Bohrbug — to błąd programistyczny, który zachowuje się deterministycznie: przy tych samych danych wejściowych powtarza się za każdym razem bez wyjątku. Nazwa pochodzi od atomowego modelu Nielsa Bohra, gdzie elektron porusza się po ściśle określonej orbicie — tak samo przewidywalnie, jak ten błąd. Według Wikipedii (2026), Bohrbug należy do klasy najprostszych do zdiagnozowania defektów, ponieważ nie wymaga specjalnych warunków do powtórzenia.
Najważniejsze
Bohrbug — to typ błędu programistycznego, który objawia się deterministycznie: przy tych samych danych wejściowych zawsze prowadzi do tej samej awarii. Termin został wprowadzony do obiegu naukowego przez badaczy Jima Graya i Andreasa Reutera w książce „Transaction Processing: Concepts and Techniques” (1993).
W przeciwieństwie do Mandelbug, który chaotycznie zmienia swoje zachowanie, Bohrbug jest stabilny: programista może go odtworzyć z zamkniętymi oczami, podając systemowi te same parametry. To czyni go idealnym kandydatem do debugowania krok po kroku w IDE.
Bohrbug występuje na wszystkich etapach cyklu życia oprogramowania — od programowania po eksploatację. Często jest wykrywany na etapie testowania, ponieważ inżynierowie QA wykonują powtarzalne scenariusze, które gwarantują awarię.
Zgodnie z klasyfikacją Graya i Reutera, Bohrbug to defekt spełniający trzy warunki: stały zestaw danych wejściowych, ten sam stan systemu i ten sam wynik awarii. Jeśli co najmniej jeden warunek jest naruszony, błąd przestaje być „borowski”.
Autorzy podkreślają, że Bohrbug niekoniecznie jest prostym błędem. Może być dowolnie skomplikowany logicznie, ale jego determinizm odróżnia go od wszystkich innych typów awarii w klasyfikacji.
Nazwa Bohrbug pochodzi od nazwiska duńskiego fizyka Nielsa Bohra, twórcy planetarnego modelu atomu. Analogia jest prosta: tak jak elektron w modelu Bohra porusza się po ściśle ustalonej orbicie, tak ten błąd powtarza to samo zachowanie przy każdym uruchomieniu.
Gray i Reuter wybrali tę nazwę, aby przeciwstawić deterministyczne błędy chaotycznym, które nazwali Mandelbug — na cześć matematyka Benoît Mandelbrota, twórcy teorii fraktali i chaosu.
Co ciekawe, w anglojęzycznej literaturze termin Bohrbug jest często używany jako synonim „błędu deterministycznego”, choć w polskojęzycznym środowisku jest mniej rozpowszechniony. Większość programistów nazywa takie błędy po prostu „błędami odtwarzalnymi”.
Bohrbug posiada zestaw charakterystycznych właściwości, które pozwalają zidentyfikować go wśród innych typów defektów programistycznych. Przyjrzyjmy się każdej cesze szczegółowo.
Główna cecha Bohrbug — całkowita przewidywalność. Jeśli aplikacja uległa awarii przy określonych danych wejściowych na komputerze programisty, ulegnie awarii dokładnie tak samo na komputerze testera i w środowisku produkcyjnym. Żadnych czynników losowych.
Bohrbug odtwarza się w 100% prób. Oznacza to, że do jego debugowania nie są potrzebne specjalne narzędzia — wystarczy zwykłe IDE i debugger. Programista ustawia punkt zatrzymania, uruchamia aplikację, podaje dane wejściowe i przechodzi kod krok po kroku.
Jeśli Bohrbug nie zostanie naprawiony, będzie się odtwarzał w każdej wersji programu aż do momentu naprawy. Czynniki czasowe — obciążenie CPU, faza księżyca, pora dnia — nie wpływają na jego występowanie.
Przyczyny powstawania Bohrbug można podzielić na kilka kategorii. Zrozumienie tych kategorii pomaga szybciej znaleźć źródło problemu.
Nieprawidłowo skonstruowany warunek — najczęstsza przyczyna Bohrbug. Na przykład programista użył operatora `||` zamiast `&&`, co doprowadziło do nieprawidłowego wykonania gałęzi kodu przy każdym wywołaniu funkcji z określonymi argumentami.
Użycie operatora `<=` zamiast `<` lub sytuacja odwrotna — klasyczne źródło Bohrbug. Jeśli pętla ma wykonać się 10 razy, a wykonuje się 11 z powodu nieprawidłowego warunku, jest to błąd deterministyczny, który wystąpi przy każdym uruchomieniu.
Sztywno zakodowane stałe, które nie odpowiadają logice biznesowej, tworzą stabilne awarie. Na przykład timeout połączenia z serwerem ustawiony na 100 milisekund zamiast 5000 — połączenie będzie zrywane przy każdym żądaniu.
Wykrywanie Bohrbug to najprostsze zadanie dla programisty w porównaniu z innymi typami błędów. Deterministyczny charakter pozwala stosować standardowe metody debugowania.
public class DiscountCalculator {
public double calculate(double amount, boolean isPremium) {
// Błąd: użytkownicy premium otrzymują 5% zniżki zamiast 10%
if (isPremium) {
return amount * 0.95;
}
return amount * 0.90;
}
}
W tym przykładzie Bohrbug jest oczywisty: przy wywołaniu `calculate(1000, true)` metoda zawsze zwraca 950 zamiast 900. Najprostszy test jednostkowy ze stałymi danymi wejściowymi natychmiast ujawni problem.
Do wykrywania Bohrbug testy jednostkowe są najskuteczniejszym narzędziem. Wystarczy pokryć funkcję zestawem testów z różnymi wartościami brzegowymi, a deterministyczny błąd ujawni się przy pierwszym uruchomieniu.
Gdy Bohrbug zostanie wykryty, debugowanie krok po kroku w IDE to najlepszy sposób na znalezienie źródła. Programista ustawia punkt zatrzymania na wejściu do funkcji i przechodzi każdą linię, obserwując wartości zmiennych.
Bohrbug różni się od innych typów błędów programistycznych kluczową cechą — determinizmem. Przyjrzyjmy się porównaniu w tabeli.
| Typ błędu | Odtwarzalność | Przyczyna | Trudność debugowania |
|---|---|---|---|
| Bohrbug | 100% przy tych samych danych | Błąd logiczny | Niska |
| Mandelbug | Zależy od stanu | Wyścig wątków, timingi | Wysoka |
| Schrödinbug | Do przeczytania kodu — 0% | Uświadomienie błędu | Psychologiczna |
| Hindenbug | Jednorazowo | Kaskada awarii | Ekstremalna |
| Heisenbug | Zmienia się przy debugowaniu | Optymalizacja kompilatora | Średnia |
Bohrbug — jedyny typ błędu, który można zagwarantowanie odtworzyć w kontrolowanych warunkach. To czyni go najbezpieczniejszym z punktu widzenia diagnostyki, ale nie mniej niebezpiecznym dla użytkownika.
Heisenbug — błąd, który znika przy próbie debugowania. W przeciwieństwie do Bohrbug, Heisenbug może nie odtwarzać się w debuggerze z powodu zmiany timingów wykonania kodu. Początkujący programiści często mylą te dwa typy.
Rozważmy rzeczywisty przykład Bohrbug w aplikacji sklepu internetowego. Funkcja oblicza całkowity koszt zamówienia z uwzględnieniem podatku.
public double calculateTotal(double subtotal, double taxRate) {
// Błąd: programista ustawił taxRate jako procent
// ale zapomniał podzielić przez 100
return subtotal + (subtotal * taxRate);
}
Przy wywołaniu `calculateTotal(1000, 20)` funkcja zwróci 21000 zamiast oczekiwanych 1200. To klasyczny Bohrbug: te same dane wejściowe zawsze prowadzą do tego samego nieprawidłowego wyniku. Naprawa jest trywialna — dodać dzielenie przez 100.
Po poprawie funkcja prawidłowo przetwarza stawkę podatkową:
public double calculateTotal(double subtotal, double taxRatePercent) {
return subtotal + (subtotal * taxRatePercent / 100.0);
}
Ten przykład wyraźnie pokazuje, że Bohrbug może być spowodowany najprostszym błędem matematycznym. Dlatego właśnie code review i testy jednostkowe są głównymi narzędziami profilaktyki takich defektów.
Często zadawane pytania
Bohrbug — to odmiana zwykłego błędu, która charakteryzuje się ścisłym determinizmem. Każdy Bohrbug jest błędem, ale nie każdy błąd to Bohrbug. Zwykły błąd może odtwarzać się niestabilnie lub zależeć od czynników zewnętrznych.
Stabilnym Bohrbug nazywa się ze względu na jego zdolność do odtwarzania się przy każdym uruchomieniu z tymi samymi danymi wejściowymi. Ta właściwość czyni go przewidywalnym i wygodnym do debugowania — w przeciwieństwie do Mandelbug czy Heisenbug.
Termin Bohrbug został wprowadzony przez Jima Graya i Andreasa Reutera w 1993 roku w książce „Transaction Processing: Concepts and Techniques”. Sklasyfikowali oni błędy programistyczne według stopnia determinizmu, używając analogii z fizyki i matematyki.
Aby szybko naprawić Bohrbug, należy: odtworzyć błąd w środowisku testowym, przejść kod krok po kroku w debuggerze, znaleźć linię z nieprawidłową logiką i napisać test jednostkowy sprawdzający poprawne zachowanie.
Tak, Bohrbug może być dowolnie skomplikowany pod względem logiki. Deterministyczność nie oznacza prostoty. Błąd może obejmować wiele warunków i zagnieżdżonych wywołań, ale jeśli stabilnie się odtwarza — to Bohrbug.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również