Машинное обучение продолжает проникать в самые разные сферы человеческой деятельности, и такая технологичная область, как разработка ПО, конечно, не могла стать исключением. По прогнозу специалиста по ИИ и машинному обучению Сергея Маркова, озвученному в лекции «Итоги ИИ-2019», в 2020-м году появится большое количество инструментов разработки, использующих машинное обучение. Это навело меня на мысль, что какие-то из этих инструментов должны быть доступны на рынке уже сейчас — могут ли они в таком случае помочь «в быту» обычному веб-девелоперу, пишущему на Java, Python и JS?
Забегая вперед, скажу, что, к моему сожалению, решений, способных генерировать хоть сколько-нибудь «боевой» код, в открытом доступе сейчас нет. Ближе всего к этому подошли Bayou и DeepCoder, но и эти проекты всё еще слишком сырые. Больший прогресс наблюдается в смежных направлениях — таких как автокомплит, статический анализ, генерация тестов. Об этом я и расскажу в статье.
Kite — умный автокомплит и встроенная документация в IDE для Python.
Сайт: https://kite.com/
Цена: Полностью бесплатный.
Плагин для ускорения написания кода при помощи «умного» автодополнения. Kite индексирует кодовую базу проекта, что подразумевает показ наиболее релевантных подсказок. Помимо собственно автокомплита, при необходимости можно в один клик раскрыть встроенную документацию с примерами кода для 800+ библиотек (наиболее полезно для библиотек типа numpy или pandas). Раз в неделю на почту присылается отчет со статистикой использования функции автоподстановки.
Предложения Kite (помечены значком) намного релевантнее нативных. Pop-up с документацией подскажет, что можно передать в kwargs
Раньше Kite отправлял небольшие куски кода на сервер, что многим не подходит по соображениям безопасности, но — хорошая новость! — сейчас Kite от этой практики отказался, и весь анализ происходит локально. В использовании плагин вполне дружелюбен — легко устанавливается и шустро работает, не загружая систему. Kite поддерживает большинство популярных IDE: Idea,PyCharm, Sublime, Vim, Vs code, Spyder и Atom.
В сухом остатке: пожалуй, самый готовый для боевого использования проект в подборке. Рекомендую всем, кто пишет на Python.
Для других языков есть аналогичные продукты — Codota для Java или TabNine, который поддерживает 22 языка. Не успел их распробовать, но по ощущениям, Codota предлагает более консервативные подсказки, в то время как TabNine (для Java) предлагает целые куски кода, включая имена переменных (иногда без всякого контекста) и попадает в точку.
DeepCode — статический анализатор кода с упором на поиск уязвимостей
Сайт: https://www.deepcode.ai/
Цена: Cloud версия бесплатна для opensource-проектов и команд до 30 человек. Есть self-hosted вариант для GitLab и BitBucket Enterprise, цена договорная.
По меткому выражению разработчиков, DeepCode — это Grammarly для кода. Назначение — помощь разработчику в обнаружении ошибок и уязвимостей в коде. Self-hosted решение поставляется в виде docker-контейнера, интегрируется в систему контроля версий через хуки и настраивается буквально за 10 минут. Также доступен бот для проверки пулл-реквестов. Заявлена поддержка языков Java, Python, JavaScript, и TypeScript.
Пример рекомендации DeepCode
Впечатления от использования: очень порадовал низкий процент ложных срабатываний. Все найденные проблемы были вполне реальными и не выстреливали по не зависящим от качества проверки причинам (код с багами не запускался, небезопасный код не использовал пользовательский ввод). Предупреждения, связанные с производительностью, также выглядят вполне резонно. Количество обнаруженных проблем в сравнении с анализатором Java кода FineBugs или той же PVS-Studio выглядит незначительным — 200 против 2-4 тысяч. Не знаю, считать ли это плюсом, но 200 штук по крайней мере реально разобрать, чего не скажешь о 4 тысячах.
Бот проверяет каждый pull request
В сухом остатке: если при работе с линтерами вас всегда расстраивало количество ложных срабатываний, стоит попробовать DeepCode. Также это отличный способ контрибьютить в opensource: форкните проект себе, прогоните тест — и парочка полезных pull requests у вас в кармане.
DiffBlue — автогенератор unit-тестов для Java
Сайт: https://www.diffblue.com/
Цена: 3375$ в месяц для команды из 25 человек. Бесплатный тариф для индивидуального использования пока в планах.
Этот продукт выглядит самым амбициозным в подборке. Британский стартап, в прошлом году получивший 20 миллионов в качестве инвестиции от Goldman Sachs. Если изначально я искал что-то, что генерирует код по тестам, то DiffBlue генерит тесты по коду с возможностью встраивания в CI. Продукт отличает хорошая интеграция с тестовой инфраструктурой Spring Boot. Работает с Gradle, Maven, testng, Junit.
Разработчиком заявлены два режима работы:
- Essential: тесты генерируются по сигнатуре метода
- Advanced: также учитывается тело метода и тесты генерируются для каждого ветвления в коде.
DiffBlue поставляется как CLI утилита для встраивания в CI или как плагин к IntelliJ IDEA для генерации тестов в процессе разработки.
DiffBlue сам мокает классы, генерирует фикстуры и ассерты.
На реальных проектах DiffBlue показал себя неоднозначно.
- Первый кейс. Проект с многолетней историей — типичный «монолит». Всё, что могло пойти не так, пошло не так. Генератор конфига отказался дружить с нашим хитровымудренным Gradle скриптом. Написанный ручками конфиг заработал только для генерации тестов к отдельным классам. При попытке натравить его на готовый jar'ник он сразу терял все зависимости, заботливо прописанные в jcover.config. В грубой форме отказался сотрудничать c Serializable, что при использовании Active Record довольно болезненно. Некоторое количество тестов он все же сгенерировал — около 3000 (sic!), что подняло coverage на смехотворные 3%.
- Кейс второй, значительно более успешный. Stateless микросервис на Spring Boot. По словам разработчиков, они много времени уделяют поддержке spring boot приложений. Все отработало без ошибок, coverage поднялся с 28 до 42 процентов, но только по инструкциям. По веткам coverage вырос всего на 6% с (41% до 47%). Это связано с тем, что много тестов проверяли геттеры или сеттеры. Возможно, в режиме Advanced результаты были бы еще интереснее.
Бывает и так. Для класса с десятком публичных методов и сложной логикой получилась пустышка.
В сухом остатке: если бы все заработало, как задумывалось, это было бы очень круто и имело смысл, но до этого пока далеко. Версия 0.1 показывает, что у ребят еще все впереди.
Заключение
Использование ИИ для программирования набирает обороты, но пока индустрия еще в самом начале пути. Возможных областей применения множество: в некоторых уже наметилась конкуренция, в других пока представлены только единичные продукты. Главная и самая, казалось бы, очевидная цель — генерация собственно кода — еще никем не взята, но повысить скорость разработки, уменьшить количество багов в старом коде и предотвратить появление новых искусственный интеллект способен уже сейчас.
Автор: densol92