Типы багов: этимология и энтомология

Какие бывают баги


1. Немного этимологии и энтомологии
Давайте посмотрим попристальней на такое знакомое и (до боли?) родное слово БАГ. Происходит оно от английского слова Bug, означающего «насекомое». Есть еще много сторонних значений, в частности английское выражение «to go bugs» — сойти с ума, что легко кореллируется со вполне русским «тараканы в голове завелись». Также вспоминаются и «жучки на линии» (тоже, кстати, по-английски – bugs). И опять мы пришли к насекомым.

Еще в 1878 году, Томас Альва Эдисон (да-да, тот самый!) в письмах к своему соратнику Пускасу писал: «It has been just so in all of my inventions. The first step is an intuition, and comes with a burst, then difficulties arise — this thing gives out and [it is] then that 'Bugs' — as such little faults and difficulties are called — show themselves and months of intense watching, study and labor are requisite before commercial success or failure is certainly reached». Тем же словом, инженеры называли и сбои радарной электроники во время второй Мировой Войны. Конечно, более распространена история о том, что в 1946 году разработка компьютера Марк-2 (Mark-II) были приостановлена из-за сбоя его функционирования, вызванного попаданием мотылька между контактов. Трупик мотылька был извлечен и приклеен к отчету липкой лентой с комментарием «First actual case of bug being found.» («Первый реальный случай нахождения жучка»). Как нетрудно догадаться, примерно оттуда же «растут уши» и слова «дебаггер» (debugger) – буквально «избавитель от жучков».

2. Виды багов.
Простейший (не как инфузория-туфелька, а самый простой для понимания, модно сказать «классический») баг – это несоответствие между ожидаемым результатом (ОР) и фактическим результатом (ФР). Разберем это на примере:
Действия Ожидаемый результат Фактический результат
Ввести в ячейку выражение «=2+2*2» (без кавычек) и нажать ENTER 6 8 БАГ!!!!


(это, кстати, реальный баг старого Microsoft Excel – он не учитывал приоритета математических операций, по которому умножение имеет высший приоритет по сравнению со сложением)

Все просто. Ждем одно – получаем другое. Баг.
Я не буду перечислять все подвиды бага классического – от опечаток в данных и опечаток в коде до бесконечных циклов, от использования оператора присвоения вместо оператора проверки равенства до использования неинициализированной переменной, от состояния гонки (race condition) в мультипоточных приложения до переполнения буфера, и так далее, и тому подобное – все это достаточно обыденные и ясные явления. Обратимся к малознакомой экзотике.

2.1. Гейзенбаг (Heisenbug)
Баг, названный в честь Гейзенбергского Принципа неопределенности – концепции квантовой физики. Простым (хоть слово «просто» здесь и не очень применимо) примером подобного бага будет являться ошибка, проявляющаяся, когда программа запускается на исполнение в рабочей среде, но исчезающая, когда программу запускают в дебаггере.

2.2. Борбаг (Bohrbug)
Тип бага, названный так в честь атомной модели Бора. В противоположность Гейзенбагу, он проявляется постоянно при одном и том же стечении обстоятельств. Вопрос в том, что весь набор обстоятельств бывет невозможно (или очень трудно) отследить.

2.3. Мандельбаг (Mandelbug)
Назван в честь Бенуа Мандельброта, внесшего огромный вклад в теорию фракталов. Мандельбагами называют ошибки, чьи причины настолько сложны и неясны, что фактически кажутся хаотичными и не поддающимися описаниями. (ключевое слово «кажутся»). Подобное, может быть вызвано, например, медленной реакцией системы – то есть ошибка уже произошла, но об этом вы узнаете только через некоторое время, что сильно затруднит локализацию причин.

2.4. Шрединбаг (Schroedinbug)
Шрединбаг назван в честь известного парадокса с кошкой Шредингера (или эта несчастная животина – кот?). Он заключается в том, что кто-нибудь читает код программы (работающей уже некоторое время) и восклицает «Да этого не может быть! Она просто не может функционировать!», после чего программа прекращает свое функционирование пока данная ошибка не будет исправлена. Будучи, казалось бы, абсолютно фантастической, данная ошибка попадается в реальности – спросите знакомых ветеранов- разработчиков, они подтвердят. Хотя, конечно, последующий анализ, как правило, позволяет отнести ошибку к разделам 2.1, 2.2 или 2.3, это удается не всегда.

2.5. Фазы луны
На самом деле такой ошибки не существует – это популярная отговорка тех, кто не хочет (не имеет желания и/или времени) разбираться в сложных причинах возникновения ошибки. Тем не менее, в истории существует пара примеров, когда ошибки возникали буквально из-за фаз луны. Я не буду приводить здесь эти истории, надеясь, что никому из нас не придется работать со столь сложными устройствами. Тем не менее, в любом случае, хотелось бы предостеречь всех от неосторожных умозаключений и попросить быть более внимательными, настойчивыми и скрупулезными в своей работе.

2.6. Статистический (более известный как количественный) баг
Баг возникающий при произведении программой большого количества каких-либо действий. Примером данной ошибки может служить запуск программы, которая должна равномерно расположить на плоскости некоторое количество точек. Если, например, при большом количестве точек программа не только неправильно располагает их, но и норовит расположить все на одной стороне плоскости (при этом до определенного количества точек работая прекрасно) – вуаля, количественный баг.

2.7. Демонстрационный эффект.
Ну и конечно, известный всем, «эффект первого показа», не раз случавшийся и с вашим покорным слугой. Как только приходит пора показать, например, прекрасно функционировавший на тестовом стенде юнит, обязательно происходит что-то ужасное. Причны, как правило, тривиальны – пропуск «незначительных» тест-кейсов, невнимательность к деталям и неучтенные юз-кейсы. Опять же – будьте внимательней.

На этом я закончу краткий обзор багов, буду рад Вашим замечаниям и предложениям.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 18

    +1
    Практического толку от такого знания немного, но познавательно. Интересная статья.
      0
      спасибо. это была моя статья в песочницу, с целью заработать инвайт на хабр
      +6
      Этой статье не хватает примеров реальных багов.
      Добавьте еще одну разновидность: когда два (или даже больше) багов компенсируют друг друга, но при исправлении одного из них система перестает нормально работать.
        +2
        > Добавьте еще одну разновидность: когда два (или даже больше) багов компенсируют друг друга, но при исправлении одного из них система перестает нормально работать.

        Этот случай подходит под определение Шрединбага — не может работать в принципе, но за счет еще одного бага все-таки работает. Впрочем википедия с этим тоже согласна:

        Шрёдинбаг может быть образован сложной комбинацией парных ошибок (когда ошибка в одном месте компенсируется ошибкой противоположного действия в другом месте). В результате система может стать очень чувствительной к малым влияниям — небольшое изменение может разрушить баланс ошибок и парализовать работу системы (зачастую при этом откат рокового изменения не решает проблему, так как состояние системы успело значительно измениться).
        • НЛО прилетело и опубликовало эту надпись здесь
          +3
          Из серии «Если баланс не сходится, значит, в нем есть, как минимум, одна ошибка. Если баланс сходится, значит, в нем есть, как минимум, две ошибки». (С) Не знаю чей. :)
          0
          У нас как раз недавно был пункт 2.7. Показывали альфа-версию игры. Потестировали, поиграли — всё работает отлично, раз пять доиграли до конца (игра короткая, минуты 2). Как демонстрировать — из трёх раз игра ни разу не доработала до конца, выбивало где-то в середине. Когда опять сели тестировать ПОСЛЕ демонстрации — так и не смогли ни разу словить баг. Исправили на ощупь.
            0
            да на любом более-менее крупном проекте такое сплошь и рядом. поверьте мне, как проработавшему порядочное время в ЖЖ…
            +10
            Обратный демонстрационный эффект:
            Система регулярно выдает какую-либо ошибку, но стоит только к ней приблизиться специалисту поддержки — все сразу работает идеально, и воспроизвести баг не удается никак. Эффект бывает однократным (когда после визита специалиста баг не повторяется, характеризуется выражением «чё это вообще было? o_O») и многократным (когда сразу после ухода спеца вылезает снова).
            • НЛО прилетело и опубликовало эту надпись здесь
                +2
                Точнее «Эффект присутствия Авторитета», на обычных уборщиц в кабинете не срабатывает.
                  0
                  Нравится мне Ваш ник. Попахивает семейкой Бартовски
                  0
                  Как раз в квантовой физике с этим впервые столкнулись, когда обнаружили что присутствие наблюдателя вносит ощутимое воздействие на ход эксперимента
                +3
                Я помню свой Гейзенбаг:

                ATLASSERT(SUCCEEDED(pObject->DoSomeJob()));
                  +3
                  Так вроде было уже: 1, 2
                    +1
                    первый да, близок, второй — немного про другое. В любом случае — спасибо за ссылки.
                    Я ни в коем случае не ставил целью скопировать кого-либо. Это была статья для песочницы, с целью получить инвайт на хабр. Если она кого-то повеселила/порадовала — счастье-счастье :)
                    0
                    На прошлой неделе поймал Гейзенбаг. Пока дошло, что к чему и почему в отладчике все работает, а «на самом деле» — нет, чуть не поседел.
                      0

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое