10 наиболее распространённых ошибок Java-программистов

Какие ошибки чаще других встречаются у новичков в программировании? Возможно, они всегда путают равенство (==) с присвоением (=), или & с &&? Или же, возможно, они используют неправильные разделители в цикле for (for (int i = 0, i < 5, i++))?

Чтобы ответить на этот вопрос, исследователи рассмотрели ошибки более чем 250 000 Java-новичков со всего мира. Используя большое количество данных (исходный код более чем 37 миллионов компиляций, если быть точнее), они выявили наиболее распространенные ошибки студентов, впервые изучавших Java. Также они выяснили, как много времени занимала учёба на собственных ошибках. Результаты оказались поразительными.


The Blackbox data collection project

Изучение нового языка программирования — это всегда вызов, поскольку вы должны научиться выражать свои сложные мысли, используя ограниченную, формальную грамматику. Естественно, многие новички делают ошибки при программировании. Чтобы пролить немного света на то, какие ошибки чаще всего делают новички, исследователи из университета Кента (Великобритания) рассмотрели код, который был собран почти у 265 000 студентов по всему миру.

Проект под названием Blackbox data collection построен на основе BlueJ, бесплатной Java IDE, спроектированной специально для новичков. BlueJ пытается устранить барьеры на пути к успеху для новичков, например, выделяя начало и конец блока кода. Это облегчает студентам процесс визуального сканирования кода на наличие лишних фигурных скобок. Ещё одна особенность данной IDE — это возможность проверки объектов прямо во время работы программы. Таким образом, это помогает пониманию принципов работы программы, а также отладке.

scope-highlightingBlackbox также работает как расширение для BlueJ, которое собирает различную анонимную информацию о том, как используется программное обеспечение. К примеру, оно собирает информацию о том, какие функции выполняются и когда, а также с какими ошибками и как часто. Количество данных огромно. Только за один учебный год (2013—2014) было обработано 37 158 094 компиляций, 19 476 087 из которых были успешными, остальные же 17 682 007 — неудачными.

В то время как большинство людей и помыслить не может об обработке такого большого количества данных, Амджад АльТадмри (Amjad Altadmri) и Нейл Браун (Neil Brown) рассмотрели каждый из 46 448 212 файлов, участвовавших в 37 миллионах компиляций, рассмотренных выше. Они также отслеживали изменения в файлах в течение длительного периода времени. При каждой компиляции учёные проверяли исходный код для того, чтобы присвоить ему одну из 18 возможных категорий ошибок (которые они обозначили буквами от А до R). Они также подсчитали количество времени, которое потребовалось студенту для того, чтобы исправить свою ошибку (путём проверки файла, в котором ошибка уже отсутствовала).


10 наиболее распространённых ошибок начинающих Java-программистов

АльТадмри и Браун были удивлены, обнаружив, что те ошибки, которые эксперты и преподаватели считали наиболее распространёнными, таковыми на самом деле не являются.

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

Однако, если обратиться к собранным данным, возникает чёткий рейтинг из 10 наиболее часто встречающихся ошибок (буквами от А до R обозначены 18 категорий ошибок, принимавших участие в исследовании):

С. Несбалансированные скобки, фигурные скобки или кавычки, а также использование этих символов попеременно, например: while (a == 0].

I. Вызов методов с неправильными аргументами или типами аргументов, например: list.get("abc").

O. Контрольный поток может достигнуть конец non-void метода без возвращения, например:

А. Путаница с операторами присвоения (=) и сравнения (==), например: if (a = b).

N. Игнорирование или отбрасывание возвращаемого значения метода с non-void типом возвращения, например: myObject.toString();.

B. Использование == вместо .equals для сравнения строк.

M. Попытка вызвать non-static метод так, если бы это был static метод, например: MyClass.toString();.

R. Попытка класса реализовать интерфейс, но отсутствие реализации всех необходимых методов, например: class Y implements ActionListener { }.

P. Вызов типов параметров при вызове метода, например: myObject.foo(int x, String s);.

E.  Неправильная расстановка запятых в условиях if, а также циклах for и while, например: if (a == b); return 6;.

Наиболее частая ошибка — это C (забытые скобки, ошибки в их расстановке) — как раз то, чему пытается противостоять BlueJ, используя подсветку. Данный вывод может быть признаком того, что ошибки типа С будут ещё чаще встречаться в IDE, которые не предоставляют никаких средств для отладки.

Удивительно, но следующие ошибки не попали в ТОП-10:

D. Путаница с использованием операторов «короткого замыкания» (&& и ||) и обычных операторов логики (& и |).

J. Отсутствие скобок после вызова метода, например: myObject.toString;.

Q. Присваивание переменной значения с типом, несовместимым с типом переменной, например: int x = myObject.toString();.

F. Неправильные разделители цикла for (использование запятой вместо точки с запятой), например: for (int i=0, i < 6, i++).

H. Использование ключевых слов в качестве имён переменных или методов, например: int new;.


Сколько времени занимает учёба на своих ошибках

Кроме того, когда Браун и АльТадмри изучили, сколько времени требуется, чтобы студенты исправили ошибку, стало ясно, что наиболее распространённая ошибка (ошибка С) была также одной из самых быстронаходимых. Другие ошибки было найти труднее. Среди таких ошибок была путаница между операторами & и | или && и || (ошибка D), использование == вместо .equals для сравнения строк (ошибка B) и игнорирование или отбрасывание возвращаемого значения метода с non-void типом возвращения (ошибка N). Они оставались незамеченными более чем 1 000 секунд (после чего отслеживание не продолжалось) или не были найдены вообще никогда.

Медиана, показывающая соотношение время-исправление (time-to fix), показана на рисунке ниже.

altadmri-brown-2015-time-to-fix

P.S. От редактора: забавно, но в статье про самые распространённые ошибки программистов автором была допущена самая распространённая ошибка программистов — не закрыта скобка тега <code>. Будьте внимательны к своему коду!

Перевод статьи «Beginners 10 most common Java programming mistakes revealed by Big Data»