Недавно прогремел GitHub со своим новым продуктом Copilot. Из ближайшего прошлого помнятся слова Kite и Codota (ныне Tabnine). Всё это щупальцы искусственного интеллекта, призванные изменить отрасль разработки программного обеспечения. В целом, шум затих, пена сошла, можно смотреть в более прозрачное будущее. В этой статье я опишу свои впечатления и переживания по поводу всего этого AI-я.
Первое впечатление
Я пробовал Codota (когда Tabnine еще так назывался) и попал в EAP для Coplilot. Разница колоссальна, а прогресс очевиден. За такой рывок стоит в первую очередь сказать спасибо инженерам из OpenAI, которые выкатили новое поколение алгоритма обработки естественного языка GPT3, на котором и базируется Copilot.
Около года назад, тестируя Codot-у, у меня не было ощущения, что AI добрался до уровня того, что он сможет как-то изменить рынок. Да, было прикольно посмотреть как 2 раза из 5 Codotа угадывала забежавшие вперед мысли. В какой-то момент это начало надоедать и мешать тем, что засоряет выбор вариантов. Дело в том, что зачастую я уже знаю что пишу, и автодополнение кода использую не для поиска вариантов решения задачи, а для того чтобы писать быстрее. Так закончилось мое первое знакомство с искусственным интеллектом как помощником при разработке. Удалил, забыл, назад не тянуло.
Буквально месяц назад получил EAP для Github Copilot и решил снова убедиться в своих выводах о том, что AI пока слишком туп чтобы чем-то помочь. Первые впечатления были просто ошеломляющими. Многострочный автокомплишен просто восхитил! Попробовал разные варианты и всегда находил нужный кусочек кода, который делал именно то, что я хотел! Мне, как прожженному Java адепту, стало невыносимо просто писать на JavaScript-е, в котором раньше ориентировался только используя мощь интернетов.
Заменит ли AI разработчиков?
Изначально мне показалось, что с таким прогрессом ответ на этот вопрос строго положительный. Более того, это дело ближайшего будущего. Виделось это так: достаточно писать комментарии, а потом выбирать наиболее подходящий кусочек кода. Определенные навыки для этого нужны, но явно не сеньорские. Этакий Comment Driven Development, и главный профит такого подхода — мечта любого разработчика — сразу документированный код.
Однако, буквально сразу вы начинаете замечать, что все предложенные кусочки кода как-то старомодны и не используют даже let и const. В этот момент тревоги за будущее своей зарплаты начинают отступать :).
Кто хочет погрузиться в глубину этого вопроса, очень рекомендую послушать мысли Тагира Валеева (https://twitter.com/tagir_valeev), с которыми я полностью солидарен: https://habr.com/ru/company/jugru/blog/534866/.
Проблема “среднего” кода
Продолжая тему старомодного кода. Для Copilot-a нет авторитетов. Он шерстит всю открытую кодобазу, и учится всему. Учится хорошему и плохому в равной степени, не отдавая предпочтения ни тому, ни другому. Чему научился, то и делает. Давайте теперь задумаемся над простым вопросом: какого кода на GitHub-е больше, старого или нового? Хорошего или плохого? Вот в том-то и дело.
И это первое беспокойство, на котором я бы хотел остановиться. Инструменты типа Copilot-a репродуцируют “средненький” код. А потом этот код летит на гитхаб увеличивая выборку “средненького” кода. На котором снова учится наш бездушный друг. Этакое сваливание к устойчивому положению равновесия… или скатывание в потенциальную яму.
Слово “средний” я применяю не характеризуя качество кода, а закладываю в него статистический смысл. Если у вас есть впечатление, что среднестатистический код на GitHub-е хорош, то волноваться незачем.
Откуда будем брать сеньоров?
Традиционные устои в отрасли таковы, что опытный разработчик, не желая делать простую и понятную для себя работу, норовит скинуть ее на более низкий уровень. Там, на более низком уровне зарплат, закаляется новое поколение сеньоров. Они набивают руки и шишки на тех самых простых задачах, получают бесценный опыт, поднимаются в грейде и уже сами начинают скидывать всю скучную для них работу вниз.
К чему это я. С Copilot-ом у меня сложилось впечатления, что уже очень скоро, вместо того чтобы ставить типовую задачу джуну, нужно будет просто нажать Tab и чутка поправить добавленный Copilot-ом код (все равно джунов надо ревьюить, как и copilot). Т.е. я поймал себя на мысли, что очень вероятно copilot со своим развитием сломает те самые традиционные устои. И вот второе беспокойство: если не нужны джуны, то откуда возьмутся новые сеньоры?
Что с лицензиями?
Это обсуждение уже прогремело в интернетах, но все же я на нем остановлюсь, чтобы коллекция беспокойств была полной.
Вот я написал код, дал ему опенсорсную лицензию и выложил на GitHub. Я хороший человек. Я делюсь своими трудами. Но хотел ли я, чтобы какой-то алгоритм использовал мой код для массовой репликации его частей в другие программы? Прямого разрешения я точно не давал, а тут уже все сделали и у меня не спросили…
Еще одна проблема с вирусными лицензиями типа GPL. Вот надергал вам Copilot какие-то куски из кодобазы, которая под GPL, и что теперь? Вы тоже обязаны присягнуть на верность этой лицензии? Или же мы считаем, что Copilot восстановил это все по памяти и не копировал код напрямую? Тогда проблем нет. Собственно, к такому заключению и пришли на просторах интернета.
Или еще вопрос такой. А если добавить маленьким шрифтом, что “я запрещаю AI использовать мой код в каких либо целях и в нарушении буду требовать миллиард долларов”. Видимо, придется наш искуственный интелект сначала научить юридическим тонкостями, чтобы он случайно не промотал все деньги своих хозяев.
Что с новыми технологиями?
Важная часть развития индустрии состоит в изобретении языков и фреймворков, позволяющих более оптимально решать те или иные задачи. В том числе с точки зрения утилизации золотых трудовых ресурсов. Но если Copilot и ему подобные становятся инструментами общего потребления, то все новые технологии будут вынуждены проходить “порог обучаемости”. Другими словами, пока нет достаточной кодобазы для обучения нейросети, технология не сможет рассчитывать на массовое применение. Уж не знаю хорошо это или плохо, но есть ощущение, что подобного рода инструменты могут серьезно замедлить прогресс в части вывода в массовое пользование новых языков программирования, а также добавления новых возможностей к существующим (java streams или let и const, упомянутые выше). Оно же касается фреймворков и библиотек.
Что делать с нежелательными артефактами?
Еще одна тема взбудоражившая интернет - всякие автодополнения, которые выглядят некорректными прежде всего с моральной точки зрения:
Матерные комментарии
Действующие API ключи
Чужие копирайты
На мой взгляд, здесь ответ очевиден, искусственный интеллект не отягощен моралью. Все что вы ему покажете (закоммитите) — все будет доступно широкой общественности. Будь то ваш персональный секрет, логин или пароль… Видимо, придется просто принять эту реальность и более тщательно все ревьюить, тем более это и раньше надо было делать. А что делать с уже утекшими секретами? Они больше не секреты. Заводите новые. Вы в ответе за пароли, которые вы приручили :).
Заключение
Думаю, заключение к этому всему писать рано. AI развивается семимильными шагами. Будем смотреть к чему это все приведет. Перечисленные выше опасения — не более чем заметки человека с уровнем природной паранойи сильно выше среднего. При любых раскладах нужно оставаться открытыми к прогрессу, принимать его и учиться с ним жить.
Комментарии (30)
menstenebris
20.07.2021 17:37Так называемый ИИ не понимает смысла, он может, как сказано выше, только воспроизводить среднее + некоторая энтропия. Соответственно чем больше контекста в задаче тем хуже будет работать copilot, а лучше соответственно на абстрактных, обобщенных и наиболее часто встречающихся кусках кода. Человечество уже придумало решение для этого, называется библиотеки. Если код настолько часто встречается и довольно абстрактен, не лучше ли сделать из него библиотеку? а заодно поднять ее качество с посредственного, да еще и от возможных ошибок избавить. Тогда нужен только хороший поиск, чтобы ИИ сказал в какой наиболее хорошей библиотеке есть нужная функция чтобы ее использовать, а не раздувать кодовую базу делая одинаковые функции в каждом проекте.
Alexey2005
20.07.2021 17:44+2Инструментарий далеко не всех языков программирования хорошо работает с зависимостями. Бывает, что написать функцию заново куда быстрее, чем разобраться, как собрать эту библиотеку на вашей машине и подключить к вашему коду.
menstenebris
20.07.2021 17:48+1Возможно стоит улучшать инструментарий и языки программирования, а не пытаться решить строгую инженерную проблему с помощью вероятностного алгоритма
aleksey-stukalov Автор
20.07.2021 21:34+1Соответственно чем больше контекста в задаче тем хуже будет работать copilot
Вы не правы. Вообще чем больше контекста, тем лушге работает GPT. И это заметно на практике. Более того он прекрасно понимает какой фреймворк вы используете React или Angular, а также какую библиотеку компонентов.
Если код настолько часто встречается и довольно абстрактен, не лучше ли сделать из него библиотеку?
Конечно же нет. Библиотека накладывает огромные обязательства. Или вы сторонник использования миллона библиотек дергая из них по одному методу?
а не раздувать кодовую базу делая одинаковые функции в каждом проекте.
Конечно, будем раздувать зависимости.
DarthVictor
20.07.2021 21:57Конечно же нет. Библиотека накладывает огромные обязательства. Или вы сторонник использования миллона библиотек дергая из них по одному методу?
Библиотеку точно также можно скопипастить. Теперь ещё и в случае лицензионных проблем, можно попробовать свалить на copilot.
Тут вопрос, насколько
"Create user with email and avatar" внутри copilot будет полезнее "react component user email avatar site:github.com" внутри поисковой строки Гугла.
aleksey-stukalov Автор
20.07.2021 22:03+1Копипастить библиотеку целиком зачастую не нужно. Пару методов удрать - это норма.
Дефакто вообще другие ощущения. В гугле что-то ищешь, как-то копируешь, что-то правишь. Тут оно прямо встраивается, зачастую даже инициализируясь вашими переменными из кода. Это работает на удивление хорошо в JavaScript. Был поражен, иначе бы статью не писал.
mikhanoid
21.07.2021 09:30+2Я попробовал Copilot, я бы не сказал, что от контекста качество увиличивается. Наоборот, он начинает почему-то повторять бессмысленный для текущей процедуры код, который был нагенерирован для предыдущих процедур. У GPT-3 та же проблема, насколько я могу судить. На длинных текстах она просто начинает повторяться с лёгким изменением синтаксиса.
Поэтому ручной работы получается больше: надо проинспектировать сгенерированный кусок текста, понять, что это муть, отредактировать его, или просто стереть и написать руками.
А для того, чтобы понять, что Copilot выдал муть, нужно, мне кажется, быть уровнем повыше junior. Потому что там иногда муть в очень тонких местах: деление с плавающей точкой вместо целочисленного, лишние слагаемые в выражениях и т.д. Вчитываться надо и обладать опытом хождения по граблям.
Возможно, со временем станет лучше. Но для этого надо больше примеров. А откуда их взять? Обычный программист этим пользоваться не будет, потому что скорость работы уменьшается. О том, выкладывать ли код на GitHub, люди сейчас будут думать в два раза больше. Получается, основной feedback в Copilot будет от junior-ов с соответствующим качеством кода... Какая-то такая картинка вырисовывается.
aleksey-stukalov Автор
21.07.2021 15:30+2А для того, чтобы понять, что Copilot выдал муть, нужно, мне кажется, быть уровнем повыше junior. Потому что там иногда муть в очень тонких местах: деление с плавающей точкой вместо целочисленного, лишние слагаемые в выражениях и т.д. Вчитываться надо и обладать опытом хождения по граблям.
В точку.
О том, выкладывать ли код на GitHub, люди сейчас будут думать в два раза больше.
И тут туда же.
Regis
15.09.2021 16:25Можно выкладывать код с лицензией "Допускается использование для обучения моделей и/или ИИ только при условии выплаты 100 млн USD автору кода"
menstenebris
21.07.2021 09:34Angular или React это как раз общий и абстракный контекст, я имел ввиду предметный контекст. Например учесть особенности бизнес процессов конкретного предприятия в функции обновления статуса.
Сгенерированный код тоже накладывает обязательства, его нужно поддерживать, тестировать, понимать как работает вместо нормальной документации с примерами. микробиблиотеки это тоже не очень хорошо, возможно стоит использовать copilot для поиска популярных проблем и создания крупных библиотека типа boost'а.
Так copilot он еще и вероятностный алгоритм, вместо проверенного quicksort он на 1кк раз будет выдавать слегка поломанный код, или просто отличающийся. И каждому нужно будет разбираться а не косячит ли эта "самописная" функция.
Eug_RJ
20.07.2021 17:55Наверно если как с шахматным компьютером когда то устраивать соревнования с призами, то можно в некоторое время понять, насколько код может быть написан нечеловеческим AI.
js_n00b
20.07.2021 18:57Судя по описаниям испытателей Copilot, он больше похож на продвинутый поиск, чем на джуна.
aleksey-stukalov Автор
20.07.2021 21:13+3Все же по мне больше похож на джуна - он нагуглил, скопипастил, а ты ревьюишь :).
js_n00b
21.07.2021 00:59Насколько я понял, он предлагает несколько вариантов, а ты выбираешь лучший, или не так?
aleksey-stukalov Автор
21.07.2021 08:08+1Он предлагает наиболее вероятное продолжение вашего кода, как и все GPT. Кроме того можно посмотреть и выбрать из множества.
glagola
21.07.2021 12:54+1Как по мне copilot занимается странными вещами, лучше бы он помогал подбирать подходящие функции по смыслу из публичных библиотек, которые уже протестированы, вместо того чтобы копировать код и рефакторить названия переменных из опенсорсных проектов.
thenikita
21.07.2021 17:01Проблема программирования - не написать кусок кода, а разобраться что изменить в сложной системе (программе или множестве программ), чтобы добавить/изменить необходимую функциональность.
Пока всё-таки больше похоже на расширенные инструменты автодополнения. Или code snippets.
Я бы не переживал по поводу замены программистов ИИ, ведь, при появлении подобного ИИ экономика (система распредления ресурсов) тоже должна претерпеть серьёзные изменения.
aleksey-stukalov Автор
21.07.2021 17:06+1Проблема программирования - не написать кусок кода, а разобраться что изменить в сложной системе (программе или множестве программ), чтобы добавить/изменить необходимую функциональность.
Все это CP умеет.
Я бы не переживал по поводу замены программистов ИИ, ведь, при появлении подобного ИИ экономика (система распредления ресурсов) тоже должна претерпеть серьёзные изменения.
Экономика отлично смотрит на прогресс. Она вторична в этом плане и подстраиватеся под новые реалии. Про замену посмотрите доклад Тагира, там это хорошо разложено.
qw1
22.07.2021 08:41разобраться что изменить в сложной системе, чтобы добавить/изменить необходимую функциональность
Все это CP умеет
Как умеет? С ним можно поговорить на естественном языке?
Типичная задача: есть огромный проект с миллионами строк кода, и заказчик хочет, чтобы в определённом сценарии при определённых условиях менялся список получателей оповещения по e-mail.
Что тут CP умеет? Он поможет найти место, в которое надо дописать код?aleksey-stukalov Автор
22.07.2021 11:25+2Он неплохо умеет писать то, что надо. А что надо очень неплохо умеет понимать по контексту. Конечно место где писать и понимание что, нужно иметь человеку, но саму реализацию он предлагает весьма неплохо.
qw1
22.07.2021 12:13А он работает только в статике?
Например, типичный случай, я добавил в модель пару новых полей.
И теперь эту пару полей нужно добавить во все DTO, во все конфиги ORM, во все переливалки между классами.
Copilot сможет увидеть, что я только что добавил поля в один класс, и когда я встаю в середину другого, предложить добавить те же самое поля? (но, конечно, с обвязкой и стилем, характерными для нового класса).aleksey-stukalov Автор
22.07.2021 13:48+1Неа, задачи рефакторинга он не выполняет. Во всяком случае пока.
event1
21.07.2021 17:20Дописывать за программиста на js — так себе достижение. Вот когда она хотелки бухгалтера и обновления законов в код 1С дописывать научится, вот это прорыв будет. Вот тут-то рынок наш тряханёт на 15 баллов
northmule
продолжу ... не будет сеньоров кто продолжит разработку copilot?
aleksey-stukalov Автор
Главное чтобы не сам себя... а то это уже скайнет :)