Bohrbug: что это, причины появления и методы исправления

Автор: IT Sectr Опубликовано: 2026-07-29 Время чтения: 8 мин

Bohrbug — это программная ошибка, которая ведёт себя детерминированно: при одинаковых входных данных она воспроизводится каждый раз без исключения. Название происходит от атомной модели Нильса Бора, где электрон движется по строго определённой орбите — так же предсказуемо, как и этот баг. По данным Википедии (2026), Bohrbug относится к классу наиболее простых для диагностики дефектов, поскольку не требует специальных условий для повторения.

Главное

  • Bohrbug — стабильная ошибка, которая воспроизводится при каждом запуске с одинаковыми входными данными.
  • Название связано с планетарной моделью атома Бора — баг ведёт себя предсказуемо, как электрон на орбите.
  • Диагностика таких багов проще всего: достаточно зафиксировать входные условия и выполнить отладку.
  • Причины включают логические ошибки, неверные граничные условия и опечатки в коде.
  • Unit-тесты — основной инструмент предотвращения Bohrbug на этапе разработки.

Что такое Bohrbug?

Bohrbug — это тип программной ошибки, которая проявляется детерминированно: при одних и тех же входных данных она всегда приводит к одинаковому сбою. Термин введён в научный оборот исследователями Джимом Греем и Андреасом Райтером в книге «Transaction Processing: Concepts and Techniques» (1993).

В отличие от Mandelbug, который хаотично меняет своё поведение, Bohrbug стабилен: разработчик может воспроизвести его с закрытыми глазами, подав системе те же параметры. Это делает его идеальным кандидатом для пошаговой отладки в IDE.

Bohrbug встречается на всех этапах жизненного цикла ПО — от разработки до эксплуатации. Часто он обнаруживается на этапе тестирования, поскольку QA-инженеры выполняют повторяющиеся сценарии, которые гарантированно приводят к сбою.

Определение по Грею и Райтер

Согласно классификации Грея и Райтера, Bohrbug — это дефект, который удовлетворяет трём условиям: фиксированный набор входных данных, одинаковое состояние системы и одинаковый результат сбоя. Если хотя бы одно из условий нарушается, баг перестаёт быть «боровским».

Авторы подчёркивают, что Bohrbug — это не обязательно простая ошибка. Он может быть сколь угодно сложным по логике, но его детерминизм отличает его от всех остальных типов сбоев в классификации.

Происхождение названия Bohrbug

Название Bohrbug происходит от имени датского физика Нильса Бора, создателя планетарной модели атома. Аналогия простая: как электрон в модели Бора движется по строго фиксированной орбите, так и этот баг повторяет одно и то же поведение при каждом запуске.

Грей и Райтер выбрали это название, чтобы противопоставить детерминированные ошибки хаотическим, которые они назвали Mandelbug — в честь математика Бенуа Мандельброта, основоположника теории фракталов и хаоса.

Интересно, что в англоязычной литературе термин Bohrbug часто используется как синоним «детерминированной ошибки», хотя в русскоязычной среде он менее распространён. Большинство разработчиков называют такие баги просто «воспроизводимыми ошибками».

Ключевые характеристики Bohrbug

Bohrbug обладает набором отличительных свойств, которые позволяют идентифицировать его среди других типов программных дефектов. Рассмотрим каждую характеристику подробно.

Детерминированность

Главная черта Bohrbug — полная предсказуемость. Если приложение упало при определённых входных данных на машине разработчика, оно упадёт точно так же на машине тестировщика и в продакшене. Никаких случайных факторов.

Воспроизводимость

Bohrbug воспроизводится в 100% попыток. Это означает, что для его отладки не нужно специальных инструментов — достаточно обычной IDE и отладчика. Разработчик ставит точку остановки, запускает приложение, подаёт входные данные и пошагово проходит код.

Стабильность во времени

Если Bohrbug не исправить, он будет воспроизводиться в любой версии программы до момента исправления. Временные факторы — загрузка CPU, фаза луны, время суток — не влияют на его проявление.

Основные причины появления Bohrbug

Причины возникновения Bohrbug можно разделить на несколько категорий. Понимание этих категорий помогает быстрее находить корень проблемы.

Логические ошибки

Неправильно построенное условие — самая частая причина Bohrbug. Например, разработчик использовал оператор `||` вместо `&&`, что привело к некорректному выполнению ветки кода при каждом вызове функции с определёнными аргументами.

Ошибки граничных условий

Использование оператора `<=` вместо `<` или обратная ситуация — классический источник Bohrbug. Если цикл должен выполниться 10 раз, а выполняется 11 из-за неверного условия, это детерминированная ошибка, которая проявится при каждом запуске.

Неверные константы и магические числа

Жёстко закодированные константы, которые не соответствуют бизнес-логике, создают стабильные сбои. Например, таймаут подключения к серверу установлен в 100 миллисекунд вместо 5000 — соединение будет обрываться при каждом запросе.

Как обнаружить Bohrbug в коде

Обнаружение Bohrbug — наиболее простая задача для разработчика по сравнению с другими типами багов. Детерминированный характер позволяет применять стандартные методы отладки.

java
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-тест с фиксированными входными данными мгновенно выявит проблему.

Unit-тестирование как основной метод

Для обнаружения Bohrbug unit-тесты — самое эффективное средство. Достаточно покрыть функцию набором тестов с различными граничными значениями, и детерминированная ошибка проявится при первом же прогоне.

Пошаговая отладка

Когда Bohrbug обнаружен, пошаговая отладка в IDE — лучший способ найти корень. Разработчик ставит точку остановки на входе в функцию и проходит каждую строку, наблюдая за значениями переменных.

Отличие Bohrbug от других типов багов

Bohrbug отличается от других типов программных ошибок по ключевому признаку — детерминированности. Рассмотрим сравнение в таблице.

Тип багаВоспроизводимостьПричинаСложность отладки
Bohrbug100% при тех же входныхЛогическая ошибкаНизкая
MandelbugЗависит от состоянияГонка потоков, таймингиВысокая
SchrödinbugДо чтения кода — 0%Осознание ошибкиПсихологическая
HindenbugОднократноКаскад отказовЭкстремальная
HeisenbugМеняется при отладкеОптимизация компилятораСредняя

Bohrbug — единственный тип ошибки, который можно гарантированно воспроизвести в контролируемых условиях. Это делает его самым безопасным с точки зрения диагностики, но не менее опасным для пользователя.

Почему путают Bohrbug и Heisenbug

Heisenbug — баг, который исчезает при попытке его отладить. В отличие от Bohrbug, Heisenbug может не воспроизводиться в отладчике из-за изменения таймингов выполнения кода. Начинающие разработчики часто путают эти два типа.

Пример Bohrbug в коде

Рассмотрим реальный пример Bohrbug в приложении для интернет-магазина. Функция рассчитывает итоговую стоимость заказа с учётом налога.

java
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.

Исправленный вариант

После исправления функция корректно обрабатывает налоговую ставку:

java
public double calculateTotal(double subtotal, double taxRatePercent) {
    return subtotal + (subtotal * taxRatePercent / 100.0);
}

Этот пример наглядно показывает, что Bohrbug может быть вызван простейшей математической ошибкой. Именно поэтому код-ревью и unit-тесты — главные инструменты профилактики таких дефектов.

Часто задаваемые вопросы

Чем Bohrbug отличается от обычного бага?

Bohrbug — это разновидность обычного бага, которая отличается строгой детерминированностью. Любой Bohrbug является багом, но не каждый баг — Bohrbug. Обычный баг может воспроизводиться нестабильно или зависеть от внешних факторов.

Почему Bohrbug называют стабильным багом?

Стабильным Bohrbug называют из-за его способности воспроизводиться при каждом запуске с одинаковыми входными данными. Это свойство делает его предсказуемым и удобным для отладки — в отличие от Mandelbug или Heisenbug.

Кто ввёл термин Bohrbug?

Термин Bohrbug ввели Джим Грей и Андреас Райтер в 1993 году в книге «Transaction Processing: Concepts and Techniques». Они классифицировали программные ошибки по степени детерминированности, используя аналогии из физики и математики.

Как быстро исправить Bohrbug?

Для быстрого исправления Bohrbug необходимо: воспроизвести баг в тестовой среде, пройти код пошагово в отладчике, найти строку с неверной логикой и написать unit-тест, который проверяет корректное поведение.

Может ли Bohrbug быть сложным?

Да, Bohrbug может быть сколь угодно сложным по своей логике. Детерминированность не означает простоту. Баг может включать множество условий и вложенных вызовов, но если он стабильно воспроизводится — это Bohrbug.

Итоги

  • Bohrbug — детерминированная программная ошибка, которая воспроизводится в 100% случаев при одинаковых входных данных.
  • Название происходит от фамилии физика Нильса Бора, чья модель атома основана на строгих орбитах — аналогия с предсказуемым поведением бага.
  • Основные причины Bohrbug: логические ошибки, неверные граничные условия, опечатки и неправильные константы.
  • Диагностика Bohrbug — самая простая среди всех типов багов благодаря детерминированному характеру.
  • Unit-тесты и код-ревью — главные инструменты предотвращения Bohrbug на этапе разработки.
  • Отличие от Mandelbug: Bohrbug стабилен и предсказуем, Mandelbug хаотичен и зависит от состояния системы.
  • Рекомендация: при обнаружении стабильного бага всегда начинайте с написания теста, который его воспроизводит.

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также