ИИ наконец-то заменил программистов или как Github Copilot отработал 1 рабочий день
21-го июня 2022 года Github Copilot, до этого около года находившийся в бете, стал доступен для разработчиков со всего мира. Напомню, что это система, работающая на алгоритме openAI Codex, призвана облегчить жизнь разработчиков, дописывая за них рутинный код. На момент выхода предлагается 60-ти дневный триал, а далее подписка за 10 долларов в месяц. В день выхода я установил соответствующий плагин в VS Code и приступил к тестированию. Боевое крещение второй пилот прошёл на Flutter проекте. Разработчики заявляют, что лучше всего Copilot работает на C++, JS и Python. Однако, это не помешало тестированию, ведь он поддерживает великое множество других языков и фреймворков.
Тест №1. Проверка синтакиса
Первой задачей стало перенести из фигмы caption шрифт. В файле уже были заданы другие шрифты. Достаточно было написать «static const caption» и помощник предложил продолжение.
К сожалению, он не угадал шрифт (в приложении использовалось всего 2 шрифта). Однако код был синтаксически верным. Это важный момент, т. к. мне уже приходилось работать с помощником Tabnine и он работал по совсем другому принципу. Tabnine учится на коде именно вашего проекта и предлагает бойлерплейты, основываясь на самых частых повторениях, игнорируя синтаксис и контекст.
Тест №2. Примитивная архитектура
Второй задачей стало нписать кнопку повторной отправки смс кода для экрана авторизации. Требовалось сделать ей 2 состояния: "разрешена отправка", "ожидание таймера". Руками был написан следующий код: """ abstract class ResendButtonState { const ResendButtonState(); } class ResendButtonStateWaiting """ Продолжение предложил ИИ: Он понял, что требуются 2 состояния: ожидания и готовности. Таким образом мы делаем вывод, что он способен к предсказанию примитивной архитектуры.
Допишем оставшийся функционал. Мне в наследство досталась функция таймера для этой кнопки. Однако, она не знала о состояниях кнопки. На 57-ой строке было достаточно написать "state = ResendButtonStateW", чтобы помощник развил идею. А на 62-ой потребовалось лишь лаконичное "state = ", и плагин доделал установку состояния готовности кнопки. Мне неизвестны другие решения на рынке, реализующие подсказки на таком уровне. Это не просто синтаксический автокомплит, а помощник, позволяющий выгрузить из головы упомянутые синтаксические моменты и заняться лишь высокоуровневым проектированием.
Тест 3. Понимание файловой структуры
В проекте используется пакет auto_route. Соответственно имеется файл с рутами и отдельно файл с их именами. Я написал файл-болванку, где создал пустой виджет HomePage. Далее открыл файл с рутами и написал "Au", после чего Copilot предложил то, что указано на скриншоте ниже. Примечательно, что синтаксически код верный. Однако, в RouteNames не было переменной home для домашней страницы. Но я проигнорировал ошибку, открыл файл с RouteNames, поставил указатель в новую строку и Copilot с нуля предложил написать название рута. Вывод: в файлах с типовым наполнением Copilot понимает как развивать структуру. Более того, благодаря этой системе он может даже связать логику нескольких файлов. Не уверен, что он понимает именно логику связки файлов, но, по крайней мере, создаётся такая видимость.
Тест 4. Продвинутая архитектура
Была реализована страница с анкетой (несколько текстовых полей для заполнения и отправки на сервер). Нужно было организовать архитекутуру, которая бы реализовала валидацию полей и привязала к ней стейт кнопки отправки, чтобы кнопка была неактивна, пока поля не прошли валидацию. В проекте используется стейт менеджер riverpod. Гайд риверпода предлагает combining providers в таких случаях. Однако, если начав делать по гайду, я увидел, что Copilot молчит. Тогда в классе виджета submit кнопки я создал функцию checkInputs и предоставил поработать ИИ. Он предложил собрать из ref все состояния полей. А после этого предложил их объединить в IF и вернуть состояние кнопки. Возможно, это не самая лучшая архитектура, да и код он предложил синтаксически неверный (перепутал сущности provider и notifier). Однако эта архитектура корректно работает после редакции синтаксиса. По этой причине я решил оставить код помощника :ослепительная_улыбка:
Тест 5. Работа с языками
Во 2-м примере мы рассмотрели работу с кнопкой повторной отправки смс. Любопытно, что начав описывать build метод, я получил подсказку, которая прекрасно отражала результат, который мне был нужен. Удивительно, что текст кнопки был на русском! Набрав этот текст в поиск по проекту, я не обнаружил совпадений в проекте. Т.е. Copilot нашёл текст на русском языке в каком-то репозитории и предложил его к месту, создав видимость понимания языковой семантики.
Вывод
В течение одного рабочего дня я активно тестировал Github Copilot и уже готов сделать вывод. Это совершенно новый уровень автокомплита. Конечно, нельзя сказать, что он обладает разумом и готов быть "вторым пилотом", как следует из его названия. Для примеров в этой статье были выбраны наиболее удачные случаи использования. Тем не менее, он может предсказать простейшую архитектуру, поработать с файловой структурой и ускорить работу с рутинным кодом. Следует также иметь ввиду, что мы рассмотрели его работу на Dart, а этот язык не входит в список рекомендуемых. Можно полагать, что на Python, JS или C++ он работает ещё лучше.
Когда он полезен? Архитектурные подсказки не всегда появляются и не всегда полезны. Зато если вы написали класс с большим кол-вом переменных, он в один клик создаст большой конструктор. Если вы хотите подключить декоратор Serializable() он сам добавит part '...'. Наконец, он полезен, когда нужно указать какой-нибудь очевидный параметр из enum.
Буду ли я им пользоваться? Во время бесплатного периода буду пользоваться и активно тестировать. Приятно получить дельную подсказку и избавить себя от описания рутины. Наверное, это технология будет развиваться и предлагать всё более осмысленные и длинные сниппеты кода. Но что дальше? Назревает вопрос: «а может вы ещё и конфеты за меня есть будете»?