Similar presentations:
Что такое баг и чем он опасен
1.
2.
Сегодня каждому известно, что такое баг. И если изначально словобыло характерно для области инженерии и работы с
компьютерами, то затем этот синоним «ошибки» без проблем
проник в обыденную жизнь.
Если говорить конкретно о программировании, то борьба с багами
– дело крайне необходимое. Ведь неудовлетворительное качество
кода может самым негативным образом повлиять на жизнь
людей.
3.
Происхождение термина «баг»Компьютерный баг, также известный как программный,
представляет собой ошибку, которая возникает случайно в ходе
написания программного обеспечения или при разработке
компьютерного оборудования.
Баги являются следствием неверных действий, выполненных
человеком при проектировании аппаратного оборудования или
программных инструментов, используемых в свою очередь для
создания компьютерных приложений, прошивок и операционных
систем. Программное обеспечение, содержащее баги, называют
забагованным, а процесс удаления этих ошибок, соответственно,
дебаггингом (отладкой).
4.
Выяснив, что такое баг, далее углубимся в историю этого термина.Само слово bug переводится с английского как «жук». Термин
вошел в употребление задолго до появления первых
компьютеров. На данный момент неизвестно, кто первым стал
использовать его для обозначения инженерных дефектов.
Существуют различные версии происхождения этого термина.
Достаточно распространенным является мнение, что слово «баг»
применительно к аппаратным устройствам впервые использовал
Томас Эдисон в попытке отыскать внутри своего аппарата
забравшегося туда таракана. Насекомое в итоге так и не было
найдено, а причина на самом деле заключалась в аппаратном
сбое.
Позднее ученый термином «баг» обозначал какую-то сложную
инженерную проблему, требующую решения. Этот факт
зафиксирован в личных дневниках Эдисона.
5.
Существует еще одна теория происхождения термина, котораясвязана на этот раз с фольклором и детскими страхами. Так,
некоторые родители в Великобритании и США используют «баги»
для запугивания своих детей, чтобы они были послушными.
В России такую же роль выполняет слово «бука». Судя по
народным легендам, эти существа представляют собой чудовищ с
запутанной шерстью, напоминающих темных медведей. Похожие
монстры чаще всего встречаются в американских мультфильмах.
Они, по мнению самих детей, могут скрываться в дымоходах,
трубах и темных уголках комнаты. Эта история показывает, что
термин «баг» может наделяться самыми разными смыслами.
6.
В компьютерную терминологию «баг» вошел из сленгаинженеров, которые называли этим словом ошибки при работе
электронных схем. В 1947 году разработчик первого в мире
компилятора Грейс Хоппер обнаружила внутри компьютера Mark
II бабочку, послужившую причиной короткого замыкания. Это
событие было затем зафиксировано в журнале происшествий как
«первый случай, когда был найден настоящий баг». Таким
образом термин прочно закрепился сфере IT.
7.
Где появляются баги• В процессе разработки и тестирования ПО программисты
периодически сталкиваются с багами. Современные программы
достаточно сложны, а языки программирования обладают
множеством неочевидных моментов. Оба этих фактора
напрямую способствует возникновению непреднамеренных
ошибок. Чаще всего баги появляются из-за неправильного
использования команд, неверной реализации алгоритмов, а
также по причине допущенных ошибок в дизайне ПО. Иногда
необходимость в дебаггинге появляется еще на этапе
разработки. В других случаях баги обнаруживаются лишь во
время тестирования или даже после выпуска продукта.
8.
Где появляются баги• Даже протестированные и выпущенные на рынок программы
нередко содержат баги. Часть из них получает определенную
известность. Так у багов появляются запоминающиеся имена. В
других же случаях мы имеем дело с достаточно редкими и даже
уникальными прецедентами. Зачастую вероятность появления
бага зависит от внешних факторов, таких как версия
операционной системы, в которой выполняется программа.
9.
Где появляются баги• Ошибки нередко содержатся и в компьютерных играх. Это
заметно по некорректной реализации игровых сцен и
персонажей. Например, дверь из одной локации в другую не
открывается, интерактивные объекты застревают в текстурах и
не могут сдвинуться с места, либо игра просто-напросто
вылетает с ошибкой. Даже культовые игровые продукты, уже
выпущенные на рынок, могут в итоге оказаться забагованными.
10.
Где появляются баги• На сайтах. Скрипты, написанные на современных языках
программирования, придают таким площадкам больше гибкости
и функциональности. Фронтенд-разработчики пользуются
JavaScript, а для реализации серверных функций применяются
PHP, Python, Ruby и др. Однако баги могут возникать как на
стороне сервера, так и на стороне клиента. Иногда их
обнаруживают только после выпуска готового сайта в продакшн.
Существует даже особый термин Bug bounty. Под ним
понимается вознаграждение, которое разработчик выплачивает
пользователю, обнаружившему критическую уязвимость в
информационной безопасности.
11.
В целом ошибку может обнаружить абсолютно любойпользователь компьютера или мобильного устройства, поскольку
даже готовые и протестированные программные продукты
нередко бывают забагованными. Но профессионально
обнаружением багов и отладкой занимаются сами разработчики.
12.
Классификация ошибок впрограммировании
Мнения обычных пользователей и профессиональных
разработчиков часто расходятся. Например, с точки зрения
пользователя простой программный сбой, в результате которого
приложение аварийно закрылось, уже будет являться ошибкой.
Программист же должен потратить много времени на выяснение
причины обнаруженной проблемы.
Сбой может возникать как на определенном оборудовании, так и
в сочетании с работой другого ПО. Поэтому есть смысл детально
рассмотреть различные классификации ошибок.
Итак, баги могут быть классифицированы по следующим
критериям.
13.
Сложность ошибкиСуществует 4 уровня ошибок:
• Наиболее легко обнаруживается борбаг (Bohr Bug). Ошибки
данного типа видны еще на стадии отладки или тестирования.
• Уровнем выше находятся гейзенбаг (Heisenbug). Такие сбои
возникают периодически и иногда пропадают сами собой. Их
свойства при этом меняются в зависимости как от программной,
так и от аппаратной составляющей.
14.
Сложность ошибки• Ошибки мандельбаг (Mandelbug) уже приводят к
непредсказуемому результату.
• Наиболее критическими являются шрединбаг (Schroedinbug).
Эти баги хотя и могут быть незаметными, способны повысить
риск взлома программы. Вероятность возникновения ошибок из
данной категории служит одной из главных причин частого
обновления ОС Windows. Пользователь при этом может и не
подозревать о серьезной опасности, нависшей над его
компьютером. Характерным примером такой ошибки является
так называемая «ошибка 2000 года» (Y2K Error), о которой,
впрочем, все уже забыли.
15.
Тип ошибки• Наиболее серьезными считаются логические баги. Они меняют
функционал программы вопреки изначальному техзаданию.
Заранее неизвестно, к чему такие ошибки приведут, в чем и
заключается главная опасность. К примеру, конфиденциальные
данные, хранящиеся в программе, вдруг станут общедоступными
для чтения и записи. Дебаггинг в данном случае можно
произвести, лишь зная изначальную логику ПО.
16.
Тип ошибки• Синтаксическими называют ошибки, возникшие на уровне
конкретного языка программирования. Если, например, в среде Java
разработчик увидит лишь предупреждения, то программист C# уже
столкнется с критическим багом. Проблема легко обнаруживается и
исправляется на стадии компиляции.
• В свою очередь компиляционные ошибки возникают на этапе
преобразовании высокоуровневого кода к виду машинного языка. Это
может произойти вследствие грубого несоблюдения синтаксиса
программистом либо из-за сбоя в компиляторе. Дебаггинг в таком
случае производится на стадии отладки, поскольку выпуск в
продакшн забагованной программы невозможен технически.
17.
Тип ошибки• Ошибки среды выполнения (Run-Time) могут появляться при
запуске скомпилированных программ в случае критической
нехватки ресурсов на компьютере пользователя либо вследствие
аварийной ситуации (выхода из строя модуля оперативной
памяти, носителя, устройств ввода-вывода и т. д.). Это
происходит, когда изначально не учтены реальные условия
эксплуатации. В таком случае программист должен заново
проработать логику программы.
18.
Тип ошибки• Арифметические ошибки представляют особую разновидность
логических сбоев. Они возникают в ходе вычисления
переменных, приводящего к непредвиденному результату.
Характерным примером можно назвать деление на ноль.
Исправить эту ошибку можно лишь на уровне кода.
19.
Тип ошибки• Ресурсные ошибки в основном возникают из-за неправильной
очистки памяти перед записью новых данных. Происходит так
называемое переполнение буфера. Также причиной может
послужить неправильно подобранный интерфейс, который не
учитывает типовые разрешения экранов. В итоге это приводит к
нарушению логики срабатывания интерактивных элементов.
Избавиться от этих багов можно, только переписав
определенную часть кода.
20.
Тип ошибки• Наконец, ошибки взаимодействия могут возникать в аппаратном
или программном окружении (например, при использовании
веб-протоколов в приложении для облачного ресурса).
Периодическое появление такого бага потребует внесения
изменений в соответствующий участок кода. В противном случае
программа работать должным образом не будет.
21.
Необходимость борьбы с багами• Ошибки в ПО могут привести к трагедиям (например, в
медицинском оборудовании) или к потере крупных сумм
денег. Так, утечка почти 90 миллионов долларов
однажды произошла по вине блокчейн-компании
Compound, из-за ошибки в коде сайта случайно
отправившей пользователям столь огромную сумму. Но
наиболее дорогостоящим признан баг, повлекший за собой
в результате обычного арифметического переполнения
катастрофу ракеты-носителя «Арион-5».
22.
В зависимости от отрасли, в которой разрабатываетсяпрограммное обеспечение, проверка качества кода может быть
очень жесткой, особенно если речь идет о сферах с большими
финансовыми потоками или жизненно важным оборудованием.
Для предотвращения возникновения ошибок в готовом продукте
разработчики проводят ряд мероприятий, среди которых:
• отладка ПО на этапе создания и написание исключений,
учитывающих всевозможные внештатные ситуации;
23.
• тестирование кода в самых разных условиях, включаянетривиальные, и обнаружение в процессе этого неочевидных
сценариев, потенциально способных привести к сбою в
программе;
• тестирование разных фрагментов кода (юнитов), позволяющее
выявить корректность работы этих компонентов на глубоком
уровне.