С каждым годом сложность разработки программных продуктов неуклонно возрастает, усложняются проекты и задачи. В связи с этим всё более востребованными становятся инструменты, облегчающие разработку и повышающие производительность труда программистов. Современные среды разработки (Integrated Development Environment, IDE) включают множество различных инструментов: средства автодополнения, исправления ошибок, автоматического рефакторинга и многие другие. Они призваны сделать процесс разработки более эффективным путём автоматизации и предоставления различного рода подсказок.
Но часто существующих инструментов оказывается недостаточно. Разработчики, особенно начинающие, зачастую не обладают необходимыми знаниями для работы с API (Application Programming Interface) различных библиотек и фреймворков. Встроенные средства IDE способны показать лишь список возможных методов, но не пример их использования. Поэтому приходится покидать среду разработки и искать нужную информацию в других источниках, таких как GitHub1 и Stack Overflow2. Однако частые переключения между различными окнами нежелательны, поскольку они негативно сказываются на продуктивности разработчиков [1, 2].
Решить данную проблему можно, если полезная информация будет доступна непосредственно в среде разработки. Это позволит повысить продуктивность работы, а также использовать дополнительные данные, недоступные вне IDE. Собранный таким образом контекст может улучшить релевантность (т.е. соответствие) предлагаемой информации текущим задачам пользователя [3].
Выделяют два принципиальных способа получения полезной информации: генеративный и ранжирующий. Первый способ заключается в преобразовании некоторого формального описания задачи в полезные данные. Примером могут служить системы для автоматического создания исходного кода, решающего поставленную задачу [4]. Второй способ предполагает поиск, оценку и переиспользование подходящих данных, ранее созданных другими людьми. Он лежит в основе различных рекомендательных систем [5, 6].
На текущем уровне развития технологий второй подход кажется более предпочтительным из-за универсальности. Он позволяет предоставлять решения типичных задач, возникающих в работе программистов, по описанию на естественном языке, может быть применён для разных языков программирования, а также не налагает дополнительных ограничений на форму представления полезной для пользователя информации.
Существующие на сегодняшний день реализации систем, использующих данных подход [7, 8], недостаточно удобны и функциональны. Для некоторых платформ, например, IntelliJ IDEA3, расширений с указанной функциональностью совсем немного, а качество их рекомендации оставляет желать лучшего.
Постановка задачи
Целью данной работы является создание расширения для IntelliJ IDEA, предоставляющего пользователю подсказки и релевантные фрагменты кода из различных источников. Для достижения поставленной цели были сформулированы следующие задачи:
• провести анализ предметной области и существующих решений;
• реализовать алгоритм рекомендации полезной информации;
• разработать архитектуру инструмента;
• реализовать пользовательский интерфейс;
• провести апробацию разработанного решения.
В ходе данной работы были получены следующие результаты.
• Проведён анализ предметной области. Сделан обзор функциональности аналогичных решений, используемых в них алгоритмов, а также метрик для оценки качества их работы.
• Реализован алгоритм рекомендации полезной информации. Он основан на техниках обработки естественного языка и простом анализе кода, благодаря чему может быть использован для разных языков программирования.
• Разработана архитектура инструмента, в основе которой лежит шаблон проектирования Presentation Model.
• Реализован пользовательский интерфейс. Инструмент позволяет находить релевантные данные по текстовому запросу, а также предлагает помощь с ошибками компиляции.
• Выполнена апробация разработанного решения. В ходе проведённого эксперимента алгоритм показал высокую точность рекомендации.
Таким образом, в данной работе представлен инструмент для помощи с распространёнными проблемами, возникающими в ходе разработки программного обеспечения. Ассистент будет полезен в первую очередь студентам, а также начинающим разработчикам, которые работают над проектами с открытым исходным кодом. Код инструмента доступен по ссылке15.
[1] Monsell S. Task switching // Trends in Cognitive Sciences 7 (3). 2003. P. 134 - 140.
[2] Proksch S., Bauer V., Murphy G. C. How to build a recommendation system for software engineering // Springer International Publishing. 2015.
[3] Kersten M., Murphy G. C. Using task context to improve programmer productivity // FSE 2014: Proceedings of the 14th ACM SIGSOFT international symposium on Foundations of software engineering. ACM Press, 2006. P. 1 - 11.
[4] Neural Sketch Learning for Conditional Program Generation / V. Murali, L. Qi, S. Chaudhuri et al. // arXiv. 2017.
[5] Prompter: A Self-Confident Recommender System / L. Ponzanelli, G. Bavota, M. D. Penta et al. IEEE, 2014. P. 577 - 580.
[6] Bing developer assistant: improving developer productivity by recommending sample code / H. Zhang, A. Jain, G. Khandelwal et al. // FSE 2016: Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering. ACM, 2016. P. 956 - 961.
[7] Takuya W., Masuhara H. A spontaneous code recommendation tool based on associative search // SUITE ’11: Proceedings of the 3rd International Workshop on Search-Driven Development: Users, Infrastructure, Tools, and Evaluation. ACM, 2011. P. 17 - 20.
[8] Campbell B. A., Treude C. NLP2Code: code snippet content assist via natural language tasks // arXiv. 2017.
[9] Ponzanelli L., Bacchelli A., Lanza M. Seahawk: stack overflow in the IDE // ICSE ’13: Proceedings of the 2013 International Conference on Software Engineering. IEEE Press, 2013. P. 1295 - 1298.
[10] Mining StackOverflow to turn the IDE into a self-confident programming prompter / L. Ponzanelli, G. Bavota, M. D. Penta et al. // MSR 2014: Proceedings of the 11th Working Conference on Mining Software Repositories. ACM, 2014. P. 102 - 111.
[11] Expected reciprocal rank for graded relevance / O. Chapelle, D. Metlzer, Y. Zhang et al. // Proceedings of the 18th ACM conference on Information and knowledge management. ACM, 2009. P. 621 - 630.
[12] What makes a good code example? A study of programming Q&A in StackOverflow / S. M. Nasehi, J. Sillito, F. Maurer et al. IEEE, 2012. P. 25 - 34.
[13] Zilberstein M., Yahav E. Leveraging a corpus of natural language descriptions for program similarity // Proceedings of the 2016 ACM International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software. ACM, 2016. P. 197 - 211.
[14] Manning C. D., Raghavan P., Schutze H. Introduction to Information Retrieval. Cambridge University Press, 2008.
[15] IntelliJ Platform SDK DevGuide. PSI Elements. URL: http://www.jetbrains.org/intellij/sdk/docs/basics/ architectural_overview/psi_elements.html.
...