Обнаружение устаревших комментариев в коде
|
Введение 4
Цель и задачи 6
Достигнутые результаты 6
Глава 1. Обзор предметной области 8
1.1. Постановка задачи 8
1.2. Типы комментариев 9
1.3. Обзор литературы 10
1.3.1 Узконаправленные методы 10
1.3.2 Векторная семантика 11
1.3.3 Механизмы сопоставления кода и комментария .... 12
1.3.4 Классическое машинное обучение 13
1.3.5 Глубокое обучение 13
1.3.6 Данные 16
1.4. Выводы 17
Глава 2. Инструмент для сбора данных 18
2.1. Подходы к разметке 18
2.1.1 Классический подход 19
2.1.2 Проблемы классического подхода 20
2.1.3 Прыжки 21
2.1.4 Испорченные не устаревшие примеры 22
2.1.5 Незначительные изменения комментариев 23
2.2. Реализация 23
2.2.1 Headless Plugin 24
2.2.2 PostProcessing 26
2.3. Результаты сбора 27
2.4. Выводы 28
Глава 3. Ручная разметка данных 30
3.1. “Золотой” набор данных 30
3.1.1 Кластеризация устаревших комментариев 31
3.1.2 Кластеризация не устаревших комментариев 32
3.2. Модель Deep JIT на новых данных 33
3.3. Выводы 34
Глава 4. Краудсорсинг 36
4.1. Яндекс.Толока 36
4.1.1 Return 37
4.1.2 Param 39
4.1.3 Summary 41
4.2. Модель Deep JIT на данных после краудсорсинга 42
4.3. Выводы 44
Глава 5. Инструмент CommentUpdater 45
5.1. Использование 45
5.2. Реализация 46
5.3. Выводы 50
Заключение 51
Благодарность 52
Приложение 53
Список литературы
Цель и задачи 6
Достигнутые результаты 6
Глава 1. Обзор предметной области 8
1.1. Постановка задачи 8
1.2. Типы комментариев 9
1.3. Обзор литературы 10
1.3.1 Узконаправленные методы 10
1.3.2 Векторная семантика 11
1.3.3 Механизмы сопоставления кода и комментария .... 12
1.3.4 Классическое машинное обучение 13
1.3.5 Глубокое обучение 13
1.3.6 Данные 16
1.4. Выводы 17
Глава 2. Инструмент для сбора данных 18
2.1. Подходы к разметке 18
2.1.1 Классический подход 19
2.1.2 Проблемы классического подхода 20
2.1.3 Прыжки 21
2.1.4 Испорченные не устаревшие примеры 22
2.1.5 Незначительные изменения комментариев 23
2.2. Реализация 23
2.2.1 Headless Plugin 24
2.2.2 PostProcessing 26
2.3. Результаты сбора 27
2.4. Выводы 28
Глава 3. Ручная разметка данных 30
3.1. “Золотой” набор данных 30
3.1.1 Кластеризация устаревших комментариев 31
3.1.2 Кластеризация не устаревших комментариев 32
3.2. Модель Deep JIT на новых данных 33
3.3. Выводы 34
Глава 4. Краудсорсинг 36
4.1. Яндекс.Толока 36
4.1.1 Return 37
4.1.2 Param 39
4.1.3 Summary 41
4.2. Модель Deep JIT на данных после краудсорсинга 42
4.3. Выводы 44
Глава 5. Инструмент CommentUpdater 45
5.1. Использование 45
5.2. Реализация 46
5.3. Выводы 50
Заключение 51
Благодарность 52
Приложение 53
Список литературы
В процессе написания и чтения кода разработчики оставляют к нему комментарии. Читаемость кода во многом зависит от качества комментариев. В исследовании Вудфилда и др. [1] проведен один из первых экспериментов, демонстрирующий положительное влияние комментариев на читаемость программного кода. В дальнейшем это было подтверждено другими исследователями [2, 3].
В то же время, исследования показывают, что сопровождение программного обеспечения - это одна из самых важных частей процесса раз-работки программного обеспечения (ПО) [4]. Значительную часть сопровождения и написания ПО занимает чтение и понимание уже написанного кода. Например, исследования Пигоски и др. [4], а также Пфлегера и др. [5], сообщают, что от 40 до 60 процентов времени сопровождения ПО тратится на его изучение. Улучшая читаемость кода, качественные комментарии упрощают поддержку ПО. Однако, чтобы поддерживать должное качество комментариев, разработчик должен прикладывать усилия и при необходимости вносить соответствующие правки при каждом обновлении кода, что происходит не всегда [6, 7].
Изменение кода без соответствующих изменений в комментарии может привести к противоречивости кода и комментария. Такие противоречивые комментарии негативно влияют на читаемость кода, принося неоднозначность [6, 8], увеличивая возможность программных ошибок [9]. Чтобы помочь программистам следить за качеством комментариев, исследователи предлагают системы автоматического обнаружения устаревших комментариев.
Устаревшие комментарии (также называемые inconsistent comments) - комментарии, описывающие фрагмент программного кода, но сообщающие об этом фрагменте неверную информацию. Часто такие комментарии возникают, когда разработчик при изменении функциональности кода забывает внести соответствующие правки в комментарий.
На Рисунке 1 приведен пример кода на Java из реального проекта seppuku [10]. Комментарий над функцией не соответствует логике ее кода. В комментарии сказано, что метод удаляет существующий файл или создает новый. Если посмотреть на код, становится ясно, что новый файл создается в любом случае. Таким образом, комментарий противоречит коду.
В этой дипломной работе исследуются способы обнаружения таких устаревших комментариев, а также проблема разметки и сбора примеров устаревших комментариев из существующих проектов. Данная работа полностью посвящена комментариям формата JavaDoc(см. раздел 1.2) к коду на языке программирования Java. Выбор языка программирования обусловлен тем, что Javaявляется одним из самых популярных языков программирования [11] и большинство статей в этой области исследуют именно комментарии к коду на Java. Кроме этого, формат JavaDoc, который используют разработчики на Java, облегчает анализ комментариев и алгоритмов.
В то же время, исследования показывают, что сопровождение программного обеспечения - это одна из самых важных частей процесса раз-работки программного обеспечения (ПО) [4]. Значительную часть сопровождения и написания ПО занимает чтение и понимание уже написанного кода. Например, исследования Пигоски и др. [4], а также Пфлегера и др. [5], сообщают, что от 40 до 60 процентов времени сопровождения ПО тратится на его изучение. Улучшая читаемость кода, качественные комментарии упрощают поддержку ПО. Однако, чтобы поддерживать должное качество комментариев, разработчик должен прикладывать усилия и при необходимости вносить соответствующие правки при каждом обновлении кода, что происходит не всегда [6, 7].
Изменение кода без соответствующих изменений в комментарии может привести к противоречивости кода и комментария. Такие противоречивые комментарии негативно влияют на читаемость кода, принося неоднозначность [6, 8], увеличивая возможность программных ошибок [9]. Чтобы помочь программистам следить за качеством комментариев, исследователи предлагают системы автоматического обнаружения устаревших комментариев.
Устаревшие комментарии (также называемые inconsistent comments) - комментарии, описывающие фрагмент программного кода, но сообщающие об этом фрагменте неверную информацию. Часто такие комментарии возникают, когда разработчик при изменении функциональности кода забывает внести соответствующие правки в комментарий.
На Рисунке 1 приведен пример кода на Java из реального проекта seppuku [10]. Комментарий над функцией не соответствует логике ее кода. В комментарии сказано, что метод удаляет существующий файл или создает новый. Если посмотреть на код, становится ясно, что новый файл создается в любом случае. Таким образом, комментарий противоречит коду.
В этой дипломной работе исследуются способы обнаружения таких устаревших комментариев, а также проблема разметки и сбора примеров устаревших комментариев из существующих проектов. Данная работа полностью посвящена комментариям формата JavaDoc(см. раздел 1.2) к коду на языке программирования Java. Выбор языка программирования обусловлен тем, что Javaявляется одним из самых популярных языков программирования [11] и большинство статей в этой области исследуют именно комментарии к коду на Java. Кроме этого, формат JavaDoc, который используют разработчики на Java, облегчает анализ комментариев и алгоритмов.
В рамках данной работы были достигнуты следующие результаты:
• Разработан инструмент для обнаружения устаревших комментариев в виде плагина для IntelliJ IDEA. Плагин использует механизм инспекций и IntelliJ Platform для извлечения информации из методов с комментариями, которая подается на вход глубокой нейронной сети, обученной для обнаружения устаревших комментариев. Устаревшие комментарии подсвечиваются в коде, обращая на себя внимание разработчика.
• С целью дальнейшего улучшения качества моделей был разработан инструмент для сбора и автоматической разметки примеров для задачи обнаружения устаревших комментариев. Инструмент также использует преимущества IntelliJ Platform и, помимо необходимой информации о методах с комментариями, собирает дополнительную (информацию о рефакторингах, метриках схожести для векторных представлений и т.д.).
• Собран набор данных, содержащий более двух миллионов примеров из 4000 проектов на Java. Автоматическая разметка примеров произведена новым способом, разработанным в данной работе для умен¬шения числа некорректных примеров.
• Кластеризован золотой набор данных. Набор из 1000 примеров, содержащий детальную информацию о природе изменений и причинах возникновения устаревших комментариев. Используя золотой набор данных, было проанализировано качество модели, обученной на различных данных (авторских и предложенных ранее).
• Разработан метод ручной разметки данных для задачи обнаружения устаревших комментариев, использующий краудсорсинг. Для этого созданы интерфейс, инструкции, контрольные и обучающие задания. В результате эксперимента размечено 1000 примеров и задействовано несколько тысяч пользователей.
Дальнейшая работа возможна в следующих направлениях:
• Собранный набор данных можно использовать для обучения новых моделей с отличной архитектурой, рассчитанной на большее число данных.
• Дополнительную информацию о рефакторингах, доступную как в собранном наборе данных, так и для новых примеров из плагина, можно использовать как входные признаки для будущих моделей.
• Инструмент для сбора и автоматической разметки данных можно использовать для извлечения примеров из другого набора проектов, формируя тем самым еще больший набор данных для задачи.
• Методику разметки примеров с помощью краудсорсинга можно масштабировать и применить для большего числа примеров.
• Разработан инструмент для обнаружения устаревших комментариев в виде плагина для IntelliJ IDEA. Плагин использует механизм инспекций и IntelliJ Platform для извлечения информации из методов с комментариями, которая подается на вход глубокой нейронной сети, обученной для обнаружения устаревших комментариев. Устаревшие комментарии подсвечиваются в коде, обращая на себя внимание разработчика.
• С целью дальнейшего улучшения качества моделей был разработан инструмент для сбора и автоматической разметки примеров для задачи обнаружения устаревших комментариев. Инструмент также использует преимущества IntelliJ Platform и, помимо необходимой информации о методах с комментариями, собирает дополнительную (информацию о рефакторингах, метриках схожести для векторных представлений и т.д.).
• Собран набор данных, содержащий более двух миллионов примеров из 4000 проектов на Java. Автоматическая разметка примеров произведена новым способом, разработанным в данной работе для умен¬шения числа некорректных примеров.
• Кластеризован золотой набор данных. Набор из 1000 примеров, содержащий детальную информацию о природе изменений и причинах возникновения устаревших комментариев. Используя золотой набор данных, было проанализировано качество модели, обученной на различных данных (авторских и предложенных ранее).
• Разработан метод ручной разметки данных для задачи обнаружения устаревших комментариев, использующий краудсорсинг. Для этого созданы интерфейс, инструкции, контрольные и обучающие задания. В результате эксперимента размечено 1000 примеров и задействовано несколько тысяч пользователей.
Дальнейшая работа возможна в следующих направлениях:
• Собранный набор данных можно использовать для обучения новых моделей с отличной архитектурой, рассчитанной на большее число данных.
• Дополнительную информацию о рефакторингах, доступную как в собранном наборе данных, так и для новых примеров из плагина, можно использовать как входные признаки для будущих моделей.
• Инструмент для сбора и автоматической разметки данных можно использовать для извлечения примеров из другого набора проектов, формируя тем самым еще больший набор данных для задачи.
• Методику разметки примеров с помощью краудсорсинга можно масштабировать и применить для большего числа примеров.



