Вайб-кодинг с отладкой
Этот пост — для тех, кто пишет свои скрипты для автоматизации. Делюсь граблями и, возможно, приёмом, который помогает наступать на них реже.
Недавно выяснилось: я писал свои скрипты неправильно. Раньше как было?
- Пишу запрос: «Сделай мне Python-скрипт, который делает то-то и то-то. И ещё вот это, это и это».
- Дипсик что-то выкатывает. Пробегаю глазами по коду. Похоже на то, что я хотел, — вставляю в VS Code, запускаю. Поехали.
- Вылазят ошибки. Они всегда вылазят. Скидываю лог, Дипсик думает, выдвигает версию и пишет что-нибудь в духе: «Ну вот теперь-то 200% заработает».
- Запускаю снова. Что-то начинает работать, что-то перестаёт. Дальше — тяни-толкай: Дипсик правит две ошибки, попутно сносит логику двух других функций, появляются ещё две ошибки.
В эту игру можно играть долго. Каждый раз Дипсик авторитетно заявляет: «Ну вот сейчас я ВАЩЕ ВСЁ-ВСЁ-ВСЁ учёл, стопудово заработает». Ты запускаешь код — и он опять через минуту, пять, пятнадцать или сорок выбрасывает ошибку.
Как вы помните, я недавно писал статью для своего клиента про эксперимент с вайб-кодингом (статья, кстати, даже залетела в топ Хабра) , где клиент мне описывал фанатов ИИ, гоняющихся за линией горизонта за шансом ухватить версию работающего кода, глядя на обещания ИИ. Я узнал себя.
В разговоре, когда мы обсуждали саму статью, клиент сказал: реализовать тот или иной алгоритм программно — никаких проблем, с этим справится junior-разработчик.
Проблема не в этом. Проблема в том, что вокруг программной реализации алгоритма и «идеального сценария его использования» (happy path) нужно написать кучу сценариев того, как всё пойдёт не по плану. А это уже 95% оставшегося кода.
Выходит, сначала надо проговорить с ИИ основную логику. Потом подолгу обсуждать краевые/запасные варианты развития событий. И только потом давать команду на выкатывание кода.
Выглядит это так. Пишу промпт:
- Хочу Python-скрипт, который делает то-то и то-то (далее пошаговый идеальный алгоритм).
- Проанализируй предложенную реализацию, выяви слабые и спорные места, предложи оптимизации.
- Никогда не выводи код, пока не прояснишь все уточняющие вопросы. Код выводи только после моей команды «Выводи полный код».
И тут начинается нудный многочасовой допрос. Примеры из обсуждения скрипта для дедупликации книг в библиотеке:
— Хэширование текста без полного извлечения — принципиально? Предлагаю такую-то реализацию. Согласен?
— Что значит «уникальный файл»?
— Где живёт индекс? Как скрипт узнаёт, что файл «новый»?
— Что если имя файла уже содержит[Число_страниц]_? Убирать старый префикс и ставить новый? Или оставлять как есть?
— По твоему правилу выживает PDF (он вLIB\), а EPUB удаляется. Это правильно? Или EPUB всё-таки должен выжить — он ведь более редактируемый?
— Дубликаты внутриLIB\тоже идут в_duplicates, а не в_trash?
Вопросы идут бесконечным, как кажется, потоком. Ответишь на двадцать — он найдёт слабые места в твоих ответах и сгенерирует ещё двадцать. Таких сессий вопросов-ответов может быть 20-30.
Главное — не давать себе слабину. Каждый раз, отправляя пачку ответов, снова и снова спрашивать:
Если есть ещё уточняющие вопросы, задавай.
В итоге Дипсик выдаёт заветное «Вопросов больше нет, я готов вывести код» — и выкатывает код, который работает почти сразу.
У меня возник всего один косяк: библиотеку Дипсик импортировал чуть позже, чем положено. Исправилось легко.
Эксперимент с таким допросом я провёл дважды: апдейтил скрипт для извлечения глоссария и вот этот, для дедупликации книг в библиотеке. Результатом пока доволен (на скриншоте лог работы скрипта, работает уже 12 часов без единой ошибки, со скоростью обработки примерно 32 файла/книги в минуту):
Таким образом, хоть ИИ и выкатывает за 2-3 минуты — это, как вы понимаете, самая финальная операция. А вот обсуждение параметров, ограничений и уточнений занимает 2-3 часа и больше даже на мелкий скрипт.