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 из-за неверного условия, это детерминированная ошибка, которая проявится при каждом запуске.
Жёстко закодированные константы, которые не соответствуют бизнес-логике, создают стабильные сбои. Например, таймаут подключения к серверу установлен в 100 миллисекунд вместо 5000 — соединение будет обрываться при каждом запросе.
Обнаружение Bohrbug — наиболее простая задача для разработчика по сравнению с другими типами багов. Детерминированный характер позволяет применять стандартные методы отладки.
public class DiscountCalculator {
public double calculate(double amount, boolean isPremium) {
// Bug: premium users get 5% discount instead of 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) {
// Bug: developer set taxRate as percentage
// but forgot to divide by 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также