Bohrbug — is een softwarefout die zich deterministisch gedraagt: bij dezelfde invoergegevens treedt deze elke keer zonder uitzondering op. De naam komt van het atoommodel van Niels Bohr, waarin een elektron zich in een strikt bepaalde baan beweegt — net zo voorspelbaar als deze bug. Volgens Wikipedia (2026) behoort Bohrbug tot de klasse van eenvoudigst te diagnosticeren defecten, omdat het geen speciale voorwaarden vereist om te worden gereproduceerd.
Belangrijkste punten
Bohrbug — is een type softwarefout die zich deterministisch manifesteert: bij dezelfde invoergegevens leidt het altijd tot dezelfde storing. De term werd in wetenschappelijke circulatie gebracht door onderzoekers Jim Gray en Andreas Reuter in het boek „Transaction Processing: Concepts and Techniques” (1993).
In tegenstelling tot Mandelbug, dat chaotisch van gedrag verandert, is Bohrbug stabiel: een ontwikkelaar kan het met gesloten ogen reproduceren door het systeem dezelfde parameters te geven. Dit maakt het een ideale kandidaat voor stapsgewijze debugging in een IDE.
Bohrbug komt voor in alle fasen van de softwarelevenscyclus — van ontwikkeling tot exploitatie. Het wordt vaak ontdekt in de testfase, omdat QA-ingenieurs herhaalbare scenario's uitvoeren die gegarandeerd tot een storing leiden.
Volgens de classificatie van Gray en Reuter is Bohrbug een defect dat aan drie voorwaarden voldoet: een vaste set invoergegevens, dezelfde systeemstatus en hetzelfde storingsresultaat. Als ten minste één voorwaarde wordt geschonden, is de bug niet langer „bohr”.
De auteurs benadrukken dat Bohrbug niet noodzakelijk een eenvoudige fout is. Het kan willekeurig complex zijn qua logica, maar het determinisme onderscheidt het van alle andere storingssoorten in de classificatie.
De naam Bohrbug komt van de Deense natuurkundige Niels Bohr, de maker van het planetaire atoommodel. De analogie is eenvoudig: zoals het elektron in Bohrs model zich in een strikt vaste baan beweegt, herhaalt deze bug hetzelfde gedrag bij elke uitvoering.
Gray en Reuter kozen deze naam om deterministische fouten te contrasteren met chaotische, die ze Mandelbug noemden — naar de wiskundige Benoît Mandelbrot, grondlegger van de theorie van fractalen en chaos.
Interessant is dat in de Engelstalige literatuur de term Bohrbug vaak wordt gebruikt als synoniem voor „deterministische fout”, hoewel het in de Nederlandstalige omgeving minder wijdverbreid is. De meeste ontwikkelaars noemen dergelijke bugs gewoon „reproduceerbare fouten”.
Bohrbug heeft een reeks onderscheidende eigenschappen waarmee het te identificeren is tussen andere soorten softwaredefecten. Laten we elke eigenschap in detail bekijken.
Het belangrijkste kenmerk van Bohrbug — volledige voorspelbaarheid. Als de applicatie op de machine van de ontwikkelaar crashte bij bepaalde invoergegevens, zal deze exact hetzelfde crashen op de machine van de tester en in productie. Geen willekeurige factoren.
Bohrbug reproduceert in 100% van de pogingen. Dit betekent dat er geen speciale hulpmiddelen nodig zijn voor de debugging — een gewone IDE en debugger volstaan. De ontwikkelaar plaatst een breekpunt, start de applicatie, voert de invoergegevens in en doorloopt de code stap voor stap.
Als Bohrbug niet wordt gerepareerd, zal het in elke versie van het programma worden gereproduceerd tot het moment van reparatie. Tijdsfactoren — CPU-belasting, maanfase, tijd van de dag — hebben geen invloed op het optreden ervan.
Oorzaken van het ontstaan van Bohrbug kunnen in verschillende categorieën worden verdeeld. Inzicht in deze categorieën helpt om de oorzaak van het probleem sneller te vinden.
Een onjuist geconstrueerde voorwaarde — de meest voorkomende oorzaak van Bohrbug. Bijvoorbeeld, een ontwikkelaar gebruikte de operator `||` in plaats van `&&`, wat leidde tot onjuiste uitvoering van een codetak bij elke aanroep van de functie met bepaalde argumenten.
Gebruik van de operator `<=` in plaats van `<` of de omgekeerde situatie — een klassieke bron van Bohrbug. Als een lus 10 keer moet worden uitgevoerd, maar 11 keer wordt uitgevoerd vanwege een onjuiste voorwaarde, is dat een deterministische fout die bij elke uitvoering optreedt.
Hardgecodeerde constanten die niet overeenkomen met de bedrijfslogica, creëren stabiele storingen. Bijvoorbeeld, de time-out voor serververbinding is ingesteld op 100 milliseconden in plaats van 5000 — de verbinding wordt bij elk verzoek verbroken.
Detectie van Bohrbug is de eenvoudigste taak voor een ontwikkelaar in vergelijking met andere bugsoorten. Het deterministische karakter maakt standaard debugmethoden toepasbaar.
public class DiscountCalculator {
public double calculate(double amount, boolean isPremium) {
// Fout: premiumgebruikers krijgen 5% korting in plaats van 10%
if (isPremium) {
return amount * 0.95;
}
return amount * 0.90;
}
}
In dit voorbeeld is Bohrbug duidelijk: bij aanroep van `calculate(1000, true)` retourneert de methode altijd 950 in plaats van 900. De eenvoudigste unittest met vaste invoergegevens zal het probleem onmiddellijk aan het licht brengen.
Voor detectie van Bohrbug zijn unittesten het meest effectieve hulpmiddel. Het volstaat om de functie te dekken met een reeks tests met verschillende randwaarden, en de deterministische fout zal bij de eerste uitvoering verschijnen.
Zodra Bohrbug is gedetecteerd, is stapsgewijze debugging in de IDE de beste manier om de oorzaak te vinden. De ontwikkelaar plaatst een breekpunt bij de ingang van de functie en doorloopt elke regel, waarbij hij de waarden van variabelen observeert.
Bohrbug verschilt van andere softwarefouttypen door een belangrijk kenmerk — determinisme. Laten we de vergelijking in een tabel bekijken.
| Bugtype | Reproduceerbaarheid | Oorzaak | Debugcomplexiteit |
|---|---|---|---|
| Bohrbug | 100% bijzelfde invoer | Logische fout | Laag |
| Mandelbug | Afhankelijk van status | Threadrace, timing | Hoog |
| Schrödinbug | Tot code lezen — 0% | Bewustwording van fout | Psychologisch |
| Hindenbug | Eenmalig | Storingscascade | Extreem |
| Heisenbug | Verandert bij debuggen | Compileroptimalisatie | Gemiddeld |
Bohrbug — het enige fouttype dat gegarandeerd kan worden gereproduceerd onder gecontroleerde omstandigheden. Dit maakt het het veiligst vanuit diagnostisch oogpunt, maar niet minder gevaarlijk voor de gebruiker.
Heisenbug — een bug die verdwijnt bij poging tot debugging. In tegenstelling tot Bohrbug kan Heisenbug mogelijk niet worden gereproduceerd in de debugger vanwege veranderingen in de uitvoeringstiming van de code. Beginnende ontwikkelaars verwarren deze twee typen vaak.
Laten we een realistisch voorbeeld van Bohrbug in een webwinkeltoepassing bekijken. De functie berekent de totale bestelkosten inclusief belasting.
public double calculateTotal(double subtotal, double taxRate) {
// Fout: ontwikkelaar heeft taxRate als percentage ingesteld
// maar vergat te delen door 100
return subtotal + (subtotal * taxRate);
}
Bij aanroep van `calculateTotal(1000, 20)` retourneert de functie 21000 in plaats van de verwachte 1200. Dit is een klassieke Bohrbug: dezelfde invoergegevens leiden altijd tot hetzelfde onjuiste resultaat. De reparatie is triviaal — delen door 100 toevoegen.
Na correctie verwerkt de functie het belastingtarief correct:
public double calculateTotal(double subtotal, double taxRatePercent) {
return subtotal + (subtotal * taxRatePercent / 100.0);
}
Dit voorbeeld toont duidelijk aan dat Bohrbug kan worden veroorzaakt door de eenvoudigste wiskundige fout. Daarom zijn codebeoordeling en unittesten de belangrijkste preventiemiddelen voor dergelijke defecten.
Veelgestelde vragen
Bohrbug — is een variant van een gewone bug die wordt gekenmerkt door strikt determinisme. Elke Bohrbug is een bug, maar niet elke bug is een Bohrbug. Een gewone bug kan onstabiel reproduceren of afhankelijk zijn van externe factoren.
Stabiel wordt Bohrbug genoemd vanwege het vermogen om te worden gereproduceerd bij elke uitvoering met dezelfde invoergegevens. Deze eigenschap maakt het voorspelbaar en handig voor debugging — in tegenstelling tot Mandelbug of Heisenbug.
De term Bohrbug werd in 1993 geïntroduceerd door Jim Gray en Andreas Reuter in het boek „Transaction Processing: Concepts and Techniques”. Ze classificeerden softwarefouten naar determinismegraad, met analogieën uit de natuurkunde en wiskunde.
Voor snelle reparatie van Bohrbug is nodig: reproduceer de bug in een testomgeving, doorloop de code stap voor stap in de debugger, vind de regel met onjuiste logica en schrijf een unittest die het correcte gedrag controleert.
Ja, Bohrbug kan willekeurig complex zijn qua logica. Determinisme betekent niet eenvoud. De bug kan meerdere voorwaarden en geneste aanroepen omvatten, maar als het stabiel reproduceert — is het een Bohrbug.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook