Приятный сеанс вайбкодинга
Я в последнее время практически большую часть работы делаю с использованием AI-агентов, которые при этом что-то программируют. На меня за это регулярно сердятся “настоящие” программисты, мол, я ничего не понимаю, что там AI пишет, будет масса проблем потом, кто это сможет поддерживать и вообще… Я, правда, честно отвечаю, что меня не волнует, кто это сможет поддерживать, пока с этим справляется даже нынешний AI, тем более, что большинство вещей, которые в итоге получаются — это прототипы, которые используются для разовой или нерегулярной задачи. Если в итоге станет понятно, что идея, алгоритм или последовательность операций даёт нужный результат — “правильной” разработкой займутся живые люди, которые сделают “правильный” проект. Хотя при этом я неплохо представляю, что откуда берется, что с данными происходит и как проверить итоговый результат — а вот какой алгоритм сортировки применен или как не по канонам названы методы, меня и волновать не должно, я такого и про результат работы живых людей не знаю.
Но вот случился у меня в качестве разгрузки совершенно хобби-проект, который я даже не особо долго обдумывал. Вообще не обдумывал, если честно, просто вдруг подумалось и за несколько дней проект сделался.
Этот блог построен на движке Hugo — я в свое время подробно рассказывал, почему и как я к нему пришел. И тогда же я упоминал, что одна из проблем движка — отсутствие какого-либо интерфейса для автора. Как-то все эти годы я эту проблему решал — пробовал веб-интерфейсы (их стало полтора вместо двух, поскольку один закрылся совсем, второй перестал нормально работать, но от первого сделали форк, а от форка сделали еще один форк, но все равно ужас и нищета), в итоге остановился на VS Code с несколькими плагинами, один из которых делал так, как мне надо, а остальные могли поддерживать шорткоды. Но вот сейчас стало понятно, что держать целую IDE только для того, чтобы пару раз в месяц написать заметку, причем в довольно ручном режиме — это перебор.
Только сейчас всё достаточно сильно изменилось. Я привык, столкнувшись с рутинными операциями, смотреть на это с точки зрения не “Как бы найти готовое решение, которое делает, что надо”, а “Может, попробовать написать что-то вместе с AI?”. Так же решил сделать и сейчас — пошел в Claude и начал спрашивать. Конечно, он сначала посоветовал те самые веб-CMS, которые я уже попробовал. Я его обругал, приказал перестать придумывать функции, которых там нет, а мне они нужны. Тогда он в итоге предложил написать свой веб-интерфейс. А я подумал и сказал, что не прочь подумать про нативный блог-клиент.
Помните (если помните), были такие в середине 2000-х — простой редактор, подключение к блогу через XML-RPC, поддержка разных движков. А были еще специализированные — для Livejournal. Потом наступил сплошной Wordpress, но редакторы еще оставались и даже еще продолжаются. Правда, их немного и только под Wordpress, у которого и так всё хорошо с интерфейсами. Но я активно использовал, еще на Windows, как минимум, один и вот решил вернуться к такому решению.
Разумеется, я отверг идею приложения на базе Electron — я очень их не люблю, как любое кросс-платформенное решение, они одинаково плохи на всех платформах. Так что мы взялись писать приложение на Swift, с использованием SwiftUI.
Я использовал Claude Code с установленным фреймворком SuperClaude — это набор агентов и команд, который очень неплохо организует рабочий процесс и обеспечивает долгосрочную память в проекте. И начал с брейнсторма — это прямо отдельная команда фреймворка, когда агент задает разнообразные вопросы человеку и формирует решение проблемы. Потом он на основе решения построил workflow и начал его выполнять. И, спустя примерно часов восемь работы в течение нескольких дней, приложение было готово.
Для его работы нужен уже установленные git и hugo и созданный репозиторий, в котором уже создан сайт. Кроме того, надо сделать отдельный ssh ключ для публикации — ведь hugo для этого сохраняет новые посты в git-репозиторий, который при этом включает механизм перестроения и загрузки сайта. Но эти операции делаются один раз и мало чем отличаются от установки скрипта на сервере — те самые блог-редакторы, вдохновившие меня на это творчество, тоже требовали всё готовое.
Что в итоге получилось — компактное приложение, которое запускается, читает выбранный репозиторий (папку на диске), показывает список постов, можно создать новый, написать его текст, нажать кнопку Save (я думаю, делать ли автосохранение), просмотреть его локально (по нажатию кнопки запускается локально hugo, строит сайт и через некоторое время открывается окно браузера с тестовой копией) и опубликовать.
Я, если честно, не думаю, что оно кому-то еще понадобится, кроме меня, хотя мысли о правильном оформлении и даже дистрибуции у меня мелькали. Но это потребовало бы добавлять функции, которые мне практически не нужны — короче, это самоподписанное приложение, которое существует только для меня, не очень заботится о требованиях политик Apple и в таком виде не сможет распространяться через AppStore.
Но при даже неизбежных проблемах во взаимодействии с агентами — а несколько раз я привычно ловил их на галлюцинациях или дурацкой инициативе, пару багов пришлось ловить несколькими агентами и тестами, — я не раз ловил себя на мысли, насколько же хорошо таким образом решать проблемы и как в принципе AI-агент быстро и хорошо разрабатывает. Даже с очень квалифицированным разработчиком ушла бы неделя на такую задачу — она не содержит никаких особых проблем, какие надо бы решить, но просто обсудить требования, проверить результаты, обнаружить, что часть требований неправильна, а часть неполна, доработать, починить баг, найти следующий — это вполне себе процесс. А тут я писал этот пост и параллельно фиксировал баги, которые тут же устранялись — так что к концу текста всё работает именно так, как мне надо.
Хотя я действительно ничего не знаю про Swift, всё же это не вайбкодинг. Я знаю, как делаются продукты, я умею сформулировать требования, я понимаю, как работают отдельные части и не ограничиваюсь промптом “Сделай всё красиво”, как принято считать. Но, если вы это тоже умеете — попробуйте решить мелкую рутинную проблему таким образом, а не мирясь с занозами и заусенцами готовых решений.