Почему программирование допускает ошибки
Программирование - то есть, компиляция программ в машинный исполняемый код - является важной частью жизни любого разработчика ПО. Когда программа не работает из-за ошибок компиляции, необходимо, чтобы программист потратил дополнительное время и интеллектуальные ресурсы, чтобы найти и устранить проблему, что, безусловно, уменьшает производительность его труда. Лучшее понимание причины появления этих ошибок может помочь в создании новых или усовершенствовании существующих средств разработки, что в свою очередь исключило бы возможность возникновения ошибок и ускорило процесс разработки.
Этот очевидный факт и лег в основу совместного исследования компании Google, Гонконгского университета науки и технологии и Университета Небраски. Команда исследователей хотела решить три основных вопроса: как часто программирование допускает ошибки, почему они возникают и как много времени требуется для их устранения?
Чтобы ответить на эти вопросы, они изучили более 26 млн разработанных программ 18 000 инженеров Google с ноября 2012 по июль 2013 года. Программы были написаны на Java и C++, двух наиболее распространенных языках, используемых Google, а ошибки в них были порождены компиляторами Javac (для Java) и LLVM Clang (для C++). В качестве единицы был определен один запрос от программиста, который выполняет одну или несколько компиляций, и считается отказом, если хотя бы одна компиляция произошла с ошибкой. Сообщения об ошибках компиляции были сгруппированы в пять категорий (зависимость, несоответствие типов, и др.).
После изучения результатов исследования, было сделано несколько выводов, которые можно считать особенно интересными:
Количество отказов не связано ни с объемами проделанной работы, ни с опытом разработчиков
Начиная изучать вопрос, исследователи предполагали, что разработчики, которые выполняют больший объем работы, будут чаще сталкиваться с ошибками. Исследователи не обнаружили никакой зависимости между количеством произведенных сборок и соотношением отказов.
Они также предположили, что у более опытных разработчиков процент отказов будет меньше. Но и эта гипотеза не подтвердилась. Исследователи не обнаружили никаких доказательств того, что опытные разработчики (те, кто произвел по крайней мере 1000 сборок за предыдущие девять месяцев) имели более низкий коэффициент неудач, чем новички (те, у кого за последние 3 месяца насчитывалось менее 200 сборок).
Большинство ошибок сборки являются взаимозависимыми
Почти 65% всех ошибок Java были классифицированы как взаимозависимые, например, в случаях, когда компилятор не мог найти символ (кстати, одна из наиболее распространенных причин - 43% всех ошибок) или не существовал какой-либо пакет.
Точно так же, почти 53% всех ошибок C++ были классифицированы как взаимозависимые. Наиболее часто встречаются такие ошибки, как использование не определенного идентификатора и отсутствие переменных класса.
C++ генерирует больше ошибок, чем Java, но их легче исправлять
Исследование показало, что средний процент неудач сборки кода для C++ составил 38,4%, в то время как средний показатель для Java был 28,5%. Было также установлено, что синтаксические ошибки встречались чаще при компиляции C++ кода, чем Java. Исследователи объясняют это различие в более широком использовании интегрированных сред разработки для Java, что позволяет сократить эти простые ошибки. Это, вероятно, также помогает объяснить, почему ошибки C++, как правило, устраняются быстрее, чем ошибки Java.
Одним из ключевых выводов исследования является то, что разработка компиляторов должна быть нацелена на оказание помощи инженерам-программистам предотвратить или устранить ошибки зависимости. Снижение количества этих ошибок, или, по крайней мере, сокращение времени, которое требуется для их решения, должно способствовать повышению производительности труда разработчиков. На самом деле, авторы говорят, что на основе этого исследования, команда Google сейчас именно над этим и работает.
Как обобщение этих данных относительно Google может быть полезным для всех остальных разработчиков программного обеспечения остается неясным. Но это положило начало нового типа исследований, которые могли бы в конечном итоге сделать разработчикам жизнь проще и повысить эффективность всего процесса разработки программного обеспечения.