Баг (bug) – это ошибка в коде или в работе программы. Разработчики описывают этим сленговым словом ситуацию, когда что-то работает неправильно, выдает неверный или непредсказуемый результат.
Не любую ошибку можно назвать багом. Этот термин обычно применяют, когда код работает, но некорректно. При этом программа запускается и даже что-то делает, в отличие от, например, синтаксической ошибки, из-за которой код попросту не запустится.
Программу с багами называют забагованной. А отладку кода – дебаггингом, то есть избавлением от багов.
Слово bug в переводе с английского означает «жук». Оно пришло в программирование из сленга инженеров, которые называли багами ошибки при работе электронных схем. А в 1947 году создательница первого компилятора Грейс Хоппер обнаружила в компьютере Mark II бабочку, закоротившую контакты. В журнале происшествий написали: «Первый случай, когда был найден настоящий баг». Так термин закрепился в компьютерной сфере.
Где встречаются баги
В разработке и тестировании. Разработчики регулярно сталкиваются с багами: современные программные продукты – сложные, а в языках программирования много неочевидных вещей. Поэтому столкнуться с багами легко. Чаще всего они становятся следствием неверного употребления команд, неправильно реализованных алгоритмов или ошибок в дизайне программы. Часть багов находят еще при разработке, другие – на этапе тестирования или даже после выпуска продукта.
В готовом программном обеспечении. Даже уже выпущенные программы часто бывают не лишены багов. Некоторые из них очень известные, возникают у многих, даже имеют собственные имена. Есть и уникальные ошибки, которые встречаются однократно. Часто баги зависят от внешних параметров: например, в одной версии операционной системы программа работает корректно, а в другой – нет.
В играх. Отдельной категорией можно назвать баги в видеоиграх: ситуации, когда игровые сцены или персонажи работают не как надо. Примеров множество: двери, которые не могут открыться, внезапные вылеты игры при достижении определенного момента, персонажи, застрявшие в текстурах или зависшие на одном месте. Даже некоторые игры, которые считаются культовыми, на этапе выхода были очень забагованными.
На сайтах. Современные сайты такие гибкие и функциональные благодаря скриптам, написанным на языках программирования. В браузере работает JavaScript, на сервере языки могут быть разными: PHP, Python, Ruby и другие. Баг может возникнуть и на стороне сервера, и в клиентской части сайта – иногда его замечают только после выпуска в продакшн. Есть даже понятие bug bounty: вознаграждение, которое компания выплачивает пользователю, нашедшему критичный баг в информационной безопасности.
Кто сталкивается с багами
В широком смысле встретить баг может любой человек, который пользуется компьютером или смартфоном. Ведь и в готовом ПО ошибки не исключены. В более узком – баги находят разработчики, они же занимаются их исправлением.
Если команда разработки пропустила ошибку, ее ищут на следующем этапе – тестировании. Тестировщики пытаются неочевидными способами воспользоваться программой, чтобы отыскать скрытые ошибки. Найденные баги описываются в специальном отчете – он называется баг-репорт. Отчет тестировщики отправляют разработчикам, чтобы те исправили ошибки.
Из-за чего возникают баги
Мы выяснили, что такое баг. Теперь поговорим о причинах, из-за которых они появляются.
- Первая и наиболее распространенная причина – ошибка разработчика. В IT-среде есть шутка: «Кто же победит: человек, венец природы… или крохотная забытая скобочка?». Маленькие недочеты могут быть очень критичными. Если поставить плюс вместо минуса в простейшем математическом вычислении, то получится совершенно другой результат.
- Иногда причиной багов становится незнание. Например, разработчик был не в курсе специфического поведения какой-нибудь конструкции в языке, поэтому воспользовался ею не совсем корректно.
- Часто баги возникают, если в команде программистов нет слаженности. Один не понимает, что написал другой, правит код по своему усмотрению и получает некорректное поведение программы.
- Наконец, дизайн программы и архитектурные ошибки тоже могут быть причиной багов. Использование неоптимальных алгоритмов, ведущих к сбоям, неверный выбор инструментов – все это может привести к забагованности.
Ворнинги, вылеты, исключения: чем отличаются от багов
Ошибки бывают разными, и это не только баги. Вот с чем еще может столкнуться программист.
Предупреждение. Это не совсем ошибка. Это скорее сообщение о риске некорректной работы. Не все предупреждения действительно указывают на что-то опасное. Например, линтеры – программы для написания чистого кода – выдают предупреждения, если человек пишет в «неправильном» стиле. На сленге предупреждения называют ворнингами от английского warning.
Исключение. Exception, или исключение, – это встроенный механизм защиты от ошибок в языках программирования. Программа выдает сообщение, что что-то пошло не так. Условия для исключений пишут сами программисты. Например, ставят защиту на ввод: если пользователь введет строку вместо числа, выбросится исключение.
Преимущество этого механизма в том, что он помогает обрабатывать проблемные ситуации еще до их появления и не допускать появления багов. Разработчик пишет, как должна вести себя программа, если столкнется с исключением. К примеру, в случае со строкой вместо числа можно прописать, чтобы программа сообщила пользователю об ошибке и попросила ввести данные в корректной форме.
Вылет. Так называют ситуацию, когда программа экстренно завершает работу из-за ошибки. Вылет может сопровождаться сообщением о сбое. Причины разные: начиная от ошибок в коде и заканчивая недостаточной мощностью компьютера, который не справляется с «тяжелой» программой.
Синтаксическая ошибка. Самый простой вариант: разработчик допустил опечатку в синтаксисе и неправильно написал какую-то конструкцию, поэтому программа не собралась. Запись оказалась неизвестна компилятору или интерпретатору. В таком случае среда программирования говорит разработчику о синтаксической ошибке и указывает, где ее искать.
Какими бывают баги
Разработчики классифицируют баги по нескольким категориям. Некоторые – скорее шуточные, другие обсуждаются всерьез. А у некоторых распространенных багов даже есть свои названия.
- Опечатка – простейший вариант. Разработчик случайно пишет не то, и вся программа работает неправильно.
- Бесконечный цикл – ситуация, когда условие для выхода из цикла никогда не наступает, и программа виснет.
- Переполнение буфера – явление, когда программе перестает хватать памяти, и она начинает пользоваться памятью за пределами выделенного ей количества.
- Состояние гонки – баг многопоточных приложений, когда несколько потоков одновременно обращаются к одному и тому же элементу и как бы «соревнуются» за доступ. Результат непредсказуем.
- Количественный баг – ошибка при работе с большим количеством действий, когда при многократных повторениях появляются баги. Например, большое количество данных распределяется неравномерно.
- Демонстрационный эффект – явление, когда программа работала нормально на этапе написания, но сломалась при демонстрации. Зачастую возникает из-за недостаточного тестирования и невнимательности: разработчик не учел какой-то сценарий.
Баги – это очень плохо?
Баги бывают забавными, не приносящими серьезного вреда. Некоторые из них, особенно игровые, порождают мемы и шутки. Но бывают и очень опасные баги, чреватые потерей денег или даже риском для жизни.
Например, баг в медицинском оборудовании может привести к трагедии. Баг в коде сайта – к утечке огромного бюджета: так было, когда блокчейн-компания Compound случайно отправила своим пользователям почти 90 миллионов долларов. А самый дорогой баг в истории – арифметическое переполнение в программной начинке ракеты-носителя «Арион-5», из-за которого ракета взорвалась в полете.
Конечно, критичность багов зависит от сферы. Если отрасль разработки связана с большими финансами или жизненно важным оборудованием, проверка качества кода в этой отрасли очень жесткая. Ведь цена ошибки очень велика.
Как избежать багов
Мы уже выяснили, что критичные баги несут опасность. Поэтому разработчики стараются не допускать их в готовом продукте:
- отлаживают программу еще на этапе создания. Хороший разработчик еще при написании кода учитывает возможные нештатные ситуации в его работе, проверяет его и пишет исключения;
- тестируют для любых ситуаций, в том числе нетривиальных. В свою очередь тестировщики находят неочевидные ситуации, в которых программа может сломаться, и сообщают о них;
- проводят юнит-тестирование для каждого компонента. Это отдельное тестирование разных частей кода – юнитов. Оно помогает понять, корректно ли работают эти компоненты – это более глубокий уровень. Ведь ошибка в одном компоненте может вызвать баги во всей программе.
Для начинающего разработчика главное – внимательность, потому что частая причина багов – опечатки. А они вероятнее, если человек еще не привык писать код. Скрупулезность и внимание к деталям помогут если не избежать багов, то серьезно сократить их количество и быстро исправить те, что остались.
Ошибки в программах – дело обыденное. Приложения зависают, вылетают, перестают запускаться. В простейшем случае пользователь решает проблему переустановкой ПО или чисткой от «мусора». Разработчикам же нужно четко понимать, что такое баг, как исправить его и каким образом получить своевременную обратную связь от пользователей.
Что такое баг?
Термин «баг» (в переводе «жук») у программистов обозначает ситуацию, когда определенный код выдает неверный результат. Причины возникновения разные: ошибки в исходном коде, интерфейсе программы или некорректной работе компилятора. Обнаруживают их на этапе отладки или уже на стадии бета-тестирования, выпуска продукта на рынок.
Варианты ошибок:
- Появилось сообщение об ошибке, программа продолжает работу.
- Приложение зависает или вылетает без каких-либо предупреждений.
- Происходит одно из событий с одновременной отправкой отчета разработчику.
Сложнее всего работать с компьютерными играми, в которых чаще используют термин «краш» (crash). Он означает критическую проблему при запуске или использовании программы. Когда говорят о багах, то чаще имеют в виду сбои графики, например, если игрок «проваливается в текстуры».
Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей
Подписаться
Классификация багов
Точка зрения пользователей часто не совпадает с мнением программистов. Так, для первых всего лишь произошел сбой, «приложение перестало работать». Кодеру же предстоит головная боль с определением источника проблемы. Ведь ошибка в программе, вероятно, проявляется лишь на конкретном железе или при сочетании с другим софтом (часто с антивирусами).
Баги делят на категории в зависимости от их критичности:
- незначительные ошибки,
- серьезные ошибки,
- showstopper.
Последние указывают на критическую программную или аппаратную проблему, из-за которой ПО теряет свою функциональность практически на 100%. Например, не удается авторизоваться через логин-пароль или перестала работать кнопка «Далее». Поэтому таким ошибкам отдают приоритет.
Также есть деление ошибок по частоте проявления. Проще всего исправлять постоянные, возникающие при одних и тех же обстоятельствах, независимо от платформы, аппаратной части компьютера или каких-то действий пользователя. Сложность возрастает при периодических сбоях, когда причиной вполне может оказаться глючная оперативная память или ошибки накопителей.
Есть вариант, когда проблема возникает только на машине конкретного клиента. Здесь приходится либо заказывать индивидуальную «работу над ошибками», либо менять компьютер. Потому что ПО для массового пользователя никто не будет редактировать из-за «одного». Только если наберется некая критическая масса одинаковых случаев.
Разновидности ошибок
Программисту еще важно деление на разные типы ошибок приложений исходя из типовых условий их эксплуатации. Например, возникающие при повышении нагрузки на процессор, в интерфейсе, в модуле обработки входящих данных. Существуют баги граничных условий, сбоя идентификаторов, банальной несовместимости с архитектурой процессора (чаще в мобильных устройствах).
Кодеры делят ошибки по сложности:
- Борбаг (Bohr Bug) – «стабильная» ошибка, легко выявляемая еще на этапе отладки или при бета-тестировании, когда речь еще не идет о выпуске стабильной версии.
- Гейзенбаг (Heisenbug) – периодически проявляющиеся, иногда надолго исчезающие баги с меняющимися свойствами, включая зависимость от программной среды, «железа».
- Мандельбаг (Mandelbug) – ошибка с энтропийным поведением, почти с непредсказуемым результатом.
- Шрединбаг (Schroedinbug) – критические баги, чаще приводящие к появлению возможности взлома, хотя внешне никак себя не проявляют.
Последняя категория ошибок – одна из основных причин регулярного обновления операционных систем Windows. Вроде бы пользователя все устраивает, а разработчик раз за разом выпускает новые пакеты исправлений. Наиболее известный баг, попортивший нервы многим кодерам, это «ошибка 2000 года» (Y2K Error). Про нее успешно забыли, но уроки извлекли.
Программисты различают и те ошибки, что мешают скомпилировать программу, и ворнинги. Вторая категория представляет собой лишь предупреждение о найденных «косяках» в коде, но они не мешают ни сборке ПО, ни последующей эксплуатации. Например, речь идет об отсутствии точки или точки запятой в синтаксисе, когда компилятор способен сам решить проблему.
Логические
Наиболее серьезная из ошибок. Такие баги приводят к изменению функционирования программы вопреки техническому заданию. К чему это приведет, никто не знает – могут записаться на диске «не те данные», некорректно измениться важные документы или предоставиться доступ к коммерческой информации без авторизации. Исправить их получится только при знании изначальной логики.
Синтаксические
Ошибки синтаксиса существуют на уровне конкретного языка программирования: C, Java, Python, Perl и т.д. Что на одной платформе работает максимум с ворнингами, для другой будет серьезной проблемой. Такие баги легко исправить на этапе компиляции, потому что инструмент не позволит «пройти дальше» некорректного участка кода.
Компиляционные
Ситуация происходит, когда код, написанный на языке высокого уровня, преобразуют в «простой», машиночитаемый. Причиной может служить как серьезная ошибка в синтаксисе, так и сбои в самом компиляторе. Такие баги устраняют на этапе разработки-отладки программ, потому что выпустить их даже для бета-тестирования не получится.
Среды выполнения
Так называемые ошибки Run-Time. Проявляются в скомпилированных программах, при запуске. Например, из-за нехватки ресурсов на машине, в результате аварийной ситуации (поломка памяти, носителя, устройств ввода-вывода). Такое происходит, если разработчик не учел реальных условий работы; придется вернуться к стадии проработки логики.
Арифметические
Одна из разновидностей логических ошибок. Происходят, когда программа при работе вычисляет массу переменных, но на каком-то этапе происходит непредвиденное. Например, деление на ноль или же приложение получает «бесконечный» результат. Изменить ситуацию получится только на уровне кода, внедренного в него алгоритма.
Ресурсные
Преимущественно к этой категории относят ошибки типа «переполнение буфера». Программист не учел необходимость очистки памяти перед размещением новых данных. Или интерфейс разработан без учета типовых разрешений экранов, и его элементы постоянно «съезжают», нарушается логика срабатывания кнопок и т.д. Исправить получится только переписыванием части кода.
Взаимодействия
Речь идет о взаимодействии с аппаратным или программным окружением. В случае с приложением для облачного ресурса программист мог допустить ошибку при использовании веб-протоколов. При постоянном появлении ошибки остается только переписывать участок кода, ответственный за появление бага, иначе программа останется неработоспособной.
Что такое исключение
Снизить риски появления непредвиденных ошибок позволяет внедрение в программу исключений. Это события, при возникновении которых начинается «неправильное» поведение. Такой механизм позволяет систематизировать обработку багов независимо от типа приложения, платформы и иных условий. И разработать единую систему реагирования, например, со стороны операционки.
Существуют программные и аппаратные исключения. Первые генерируются самой программой и ОС, под которой она запущена. К аппаратным относятся те, что создаются процессором. Например, деление на 0, переполнение буфера, обращение к невыделенной памяти. Исключениями кодеры охватывают наиболее серьезные, критические баги.
Как избежать ошибок?
Существует два эффективных способа избежать проблем еще на стадии разработки. Первый – это отладка при помощи специальных программ. Они отображают результаты выполнения в цифрах, которые объективно показывают кодеру, правильно ли был обработан следующий участок кода или нужно искать закравшуюся ошибку.
Второй способ представляет собой привлечение специальных людей, тестировщиков. Они помогут разобраться с работоспособностью интерфейса в различных ситуациях, на разных платформах. Это происходит максимально приближенно к реальным условиям. Поэтому любой серьезный продукт проходит такую стадию обязательно.
Выводы
Баги – сопутствующий фактор любой разработки. Большую их часть пользователь не видит, потому что устраняются они еще в «лаборатории», на этапе альфа-тестирования. В бета-версии попадают уже незначительные ошибки, например, связанные с конкретными «узкими» условиями эксплуатации. Редкие проблемы помогают решать краш-репорты – отчеты, отсылаемые производителю самой программой.
Готовая программа не всегда работает как надо. Бывает, возникают баги, предупреждения, исключения. В итоге программа зависает, дает сбой или вылетает. Но это не конец света. Любую ошибку в коде можно исправить, если знать, почему она возникла.
Программная ошибка: что это и почему возникает
Программная ошибка — это дефект в коде. Из-за него программа сбоит или выдает неверные результаты. Некоторые ошибки серьезные — например, блокируют логин и пароль, из-за чего пользователь не может попасть в личный кабинет. А другие незаметны. Некоторое время программа работает как будто бы исправно — и только потом начинает глючить.
Ошибка в программировании — это зачастую ошибки разработчиков, которые находят тестировщики. Запускают разные тесты и отладку, чтобы определить источники проблемы.
Научитесь находить ошибки в приложениях и на сайтах до того, как ими начнут пользоваться клиенты. Для этого освойте профессию «Инженер по тестированию». Изучать язык программирования необязательно. Тестировщик работает с готовыми сайтами, приложениями, сервисами, а не с кодом. В программе от Skypro: четыре проекта для портфолио, практика с обратной связью, все основные инструменты тестировщика.
Ошибки часто называют багами, но подразумевают под ними разное, например:
❗ Ворнинги, или предупреждения. Возникают, когда программа начинает вести себя не так, как задумывалось. Не являются критичными ошибками. Программа с ворнингами работает, но с аномалиями.
❗ Исключения. Это не ошибки, а особые ситуации, которые нужно обработать.
❗ Синтаксические ошибки. Это ошибка в программе, связанная с написанием кода. Пример: программист забыл поставить точку или неверно написал название оператора. Если не исправить, код программы не запустится, а останется просто текстом.
Классификация багов
У багов есть два атрибута — серьезности (Severity) и приоритета (Priority). Серьезность касается технической стороны, а приоритет — организационной.
🚨 По серьезности. Атрибут показывает, как сильно ошибка влияет на общую функциональность программы. Чем выше значение атрибута, тем хуже.
По серьезности баги классифицируют так:
- Blocker — блокирующий баг. Программа запускается, но спустя время баг останавливает ее выполнение. Чтобы снова пользоваться программой, блокирующую ошибку в коде устраняют.
- Critical — критический баг. Нарушает функциональность программы. Появляется в разных частях кода, из-за этого основные функции не выполняются.
- Major — существенный баг. Не нарушает, но затрудняет работу основного функционала программы либо не дает функциям выполняться так, как задумано.
- Minor — незначительный баг. Слабо влияет на функционал программы, но может нарушать работу некоторых дополнительных функций.
- Trivial — тривиальный баг. На работу программы не влияет, но ухудшает общее впечатление. Например, на экране появляются посторонние символы или всё рябит.
🚦 По приоритету. Атрибут показывает, как быстро баг необходимо исправить, пока он не нанес программе приличный ущерб. Бывает таким:
- Top — наивысший. Такой баг — суперсерьезный, потому что может обвалить всю программу. Его устраняют в первую очередь.
- High — высокий. Может затруднить работу программы или ее функций, устраняют как можно скорее.
- Normal — обычный. Баг программу не ломает, просто где-то что-то будет работать не совсем верно. Устраняют в штатном порядке.
- Low — низкий. Баг не влияет на программу. Исправляют, только если у команды есть на это время.
Типы ошибок в программе
🧨 Логические. Приводят к тому, что программа зависает, работает не так, как надо, или выдает неожиданные результаты — например, не записывает файл, а стирает.
Логические ошибки коварны: их трудно обнаружить. Программа выглядит так, будто в ней всё правильно, но при этом работает некорректно. Чтобы победить логические ошибки, специалист должен хорошо ориентироваться в коде программы.
🧨 Синтаксические. Это опечатки в названиях операторов, пропущенные запятые или кавычки. Безобидные ошибки: их обнаруживают и подсвечивают в коде компиляторы, а программисту остается исправить.
🧨 Взаимодействия. Это ошибка в участке кода, который отвечает за взаимодействие с аппаратным или программным окружением. Такая ошибка возникает, например, если неправильно использовать веб-протоколы. Исправляется элементарно: разработчик переписывает нужный кусок кода.
🧨 Компиляционные. Любая программа — это текст. Чтобы он заработал как программа, используют компилятор. Он преобразует программный код в машинный, но одновременно может вызывать ошибки.
Компиляционные баги появляются, если что-то не так с компилятором или в коде есть синтаксические ошибки. Компилятор будто ругается: «Не понимаю, что тут написано. Не знаю, как обработать».
🧨 Ошибки среды выполнения. Возникают, когда программа скомпилирована и уже выглядит как файл — жми и работай. Юзер запускает файл, а программа тормозит и виснет. Причина — нехватка ресурсов, например памяти или буфера.
Такой баг — ошибка разработчика. Он не предвидел реальные условия развертывания программы. Теперь ему надо вернуться в исходный код и поправить фрагмент.
🧨 Арифметические. Бывает, в коде есть числовые переменные и математические формулы. Если где-то проблема — не указаны константы или округление сработало не так, возникает баг. Надо лезть в код и проверять математику.
Инженер-тестировщик: новая работа через 9 месяцев
Получится, даже если у вас нет опыта в IT
Узнать больше
Что такое исключения в программах
Это механизм, который помогает программе обрабатывать нестандартную ситуацию и при этом не вылетать. Идеально, если программист предусмотрел все возможные ситуации. Но так бывает редко, поэтому лучше использовать специальный обработчик. Он обработает исключения так, что программа продолжит работать.
Как это происходит:
- Когда программист кодит, то продумывает, в какой части программы может вылезти ошибка.
- В этой части пишет специальный фрагмент, который предупредит компьютер, что ошибка — вполне ожидаемое явление и резко обрывать программу не нужно.
- Когда юзер запустит программу и появится ошибка, компьютер увидит заранее подготовленное предупреждение программиста. Продолжит выполнять алгоритм так, словно никакого бага и не было.
Исключения бывают программными и аппаратными:
- Аппаратные создает процессор. К ним относят деление на ноль, выход за границы массива, обращение к невыделенной памяти.
- Программные создает операционка и приложения. Возникают, когда программа их инициирует: аномальная ситуация возникла — программа создала исключение.
Как контролировать баги в программе
🔧 Следите за компилятором. Когда компилятор преобразует текст программы в машинный код, то подсвечивает в нём сомнительные участки, которые способны вызывать баги. Некоторые предупреждения не обозначают баг как таковой, а только говорят: «Тут что-то подозрительное». Всё подозрительное надо изучать и прорабатывать, чтобы не было проблемы в будущем.
🔧 Используйте отладчик. Это программа, которая без участия айтишника проверяет, исправно ли работает алгоритм. В случае чего сообщает об ошибках. Например, отладчик используют для построчного выполнения программы. Вместе с тем проверяют значения переменных: фактические сравнивают с ожидаемыми. Если что-то не сходится, ищут баги и исправляют.
🔧 Проводите юнит-тесты. Это когда разработчик или тестировщик описывает ситуации для каждого компонента и указывает, к какому результату должна привести программа. Потом запускает проверку. Если результат не совпадает с ожидаемым, появляется предупреждение. Дальше программисты находят и устраняют проблему.
Ключевое: что такое ошибки в программировании
- Ошибка в программировании — это дефект кода, баг, который может вызывать в программе сбои и неожиданное поведение.
- По серьезности баги делятся на блокирующие, критические, существенные, незначительные, тривиальные. По приоритету — на наивысший, высокий, обычный, низкий.
- Ошибки в коде могут быть разными, например связанные с логикой программы. Или с математическими вычислениями — логические. Еще бывают синтаксические, ошибки взаимодействия, компиляционные и ошибки среды выполнения.
- Некоторые ошибки помогают ловить обработчики исключений.
- Чтобы находить ошибки в коде, тестировщики используют компиляторы, отладчики и пишут юнит-тесты.
Где используется термин? Сегодня каждому известно, что такое баг. И если изначально слово было характерно для области инженерии и работы с компьютерами, то затем этот синоним «ошибки» без проблем проник в обыденную жизнь.
На что обратить внимание? Если говорить конкретно о программировании, то борьба с багами – дело крайне необходимое. Ведь неудовлетворительное качество кода может самым негативным образом повлиять на жизнь людей.
В статье рассказывается:
- Происхождение термина «баг»
- Где появляются баги
- Классификация ошибок в программировании
- Необходимость борьбы с багами
-
Пройди тест и узнай, какая сфера тебе подходит:
айти, дизайн или маркетинг.Бесплатно от Geekbrains
Происхождение термина «баг»
Компьютерный баг, также известный как программный, представляет собой ошибку, которая возникает случайно в ходе написания программного обеспечения или при разработке компьютерного оборудования.
Баги являются следствием неверных действий, выполненных человеком при проектировании аппаратного оборудования или программных инструментов, используемых в свою очередь для создания компьютерных приложений, прошивок и операционных систем. Программное обеспечение, содержащее баги, называют забагованным, а процесс удаления этих ошибок, соответственно, дебаггингом (отладкой).
Выяснив, что такое баг, далее углубимся в историю этого термина. Само слово bug переводится с английского как «жук». Термин вошел в употребление задолго до появления первых компьютеров. На данный момент неизвестно, кто первым стал использовать его для обозначения инженерных дефектов.
Существуют различные версии происхождения этого термина. Достаточно распространенным является мнение, что слово «баг» применительно к аппаратным устройствам впервые использовал Томас Эдисон в попытке отыскать внутри своего аппарата забравшегося туда таракана. Насекомое в итоге так и не было найдено, а причина на самом деле заключалась в аппаратном сбое.
Позднее ученый термином «баг» обозначал какую-то сложную инженерную проблему, требующую решения. Этот факт зафиксирован в личных дневниках Эдисона.
Существует еще одна теория происхождения термина, которая связана на этот раз с фольклором и детскими страхами. Так, некоторые родители в Великобритании и США используют «баги» для запугивания своих детей, чтобы они были послушными.
В России такую же роль выполняет слово «бука». Судя по народным легендам, эти существа представляют собой чудовищ с запутанной шерстью, напоминающих темных медведей. Похожие монстры чаще всего встречаются в американских мультфильмах. Они, по мнению самих детей, могут скрываться в дымоходах, трубах и темных уголках комнаты. Эта история показывает, что термин «баг» может наделяться самыми разными смыслами.
Скачать
файл
В компьютерную терминологию «баг» вошел из сленга инженеров, которые называли этим словом ошибки при работе электронных схем. В 1947 году разработчик первого в мире компилятора Грейс Хоппер обнаружила внутри компьютера Mark II бабочку, послужившую причиной короткого замыкания. Это событие было затем зафиксировано в журнале происшествий как «первый случай, когда был найден настоящий баг». Таким образом термин прочно закрепился сфере IT.
Где появляются баги
- В процессе разработки и тестирования ПО программисты периодически сталкиваются с багами. Современные программы достаточно сложны, а языки программирования обладают множеством неочевидных моментов. Оба этих фактора напрямую способствует возникновению непреднамеренных ошибок. Чаще всего баги появляются из-за неправильного использования команд, неверной реализации алгоритмов, а также по причине допущенных ошибок в дизайне ПО. Иногда необходимость в дебаггинге появляется еще на этапе разработки. В других случаях баги обнаруживаются лишь во время тестирования или даже после выпуска продукта.
- Даже протестированные и выпущенные на рынок программы нередко содержат баги. Часть из них получает определенную известность. Так у багов появляются запоминающиеся имена. В других же случаях мы имеем дело с достаточно редкими и даже уникальными прецедентами. Зачастую вероятность появления бага зависит от внешних факторов, таких как версия операционной системы, в которой выполняется программа.
- Ошибки нередко содержатся и в компьютерных играх. Это заметно по некорректной реализации игровых сцен и персонажей. Например, дверь из одной локации в другую не открывается, интерактивные объекты застревают в текстурах и не могут сдвинуться с места, либо игра просто-напросто вылетает с ошибкой. Даже культовые игровые продукты, уже выпущенные на рынок, могут в итоге оказаться забагованными.
- На сайтах. Скрипты, написанные на современных языках программирования, придают таким площадкам больше гибкости и функциональности. Фронтенд-разработчики пользуются JavaScript, а для реализации серверных функций применяются PHP, Python, Ruby и др. Однако баги могут возникать как на стороне сервера, так и на стороне клиента. Иногда их обнаруживают только после выпуска готового сайта в продакшн. Существует даже особый термин Bug bounty. Под ним понимается вознаграждение, которое разработчик выплачивает пользователю, обнаружившему критическую уязвимость в информационной безопасности.
Топ-30 самых востребованных и высокооплачиваемых профессий 2023
Поможет разобраться в актуальной ситуации на рынке труда
Подборка 50+ ресурсов об IT-сфере
Только лучшие телеграм-каналы, каналы Youtube, подкасты, форумы и многое другое для того, чтобы узнавать новое про IT
ТОП 50+ сервисов и приложений от Geekbrains
Безопасные и надежные программы для работы в наши дни
Уже скачали 21137
В целом ошибку может обнаружить абсолютно любой пользователь компьютера или мобильного устройства, поскольку даже готовые и протестированные программные продукты нередко бывают забагованными. Но профессионально обнаружением багов и отладкой занимаются сами разработчики.
Классификация ошибок в программировании
Мнения обычных пользователей и профессиональных разработчиков часто расходятся. Например, с точки зрения пользователя простой программный сбой, в результате которого приложение аварийно закрылось, уже будет являться ошибкой. Программист же должен потратить много времени на выяснение причины обнаруженной проблемы.
Сбой может возникать как на определенном оборудовании, так и в сочетании с работой другого ПО. Поэтому есть смысл детально рассмотреть различные классификации ошибок.
Итак, баги могут быть классифицированы по следующим критериям.
Степень критичности
Здесь ошибки принято разделять на:
- незначительные,
- серьезные,
- критические.
Последнюю категорию также называют showstoppers. К ней относятся наиболее критические проблемы, которые практически всегда приводят к остановке работы программы. Например, становится невозможной авторизация по логину и паролю, или отсутствует реакция системы на нажатие на кнопку «Далее». Данные ошибки имеют наибольший приоритет отладки.
Частота проявления
Наиболее легко устраняются проблемы, возникающие постоянно в одних и тех же обстоятельствах вне зависимости от программного или аппаратного обеспечения, а также от пользовательских действий. Но если ошибка периодически вызывается, например, неисправным модулем оперативной памяти, сложность такой ошибки возрастает.
Условия использования программы
Разработчик должен четко знать, в каких условиях эксплуатировалось приложение. Исходя из этого ошибки также могут быть разными. К примеру, сбои регулярно возникают при высокой нагрузке на процессор, при работе ПО в определенном интерфейсе, в модуле обработки входящих данных и т. п. Различают также ошибки граничных условий, сбой идентификаторов и обычную несовместимость программы с архитектурой процессора.
Сложность ошибки
Существует 4 уровня ошибок:
Наиболее легко обнаруживается борбаг (Bohr Bug). Ошибки данного типа видны еще на стадии отладки или тестирования.
Уровнем выше находятся гейзенбаг (Heisenbug). Такие сбои возникают периодически и иногда пропадают сами собой. Их свойства при этом меняются в зависимости как от программной, так и от аппаратной составляющей.
Читайте также
Ошибки мандельбаг (Mandelbug) уже приводят к непредсказуемому результату.
Наиболее критическими являются шрединбаг (Schroedinbug). Эти баги хотя и могут быть незаметными, способны повысить риск взлома программы. Вероятность возникновения ошибок из данной категории служит одной из главных причин частого обновления ОС Windows. Пользователь при этом может и не подозревать о серьезной опасности, нависшей над его компьютером. Характерным примером такой ошибки является так называемая «ошибка 2000 года» (Y2K Error), о которой, впрочем, все уже забыли.
Тип ошибки
Наиболее серьезными считаются логические баги. Они меняют функционал программы вопреки изначальному техзаданию. Заранее неизвестно, к чему такие ошибки приведут, в чем и заключается главная опасность. К примеру, конфиденциальные данные, хранящиеся в программе, вдруг станут общедоступными для чтения и записи. Дебаггинг в данном случае можно произвести, лишь зная изначальную логику ПО.
Только до 8.06
Скачай подборку тестов, чтобы определить свои самые конкурентные скиллы
Список документов:
Тест на определение компетенций
Чек-лист «Как избежать обмана при трудоустройстве»
Инструкция по выходу из выгорания
Чтобы получить файл, укажите e-mail:
Подтвердите, что вы не робот,
указав номер телефона:
Уже скачали 7503
Синтаксическими называют ошибки, возникшие на уровне конкретного языка программирования. Если, например, в среде Java разработчик увидит лишь предупреждения, то программист C# уже столкнется с критическим багом. Проблема легко обнаруживается и исправляется на стадии компиляции.
В свою очередь компиляционные ошибки возникают на этапе преобразовании высокоуровневого кода к виду машинного языка. Это может произойти вследствие грубого несоблюдения синтаксиса программистом либо из-за сбоя в компиляторе. Дебаггинг в таком случае производится на стадии отладки, поскольку выпуск в продакшн забагованной программы невозможен технически.
Ошибки среды выполнения (Run-Time) могут появляться при запуске скомпилированных программ в случае критической нехватки ресурсов на компьютере пользователя либо вследствие аварийной ситуации (выхода из строя модуля оперативной памяти, носителя, устройств ввода-вывода и т. д.). Это происходит, когда изначально не учтены реальные условия эксплуатации. В таком случае программист должен заново проработать логику программы.
Арифметические ошибки представляют особую разновидность логических сбоев. Они возникают в ходе вычисления переменных, приводящего к непредвиденному результату. Характерным примером можно назвать деление на ноль. Исправить эту ошибку можно лишь на уровне кода.
Ресурсные ошибки в основном возникают из-за неправильной очистки памяти перед записью новых данных. Происходит так называемое переполнение буфера. Также причиной может послужить неправильно подобранный интерфейс, который не учитывает типовые разрешения экранов. В итоге это приводит к нарушению логики срабатывания интерактивных элементов. Избавиться от этих багов можно, только переписав определенную часть кода.
Наконец, ошибки взаимодействия могут возникать в аппаратном или программном окружении (например, при использовании веб-протоколов в приложении для облачного ресурса). Периодическое появление такого бага потребует внесения изменений в соответствующий участок кода. В противном случае программа работать должным образом не будет.
Необходимость борьбы с багами
В современном мире ошибки в программном обеспечении являются серьезной проблемой, так как они могут привести к значительным экономическим и жизненным последствиям. По подсчетам, проведенным Национальным институтом стандартов и технологий около 20 лет назад, ежегодно выявляемые в ПО баги обходились американской казне почти в 60 млн долларов. И вполне вероятно, что эти расходы со временем только выросли.
Читайте также
Несмотря на то, что количественно оценить влияние ошибок сложно, вполне очевидно, что неправильно работающее ПО может существенно снизить производительность. Более того, программные баги способны стать причиной аварий на транспорте или нарушений в работе жизненно важной инфраструктуры (например, крупной электростанции).
Ошибки в ПО могут привести к трагедиям (например, в медицинском оборудовании) или к потере крупных сумм денег. Так, утечка почти 90 миллионов долларов однажды произошла по вине блокчейн-компании Compound, из-за ошибки в коде сайта случайно отправившей пользователям столь огромную сумму. Но наиболее дорогостоящим признан баг, повлекший за собой в результате обычного арифметического переполнения катастрофу ракеты-носителя «Арион-5».
В зависимости от отрасли, в которой разрабатывается программное обеспечение, проверка качества кода может быть очень жесткой, особенно если речь идет о сферах с большими финансовыми потоками или жизненно важным оборудованием. Для предотвращения возникновения ошибок в готовом продукте разработчики проводят ряд мероприятий, среди которых:
- отладка ПО на этапе создания и написание исключений, учитывающих всевозможные внештатные ситуации;
- тестирование кода в самых разных условиях, включая нетривиальные, и обнаружение в процессе этого неочевидных сценариев, потенциально способных привести к сбою в программе;
- тестирование разных фрагментов кода (юнитов), позволяющее выявить корректность работы этих компонентов на глубоком уровне.
Итак, подытожим. Слово bug является широко используемым термином в среде программистов и возникло еще до появления компьютеров, когда оно обозначало физическую поломку устройства из-за воздействия внешних факторов. Сегодня программистам крайне важно знать, что такое баги и как с ними бороться. Своевременный дебаггинг в итоге способен предотвратить негативные и при том весьма серьезные последствия.
#Руководства
- 30 июн 2020
-
14
Что такое баги, ворнинги и исключения в программировании
Разбираемся, какие бывают типы ошибок в программировании и как с ними справляться.
vlada_maestro / shutterstock
Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Многим известно слово баг (англ. bug — жук), которым называют ошибки в программах. Однако баг — это не совсем ошибка, а скорее неожиданный результат работы. Также есть и другие термины: ворнинг, исключение, утечка.
В этой статье мы на примере C++ разберём, что же значат все эти слова и как эти проблемы влияют на эффективность программы.
Словом «ошибка» (англ. error) можно описать любую проблему, но чаще всего под ним подразумевают синтаксическую ошибку — некорректно написанный код, который даже не скомпилируется:
//В конце команды забыли поставить точку с запятой (;)
int a = 5
Компилятор тут же скажет, что в коде ошибка и скорее всего не хватает запятой или точки с запятой.
Также существуют ворнинги (англ. warning — предупреждение). Они не являются ошибками, поэтому программа всё равно будет собрана. Вот пример:
int main()
{
//Мы создаём две переменные, которые просто занимают память и никак не используются
int a, b;
}
Мы можем попросить компилятор показать нам все предупреждения с помощью флага -Wall:
Предупреждения не являются чем-то критичным, но могут иметь негативные последствия. Например, ваша программа будет использовать больше памяти, чем должна. Так как C++ нужен в том числе и для разработки высоконагруженных систем, этого допускать нельзя.
После восклицательного знака в треугольнике — количество предупреждений
Третий вид ошибок — ошибки сегментации (англ. segmentation fault, сокр. segfault, жарг. сегфолт). Они возникают, если программа пытается записать что-то в ячейку, недоступную для записи. Например:
//Создаём константный массив символов
const char * s = "Hello World";
//Если мы попытаемся перезаписать значение константы, компилятор выдаст ошибку
//Но с помощью указателей мы можем обойти её, поэтому программа успешно скомпилируется
//Однако во время работы она будет выдавать ошибку сегментации
* (char *) s = 'H';
Вот результат работы такого кода:
Мы выяснили, что баг — это не совсем ошибка, а скорее неожиданное поведение программы или результат такого поведения. Баги могут быть чем-то забавным или неприятным. Например, как в играх:
Но они могут привести и к более серьёзным последствиям. Если неправильно спроектировать работу многопоточного приложения, то потоки будут постоянно опережать друг друга. Например, сообщение об ошибке из одного потока может опоздать на миллисекунду, из-за чего второй поток подумает, что никакой ошибки не было, и продолжит работу.
Если ваш код приводит в действие какое-нибудь потенциально опасное устройство, то ценой такой ошибки может быть чья-нибудь жизнь. Такое случилось с кодом для аппарата лучевой терапии Therac-25 — как минимум два человека умерло и ещё больше пострадали из-за превышения дозы радиации.
Также во время работы программы могут возникать ситуации, которые мешают корректной работе программы. Например, если вы просите пользователя ввести число, а он вводит строку.
Конвертировать введённое значение не всегда возможно, поэтому функция, которая занимается преобразованием, «выбрасывает» исключение (англ. exception). Это специальное сообщение говорит о том, что что-то идёт не так.
Если разработчик не описывает логику работы программы при вы выбрасывании исключения, то программа аварийно закрывается. Подробнее мы рассказали об этом в статье про ввод и конвертацию в C++.
Одно из самых известных исключений — переполнение стека (англ. stack overflow). В честь него даже назвали сайт, на котором программисты ищут помощь в решении своих проблем.
int main()
{
//Бесконечная рекурсия - одна из причин переполнения стека вызовов
main();
}
Компилятор C++ при этом может выдать ошибку сегментации, а не сообщение о переполнении стека:
Вот аналогичный код на языке C#:
class Program
{
static void Main(string[] args)
{
Main(args);
}
}
Однако сообщение в этот раз более конкретное:
В обоих случаях программа завершается, потому что не может дальше корректно работать.
Похожая ситуация — переполнение буфера (англ. buffer overflow). Она происходит, когда записываемое значение больше выделенной области в памяти.
//Пробуем записать в переменную типа int значение, которое превышает лимит
//Константа INT_MAX находится в библиотеке climits
int a = INT_MAX + 1;
Обратите внимание, что мы получили предупреждение об арифметическом переполнении (англ. integer overflow):
Тем не менее программа скомпилировалась. Если же такая ситуация возникнет во время вычислений, то мы можем не получить предупреждения.
Арифметическое переполнение стало причиной одной из самых дорогих аварий, произошедших из-за ошибки в коде. В 1996 году ракета-носитель «Ариан-5» взорвалась на 40-й секунде полёта — потери оценивают в 360–500 миллионов долларов.
К сожалению, вручную всё это заметить и исправить не получится. Однако существуют различные инструменты и технологии, которые могут помочь.
Один из таких инструментов — отладчик. Он помогает контролировать ход работы программы, чтобы отслеживать разные показатели.
Второй, более эффективный метод — unit-тесты. Они представляют из себя набор описанных ситуаций для каждого компонента программы с указанием ожидаемого поведения.
Например, у вас есть функция sum (int a, int b), которая возвращает сумму двух чисел. Вы можете написать unit-тесты, чтобы проверять следующие ситуации:
Входные данные | Ожидаемый результат |
---|---|
5, 10 | 15 |
99, 99 | 198 |
8, -9 | -1 |
-1, -1 | -2 |
fff, 8 | IllegalArgumentException |
Если какой-то из этих тестов не пройден, вы узнаете об этом и сможете всё исправить. Это намного быстрее, чем проверять всё вручную.
Ошибок существует слишком много. При этом самые опасные тяжелее обнаружить, что только усугубляет ситуацию.
Научитесь: Профессия Разработчик на C++ с нуля
Узнать больше