Мифы о статическом анализе. Миф второй – профессиональные разработчики не допускают глупых ошибок

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

Миф второй: "Профессиональные разработчики не допускают глупых ошибок, которые в основном и ловят статические анализаторы кода".

Вот как выглядит такое утверждение при обсуждении на форуме (собирательный образ):

У меня, профессионального разработчика, уже N лет не было проблем с порчей памяти, временем жизни объектов и так далее. Статический анализ - это инструмент для "макдональдса", а здесь (на профессиональном форуме) сидят гики. Сейчас мои основные проблемы это сложно тестируемые алгоритмы и интеграция с другими разработчиками с использованием неявных контрактов по состояниям объектов.

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

Это не так. Любые программисты делают глупые ошибки. Я знаю, что вы меня не услышали. Повторю еще раз еретические мысли. Все программисты делают глупые ошибки. Неважно, какие они профессионалы. Людям свойственно делать ошибки. И чаще всего эти ошибки просты.

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

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

Что-то аналогичное происходит с программистом, когда он занимается поиском ошибок. Он хорошо помнит про сложные и интересные ошибки. Может подискутировать о них с коллегами или написать заметку в блог. Когда же он заметит, что вместо переменной 'AB' он написал 'BA', то он просто исправит ляп, и этот факт сразу исчезнет из его памяти. Фрейд обратил внимание на следующую особенность памяти: человеку свойственно помнить положительные высказывания о себе и забывать отрицательные. Если человек сражается со сложной ошибкой в алгоритмической задаче, то когда он её исправляет, считает себя героем. Это стоит запомнить и даже рассказать другим. Когда он находит глупый баг, то помнить про это нет никакого повода и желания.

Какие у меня есть доказательства? Хотя большинство опечаток и ляпов исправляется, некоторые из них всё-таки остаются незамеченными. И массу примеров таких ошибок можно обнаружить в этой статье. В статье хорошо видно, что ошибки допускали не новички, а квалифицированные программисты.

Вывод. Программисты тратят на исправление опечаток гораздо больше времени, чем думают. Инструменты статического анализа могут существенно экономить усилия разработчиков, выявляя часть таких ошибок ещё до этапа тестирования.