Данные проект - попытка создать инструмент для определения comment inconsistency. Это ситуация, когда разработчик обновил код, но забыл обновить комментарий. Из-за таких несоответсвий усложняется читаемость и поддерживаемость кода.
Задача не новая, существует несколько статей, которые описывают различные подходы решения. Но на данный момент нет прикладного решения, которое можны было бы, например, использовать в современных IDE.
С другой стороны, существующие решения, в основном описывают rule-based подход (Решение о том, что комментарий устарел принимается на основе эмпирически выведенных правил, например если тип функции поменялся, а в комментарии есть прямое указание типа - его точно нужно поменять). Такие алгоритмы часто имеют недостатки, например у них могут возникнуть трудности при использовании другого языка программирования, стилизации или языка комментария. Хочется использовать для этой задачи машинное обучения. Статьи на эту тему есть, но вышли относительно недавно - осенью 2020, а значит задача не исследована до конца и представляет научный и прикладной интерес.
В это проекте мы используем подход, использующий техники NLP и машинного обучения.
В этом семестре я продолжаю работать над этим проектом (т.е в осеннем семестре у меня был такой же проект).
Из студентов в команде я один, проектом руководит Зарина Курбатова (JetBrains Research) и Тимофей Брыксин (JetBrains Research), активно помогает Егор Богомолов (JetBrains Research).
Из постановки задачи можно понять, что реализованный проект будет полезен многим разработчикам. Особенно забывчивым, которые не меняют свои комментарии (я среди них).
Глобальная задача проекта - исследовать и реализовать подходы обноружения и устранения comment inconsistency. В этом семестре хотелось бы использовать рабочий алгоритм обнаружения и обернуть его в плагин для Intellij Idea.
Каждую неделю я трачу 10+ часов, чтобы решить задачу, которую выдал руководитель. Каждый четверг мы созваниваемся по видеосвязи (я, Зарина, Егор) и обсуждаем: что я сделал, кто виноват, что мне делать дальше, кому на руси жить хорошо.
- Исследовал существующие решения
- Писал свои модели разной архитектуры и сравнивал их
- Написал инструмент для сбора новых данных для задачи
- В этом семестре авторы статьи на эту тему опубликовали свой код и данные
- Изучал их код, эксперементировал с их моделями на разных данных
- В процессе обнаружил, что модель работает очень долго, некоторое время пытался ускорять ее выполнение
- Проанализировал результаты модели, качество недостаточно, чтобы использовать модель как единственную или основную
- Считал разные метрики, чтобы понять, можно ли дообучить модель, предоставив ей больше данных. (оказалось, что скорее всего - нет)
- Эксперементировал с архитектурой модели (Например, добавлял Control Flow, Data Flow ребра в AST-граф для представления кода, использовал другие Encoder-ы, например Transformer, LSTM вместо GRU)
- Писал код, который загружает данные для обучения с диска, а не из оперативной памяти, как было у авторов модели. (Загрузка данных в RAM требует ~16gb места)
- Запускал модель на реальных проектах на github, получилось найти реальные примеры code-comment inconsistency в некоторых проектах JetBrains-Research
- Последние две недели я пишу плагин для Intellij IDEA, который помимо своего основного назначения поможет нам собирать более детальные данные с проектов для развития дальнейших моделей.
Модели я пишу на Python + Pytorch. В таком проекте важнее не инструменты программирования как таковые, а подходы и методы решения задачи. (Например сейчас используется: LSTM, GRU, Attention, Embeddings, Gated Graph Sequence NN)
Плагин я пишу на Kotlin.
Старый код с прошлого семестра: JetBrains-Research/comment-updating
Код, в котором я модифицирую уже существующую модель: pavlov200912/deep-jit-inconsistency
Код плагина на Kotlin (в разработке): JetBrains-Research/CommentUpdater
Много кода я пишу в колабах, в основном эксперименты с моделями. Оставлять ссылку не буду, потому что читать его достаточно сложно.