
Баг (от англ. bug) — это ошибка в коде, из-за которой программа работает, но делает что-то неправильно. В отличие от критических сбоев, баги не всегда мешают запуску, но вызывают некорректное поведение: например, не реагирует одна кнопка, не выполняется команда. Или интерфейс отображается с искажениями.
Термин bug (жук) известен с конца XIX века, а в программировании закрепился после случая с мотыльком, который помешал работе вычислительной машины Harvard Mark II в 1947 году.
Баги могут возникать на всех этапах: от написания кода до использования программы конечным пользователем.
Ошибки бывают визуальными, функциональными, UX, производительными, и зависят от множества факторов — от нагрузки до проектирования.
Баги отличаются от предупреждений, синтаксических ошибок и исключений по степени влияния и способу проявления.
Чтобы найти и исправить баги, проводят тестирование, пишут баг-репорты и устраняют найденные дефекты.
Почему баг так называется
Термин bug («жук») применялся для описания технических неполадок задолго до появления компьютеров. Например, в письме 1878 года Томас Эдисон называл жучками мелкие неисправности в устройствах, мешающие нормальной работе. Слово встречалось в инженерной среде радиотехников и телеграфистов — им обозначали редкие и трудноуловимые сбои в оборудовании.
В программировании термин используется с середины XX века. 9 сентября 1947 года ученая Грейс Хоппер обнаружила ошибку в работе вычислительной машины Harvard Mark II. Пытаясь найти причину неисправности, она обнаружила мотылька, застрявшего между контактами реле.
Насекомое извлекли, приклеили в рабочий журнал и подписали: First actual case of bug being found («Первый реальный случай обнаружения жука»). Случай стал хрестоматийным. Термин используется по сей день.

Где встречаются баги
Баги могут возникнуть на любом этапе работы с программным обеспечением.
1. Во время разработки. Большинство багов появляются на этапе написания кода. Причины — человеческий фактор, неудачный выбор алгоритма, неверная логика. Часть ошибок видна сразу, часть появляется только в определенных условиях.
2. На этапе тестирования. Даже тщательно написанный код может содержать дефекты. Тестировщики ищут нестандартные сценарии, при которых программа ведет себя непредсказуемо: например, обрабатывает пустое поле ввода или сбоит при быстром переключении между разделами.
3. В выпущенных продуктах. Ошибки случаются и после релиза. Программа может работать на одной системе, но выдавать сбои на другой из-за различий в настройках, драйверах или браузерах. Некоторые баги проявляются только при определенной нагрузке или из-за обновлений сторонних библиотек.
4. В видеоиграх. Баги в играх — отдельная история. Персонажи вязнут в стене, как в болоте, уровни не прогружаются, а управление пропадает. Некоторые ошибки становятся мемами — как, например, легендарное «застрял в текстурах». Игры могут быть забагованными сами по себе. Но нередко ошибки появляются, когда геймеры используют читы или неофициальные моды.

5. На сайтах. Веб-приложения часто ломаются из-за ошибок в JavaScript, некорректных запросов к серверу или конфликта между плагинами. Нередко баги обнаруживаются уже после публикации сайта. В сфере кибербезопасности есть практика bug bounty (от англ. «награда за баг») — компании платят пользователям за найденные уязвимости.
Разновидности багов
Ошибки в программном обеспечении могут быть разными — по проявлению, характеру влияния на систему и сложности устранения. Вот основные типы багов, с которыми сталкиваются разработчики и тестировщики.
Визуальные (UI). Проблемы с отображением интерфейса: текст выходит за пределы кнопки, изображения накладываются друг на друга, шрифт становится нечитаемым при масштабировании страницы.
Функциональные. Нарушение работы заявленной функции. Например, кнопка «Скачать файл» отображается корректно, но не реагирует на нажатие.
Баги юзабилити (UX). Связаны с неудобством использования. Если для простой регистрации нужно пройти пять шагов и ввести лишние данные — это UX-проблема. Если при этом не получается прописать номер телефона в форме или отправить информацию, это комбинация функционального бага и UX.
Производительные. Замедление работы системы, утечки памяти, перегрузка процессора. Например, приложение-читалка тормозит при открытии объемной книги.
Ошибки при высокой нагрузке. Выявляются, когда система не справляется с большим количеством одновременных запросов. Пример — сайт падает при начале распродажи.
Ошибки требований. Возникают из-за недочетов на этапе проектирования. Программа работает как задумано, но логика в исходных требованиях была ошибочной. Например, забыли предусмотреть работу в офлайн-режиме.

Баги часто классифицируют по серьезности (severity) и приоритету (priority). Например, неработающий поиск может быть критическим багом с высоким приоритетом, а кривой отступ в нижней части страницы — некритичный баг, который можно поправить без спешки.
Причины появления багов
Ошибки в коде могут быть связаны с невнимательностью разработчиков. Но есть и другие причины.
Сложные системы. В больших проектах все связано: правка одного модуля может неожиданно повлиять на поведение других.
Редкие сценарии. Некоторые ошибки проявляются только при нестандартных условиях: другая ОС, нестабильный интернет, необычные настройки.
Сжатые сроки. Ближе к дедлайну у команды меньше времени на проверку, и часть ошибок может попасть в прод.
Недостаток информации. Иногда разработчик просто не знает о нюансах языка или фреймворка, и баг появляется из-за неверного применения.
Чем баги отличаются от ворнингов и других ошибок
Баг — не единственный вид сбоев. Есть и другие.
Предупреждение (ворнинг) — сигнал о потенциальной проблеме, но код при этом выполняется. Например, переменная используется без значения.
Исключение (exception) — ситуация, при которой выполнение кода прерывается.
Синтаксическая ошибка — ошибка в правилах написания кода. Программа не запускается вовсе, пока ее не исправят.
Вылет — аварийное завершение работы программы, которое может быть следствием необработанного исключения, багов или перегрузки системы.
Вопросы и ответы
Собрали ответы на распространенные вопросы.
Что такое баг-тест?
Это этап проверки программы, в ходе которого ищут ошибки. Обычно баг-тестами называют работу тестировщиков: они запускают разные сценарии, чтобы выявить, где система ведет себя неправильно.
Что такое гейзенбаг?
Некоторые ошибки возникают только при специфических условиях: нестандартной конфигурации системы, редкой последовательности действий или определенных версиях программного обеспечения. Их называют гейзенбагами — они ведут себя непредсказуемо и могут исчезать при попытке воспроизведения. Гейзенбаги особенно сложно отловить и исправить.
Что значит «не баг, а фича»?
Это шутливое выражение используют, когда программа ведет себя странно, но ошибку преподносят как полезную и запланированную. Мем распространился за пределы IT-среды.

Зачем программисты ищут баги?
Баги могут мешать пользователю и снижать доверие к продукту. Поэтому программисты и тестировщики стремятся находить и устранять ошибки до релиза: чем раньше найден баг, тем дешевле и проще его исправить. Это важная часть разработки — она напрямую влияет на качество, безопасность и стабильность ПО.




