Разделы портала

Онлайн-тренинги

.
Откуда берутся баги?
16.08.2022 00:00

Автор: Джил Зильберфельд (Gil Zilberfeld)
Оригинал статьи
Перевод: Ольга Алифанова

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

И я отвечаю: нет.

Затем они выхватывают автоматы, и вечер перестает быть томным.

Но почему так происходит? Неужели мы действительно приговорены к борьбе с багами до конца наших дней? Или их дней? Неужели мы никогда не увидим конца шоку открытий, что "это не то, чего я ожидал"?

Ну, да. И вот почему.

Мы что-то упускаем

Мы не идеальны. Это наука. Мы не можем запрограммировать все возможные варианты, потому что мы не можем представить себе все возможные варианты. Это касается не только разработчиков. Мы что-то упускаем в требованиях, архитектуре, дизайне, коде, тестировании, деплое – на любой стадии, где участвуют люди, что-то будет упущено. И там плодятся баги.

Мы не понимаем друг друга

Даже если бы мы смогли представить себе все, что может произойти, нам нужно передать эти идеи другим людям. И это никогда не бывает точным переводом картинки в моей голове в картинку в вашей. На прошлой неделе я давал упражнение в ходе воркшопа "Чистый код", и два человека поняли разное, читая один и тот же код. А код же должен быть "единой абсолютной истиной". Готовьтесь к сюрпризам.

Мы переводим. Плохо.

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

Эти модели – абстракции, поэтому они опускают детали. Эти детали становятся сюрпризами. Но более того, мы ожидаем, что модели – модели решения, дизайна, кода – будут схожими. На самом деле, если модель проблемы и решения понятна, мы предполагаем, что с кодом и дизайном будет то же самое.

К сожалению, это не так. Код эластичен, мы можем задать абсолютно любую модель, свободную от соответствия моделям "реальной жизни". Это будет работать, пока не перестанет.

Вот еще пример из моего воркшопа "Чистый код". Там есть упражнение на создание игры "Крестики-нолики". Практически все создают класс Game, который в свою очередь создает Board. Вроде это работает.

Однако в реальной жизни на одной доске можно сыграть множество игр. Что произойдет, если мы будем добавлять больше функций вроде этой? Мы еще больше исказим нашу модель, и снова окажемся в стране ошибок перевода. Добро пожаловать, баг!

К тому же разные модели затрудняют понимание, но мы уверены в том, что делаем. Это приводит нас к тому, что…

Мы строим предположения

Ах, "небольшое" допущение. Мы думаем, что мы это знаем. Мы предполагаем, что все остальные думают так же. "Никто никогда не отправит null", правда? Никто не обратится к этому значению одновременно с кем-то другим, правда?

Правда же?

Этого невозможно избежать. В противном случае мы снова окажемся в точке отсчета – нам придется подумать обо всем на свете. Но мы не будем, потому что наш мозг говорит нам, что это всем известно. Все, что мы предполагаем, мы не описываем в коде (штука с null), или, если мы предполагаем худшее, у нас получается чересчур много кода (синхронизация значения в цепочках). В первом случае мы удивимся, что были неправы, а во втором код станет настолько сложным, что его трудно тестировать и доказать справедливость наших допущений. Затем мы удивимся, что были неправы.

Мы делаем ошибки

Этим все сказано.

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

Но баги, как зомби, возвращаются.

Они всегда возвращаются.

Обсудить в форуме