Нейросеть пишет код вместо меня: как я пользуюсь бета-версией Copilot
Разработчик делится опытом, как Copilot избавляет его от рутины, почему сервис конфликтует с IDE и может тянуть в проект чужой код с GitHub.
karsten madsen / Pexels / Polina Vari для Skillbox Media
Игорь Камышев
об эксперте
Работает в Aviasales в команде веб-платформы — делает жизнь фронтендеров чуть менее болезненной. Ведёт блог и Telegram-канал, где рассказывает про разработку программ.
Copilot — это помощник, который встраивается в IDE. Он умеет превращать английскую речь в код, предлагает подсказки, оставляет комментарии и придумывает названия функциям. Лучше всего система работает с Python, JavaScript, TypeScript, Ruby и Go, но понимает и десятки других языков.
Придумали Copilot в GitHub, поэтому нейросеть обучали на всём открытом коде с платформы. Но она умеет тренироваться и на локальных файлах.
Создатели Copilot обещают, что ваш закрытый код не попадёт на сервера GitHub. Я тоже так думаю — если бы в GitHub захотели украсть мой код, там бы нашли способ попроще.
Copilot избавляет меня от рутины
Я работаю в команде, которая делает инструменты для программистов. Занимаюсь бэкендом и фронтендом, ещё пишу скрипты на Bash. Мне повезло попасть в программу тестирования Copilot, поэтому я пользуюсь его бесплатной бета-версией. Многие знакомые завидуют — их заявки пока не одобрили. Сервис работает как плагин для Visual Studio Code.
Первые пару дней Copilot мне не нравился. Я переживал, что подсказки будут неудобными — их придётся перечитывать, чтобы проверить качество кода, и тратить лишние силы. А я стараюсь во время работы экономить энергию и думать по-минимуму.
Но Copilot начал избавлять меня от рутины. Я работал со Storybook — инструмент помогает изолированно разрабатывать UI-компоненты и сразу отображает их в браузере. Раньше у него был плагин Storybook Addon Knobs, который показывал параметры элементов: например, цвет или размер кнопки. Его запретили, а взамен предложили другой плагин с совершенно новым синтаксисом. Мне пришлось переписывать под него 200 файлов, и это нельзя было автоматизировать средствами миграции.
После первых 15 файлов Copilot так хорошо натренировался, что дальше оставалось только принимать автозаполнение, нажимать Tab и иногда исправлять мелкие ошибки. Я не разбираюсь в нейросетях, поэтому не знаю, как это работает. Но Copilot быстро понял задачу и почти всё сделал сам.
В основном Copilot помогает мне писать на JavaScript и TypeScript. С Bash он справляется не слишком хорошо — нейросеть на нём явно мало тренировалась. Если пишете на Bash, то пока нет смысла пользоваться Copilot.
TypeScript — это и есть JavaScript, но в нём есть статическая типизация. Как минимум она даёт классные подсказки в редакторе и валидацию на этапе компиляции. Это помогает стандартизировать разработку, особенно в большой команде.
Иногда я пишу на Go, но тут качество подсказок Copilot оценить не могу, потому что только учу этот язык. Автодополнения для Scala мне не понравились. Хотя это очень специфичный язык — для меня он всегда головоломка, а её интереснее решить самому. Конечно, это приятно и весело, но я больше никогда не стану писать на Scala для продакшена. Слишком академичный язык.
Пробовал Haskell, но впечатления ещё хуже, чем от Sсala. Не могу держать в голове все контравариантные типы, моноиды, монады и прочее. В обычной работе это отвлекает.
Copilot неплохо научился подсказывать в Docker Compose — например, сразу после слов «docker compose» он говорит: «Давай порт прокинем». А это и правда хорошая идея. С цифрами не угадывает, но в целом удобно.
У него много сценариев использования
Я покажу, как Copilot дополняет функции, придумывает им названия и снимает другую рутину. Для примера возьму свой пет-проект с GitHub.
Дописывает функции. Если я открою файл на TypeScript и напишу «formatDate», Copilot допишет всю функцию за меня. Чтобы сохранить код, нужно нажать Tab.
Предлагает сигнатуру функций. Если я дополню текст, то Copilot не предскажет функцию целиком, но попробует додумать её сигнатуру. Когда нужно посчитать сумму нескольких значений, он тоже предложит свой вариант. Если я внесу правку, сервис сразу подскажет что-нибудь другое.
Такие длинные подсказки я не слишком люблю, потому что в них сложно разобраться. Обычно нажимаю Tab и смотрю, подсвечивает ли код моя IDE. Если нет — всё в порядке.
Создаёт новые функции. Когда в TypeScript я напишу слово «function», Copilot сам придумает ей название и предложит код — чтобы составить новую функцию, он анализирует соседние. В этом случае он назвал её «handleChange» — я бы и сам так сделал. Удачные варианты попадаются подозрительно часто.
Работает в пустом файле. Если я создам новый YML-файл и напишу «services», Copilot подскажет корректный код. Сперва что-то пошло не так — внизу окна загорелся красный индикатор, что Copilot не работает, но потом он включился. Помощник может написать целый файл, а мне останется только выставить нужные значения.
Иногда Copilot заедает на каком-то куске кода и он по кругу предлагает одинаковые строки, пока ты с ним что-то не сделаешь.
Пишет большие функции. Варианты в несколько строк у Copilot обычно получаются хорошо, а большие — плохо. Например, если предложить ему перемешать массив, он напишет функцию из семи строк. Хотя в этот раз она оказалась рабочей.
Дописывает тесты. Я хочу протестировать свою функцию «format_number», поэтому напишу «should format in US locale», а дальше помощник всё делает за меня. Получается вполне логичный код, я бы и сам так написал.
Подсказки Copilot зависят и от проекта, в котором я работаю. Мне кажется, что нейросеть понимает контекст и подстраивается под него. Но если Copilot предлагает слишком длинную подсказку, иногда проще не вчитываться и написать код самому.
В Copilot четыре важных минуса
Я пишу эту статью в сентябре 2021 года, когда Copilot ещё не вышел из беты, поэтому у него есть пара заметных недостатков. Иногда он конфликтует с IDE, есть вопросы к лицензиям и качеству кода.
Конфликты с IDE. Copilot немного ломает подсказки, которые уже встроены в среду разработки. В основном я пишу на строго типизированных языках — когда ставишь точку, IDE сообщает, какие у объекта есть поля. Встроенное автозаполнение появляется спустя 0,2 секунды, а подсказка Copilot — через 2 секунды. Это тормозит работу, когда быстро пишешь код.
Чужой код в проекте. Copilot может вставлять в проект куски стороннего кода. Есть мнения, что иногда сервис использует части программ с вирусной лицензией — если они попадают в проект, его придётся лицензировать. Но Microsoft дала официальный комментарий и сказала, что берёт все юридические риски на себя.
В Twitter был пост о том, как человек начал вписывать SSH-ключ, а Copilot подставил окончание ключей из чужого проекта. Но автор удалил тред и написал, что нейросеть подсказала случайный ключ.
Если Copilot предложит специфичный код, который, скорее всего, написан человеком, я отнесусь к этому с опаской. Но пока такого не было.
Незакрытые скобки. Любая IDE автоматически закрывает скобки: ты добавляешь первую, а она подставляет вторую. Всё налажено, и запутаться сложно. Но если Copilot предлагает подсказку, а ты её отклоняешь, скобки остаются незакрытыми и их приходится закрывать вручную. Мелочь, но раздражает.
Ошибки с типизацией. Хочу, чтобы Copilot понимал систему типов в моём языке программирования. Он часто даёт подсказки с неправильными типами — такой код не скомпилируется.
Я буду пользоваться Copilot всегда
За полтора месяца я очень привык к Copilot, и сейчас он для меня почти как стандартное автодополнение кода в IDE. Я просто чаще нажимаю Tab. В основном я пишу несложный код, поэтому Copilot сильно помогает с рутиной, где сразу знаешь, что собираешься написать и какой нужен финальный результат.
Конечно, иногда система ошибается и за ней приходится править код, но она определённо экономит время. Если сервис ломается, я сразу чувствую, что мне его не хватает. Не будь Copilot бесплатным, я бы за него платил.
Было бы здорово, если бы Copilot сразу разбирался в типах, валидировал свои подсказки и предлагал решения, если типы не сходятся. Хорошо, если это добавят в его новых версиях.