Введение 4
1. Обзор 6
1.1. Рекомендация преобразований кода 8
1.1.1. Эвристические методы 8
1.1.2. Методы машинного обучения 9
1.2. Сравнение вариантов кода 10
1.2.1. Подход на основании метрик 11
1.3. Модели машинного обучения 12
1.4. Компоненты IntelliJ IDEA 13
1.5. Выводы 15
2. Подготовка модели 16
2.1. Инструмент для извлечения намерений 16
2.2. Подготовка данных для обучения 18
2.2.1. Цепочки намерений 19
2.3. Векторизация кода 20
2.4. Метрики качества 23
2.5. Модели 24
3. Плагин к IntelliJ IDEA 26
3.1. Особенности реализации плагина 26
3.2. Интеграция с инструментом предпросмотра 28
4. Апробация 29
4.1. Методология 29
4.2. Отзывы пользователей 30
Заключение 32
Список литературы 33
Интегрированные среды разработки (Integrated Development Environments, IDEs) на сегодняшний день являются одним из важнейших инструментов для программистов [1]. С течением времени падает число пользователей, использующих простые текстовые редакторы, и растет число пользователей, использующих среды разработки [2]. В частности, программисты активно используют средства автоматического рефакторинга кода, предоставляемые ими [3, 4].
В среде разработки IntelliJ IDEA [5] существует механизм под названием “Intention Actions”, название которого можно перевести как “намерения”. Намерения позволяют программисту применять некоторые часто выполняемые преобразования кода в автоматическом режиме. Например, такие действия могут оптимизировать код или делать его более читаемым, что экономит время и усилия программиста, позволяя не совершать монотонную работу вручную.
Данный механизм имеет несколько особенностей. Первая из них заключается в том, что намерения не всегда улучшают код: например, некоторые из них созданы для того, чтобы подготовить код к дальнейшим преобразованиям. Вторая особенность заключается в том, что иногда для получения наилучшего варианта кода приходится применять несколько намерений одно за другим. В результате программист может остановиться, применив одно намерение, но не получить при этом оптимальный вариант кода. Кроме того, само понятие качества кода субъективно: разные люди могут по-разному относиться к примененному к коду преобразованию.
Чтобы учесть данные особенности, предлагается научиться распознавать целые цепочки намерений, которые делают код лучше. Так как количество комбинаций цепочек, а также участков кода, к которым они могут применяться, очень велико, предлагается использовать для решения этой задачи методы машинного обучения.
Постановка задачи
Целью данной работы является разработка плагина для IntelliJ IDEA, способного классифицировать намерения и цепочки намерений, выдавая пользователю те из них, которые могут быть полезны в выбранной им позиции. Для достижения этой цели необходимо выполнить следующие задачи:
• Разработать инструмент, способный извлекать необходимые данные из кода, а именно, все возможные варианты кода, которые можно получить в выбранной позиции применением любого числа намерений. Применить данный инструмент к некоторой кодовой базе и привести полученные данные к подходящему для разметки виду.
• Обучить на полученных данных несколько моделей машинного обучения с различной архитектурой и выбрать из них наиболее точную. Модели должны определять, какие из вариантов кода, полученных с помощью механизма намерений, улучшают код.
• Разработать плагин для среды разработки IntelliJ IDEA, в который будет встроена обученная модель.
• Провести его апробацию на пользователях.
В ходе данной работы было разработано расширение для среды разработки IntelliJ IDEA, предлагающее программисту наиболее подходящие изменения кода в выбранной позиции. Ключевым нововведением данной работы является использование для этого методов машинного обучения, а также возможность применять сразу цепочки намерений. Это позволяет программисту работать быстрее и эффективнее.
В процессе работы были достигнуты следующие результаты:
• Разработан инструмент для извлечения вариантов кода из кодо¬вой базы. С его помощью удалось обработать несколько проектов и подготовить данные для разметки.
• Проведены эксперименты с несколькими моделями и выбрана наи¬лучшая. Полученная модель была интегрирована в решение.
• Разработан плагин, предлагающий пользователю возможные ва¬рианты преобразований. Реализована интеграция с механизмом предпросмотра.
• Проведена апробация на пользователях. Получены в целом положительные отзывы, по результатам опроса локализованы некоторые недостатки плагина, которые планируется исправить в будущем.
Код проекта доступен по ссылкам:
• Инструмент для извлечения вариантов кода — https://github.
com/SacredArrow/idea-intentions-plugin
• Плагин — https://github.com/SacredArrow/usableIntentionsPlugin
[1] Stack Overflow. Developer Survey Results 2019. — https://insights.stackoverflow.com/survey/2019. — 2019. — [Online; accessed November 24, 2020].
[2] Pierre Carbonnelle. PYPL index.— https://pypl.github.io/IDE.html. — 2020. — [Online; accessed November 24, 2020].
[3] Murphy G. C., Kersten M., Findlater L. How are Java software developers using the Elipse IDE? //IEEE Software. — 2006. — Vol. 23, no. 4. — P. 76-83.
[4] Amann S., Proksch S., Nadi S., Mezini M. A Study of Visual StudioUsage in Practice// 2016 IEEE 23rd International Conference on Software Analysis, Evolution, and Reengineering (SANER). — Vol. 1. — 2016. —P. 124-134.
[5] JetBrains. IntelliJ IDEA. — https://www.jetbrains.com/ru-ru/idea/. — 2020. — [Online; accessed November 24, 2020].
[6] Fowler Martin. Refactoring: Improving the Design of Existing Code. — Boston, MA, USA : Addison-Wesley, 1999.-ISBN: 0-201-48567-2.
[7] Haas Roman, Hummel Benjamin. Deriving Extract Method Refactoring Suggestions for Long Methods // Software Quality. The Future of Systems- and Software Development / Ed. by Dietmar Winkler, Stefan Biffl, Johannes Bergsmann. — Cham : Springer International Publishing, 2016. — P. 144-155.
[8] Silva Danilo, Terra Ricardo, Valente Marco. JExtract: An Eclipse Plug¬in for Recommending Automated Extract Method Refactorings. — 2015.-06.
[9] Palomba Fabio, Panichella Annibale, De Lucia Andrea et al. A textual¬based technique for Smell Detection// 2016 IEEE 24th International Conference on Program Comprehension (ICPC). — 2016. — P. 1-10.
[10] Yue Ruru, Gao Zhe, Meng Na et al. Automatic Clone Recommendation for Refactoring Based on the Present and the Past. — 2018. — 1807.11184.
[11] Schapire Robert E. A Brief Introduction to Boosting // Proceedings of the 16th International Joint Conference on Artificial Intelligence - Volume 2. — IJCAI’99. — San Francisco, CA, USA : Morgan Kaufmann Publishers Inc., 1999. —P. 1401-1406.
[12] Fontana F. A., Zanoni M., Marino A., Mantyla M. V. Code SmellDetection: Towards a Machine Learning-Based Approach// 2013 IEEE International Conference on Software Maintenance. — 2013. — P. 396¬399.
[13] Tempero E., Anslow C., Dietrich J. et al. The Qualitas Corpus: ACurated Collection of Java Code for Empirical Studies // 2010 Asia Pacific Software Engineering Conference. — 2010. — P. 336-345.
[14] Liu Hui, Xu Zhifeng, Zou Yanzhen. Deep learning based feature envydetection. - 2018. - 09. - P. 385-396.
[15] Mikolov Tomas, Chen Kai, Corrado Greg, Dean Jeffrey. Efficient Estimation of Word Representations in Vector Space. — 2013. — 1301.3781.
...
37 источников