Bohrbug — je softwarová chyba, která se chová deterministicky: při stejných vstupních datech se pokaždé bez výjimky opakuje. Název pochází z atomového modelu Nielse Bohra, kde se elektron pohybuje po přesně definované dráze — stejně předvídatelně jako tato chyba. Podle Wikipedie (2026) patří Bohrbug do třídy nejsnáze diagnostikovatelných defektů, protože nevyžaduje speciální podmínky pro opakování.
Hlavní body
Bohrbug — je typ softwarové chyby, která se projevuje deterministicky: při stejných vstupních datech vždy vede ke stejnému selhání. Termín zavedli do vědeckého oběhu výzkumníci Jim Gray a Andreas Reuter v knize „Transaction Processing: Concepts and Techniques” (1993).
Na rozdíl od Mandelbug, který chaoticky mění své chování, je Bohrbug stabilní: vývojář ho může reprodukovat se zavřenýma očima, když systému poskytne stejné parametry. To z něj dělá ideálního kandidáta pro krokové ladění v IDE.
Bohrbug se vyskytuje ve všech fázích životního cyklu softwaru — od vývoje po provoz. Často je objeven ve fázi testování, protože QA inženýři provádějí opakovatelné scénáře, které zaručeně vedou k selhání.
Podle klasifikace Graye a Reutera je Bohrbug defekt, který splňuje tři podmínky: pevná sada vstupních dat, stejný stav systému a stejný výsledek selhání. Pokud je porušena alespoň jedna podmínka, chyba přestává být „bohrovskou”.
Autoři zdůrazňují, že Bohrbug není nutně jednoduchá chyba. Může být logicky libovolně složitá, ale její determinismus ji odlišuje od všech ostatních typů selhání v klasifikaci.
Název Bohrbug pochází od dánského fyzika Nielse Bohra, tvůrce planetárního modelu atomu. Analogie je jednoduchá: stejně jako se elektron v Bohrově modelu pohybuje po přesně stanovené dráze, tato chyba opakuje stejné chování při každém spuštění.
Gray a Reuter zvolili tento název, aby postavili deterministické chyby proti chaotickým, které nazvali Mandelbug — na počest matematika Benoîta Mandelbrota, zakladatele teorie fraktálů a chaosu.
Zajímavé je, že v anglicky psané literatuře se termín Bohrbug často používá jako synonymum pro „deterministickou chybu”, i když v českém prostředí je méně rozšířený. Většina vývojářů nazývá takové chyby jednoduše „reprodukovatelnými chybami”.
Bohrbug má soubor charakteristických vlastností, které umožňují jeho identifikaci mezi jinými typy softwarových defektů. Pojďme si každou vlastnost podrobně prohlédnout.
Hlavní rys Bohrbug — úplná předvídatelnost. Pokud aplikace spadla při určitých vstupních datech na počítači vývojáře, spadne úplně stejně na počítači testera a v produkci. Žádné náhodné faktory.
Bohrbug se reprodukuje ve 100 % pokusů. To znamená, že k jeho ladění nejsou potřeba speciální nástroje — stačí běžné IDE a debugger. Vývojář nastaví bod přerušení, spustí aplikaci, poskytne vstupní data a prochází kód krok za krokem.
Pokud Bohrbug není opraven, bude se reprodukovat v každé verzi programu až do okamžiku opravy. Časové faktory — zatížení CPU, fáze měsíce, denní doba — neovlivňují jeho projevení.
Příčiny vzniku Bohrbug lze rozdělit do několika kategorií. Porozumění těmto kategoriím pomáhá rychleji najít kořen problému.
Nesprávně sestavená podmínka — nejčastější příčina Bohrbug. Například vývojář použil operátor `||` místo `&&`, což vedlo k nesprávnému provedení větve kódu při každém volání funkce s určitými argumenty.
Použití operátoru `<=` místo `<` nebo opačná situace — klasický zdroj Bohrbug. Pokud se má smyčka provést 10krát, ale provede se 11krát kvůli nesprávné podmínce, jde o deterministickou chybu, která se projeví při každém spuštění.
Pevně zakódované konstanty, které neodpovídají obchodní logice, vytvářejí stabilní selhání. Například časový limit připojení k serveru je nastaven na 100 milisekund místo 5000 — připojení bude přerušeno při každém požadavku.
Odhalení Bohrbug je pro vývojáře nejjednodušší úkol ve srovnání s jinými typy chyb. Deterministický charakter umožňuje použití standardních metod ladění.
public class DiscountCalculator {
public double calculate(double amount, boolean isPremium) {
// Chyba: prémioví uživatelé dostávají 5% slevu místo 10%
if (isPremium) {
return amount * 0.95;
}
return amount * 0.90;
}
}
V tomto příkladu je Bohrbug zřejmý: při volání `calculate(1000, true)` metoda vždy vrací 950 místo 900. Nejjednodušší unit test s pevnými vstupními daty okamžitě odhalí problém.
Pro odhalení Bohrbug jsou unit testy nejúčinnějším nástrojem. Stačí pokrýt funkci sadou testů s různými okrajovými hodnotami a deterministická chyba se projeví při prvním spuštění.
Jakmile je Bohrbug odhalen, krokové ladění v IDE je nejlepší způsob, jak najít kořen. Vývojář nastaví bod přerušení na vstupu funkce a prochází každý řádek, přičemž sleduje hodnoty proměnných.
Bohrbug se liší od jiných typů softwarových chyb klíčovým rysem — determinismem. Podívejme se na srovnání v tabulce.
| Typ chyby | Reprodukovatelnost | Příčina | Obtížnost ladění |
|---|---|---|---|
| Bohrbug | 100 % při stejných vstupech | Logická chyba | Nízká |
| Mandelbug | Závisí na stavu | Závitová soutěž, načasování | Vysoká |
| Schrödinbug | Do přečtení kódu — 0 % | Uvědomění chyby | Psychologická |
| Hindenbug | Jednorázově | Kaskáda selhání | Extrémní |
| Heisenbug | Mění se při ladění | Optimalizace kompilátoru | Střední |
Bohrbug — jediný typ chyby, který lze zaručeně reprodukovat v kontrolovaných podmínkách. To ho činí nejbezpečnějším z hlediska diagnostiky, ale ne méně nebezpečným pro uživatele.
Heisenbug — chyba, která zmizí při pokusu o její odladění. Na rozdíl od Bohrbug se Heisenbug nemusí v debuggeru reprodukovat kvůli změně načasování provádění kódu. Začínající vývojáři si tyto dva typy často pletou.
Podívejme se na reálný příklad Bohrbug v aplikaci internetového obchodu. Funkce vypočítá celkovou cenu objednávky s ohledem na daň.
public double calculateTotal(double subtotal, double taxRate) {
// Chyba: vývojář nastavil taxRate jako procento
// ale zapomněl vydělit 100
return subtotal + (subtotal * taxRate);
}
Při volání `calculateTotal(1000, 20)` funkce vrátí 21000 místo očekávaných 1200. Toto je klasický Bohrbug: stejná vstupní data vždy vedou ke stejnému nesprávnému výsledku. Oprava je triviální — přidat dělení 100.
Po opravě funkce správně zpracovává daňovou sazbu:
public double calculateTotal(double subtotal, double taxRatePercent) {
return subtotal + (subtotal * taxRatePercent / 100.0);
}
Tento příklad jasně ukazuje, že Bohrbug může být způsoben nejjednodušší matematickou chybou. Právě proto jsou code review a unit testy hlavními nástroji prevence takových defektů.
Často kladené otázky
Bohrbug — je varianta běžné chyby, která se vyznačuje přísným determinismem. Každý Bohrbug je chybou, ale ne každá chyba je Bohrbug. Běžná chyba se může reprodukovat nestabilně nebo záviset na vnějších faktorech.
Stabilní se Bohrbug nazývá kvůli své schopnosti reprodukovat se při každém spuštění se stejnými vstupními daty. Tato vlastnost ho činí předvídatelným a vhodným pro ladění — na rozdíl od Mandelbug nebo Heisenbug.
Termín Bohrbug zavedli Jim Gray a Andreas Reuter v roce 1993 v knize „Transaction Processing: Concepts and Techniques”. Klasifikovali softwarové chyby podle stupně determinismu s využitím analogií z fyziky a matematiky.
Pro rychlou opravu Bohrbug je třeba: reprodukovat chybu v testovacím prostředí, projít kód krok za krokem v debuggeru, najít řádek s nesprávnou logikou a napsat unit test, který ověřuje správné chování.
Ano, Bohrbug může být logicky libovolně složitý. Deterministický charakter neznamená jednoduchost. Chyba může zahrnovat mnoho podmínek a vnořených volání, ale pokud se stabilně reprodukuje — jde o Bohrbug.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také