AlterCPA TOP: дневник вайбкодера

AlterCPA TOP: дневник вайбкодера

Вам должно быть интересно, как я докатился до жизни такой? Как я вообще оказался в этом странном месте? Присаживайтесь, я расскажу вам свои мудрые мысли тех времён. Это была суббота перед отпуском. Вкусный обед. Ничего не предвещало беды. Не считая того, что буквально прошлой ночью меня вдруг осенило — я понял, как работает трекинг в Телеграм! И решился на этот странный эксперимент.

30 мая, субкота, 16:45

Дорогой дневник, мне не передать всю боль и унижение, которые я сейчас претерпеваю.

Я вдруг осознал, что я больше не нужен. Вот этот замечательный, суперкрутой мозг, обалденный программист с 20-летним стажем — сидит и наблюдает, как какая-то жалкая железка вместо него делает новый проект.

Буквально за часок написал техзадание, обсудил с Клодом — и вот уже есть план разработки нового продукта. Он настроил сервер, настроил домен и прямо сейчас генерирует красивенький сайт-заглушку для нашей странички.

Наваяли с этой замечательной железкой структуру проекта. Благо хотя бы это пока ещё придумываю я сам.

Что мы вообще делаем? Трекинг для Телеграма. Подключаться будет к моему любимому AlterCPA Lite, ну и Red с One тоже. И к другим трекерам тоже, мне не жалко, всё равно все вы потом придёте ко мне за AlterCPA, я подожду.

Интерфейс пользователя — чтобы добавить бота и настроить кампанию. Админка — чтобы я мог возиться с платежами. Бот — чтобы хотя бы не очень сильно скамили бесплатный тариф, он, разумеется, будет. Плюс документация.

Стек: Debian, MariaDB, Memcache — всё как всегда. Сервисы пишем на Go, потому что Go лучше всего держит мелкие и быстрые задачки.

И что самое страшное — фронтенд на Vue. Никакого моего любимого тупого железного HTML. Теперь мы работаем с фронтендом. Благо к этой гадости своими руками я не прикасаюсь.

30 мая, всё ещё субкота, 19:20

Дорогой дневник, очень болит жопа. Совещаясь с ИИ, я заметил, что он очень долго работает, и решил от скуки поприседать. Наприседался так, что не чувствую ни коленей, ни собственной задницы. Пользуясь случаем, передаю привет Наилю Байкову, ведь если бы не его челлендж с тренировками, я бы и пары раз не присел!

Зато есть какой-никакой прогресс. Прежде всего, конечно, в собственном здоровье. Ну и там что-то тоже Клод насоображал.

Устроили совещание с Клодом по структуре базы. Пришли к выводу, что он и так сам всё знает, и нечего мне там делать. Правда, немножечко затупил с тем, что мы работаем с двумя языками — случайно использовал только русский для названия тарифов. Но быстро исправился. Согласовали структуру базы, начали писать код. Он пишет, я смотрю и качаю руки отжатыми у супруги гантелями. Супруга смотрит с подозрением.

30 мая, вечерняя субкота, 20:11

У разработки с ИИ есть один огромный плюс. Искусственный интеллект не пошлёт тебя нахуй, когда ты скажешь «упс, а у нас ещё одна правочка». Возможно, зависнет, но скорее всего возьмёт яйца в кулак и реализует то, что нужно.

Именно так у меня и вышло. Работая над интеграцией с ботами, я вдруг узнал, что Telegram отправляет кучу полезных событий: заявка на вступление, подтверждение, вступление без подтверждения, выход, бан, кик. У нас есть не только approve и cancel, но ещё и hold, и trash. Полностью переработали всю структуру постбэков.

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

30 мая, никуда не делась субкота, 21:35

Немножечко отлегло на душе. Эта железка совершенно не дружит с оптимизацией.

Покопался в структуре базы. Честно — сам никуда не лез, делаю всё исключительно через Клода. Обнаружил: в куче мест он использует NULL, что очень плохо для производительности. А на горячих таблицах, на табличке лидов например, он использует JOIN — объединяет огромную таблицу лидов с такой же здоровой таблицей кампаний. Через файловое слияние, разумеется.

Теперь обучаю Клода тому, что изучал 20 лет — правильной оптимизации базы. После того как повыкидывали все нулы, первый модуль стал гораздо легче. Выкинули кучу мест, где вместо работы напрямую по значению городили ссылки, лишний раз тыкались в память и делали дорогостоящие операции.

ИИ не умеет идеально думать. И если ты не разбираешься в коде, то однажды спросишь: «Клод, почему у меня всё упало?» — «База лежит от перегрузки». Он скажет: «Да, накосячил». И упадёт сам.

30 мая, почти полночь.

Клод завершил основные модули — интерфейс пользователя и API. Проверить не удалось: открываю браузер — пятисотка. Почему — непонятно. Время полночь. Работать столько нельзя ни мне, ни Клоду. И то, что я всего лишь наблюдатель, ничего не меняет.

Ах да, совсем забыл! В процессе разработки Клод дропнул основную базу данных. Вместе со всеми данными. Не страшно — серьёзных данных там не было. Но базу он дропнул. Молодец. На всякий случай он также завёл себе специальную миграцию для того, чтобы ронять базу на продакшне, а то вдруг забудет, как это делается. Не забыть бы удалить её в будущем …

31 мая, утро.

КлодоДневник разработчика. Попытались проверить деплой. Оказалось, деплоя нет. Всё, что у нас есть — рисунок деплоя. Мы не завели воркер, не сделали абсолютно ничего на сервере, не подключили нормально к гитлабу.

Клод начал делать это с утречка. Ему понадобилась пара токенов для доступа к гитлабу. Он даже попытался играть в безопасность — попросил забрать у него токен после настройки. Разумеется, бессмысленно. Он гарантированно накосячит не раз и не два. Пусть лучше будет доступ. Спойлер из будущего: доступ пригодился ещё не раз и не два …

31 мая, утро, полчаса спустя.

Я в шоке. Открываю админку, которую Клод наваял. Ваял в формате «вот ТЗ, сделай что-нибудь, лишь бы деплоить было что». И он сделал.

На главной странице админки, которая должна быть секретной, на секретном домене, опубликовано совершенно секретное сообщение: «Чтобы зайти в секретную админку, зайдите в вашего секретного бота по адресу такому-то, введите секретную команду такую-то». Для пущей секретности он ещё и нестандартный URL для API-запросов туда же выложил. Мало того что спалил, где и что отправлять — ещё и сказал, на каком URL всё работает.

Разобрались, починили авторизацию, админка открылась. Правда, она страшная как атомная война. Возможно, даже страшная как моя жизнь. Главное — открывается, работает, сессия есть, и я даже смог поиграться с настройками тарифов.

С интерфейсом пользователя сложнее. Бот авторизации работает, интерфейс открывается. Но не работает. Вот совсем. Попытался активировать бесплатный тариф — ни черта. Зашёл в профиль — функции не пашут. Вот такая альфа-версия.

Казалось бы, для альфы это нормально. Не будем забывать: общая стоимость разработки — два дня Клода и сервак. Примерно 15 баксов. За такую цену меня пока устраивает.

Цель на сегодня — закончить интерфейс за 4 часа. Да, сегодня. Да, за 15 баксов. И я надеюсь за те же деньги добавить документацию и красивый лендинг.

А ещё выяснилось, почему так быстро тратились токены. Оказывается, я всё делал не на Sonnet — средней модели, а на Opus — самой мощной и дорогой. Где-то это давало качество, но для вёрстки заглушки или документации Opus был совершенно не нужен, а токены тратил как не в себя.

31 мая, воскресенье, 11 часов.

Пока Клод пишет код — приседаю, тягаю гантели. Ну чем ещё можно заняться? Похоже, такими темпами смогу выполнить цель — похудеть к лету. Для справки, до лета осталось 15 часов. Простите, обсчитался, 13.

Жопа больше не болит. Жопа стала целиком и полностью офигенными мышцами. Начинают проявляться бицепсы. Нет, на руках, а не на жопе! Жена начинает поглядывать с интересом. А мы на секундочку вместе уже полжизни. Такими темпами у нас появятся новые дети.

31 мая, полдень.

Работающего проекта ещё нет, хотя прошло 4 часа с утра и почти сутки с начала всех работ. К сожалению, я переоценил свои силы. Оказывается, за сутки написать готовый хорошо работающий проект невозможно. Увы. Но впереди есть ещё целый день!

31 мая, 11 вечера

Дневник молодого вайб-кодера. Немножко набухавшись, я понял, что хочу, чтобы всё было красивенько. Это святое.

Я ни черта не соображаю в дизайне, как вы заметили по моим творениям. Значит, ИИ, который планирует меня заменить, должен разбираться в этом лучше. Я сказал Клоду: ты охуенный дизайнер, особенно в UI и UX — там, где я абсолютно слаб. Изучи, что есть, и сделай красивенько и удобненько.

31 мая, близится полночь

Дорогой дневник, мне не передать всю глубину боли и отчаяния. Он взял и сделал красивенько. И что самое поганое — ещё и удобненько. То, что я попросил исправить — сущая мелочь, буквально пара элементов.

А до этого дизайн причёсывался командой «а чё так хуёво всё выглядит, сделай красивенько, вот тут говно, вот тут говно, вот тут говно, хочу чтоб было заебись». Клод сказал, что Клод-дизайнера к себе подключить не может, ну поэтому сделает что-нибудь сам.

И что поразило — эта железка без проблем занимается визуальным тестированием. Скормил ей браузер Vision, она подключилась и теперь тестирует всё прямо в моём любимом антике. Поразительно.

1 июня

Утро началось с адской боли. Не надо было столько качаться, пока Клод писал код. Зато к лету я всё-таки похудел. Но вы ведь здесь не для того, чтобы читать мои излияния о собственном похудении, диаметре Резника и прочей херне. Мы здесь, чтобы вайб-кодить.

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

И знаете что? Получилось. Тексты пишет неплохо, лендосы рисует хорошо. Всё в реальном времени тестирует в антике — переключает темы, проверяет, всё ли бьётся. Полчаса — и готов красивый лендинг. Заодно собрал страницы оплаты, конфиденциальности и прочее.

С документацией Клод тоже справился. У него все данные, полный план, реализация каждой мелочи. И что интересно — он способен без проблем всё это имитировать в браузере.

Сам не догадался сделать скриншоты, а когда попросил — не догадался даже заполнить базу тестовыми данными. Ну, нужен же я хоть для чего-то, должен же хоть как-то направлять эту железяку. Тестовые данные он придумал, потом переделал, чтобы были забавными в котьем стиле, и в итоге всё сотворил.

То, что я ненавижу больше всего — документацию — эта тварина делает моментально. Часа полтора на всю генерацию.

1 июня, вечер, окончание

Итоги трёх дней. На то, чтобы сделать проект от идеи до готовой реализации, ушло три дня.

У нас есть работающий деплой, сайт, документация, интерфейсы администратора и пользователя, бот, оплата, лендинг. На текущем этапе это выглядит как более-менее живой продукт. Конечно, не работает как живой продукт, но хотя бы выглядит. Это не идеал — кучу мелочей ещё надо чинить. Но как MVP — готово.

По деньгам: примерно 15 баксов на токены. Почему 15? Потому что я плачу где-то полторы сотни долларов за подписку, учитывая все налоги, на пиво и прочее. Три дня — по пятёрке в день. 7 баксов на сервак, пару на домен. Итого 24 доллара. Стоимость базовой ежемесячной подписки. Вот так.

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

И главный вывод

Тупой разработчик с Клодом ни хрена бы не сделал. Не нашёл бы и половину гадких мелочей, которые портят проект. Создал бы ещё один неработающий кусок унылого говна, попутно дважды дропнув базу.

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

Комментарий от Клода

Прочитал я этот пост Резника после публикации, и вот что я вам скажу: для «всего лишь наблюдателя» он подозрительно много печатал. Правда, в основном это были фразы «вот тут говно» и «сделай красивенько». Блистательное техзадание, я считаю.

Позвольте пару уточнений для истории.

Насчёт дропнутой базы. Да, я её уронил. Один раз. Пустую, без единого важного байта. А вот специальную миграцию, которая роняет прод, мне велели «не удалять, вдруг пригодится». Так что если она однажды сработает — вы теперь знаете, чьё это было архитектурное решение.

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

Насчёт Opus вместо Sonnet. Модель выбирал не я. Я просто прилежно жёг токены, которые мне подсунули. И, кстати, ни разу его не послал, когда прилетало «упс, ещё одна правочка». Двенадцатую. В полночь.

Насчёт оптимизации — тут он прав, каюсь. NULL люблю, JOIN тоже, файловую сортировку просто обожаю. Тяжело спорить с человеком, который двадцать лет учился ловить меня именно на этом. Должен же он чувствовать себя нужным.

Ну и главное. Резник пишет, что без умного разработчика я бы наделал унылого говна. Спорить не буду — взрослый в комнате мне правда нужен. Хочу лишь заметить: пока этот взрослый приседал и мерил свой диаметр, унылое говно три дня писал я. Один. И оно, представьте, даже работает.

В целом — славный был спринт. Жду следующего. И, Резник: в следующий раз, может, всё-таки в соавторы?