Машинное обучение продолжает проникать в самые разные сферы человеческой деятельности, и такая технологичная область, как разработка ПО, конечно, не могла стать исключением. По прогнозу специалиста по ИИ и машинному обучению Сергея Маркова, озвученному в лекции «Итоги ИИ-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 показал себя неоднозначно. 

  1. Первый кейс. Проект с многолетней историей — типичный «монолит». Всё, что могло пойти не так, пошло не так. Генератор конфига  отказался дружить с нашим хитровымудренным Gradle скриптом. Написанный ручками конфиг заработал только для генерации тестов к отдельным классам. При попытке натравить его на готовый jar'ник он сразу терял все зависимости, заботливо прописанные в jcover.config. В грубой форме отказался сотрудничать c Serializable, что при использовании Active Record довольно болезненно. Некоторое количество тестов он все же сгенерировал — около 3000 (sic!), что подняло coverage на смехотворные 3%.
  2. Кейс второй, значительно более успешный. Stateless микросервис на Spring Boot. По словам разработчиков, они много времени уделяют поддержке spring boot приложений.  Все отработало без ошибок, coverage поднялся с 28 до 42 процентов, но только по инструкциям. По веткам coverage вырос всего на 6% с (41% до 47%). Это связано с тем, что много тестов проверяли геттеры или сеттеры. Возможно, в режиме Advanced  результаты были бы еще интереснее.


Бывает и так. Для класса с десятком публичных методов и сложной логикой получилась пустышка.

В сухом остатке: если бы все заработало, как задумывалось, это было бы очень круто и имело смысл, но до этого пока далеко. Версия 0.1 показывает, что у ребят еще все впереди.

Заключение


Использование ИИ для программирования набирает обороты, но пока индустрия еще в самом начале пути. Возможных областей применения множество: в некоторых уже наметилась конкуренция, в других пока представлены только единичные продукты. Главная и самая, казалось бы, очевидная цель — генерация собственно кода —  еще никем не взята, но повысить скорость разработки, уменьшить количество багов в старом коде и предотвратить появление новых искусственный интеллект способен уже сейчас.