Что такое баги и почему программисты все время их ищут

Рассказываем, что такое баги, какими они бывают и чем отличаются от ворнингов, вылетов и исключений.
Термин
Где встречаются
Разновидности
Причины появления
Другие ошибки
Вопросы и ответы
Термин
Где встречаются
Разновидности
Причины появления
Другие ошибки
Вопросы и ответы
Еще
Программисты ищут баг в коде
Баг — это не критическая, но вызывающая некорректное поведение программы ошибкаИсточник: Unsplash

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

  • Термин bug (жук) известен с конца XIX века, а в программировании закрепился после случая с мотыльком, который помешал работе вычислительной машины Harvard Mark II в 1947 году.

  • Баги могут возникать на всех этапах: от написания кода до использования программы конечным пользователем.

  • Ошибки бывают визуальными, функциональными, UX, производительными, и зависят от множества факторов — от нагрузки до проектирования.

  • Баги отличаются от предупреждений, синтаксических ошибок и исключений по степени влияния и способу проявления.

  • Чтобы найти и исправить баги, проводят тестирование, пишут баг-репорты и устраняют найденные дефекты.

Почему баг так называется

Термин bug («жук») применялся для описания технических неполадок задолго до появления компьютеров. Например, в письме 1878 года Томас Эдисон называл жучками мелкие неисправности в устройствах, мешающие нормальной работе. Слово встречалось в инженерной среде радиотехников и телеграфистов — им обозначали редкие и трудноуловимые сбои в оборудовании.

В программировании термин используется с середины XX века. 9 сентября 1947 года ученая Грейс Хоппер обнаружила ошибку в работе вычислительной машины Harvard Mark II. Пытаясь найти причину неисправности, она обнаружила мотылька, застрявшего между контактами реле. 

Насекомое извлекли, приклеили в рабочий журнал и подписали: First actual case of bug being found («Первый реальный случай обнаружения жука»). Случай стал хрестоматийным. Термин используется по сей день.

Первая компьютерная ошибка, которая называется баг
Тот самый баг в журналеИсточник: wikipedia.org/CC0/Courtesy of the Naval Surface Warfare Center

Где встречаются баги

Баги могут возникнуть на любом этапе работы с программным обеспечением.

1. Во время разработки. Большинство багов появляются на этапе написания кода. Причины — человеческий фактор, неудачный выбор алгоритма, неверная логика. Часть ошибок видна сразу, часть появляется только в определенных условиях. 

2. На этапе тестирования. Даже тщательно написанный код может содержать дефекты. Тестировщики ищут нестандартные сценарии, при которых программа ведет себя непредсказуемо: например, обрабатывает пустое поле ввода или сбоит при быстром переключении между разделами.

3. В выпущенных продуктах. Ошибки случаются и после релиза. Программа может работать на одной системе, но выдавать сбои на другой из-за различий в настройках, драйверах или браузерах. Некоторые баги проявляются только при определенной нагрузке или из-за обновлений сторонних библиотек.

4. В видеоиграх. Баги в играх — отдельная история. Персонажи вязнут в стене, как в болоте, уровни не прогружаются, а управление пропадает. Некоторые ошибки становятся мемами — как, например, легендарное «застрял в текстурах». Игры могут быть забагованными сами по себе. Но нередко ошибки появляются, когда геймеры используют читы или неофициальные моды. 

Игра PEAK, в которой встретился баг
Баг в игре PEAKИсточник: PEAK

5. На сайтах. Веб-приложения часто ломаются из-за ошибок в JavaScript, некорректных запросов к серверу или конфликта между плагинами. Нередко баги обнаруживаются уже после публикации сайта. В сфере кибербезопасности есть практика bug bounty (от англ. «награда за баг») — компании платят пользователям за найденные уязвимости.

Разновидности багов

Ошибки в программном обеспечении могут быть разными — по проявлению, характеру влияния на систему и сложности устранения. Вот основные типы багов, с которыми сталкиваются разработчики и тестировщики.

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

  • Функциональные. Нарушение работы заявленной функции. Например, кнопка «Скачать файл» отображается корректно, но не реагирует на нажатие.

  • Баги юзабилити (UX). Связаны с неудобством использования. Если для простой регистрации нужно пройти пять шагов и ввести лишние данные — это UX-проблема. Если при этом не получается прописать номер телефона в форме или отправить информацию, это комбинация функционального бага и UX. 

  • Производительные. Замедление работы системы, утечки памяти, перегрузка процессора. Например, приложение-читалка тормозит при открытии объемной книги.

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

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

Группа тестировщиков, которая нашла баг
Разработчики и тестировщики сталкиваются с разными типами баговИсточник: Freepik

Баги часто классифицируют по серьезности (severity) и приоритету (priority). Например, неработающий поиск может быть критическим багом с высоким приоритетом, а кривой отступ в нижней части страницы — некритичный баг, который можно поправить без спешки.

Причины появления багов

Ошибки в коде могут быть связаны с невнимательностью разработчиков. Но есть и другие причины.

  • Сложные системы. В больших проектах все связано: правка одного модуля может неожиданно повлиять на поведение других. 

  • Редкие сценарии. Некоторые ошибки проявляются только при нестандартных условиях: другая ОС, нестабильный интернет, необычные настройки.

  • Сжатые сроки. Ближе к дедлайну у команды меньше времени на проверку, и часть ошибок может попасть в прод.

  • Недостаток информации. Иногда разработчик просто не знает о нюансах языка или фреймворка, и баг появляется из-за неверного применения.

Чем баги отличаются от ворнингов и других ошибок

Баг — не единственный вид сбоев. Есть и другие.

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

  • Исключение (exception) — ситуация, при которой выполнение кода прерывается. 

  • Синтаксическая ошибка — ошибка в правилах написания кода. Программа не запускается вовсе, пока ее не исправят.

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

Вопросы и ответы

Собрали ответы на распространенные вопросы. 

Что такое баг-тест?

Это этап проверки программы, в ходе которого ищут ошибки. Обычно баг-тестами называют работу тестировщиков: они запускают разные сценарии, чтобы выявить, где система ведет себя неправильно. 

Что такое гейзенбаг?

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

Что значит «не баг, а фича»?  

Это шутливое выражение используют, когда программа ведет себя странно, но ошибку преподносят как полезную и запланированную. Мем распространился за пределы IT-среды.

Картинка, изображающая выражение не баг, а фича
Фича — это запланированная ошибка. Ну, по крайней мере, она так преподносится Источник: Соцсети

Зачем программисты ищут баги?

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