AI-программирование: как я решил задачу, не написав ни строчки кода

f56080c18d6f99a00c421e5ecc6fac37

Вы что-нибудь слышали об AI-кодерах? Это такие программисты, которые не умеют писать код. Нас ими все пугают, что вот они придут и отнимут нашу работу. Насколько эти опасения оправданы? А вы знаете, что они уже среди нас?

Им пока не просто, им все еще приходится проходить собеседования, притворяясь обычными программистами и заучивая принципы SOLID. Никто из кандидатов в здравом уме не скажет работодателю: «Я не умею писать код, за меня его пишет ChatGPT», и работодатели пока тоже не понимают, что с ними делать, смогут ли они создавать хорошие продукты, они не понимают, как оценивать их работу, сколько они стоят, как их собеседовать.

Я пока тоже отношусь к скептикам, но поскольку я считаю себя человеком с ярко выраженным критическим мышлением, я задался вопросом:, а что если?

Я решил провести эксперимент и сделать задачу, не написав ни строчки кода, обладая минимальными техническими знаниями, и вот что у меня получилось. Дабы этот пост влез в рамки 10–15 минутной статьи, я сделал допущение, что проект уже существует, кто-то помог мне развернуть его у себя на машине. У меня стоит PhpStorm, настройки которого были подготовлены старшими товарищами, и я знаю, где находится командная строка, в которую я буду копипастить команды. Задача, которую я буду решать, будет уровня джуниор+.

Итак, вводные данные — небольшой готовый проект на Symfony на чуть больше чем 200 файлов с кодом и около 35'000 токенов (слов). В проекте есть рекламные объявления, где пользователи могут загружать фотографии и видео. Загрузка фотографий и их постобработка уже реализована (ресайзинг, удаление метаинформации). Постобработка происходит асинхронно через Messenger. Пока фотографии не обработаны, они и само объявление находятся в статусе ENQUEUED. После обработки получают статус ACTIVE. Задача, которая стояла — сделать постобработку видео. Перекодировать видео не нужно, но удалить метаинформацию было очень важно, поскольку в видео с телефона содержатся координаты, где видео было сделано, а это очень персональная информация.

Поскольку код писать мы не умеем, первая мысль, которая приходит в голову — загрузить весь проект AI и написать ему задачу. Я написал небольшой скрипт (все-таки одну строчку кода пришлось написать!), который собрал весь проект в один файл:

find . -type f \
  -not -path './vendor/*' \
  -not -path './var/*' \
  -not -path './assets/fonts/*' \
  -not -path './assets/vendor/*' \
  -not -path './.*' \
  -not -path './public/assets/*' \
  -not -path './public/uploads/*' \
  -not -path './*.lock' | \
  while read file; do
    echo "# $file";
    cat $file;
    echo "";
  done > project.txt

Размер файла у меня получился 424K, это проблема, поскольку максимальный размер контекста ChatGPT — 32K. Но зато есть Claude, и у него размер уже 200 тыс. токенов (слов). В моем проекте 35 тыс. токенов, так что должно хватить. Тем более что буквально на днях вышла новая версия 3.5 Sonnet. Что ж, попробуем.

Загружаю ему проект и прежде чем он начнет писать код, хочу обсудить с ним задачу и послушать, как он будет ее реализовывать:

Analyze project code, use its content and stylistic as a reference. I need to implement the following task:

On posting new ads, it«s possible to upload videos. Currently, video is uploaded and then publicly available as it is, which causes some security issues. We need at least to remove meta tags.

First let«s talk about how you will implement this task. Suggest ideas.

Claude дает вполне разумное решение: создать по аналогии с обработкой картинок новое событие для видео и обработчик для него. Вызывать событие в контроллере при загрузке видео. Он предлагает использовать библиотеку FFmpeg для редактирования видео, предлагает менять статус видео на время обработки и изменить вывод видео, чтобы необработанные видео не показывались. Как бонус предлагает создать превью для видео. Такой задачи у меня не было, но я не сразу обратил на это внимание и не сказал ему об этом ничего.

Здесь нужно сделать небольшое отступление. Это классно, когда у меня есть опыт, и я могу понять, что советы разумные. Но как человеку без опыта в программировании вообще понять, что он не советует полную дичь? Ответ на этот вопрос на самом деле простой. Точно так же, как понять, что профессор в университете, не рассказывает какую-то ересь — во-первых, он ее все-таки иногда да рассказывает, и ничего страшного в этом нет, ошибки делать можно и нужно. Во-вторых — ну нам же не нужно быть великим поваром, чтобы сказать, что стейк вкусный. Здравый смысл рано или поздно подскажет, как делать можно, а как не стоит. Плюс, пообщавшись с AI какое-то время, вы начинаете хорошо чувствовать, где AI уверен в своих суждениях, а где не очень. В конце концов, если вы не уверены, его можно переспросить! Но даже если ваша «чуйка» еще недостаточно развита, всегда можно просто принять на веру факт, что то, что он делает, — скорее правильно, чем нет. Мы делаем это каждый день в повседневной жизни, не вижу никакой проблемы сделать это и тут.

Итак, я принимаю его решение как подходящее. И мы идем дальше. Мне нужно как-то получить изменения, которые нужно сделать. Если я просто попрошу все, что надо поменять, то с высокой долей вероятности он после пары десятков строк скажет что-то вроде: «Ну, а вот тут сам допишешь». Нужно попросить его дать результат по частям, и я прошу его дать список файлов, в которых будут какие-то изменения.

Print complete list of files that need to be changed

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

print the content of src/Message/ProcessVideo.php

Он выдает какой-то код, создаю файл и копирую его туда. Прошу следующий файл:

print the content of src/MessageHandler/ProcessVideoHandler.php

Он выдает содержимое файла и говорит, что необходимо выполнить команду для подключения FFmpeg. Не имея ни малейшего понятия ни что такое FFmpeg, ни что такое Composer, слепо выполняю команду, и она отрабатывает.

В этом файле кода уже было побольше. Во мне, вдруг, проснулся внутренний программист и я увидел, что FFmpeg используется в обработчике явно, а на проекте у нас принято передавать все зависимости извне. Я не считаю это большой проблемой. Действительно, на каждом проекте есть свои практики, у нас принято так, Claude сделал по-другому. По-хорошему, вместе с проектом я должен был в изначальный prompt дать наш coding standard, в котором вероятно было бы что-то сказано про SOLID и Dependency Inversion, и я почти уверен, что он бы сразу написал правильно. Поскольку такого документа я ему не дал, я просто попросил передавать все зависимости извне.

Дальше начались проблемы, поскольку я человек внимательный. Я увидел, что PhpStorm мне выделяет отдельные куски кода. При наведении на них мышью он выводил какой-то текст, что он не может что-то найти. Я понятия не имею что это, но если PhpStorm мне об этом сообщает, значит, считает это важным, и я копирую это в Claude, он генерирует новый код, ошибка уходит.

Seems like method stripMetadata does not exist in $video→filters ()

Мой пытливый ум заметил, что среди кучи непонятного кода иногда встречается вполне себе человеческий текст. Например, мой глаз зацепился за такие слова:

// Generate a thumbnail (optional)
// Create a new video format
// Remove metadata and save the processed video
// This removes all metadata
// Use H.264 codec for video
// Use AAC codec for audio
// Remove the original unprocessed video

Я слегка удивился, ведь я не просил генерировать превью (thumbnail), и еще меня смутило, что он использует какие-то кодеки. Зачем, если мне надо просто удалить метаданные? В задаче четко стояло, что перекодировать не нужно.

Не уверен, поэтому решаю задать вопросы.

1. Remove code related to video thumbnail generation, I don’t need thumbnails for video.

2. I«m wondering about the performance of your approach. Will it re-encode the entire video file or just remove meta tags?

Claude соглашается, что действительно наделал лишнего. Из кода пропадают упоминания о thumbnails и появляются комментарии вида:

// Create a format that copies streams without re-encoding

Кажется, это уже то, что нужно, но теперь PhpStorm снова начинает подсвечивать слова. По старой схеме я кидаю ему все ошибки, и рано или поздно он пишет код, который на первый взгляд можно запускать.

Аналогичным образом я применил все изменения, которые он мне предложил. Я писал ему обо всех своих мыслях и переживаниях, которые возникали в процессе, и он их исправлял. Он делал ошибки, иногда получалось просто субъективно некрасиво, иногда он предлагал добавить код, который уже есть, но в целом ничего такого, для чего мне понадобилось бы умение писать код, он не делал.

Итак, все изменения применены, пробую загрузить видео, на экране ошибка и много другого текста:

App\Message\ProcessVideo::__construct (): Argument #1 ($videoId) must be of type int, null given, called in /home/eug/PhpstormProjects/my-project/src/Controller/UserController.php on line 148

Хотя мне кажется, что если бы я просто выделил все содержимое окна и скопировал его в окно чата, то Claude бы все равно понял, где ошибка, но я немного помог ему и полез в дебаг консоль за машиночитаемым бектрейсом. Мне кажется, что скоро мы должны увидеть, как отладочную информацию фреймворки будут выводить, не только красиво для глаза, а и удобно для ИИ.

Claude не составило труда понять, что он вызывает getId () перед тем как сделать flush (), и, соответственно, далее вместо id он в обработчик передает null.

В очередной версии ошибка ушла, видео успешно сохранилось, метатеги были успешно удалены.

В принципе, на этом можно было бы и остановиться, задача в целом успешно выполнена. Но я заметил, что видео обрабатывается синхронно при загрузке. Я, конечно, понял почему — нужно было настроить роутинг для нового сообщения на использование транспорта async, но так не интересно. Я хочу, чтобы он сам догадался. Он ведь сам в начале задачи писал, что видео будет в статусе ENQUEUED, пока не будут обработаны. Я задаю ему вопрос:

I uploaded video, but in database it’s in active state, shouldn’t it be enqueued?

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

Выводы

Итак, что мы имеем в итоге? Задача сделана, code review пройдено, да, были ошибки, но они были найдены и исправлены, ни одной строки кода я лично не написал (ну ладно, всего одну).

Главный вопрос: может ли человек, не умеющий программировать, писать код? Мой ответ — да, это уже вполне возможно. Кажется, что интерфейс в виде чата пока не очень удобный, потому что приходится копировать куски кода. Было бы куда удобнее, чтобы ИИ-помощник сам создавал и редактировал нужные файлы в проекте прямо в IDE, но мне кажется, это вопрос нескольких месяцев.

Я вас серьезно призываю перестать спрашивать на собеседованиях про разные виды сортировок и различие между B-Tree и AVL-Tree, а начать проверять умение пользоваться AI-помощниками. Хотите вы или нет, AI-кодеры уже появляются среди нас, и они уже сидят сутками перед мониторами и решают реальные задачи не хуже, а местами лучше «традиционных» программистов, при этом вообще не умея писать код.

© Habrahabr.ru