Баги, Ошибки, Проблемы, Недостатки, Неисправности, Сбои, и Дефекты
Волею судьбы часть времени провожу в общении с руководителями проектов, клиентами и иногда клиентами-клиентов. В диалогах часто возникает слова: баги, проблемы, сбои, ошибка и дефект и зачастую они используются как синонимы, но различия все таки есть.
Если что-нибудь может пойти не так, оно пойдёт не так...
Ошибка (error) — это ошибочные действия, допущенные в результате ошибки программирования или ошибки использования. Не каждая ошибка приводит к последующим проблемам.
Дефект — это ошибка, обнаруженная на этапе разработки.
Баг — это дефект, обнаруженный на этапе тестирования. Не все ошибки обнаруживаются. Следовательно, не все ошибки вызывают дефекты и баги.
Сбой или отказ — это когда система не соответствует своим требованиям. Это ошибка, которая дошла до пользователя.
Неисправность является причиной сбоя. Это может быть ошибка программирования или неправильное использование системы пользователем.
Проблемой может быть что угодно — даже то, что было согласовано и является правильным согласно задания. Это может быть то что беспокоит пользователя или что затрудняет его работу.
Недостаток / изъян обычно относится к проблеме в архитектуре или конструкции всей системы. Недостатки не являются напрямую ошибкой, но вызывают проблемы.
Например, если вы зальете дизель в бензиновый автомобиль, автомобиль перестанет работать. Тот факт, что двигатель больше не работает, является отказом. Ошибка была в том, что в автомобиль залили дизель. Пользователи и тестировщики обычно сообщают о сбоях, разработчикам нужно найти неисправности.
Используем больше слов в одном сценарии: представьте водителя автомобиля, который идет к механику с жалобой на то, что машина не едет. Пользователь сообщает о неисправности. Машина не ехала. Механик осматривает машину и подтверждает это. Он выясняет, что в бензиновом двигателе есть дизельное топливо — он определил причину. Это вина пользователя, причина неисправности в том, что он залил дизельное топливо в бензиновый двигатель! Теперь мы пытаемся найти причину, по которой произошла неисправность. Это была человеческая ошибка — водитель не обратил внимания, но проблема в том, что вы вообще можете залить дизельное топливо в бензиновый двигатель.
Несколько примеров интересных ошибок
Ошибки единиц измерения
Когда вы имеете дело с физическими системами, единицы измерения имеют значение. Есть разница, едете ли вы со скоростью 100 миль или 100 км в час. Это опыт, который команде Mars Climate Orbiter пришлось пройти нелегким путем: одна команда использовала ньютоны, а другая — фунт-силы. Это несоответствие в коммуникации между двумя программными компонентами привело к взрыву космического корабля. Это потеря в размере 327,6 млн долларов США.
Ошибки на единицу или ошибка неучтённой единицы (Off-by-One Errors)
Ошибки на единицу — это одни из самых распространённых логических ошибок в программировании. Они возникают, когда мы путаемся в границах ><=:
- Меньше или меньше либо равно
- Больше или больше либо равно
- Меньше или больше
Такие ошибки можно обнаружить, если протестировать функцию на заранее известных входных данных и сравнить фактический результат с ожидаемым. Данная ошибка коварна, так как может приводить не только к некорректным вычислениям, но и, например, к бесконечным циклам.
Хорошие юнит-тесты помогают выявлять ошибки.
Условия гонки / race condition
Состояние гонки возникает, когда два или более потоков/процессов работают с одними и теми же данными. В такой ситуации время выполнения отдельных частей процесса становится критически важным. Если повезёт, всё будет работать так, как задумано. Но если синхронизация окажется неудачной, возможны различные проблемы:
- Грязное чтение
- Неповторяющиеся чтения
- Фантомное чтение
Ошибки, вызванные гонками данных, очень трудно отловить, поскольку они зависят от точного времени выполнения разных процессов. Из-за этого их иногда называют "Гейзенбагами" (Heisenbugs) – если попытаться их поймать, они словно исчезают.
Нефункциональные проблемы
Одна из самых распространённых нефункциональных ошибок — это медленная работа кода или проекта. Определить это можно с помощью инструментов, таких как Xdebug, аналоги или на глаз.
Другая частая проблема — чрезмерное потребление памяти в браузерах. Это критично для смартфонов, где ресурсы ограничены.
Другая проблема со смартфонами — чрезмерное энергопотребление. Если приложение быстро разряжает батарею, его вряд ли оценят пользователи.
Человеческая ошибка
На мой взгляд, утверждение, что первопричиной всех бед является человеческая ошибка неверна — это слишком просто. Такая трактовка означает что мы отказываемся от улучшения системы.
Однако я думаю, что выделение четырех типов «человеческой ошибки» может привести к дополнительным размышлениям на эту тему:
- Промахи — невнимательность: возможно, нам следует сделать предупреждение более заметным, убрать беспорядок в интерфейсе или привлечь больше людей для этой работы.
- Провалы — провалы памяти: если люди забыли что-то сделать, это может быть связано с тем, что им нужно запомнить слишком много вещей или информация была озвучена очень давно. Более частое обучение или упрощение работы может помочь.
- Ошибки — непреднамеренные ошибки в принятии решений: если люди нарушают правило или процедуру, им может не хватать знаний или понимания процесса.
- Нарушение — намеренное совершение неправильных действий: если люди намеренно нарушают правила процедуры, они могут не осознавать последствий, или их обычный рабочий процесс будет значительно медленнее, если они будут постоянно следовать правилам.