Когда пет-проект перестаёт быть пет-проектом

от автора

Пет-проект ни к чему не обязывает. Никто не ждёт аптайма, можно неделю не заходить. Сломалось, починишь на выходных. Всё меняется, когда за продукт начинаешь отвечать: чужие люди платят деньги, присылают свои фотографии и рассчитывают, что всё сработает. Игрушка становится обязательством.

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

Я не фуллстек-разработчик: пять лет я строю системы машинного обучения и языковые модели в финансах. Добрую половину того, что ниже (фронт, боты, продукт, маркетинг), до этого проекта я не трогал. И главный сюрприз оказался не в коде.

Архитектура: четыре точки входа поверх единого бэкенда

Архитектура: четыре точки входа поверх единого бэкенда

Откуда я пришел

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

В своем проекте команды не было, и быстро выяснилось, чего я не умею. Фронтенд, верстка, боты, мобильные приложения, это раз, но это хотя бы инженерия, её видно. Куда хуже было то, чего я не умел и не считал важным: продукт и деньги. За это я потом и заплатил, в прямом смысле.

Одна деталь сыграет потом: по специализации я занимаюсь как раз языковыми моделями и агентными системами. Те самые AI‑инструменты, на которых всё это собрано, и есть мой рабочий предмет. Я подходил к ним без магии, понимая, как они устроены и где врут.

Как оно росло и почему вообще в одиночку

Без инструментов этой истории бы не было, поэтому про них отдельно.

Начинал по старинке, писал всё руками. Документация, Stack Overflow, чужие сниппеты, отладка по строчке. В своем ML я так и привык работать, но половина проекта была чужой территорией (фронт, боты), и каждая незнакомая мелочь съедала вечер. Потом подключил Cursor, стало заметно быстрее. Но у Cursor оплата по расходу, и стоит начать кодить целыми днями, как лимиты выгорают к обеду, а доплаты сверху капают непредсказуемо. Вместо того чтобы писать код, начинаешь следить за счетчиком. Сейчас всё идет через Claude Code на тарифе за сто долларов в месяц, фиксированных. По поштучной цене за токены тот объём, что я через него прогоняю, стоил бы в разы больше. У активных пользователей API-счёт за столько же переваливает за тысячи долларов в месяц. Это и сместило всю экономику: за один предсказуемый тариф я получаю то, на что раньше пришлось бы нанимать подрядчиков.

Сам сетап тянет на отдельный пост. Claude Code живет прямо на боевом VPS, там же, где крутится прод. А прод это больше десятка контейнеров на одной машине: фронт, API, фоновый воркер, очередь, хранилище, nginx и оба бота. Агент видит их все вживую: какие подняты, что в логах, что отвалилось после деплоя; может пересобрать контейнер и проверить, что поднялось. Рядом, на втором сервере, живет аналитика. Сервер связан с продом приватной сетью, и агент заходит туда по отдельному SSH.

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

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

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

А расширялся проект вынужденно, без всякого плана. Первым был бот в Telegram: низкий порог входа, аудитория уже на месте, запустить можно за вечер. Потом Telegram в России начали блокировать, и держать на нём единственную точку входа стало рискованно: я пошел в VK. Но в VK та же механика работала заметно хуже: трафик шёл, а в оплату почти не превращался. Стало понятно, что нужна своя площадка, которую никто не отключит и где правила устанавливаю я. Так появился сайт.

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

Людям не нужны нейросети

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

Люди не крутили. Они заходили, упирались в экран с выбором моделей и настроек, и закрывали вкладку. Тот, кто все-таки доходил до результата, часто получал не то, что ждал (промпт это навык), расстраивался и не возвращался. Я гордился гибкостью, а гибкость отпугивала.

Дошло до меня не сразу. Обычному человеку не нужна нейросеть. Ему вообще неинтересно, что это нейросеть, какая модель и какие у нее параметры. Он пришел за результатом: посмеяться, удивить друзей, увидеть себя там, где в жизни не окажется. Смешной пранк. Свое фото рядом с дорогой машиной. Селфи со знаменитостью. Выбор из десяти настроек для него не свобода, а препятствие: лишний повод почувствовать себя дураком и закрыть вкладку.

Это та вещь, которую инженеру принять тяжело. Мы привыкли, что больше опций лучше, а прятать возможности значит оглуплять продукт. Здесь всё ровно наоборот: каждая настройка, которую я убирал, поднимала шанс, что человек дойдет до результата.

Был и трезвый расчет. Сама по себе генерация давно доступна бесплатно: Шедеврум у Яндекса, Kandinsky у Сбера, заходи и рисуй сколько хочешь. Конкурировать с бесплатным, предлагая ровно то же самое за деньги, бессмысленно. Но эти сервисы дают инструмент: пустое поле, промпт, выбор, ту самую мощь, от которой мой обычный пользователь и сбегал. За упакованный результат (готовый сценарий в один клик, без настроек) он платит, потому что бесплатные генераторы его как раз не дают.

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

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

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

Что под капотом

Архитектурно проект это четыре точки входа поверх одного бэкенда. Сайт на Next.js, бот в Telegram, бот во ВКонтакте и мини-апп внутри Telegram: все они тонкие клиенты к общему API на FastAPI. Логики «считать деньги» или «дергать модель» в самих ботах нет; они только показывают интерфейс и ходят в бэкенд.

Генерация устроена асинхронно, иначе никак: модель может думать и десять секунд, и минуту. Запрос с любой поверхности попадает в очередь (Arq поверх Redis), ее разбирает воркер, дергает нужную модель (через Replicate), складывает результат в объектное хранилище и возвращает пользователю туда, откуда он пришел. Данные живут в PostgreSQL, файлы в S3-совместимом хранилище, все это в докере за nginx.

Поток генерации: от загруженного фото до готового результата за минуту

Поток генерации: от загруженного фото до готового результата за минуту

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

Один нюанс всплыл как раз из-за того, что поверхностей несколько: тот же человек приходит и из Telegram, и из VK, и с сайта. Логично, что баланс у него должен быть общий, иначе пополнивший в боте, а зашедший на сайт решит, что его обманули. Поэтому кошелёк общий на все четыре поверхности, а не свой в каждом канале.

И ещё одна история, чисто из реальности: оплата внутри Telegram. Там есть мини-апп, и логично принимать оплату прямо в нём. Нельзя: Telegram запрещает продавать цифровые услуги внутри webview. Обойти невозможно, можно только увести человека в обычный браузер, не потеряв, кто он. Я делаю это через одноразовый токен, который кладётся в адрес после решётки и потому не уходит на сервер; внешний браузер подхватывает по нему сессию и продолжает с того же места.

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

Самая дорогая ошибка была не в коде

Теперь честно про роль AI. Без этого статья была бы рекламой вайбкодинга, а это враньё.

С техническими косяками всё скучно. Где-то iOS капризничал с версткой, где-то прод отдавал ошибку после деплоя. Клод чинил такое быстро, я подсказывал направление, и оно закрывалось. Делать вид, что я героически воевал с багами, не буду: код, в котором я был слаб, AI реально вытащил. Фронт, боты, мини-апп, докер, деплой: то, на что у меня ушли бы месяцы, делалось за вечера. Это его сильная сторона, и тут он меня ни разу всерьёз не подвёл.

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

И ведь я сеньор из финтеха, уж мне-то полагалось сначала посчитать. Но мой финтех это про модели и инфраструктуру; экономика привлечения в него никогда не входила, и в этой слепой зоне я наступил на грабли как полный новичок. Здесь не помог ни опыт, ни AI. Это вообще не инженерная задача. Это та часть бизнеса, которую я всю жизнь считал чужой работой.

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

Как один человек видит, что происходит

Технику я мониторю стандартно, через Prometheus и Grafana: жив ли прод, как себя чувствуют очереди и генерации. Это мой рабочий инструментарий, тут ничего нового. Продуктовую и денежную часть свёл в Metabase. Главная морока в том, что данные размазаны по трём базам: сайт и два бота исторически жили отдельно, и чтобы видеть картину целиком, их приходится сшивать. Один и тот же человек в Telegram, VK и на сайте — это один человек, и считать его надо один раз.

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

Каждое утро бизнес-обзор приходит в Telegram

Каждое утро бизнес-обзор приходит в Telegram

А недавно это вышло на следующий уровень. Тот же AI-агент, что пишет мне код, имеет доступ ко всем цифрам и контексту проекта. Поэтому теперь я не строю каждый разрез руками. Я спрашиваю человеческим языком: «почему вчера просела оплата», «какие тренды держат людей, а какие приводят и отпускают», и получаю ответ с цифрами быстрее и глубже, чем собрал бы сам. Аналитика из «построить дашборд» превратилась в «задать вопрос», и этим я занимаюсь на работе каждый день, только теперь для себя.

Маркетинг, о котором инженеры не думают

Здесь придётся сказать неприятное для инженерной аудитории. Самым важным навыком оказался не код.

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

Заодно развалилась красивая идея про «голубой океан», уникальную нишу, которую никто не занял. Я думал, оригинальная идея сама по себе защищает. Не защищает. Генераторов фото в мире тысячи, ниша забита под завязку, и в ней при этом спокойно зарабатывают, потому что дело не в уникальности. Можно открыть одиннадцатую кофейню на улице с десятью кофейнями и жить, если у тебя проходное место, понятное предложение и поток людей. С приложением то же самое: выигрывает не самый оригинальный, а тот, кто яснее объясняет, что он даёт, и умеет приводить людей. Для меня, человека от технологии, это звучало почти оскорбительно, и оказалось правдой.

Дальше я сделал ровно то, что делает любой инженер, дорвавшийся до маркетинга: полез в его техническую часть. SEO, разметка, скорость загрузки, корректная индексация: всё, что похоже на инженерию, измеримо и понятно. Работа нужная, но трафик она приносит не завтра, а в лучшем случае через полгода. А люди приходят совсем с другого, с того, что инженеру делать неловко.

Что реально работает у меня: контент. Я генерирую короткие ролики на своём же сайте, монтирую и выкладываю под виральные тренды. Я понял это не сразу. Ролик не реклама продукта, а сам продукт в действии. Человек видит готовый результат на чужом фото, хочет так же, и идет делать. Реклама и демонстрация совпали в одном коротком видео. Объем решает: чем больше роликов, тем выше шанс попасть в волну; что именно выстрелит, предсказать нельзя, можно только выкладывать много и быстро подхватывать то, что уже залетело.

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

Если свести в одно. Инженеру кажется, что главное построить, а маркетинг прикрутишь потом. Все наоборот: построить сегодня это посильная часть, а привести людей и удержать это отдельная работа, которой я не владел и которая далась тяжелее всего кода. Продукт без нее просто не существует, сколько его ни полируй.

Что значит «стало бизнесом»

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

Игрушка становится продуктом, когда чужой человек платит и ждет результат, а ты не можешь его потерять. Продукт становится бизнесом, когда ты перестаешь думать только про код и начинаешь думать про концепцию, цену, привлечение и удержание. У меня это пришло поздно, мне было комфортнее в коде. То, что в найме за меня закрывали продакт, маркетолог и финансист, пришлось осваивать самому: проджект-менеджмент, план, простую финансовую модель, без которой не понимаешь, зарабатываешь ты или нет.

И все же один человек сегодня может то, на что вчера нужна была команда. Но дело не в том, что «разработчики больше не нужны».

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

Так ценность и сместилась, с «умею писать код» на «понимаю, что и зачем строю». AI закрыл мне то, в чем я был слаб (код вне моей специализации), и это сняло с одиночки половину работы, инженерную. Вторая половина (понять, что нужно людям, и привести их) никуда не делась, и ее AI за тебя не сделает.

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

Если ты инженер и думаешь «сделаю продукт, а маркетинг потом», переверни порядок. Продукт ты теперь и так сделаешь. Все остальное и есть бизнес.

ссылка на оригинал статьи https://habr.com/ru/articles/1049890/