Vibe, етить его, codding
@m0n0x41dЗаписывает мне вчера мой друг с густой шевелюрой голосовое сообщение. Говорит – "я сижу монтирую видео, и кликая мышкой издаю звуки ртом типа скдыщь-бдыщ-шмяк, вот прикольно было бы приложуху такую сделать."
Ну, посмеялись. А утром сегодня я подумал - а что? а вдруг? Ну давай попробуем vibe codding на swift, который я в жизни не трогал. Эксперименты!
И попробуем заодно с инженерно более взрослым флоу, где сначала следуем Харперу целиком, в смысле запускаем интерактивный опрос моделью нас с целью опросить собрать описание проекта. А вот дальше уже чуть серьезнее:
- Сначала просим на основании полученного описания расписать абстрактные типы данных, по OOAD методичке Бертранда Мейера, учитывая границы и отношения между ними
- Потом на основании этого описания, просим уже более формально описать эти АТД, с пред и пост условиями
- И в конце берем обе эти спеки и у модели которая "умеет синкэнг" просим последовательный имплементейшен план, с чек бокасми и промптами для реализации каждого этапа курсором.
НУ ШТОШ!
Следуя этому флоу я нагенерил все на Sonnet 3.7. Последний этап - та же модель, но с thinking.
Положил все 4 файла в директорию проекта, открыл Cursor (все еще с той же моделью) и начал кормить последовательно промпты из implementation plan, добавляя в контекст (через собаку) файлы со спецификациями ATD и контрактами.
После того как курсор нарисовал все классы (в разные файлы), прямо в корне проекта, я убрав все из контекста спросил по всему проекту "на основании спецификации проекта из файлов с АТД, контрактами и имлементейшен плана посмотри что у нас есть, чего не хватает и что вообще надо сделать."
Cursor удивительно хорошо понял все косяки, составил план, где сперва надо нормальную структуру xcode (хммм, swift имел наверное в виду :) проекта сделать, потом поправить все ошибки линтера, добавить не достающих классов UI и еще пару мелочей.
Тесты он не предлагал писать вообще. Но это должно быть (я верю!) поправимо – в последнем промпте для implementation плана надо добавить требование, чтобы в этот самый план были включены тесты.
Тут я взял и пульнул в Cursor обратно первые пункты из его же плана исправлений (поправить структуру, дописать классы и прочее.)
Минут 15 (!!!) он делал что-то сам, мне надо было только принимать предложения...))) В какой то момент в окне с "Агентом" всплыло забавное сообщение – "Мы по дефолту вырубаем работу после 25 tool-calls, нажми сюда чтобы возобновить конверсейшен"
Лол. Нажимаю.
Сидишь как идиот жмешь на Accept All вообще не успевая понять что происходит. Vibe, етить его, codding. Какой ужас. Приятное времяпрепровождение? Вы серьезно щас?
Ладно, через 15 минут его переваривания самого себя, структура проекта вроде стала лучше, но...
- импорты побиты наглухо
- Я вообще не понимаю что нагенерено - первый раз вижу свифт; Язык нормальный, вроде вполне выразительный, определения и все остальное читается сразу. Но это вообще ничего не дает сходу.
Если на этом этапе вообще не пытаться разбираться, и начать жать на ошибки "Fix in Chat" – это путь в никуда. Cursor начинает моросить полную дичь, создавать какие то мутные файлы где AppController класс-враппер для ApplicationController лежащего рядом ЧТОБЫ ИМПОРТ ПОФИКСИТЬ. Норм вайб, еее!
И начинаю нервничать:
Please analyze the whole project What's wrong with it? Which flaws we have? A lot of imports are broken why? Why you have created an idiotic wrapper @AppController.swift if we have already have a class in @ApplicationController.swift?
Он стал снова в целом нормальный анализ выплевывать – надобно мол создать файл который определит структуру проекта свифт и еще вот тут и там поправить.
На словах я Лев Толстой, а на Please Proceed я *** простой!
но вот конкретный ответ на мой вопрос выше меня разорвал:
### Why AppController.swift Was Created The AppController.swift wrapper was created as a temporary workaround to fix the compilation error in main.swift. It was an attempt to: 1. Provide a simplified interface to the real ApplicationController 2. Avoid direct dependencies on the actual implementation 3. Get the code compiling quickly This was indeed not an ideal solution, as it duplicates functionality and adds complexity
Обратите в нимание на бред во втором пункте – там никакого "интерфейса не было", тупо инстанс класса в другой засунул :)
Когда он завершил свой очередной анализ, и на "Would you like me to implement any of these solutions to fix the project?" где он предлагает создать нормальный swift пакет-проект, починить protocol-based дизайн и билд скрипт....
Я отвечаю снова и с гордо отваливающейся от вайба головой - `Yes proceed`.
Пошел чинить расставляя public перед классами и енумами, бодро подвигал еще пару файлов местами. Результат:

И дальше:

Вот уже на этом этапе на все про все его самоанализы я потратил ЧАС жизни. Приехав куда? Никуда.
Я ничему не научился, я ничего рабочего не сделал, на меня обрушилась ГОРИЩА потенциальной работы.
Было бы лучше если бы по финальному implementation plan я пошел своими руками делать по чек листам, без всяких промптов в этом плане и прочему.
Ничего не мешало бы пользовался бы курсором в моменте, решая конкретные задачи в узком контексте.
Ну, а что значит лучше? Было бы быстрее?
Нет, не было бы быстрее, я бы наверное за час только разобрался с базовой экосистемой свифта, нагинерил/написал бы определения пакета-проекта-как-его-там-в-сфивте-назвали и может первый класс, и тесты к нему.
Научился бы я чему то? Ну, кажется что еще как бы научился.
А так, ты получаешь огромный блоб кода который бросает невероятный когнитивный вызов.
Я пристально не вычитывал ATD и контракты которые на самом начальном этапе получились, но они выглядят как хорошая отправная точка. Для серьезного проекта таким подходом можно и НУЖНО пользоваться. Главное вычитать спеки, и потенциально поправить.
Implemetation plan получился тоже разумный, но промпты из него надо выкидывать. Нафиг! Я не верю в то что можно скормить такую спеку и ждать что курсор сделает норм. Это уже overfitting.
Короче результат такой такой:
- вайб коддинг вайбовый только когда используешь язык на котором ты уже хорошо умеешь писать и читать, чтобы достаточно быстро критически оценивать выхлоп и хватать курсор за хвост. Мой вайб коддинг - это command + k, или конкретные напихивания через собаку, с предельно тупым и конкретным указанием. Такое – нравится. Такое – вайб.
- Смириться и забыть про то что LLM может со взрослых инженерных спек писать код. Не может. Самое смешное что эти спецификации вроде бы как прям подробные, достаточно и очень даже подробные в том смысле - _чо как должно быть реализовано и работать_. Нет, LLM в ограниченном контексте скорее с детальными описаниями, но без _инженерной детальности_ может что то вам нарисовать.
- Sonnet хорошо бустит исследования, и генерирует вполне неплохие отправные спецификации ATD, понимает DDD/BDD хоть сколько нибудь. Отличный фундамент для нового проекта. Implementation Plan со спек тоже хороший делает, только надо промпт на этот план переделать "Чтоб для человека", без вложенных промптов для Курсора - нафиг.
Обязательно буду пользоваться таким флоу дальше и оттачивать.
Промпты кстати, найдете в комментах к посту в телеграм канале.
Обязательно попробую еще раз что нибудь другое с нуля повайбкодить на питоне / тайп скрипте. Может быть я (или Sonnet) все таки дурачок в Swift?