Bohrbug — је програмска грешка која се понаша детерминистички: при истим улазним подацима понавља се сваки пут без изузетка. Назив потиче од атомског модела Нилса Бора, где се електрон креће по строго одређеној орбити — једнако предвидљиво као и ова грешка. Према Википедији (2026), Bohrbug спада у класу најједноставнијих за дијагностику дефеката, јер не захтева посебне услове за понављање.
Главно
Bohrbug — је врста програмске грешке која се манифестује детерминистички: при истим улазним подацима увек доводи до истог квара. Термин су увели у научну употребу истраживачи Џим Греј и Андреас Ројтер у књизи „Transaction Processing: Concepts and Techniques” (1993).
За разлику од Mandelbug-а, који хаотично мења своје понашање, Bohrbug је стабилан: програмер га може репродуковати затворених очију, дајући систему исте параметре. То га чини идеалним кандидатом за корачно отклањање грешака у IDE.
Bohrbug се јавља у свим фазама животног циклуса софтвера — од развоја до експлоатације. Често се открива у фази тестирања, јер QA инжењери извршавају понављајуће сценарије који гарантовано доводе до квара.
Према класификацији Греја и Ројтера, Bohrbug је дефект који испуњава три услова: фиксни скуп улазних података, исто стање система и исти резултат квара. Ако је бар један услов прекршен, грешка престаје да буде „боровска”.
Аутори наглашавају да Bohrbug није нужно једноставна грешка. Може бити произвољно сложена по логици, али њен детерминизам је разликује од свих осталих врста кварова у класификацији.
Назив Bohrbug потиче од имена данског физичара Нилса Бора, творца планетарног модела атома. Аналогија је једноставна: као што се електрон у Боровом моделу креће по строго фиксираној орбити, тако и ова грешка понавља исто понашање при сваком покретању.
Греј и Ројтер су изабрали овај назив да би супротставили детерминистичке грешке хаотичним, које су назвали Mandelbug — у част математичара Беноа Манделброта, оснивача теорије фрактала и хаоса.
Занимљиво је да се у енглеској литератури термин Bohrbug често користи као синоним за „детерминистичку грешку”, иако је у српском окружењу мање распрострањен. Већина програмера такве грешке назива једноставно „поновљивим грешкама”.
Bohrbug поседује скуп карактеристичних својстава која омогућавају идентификацију међу другим врстама софтверских дефеката. Размотримо сваку карактеристику детаљно.
Главна особина Bohrbug-а — потпуна предвидљивост. Ако је апликација пала при одређеним улазним подацима на рачунару програмера, пашће потпуно исто на рачунару тестера и у продукцији. Без случајних фактора.
Bohrbug се понавља у 100% покушаја. То значи да за његово отклањање нису потребни специјални алати — довољни су обичан IDE и дебагер. Програмер поставља тачку заустављања, покреће апликацију, даје улазне податке и корак по корак прати код.
Ако Bohrbug не буде поправљен, понављаће се у свакој верзији програма до тренутка поправке. Временски фактори — оптерећење CPU-а, фаза месеца, доба дана — не утичу на његово испољавање.
Узроци настанка Bohrbug могу се поделити у неколико категорија. Разумевање ових категорија помаже да се брже пронађе корен проблема.
Неправилно конструисан услов — најчешћи узрок Bohrbug. На пример, програмер је користио оператор `||` уместо `&&`, што је довело до неправилног извршавања гране кода при сваком позиву функције са одређеним аргументима.
Коришћење оператора `<=` уместо `<` или обрнута ситуација — класичан извор Bohrbug. Ако се петља треба извршити 10 пута, а извршава се 11 због нетачног услова, ово је детерминистичка грешка која ће се испољити при сваком покретању.
Чврсто кодиране константе које не одговарају пословној логици стварају стабилне кварове. На пример, timeout повезивања са сервером је постављен на 100 милисекунди уместо 5000 — веза ће се прекидати при сваком захтеву.
Откривање Bohrbug-а — најједноставнији задатак за програмера у поређењу са другим врстама грешака. Детерминистички карактер омогућава примену стандардних метода отклањања грешака.
public class DiscountCalculator {
public double calculate(double amount, boolean isPremium) {
// Greška: premium korisnici dobijaju 5% popusta umesto 10%
if (isPremium) {
return amount * 0.95;
}
return amount * 0.90;
}
}
У овом примеру Bohrbug је очигледан: при позиву `calculate(1000, true)` метода увек враћа 950 уместо 900. Најједноставнији unit тест са фиксним улазним подацима одмах ће открити проблем.
За откривање Bohrbug-а, unit тестови су најефикасније средство. Довољно је покрити функцију сетом тестова са различитим граничним вредностима, и детерминистичка грешка ће се испољити при првом покретању.
Када Bohrbug буде откривен, корачно отклањање грешака у IDE је најбољи начин да се пронађе корен. Програмер поставља тачку заустављања на улазу у функцију и пролази кроз сваку линију, посматрајући вредности променљивих.
Bohrbug се разликује од других врста програмских грешака по кључној особини — детерминизму. Размотримо поређење у табели.
| Врста грешке | Поновљивост | Узрок | Сложеност отклањања |
|---|---|---|---|
| Bohrbug | 100% при истим улазима | Логичка грешка | Ниска |
| Mandelbug | Зависи од стања | Трка нити, тајминг | Висока |
| Schrödinbug | До читања кода — 0% | Свест о грешци | Психолошка |
| Hindenbug | Једнократно | Каскада отказивања | Екстремна |
| Heisenbug | Мења се при отклањању | Оптимизација компајлера | Средња |
Bohrbug — једина врста грешке која се може гарантовано поновити у контролисаним условима. То га чини најбезбеднијим са становишта дијагностике, али не мање опасним за корисника.
Heisenbug — грешка која нестаје при покушају отклањања. За разлику од Bohrbug, Heisenbug се можда неће поновити у дебагеру због промене тајминга извршавања кода. Почетници програмери често мешају ове две врсте.
Размотримо стварни пример Bohrbug у апликацији интернет продавнице. Функција израчунава укупну цену поруџбине узимајући у обзир порез.
public double calculateTotal(double subtotal, double taxRate) {
// Greška: programer je postavio taxRate kao procenat
// ali je zaboravio da podeli sa 100
return subtotal + (subtotal * taxRate);
}
При позиву `calculateTotal(1000, 20)` функција ће вратити 21000 уместо очекиваних 1200. Ово је класичан Bohrbug: исти улазни подаци увек доводе до истог нетачног резултата. Поправка је тривијална — додати дељење са 100.
Након поправке, функција коректно обрађује пореску стопу:
public double calculateTotal(double subtotal, double taxRatePercent) {
return subtotal + (subtotal * taxRatePercent / 100.0);
}
Овај пример јасно показује да Bohrbug може бити изазван најједноставнијом математичком грешком. Управо зато су преглед кода и unit тестови главни алати превенције таквих дефеката.
Често постављана питања
Bohrbug — је варијанта обичне грешке коју карактерише строги детерминизам. Сваки Bohrbug је грешка, али није свака грешка Bohrbug. Обична грешка може да се понавља нестабилно или да зависи од спољних фактора.
Стабилном Bohrbug се назива због способности да се понови при сваком покретању са истим улазним подацима. Ово својство га чини предвидљивим и погодним за отклањање грешака — за разлику од Mandelbug или Heisenbug.
Термин Bohrbug увели су Џим Греј и Андреас Ројтер 1993. године у књизи „Transaction Processing: Concepts and Techniques”. Они су класификовали програмске грешке према степену детерминизма, користећи аналогије из физике и математике.
За брзо поправљање Bohrbug потребно је: поновити грешку у тестном окружењу, проћи кроз код корак по корак у дебагеру, пронаћи линију са нетачном логиком и написати unit тест који проверава исправно понашање.
Да, Bohrbug може бити произвољно сложен по својој логици. Детерминизам не значи једноставност. Грешка може укључивати више услова и угњеждених позива, али ако се стабилно понавља — то је Bohrbug.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође