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

Привет, Хабр! Меня зовут Леонид Калядин, я Cluster Data lead в МТС Web Services. Я отлично разбираюсь во всем, что связано с data, но вот в мобильной разработке — полный ноль. Во всяком случае был до недавнего времени. В этом материале я расскажу, как решил спасти дочь от надоедливой рекламы и навайбкодил Adventure Mazes — игру, которая вошла в топ Android TV в Google Play. Итак, кому интересны подробности — велкам. 

Идея лежала на поверхности — лабиринт

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

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

 Вроде только текст написал, а он сразу же превращается в интерактивный лабиринт. Дочь засыпала меня вопросами, как это работает, и я, поймав кураж, решил набросать ей в draw.io схему разработки. Ее шестилетний мозг, окинув взглядом прямоугольники, ромбики и стрелочки, выдал вердикт: «Пап, ну это сопли какие-то». И дочка пошла спать. Миссия номер один — уложить ребенка — была выполнена.

А меня накрыло. Всплыло то самое, давнее желание делать игры, приведшее меня в IT, но которое успешно похоронили предложения на рынке труда (хотя свое направление data я тоже люблю). Очнулся я в четыре утра с диким желанием прикрутить еще пару фич, но инстинкт самосохранения победил.

Утром жена устроила допрос: 

— Лег во сколько?
— В четыре. И то я себя заставил! Мог бы до шести фигачить.
— Совсем сдурел?

Тут пришлось доставать главный козырь: «Дорогая, я же не просто так! Я игру сделал! Запущу в Google Play, стартанем, заработаем миллионы!» Лед в ее взгляде тронулся: «А… Ну тогда ладно».

Итак, перчатка брошена (мною же самому себе). Вызов принят. Переходим к серьезным делам.

Proof of Vibe: от идеи до игры, пока не остыл кофе

Отлично, отпуск только начался, времени — вагон. Первым делом уточняю у AI, а смогу ли я вообще отправить свое творение в Google Play. Ответ обнадеживает: существует куча утилит, все прекрасно публикуется, и по каждой из них он готов выдать пошаговую инструкцию. Что ж, дело за малым — навайбкодить саму игру.

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

Я почти не валидировал код. Конечно, у меня был опыт интеграции JS-чартов в опенсорсный BI и написания кастомных CSS, но такое количество вложенных if и for все равно немного выходит за рамки моей зоны комфорта.

Однако стратегия «один файл на все случаи жизни» быстро себя исчерпала. Этот index.html-мутант рос на глазах, AI переписывал его все дольше, и каждая итерация превращалась в лотерею: отвалятся иконки или сломается кнопка? Все чаще после добавления новой фичи игра переставала запускаться — и чат заботливо подсовывал кнопку Fix error, снова и снова переписывая весь код, порой обрываясь из-за connection timeout.

Окей, пора взрослеть

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

/my-game/

├── index.html

├── spritemap.json      // Карта спрайтов

├── /css/

│   └── style.css

├── /js/

│   ├── main.js         // Главный файл: инициализация, игровой цикл

│   ├── billing.js       // Платежный плагин

│   └── config.js       // Настройки уровней и локализаций

└── /assets/

    ├── /images/

    └── /audio/

И тут я поймал себя на мысли о контрасте с основной работой. В мире больших данных я использую AI очень точечно. Просто невозможно загрузить в него весь контекст бизнес-процессов. Ему не объяснишь, что формат интеграции утвержден, но есть еще Лариса Алексеевна из смежного отдела, которая порой выходит работать в субботу (что само по себе тревожный знак), вручную формирует Excel-отчет для загрузки корректировок и может случайно поменять столбцы местами. Такие кейсы — задачка для сеньора с сединой на висках. А здесь, в моем маленьком stand-alone-проекте, все четко, логично и предсказуемо. 

От PoC к MVP через минное поле

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

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

В какой-то момент в ленте мне попался пост, что очередной AI достиг очередных высот. Я раздраженно пожаловался другу, что высоты высотами, а у меня игра в одном из десяти случаев намертво виснет при столкновении с привидением. В ответ поймал риторический вопрос: «Так кто косячит — AI или тот, кто пишет ему кривой промпт?» Несмешно, но задуматься заставило.

Понял, что нужно что-то менять в моем подходе. Если раньше я пытался описать AI задачу максимально подробно, со всем контекстом, чтобы получить все и сразу, то теперь понял: это путь в никуда. Чем сложнее запрос, тем хуже результат. Все как в реальной разработке: не нужно пытаться объять необъятное — нужно двигаться короткими итерациями.

Так дело пошло лучше: стало еще меньше галлюцинаций, AI точнее понимал требования, многие ошибки ушли. Но проклятый баг с привидением остался. 

Начался мой личный «день сурка». Вечер: новая гипотеза, новый промпт. AI: «Да, босс, я все понял, теперь 100% будет работать!» Ночь: тест, фриз. Утро: 4:00 на часах, я разбит, прогресса ноль.

Я лежал в кровати и глядел в потолок — и вдруг пришло озарение… Идиот тут не AI, а я сам. Человек, который менторил джунов и талдычил им: «Без логирования ошибку не исправишь, ну если только ты не обладаешь экстрасенсорными способностями!» — пытался дебажить вслепую! Сам же нарушал свои главные заповеди.

Окей, новый план. Прошу AI добавить в код логирование. И вот оно! Зависание оказалось связано с редкой гонкой состояний при перезапуске уровня. Решение простое — задать уникальный ID для каждой игровой сессии. С логами на руках AI мгновенно поставил диагноз и предложил верное лечение.

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

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

Умный вайб-кодинг, или Семь раз отмерь, один раз сгенерь

Основные механики готовы, пингвин бегает, призраки летают, ничего не виснет. Финальный штрих: задаю вопрос AI и получаю новую инструкцию, по которой создаю Android-проект с помощью Capacitor и делаю билд APK. На моем телефоне все отлично работает. Пришло время подумать о высоком… О том самом миллионе долларов, обещанном жене.

Когда твой вайбкод встречается с чужим API

В плане монетизации моя философия проста и прямолинейна: никакой рекламы, только честная кнопка «Открыть все». Этот вариант я бы и сам спокойно поставил дочке. AI предложил выбор: интегрировать готовый коммерческий плагин с бесплатным тарифом  или написать свой. Я глянул на документацию и увидел предупреждение: «Только на настройку Google Cloud уйдет 2–3 часа». Серьезно? Да я за это время свой с нуля напишу, да еще и кофе успею выпить!

AI быстренько накидал инструкцию, я аккуратно все повторил — и APK перестал собираться. Ошибка в dependencies. Ну… с кем не бывает. После нескольких итераций исправлений билд по-прежнему падал. Ладно, 2–3 часа на настройку Google Cloud — не самая высокая цена.

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

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

Человек или AI? Вот в чем вопрос. Доверяюсь своему опыту, делаю, как написано в доке, и… ошибка исчезает. Билд проходит, плагин все еще не работает, но apk собран.

Интересно, сколько еще часов я бы потратил, если бы слепо слушал «помощника»?

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

Итак, приложение опубликовано  в closed testing. Платеж проходит, контент открывается. Победа?

8 гигабайт оперативки хватит всем

Как бы не так. AI-ментор тут же напоминает, что Google в свой магазин не пустит, но тестирования на своем устройстве недостаточно, ANR, Crash Rate, вот это все, иначе приложение будет пессимизировано и пропадет из выдачи. И что неплохо бы потестить на эмуляторах в Android Studio. И тут я смотрю на свой ноутбук. Когда-то я был уверен, что 8 ГБ оперативки хватит всем. Ну для Caesar 3, вторых «Героев» и браузера. Оказалось, что в 2025-м этого не хватает даже на то, чтобы запустить эмулятор бюджетного телефона в Android Studio.

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

В нашем кластере есть продукт SunQ — мобильная ферма для тестирование приложений. Пересекаюсь с ребятами в офисе, чтобы узнать, как бы к ним пристроиться. Выясняется, что это небольшой, но все же бюрократический процесс. А в моем случае будет не так-то просто объяснить, зачем Cluster Data Lead вдруг понадобился доступ к мобильной ферме, да еще и чтобы затащить приложение извне.

Звоню CPO продукта. Договариваемся встретиться в кафешке и обсудить. Пока жду коллегу, девушки за соседним столом обсуждают «вайбы» прошедшей вечеринки. У меня от опыта кодинга с AI на этом слове уже начинает дергаться глаз.

Наконец, коллега приходит и дает мне два очень хороших совета:

  1. А чего тебе просто на внешнем стенде не зарегаться? Там триалка 21 день, для твоих нужд хватит за глаза.

  2. Ты капибару-то в игру добавил? (На тот момент еще нет.)

Золотые слова! Регистрируюсь в сервисе, выбираю телефоны послабее и тестирую. На бюджетном Xiaomi с 2 Гб оперативы все ок, а вот на Samsung с Android Go все выглядит совсем жалко.

Нужна была оптимизация. К счастью, у меня как раз появился триал другого, популярного AI-сервиса. Я закинул код обоим. Советы оказались разными. Тогда я устроил им очную ставку: просто начал копировать ответы одного в чат к другому.

После нескольких раундов этого AI-баттла («А вот он сказал, что твой requestAnimationFrame — ерунда!») они наконец-то сошлись в показаниях и выдали общий пул оптимизаций. Один AI — хорошо, а два — лучше.

Дальше была финальная полировка, длившаяся три ночи, за которую я исчерпал все токены, пока  пытался найти промпт, чтобы добиться от AI иконок в едином стиле подходящем игре. Затем — локализация страниц, где AI-переводчик выдавал порой такие галлюцинации, что я все перепроверял через кросс-сверку от второго AI. После всех этих мелочей — наконец-то релиз.

Как я попал в топы и толком ничего не заработал (и почему это неважно)

Через неделю игра выстрелила в топе новых игр для Android TV, а потом перешла и в основной. Денег это, правда, особо не принесло. Но мог ли быть другой исход? 

Я делал игру для ребенка — без донатного мусора и рекламы. Монетизация там была для галочки. Да, в игре можно купить весь контент сразу, но, как сказал мой друг, главная «проблема» моего  бизнес-плана в том, что открытие контента через игру гораздо интереснее, чем его покупка.

Зато я получил много теплых отзывов. Восьмилетняя девочка из Чили, благодарный родитель из Турции и многие другие — игра нашла свою аудиторию. Игра живет и развивается (естественно, за счет моего очередного бодания с AI).

И вот тут мы подходим к главному

AI как технология, несмотря на весь хайп вокруг и глюки, дала мне (и может дать кому угодно) возможность сделать что-то свое. У меня вот есть подписка на приложение с ежедневными английскими кроссвордами. И думаю, что продлевать ее уже не буду. Я лучше потрачу еще пару-тройку вечеров (недель) и запилю кроссворды, которые нужны именно мне. А может, как раз они-то и принесут тот самый миллион. Кто знает… 

В общем, я устал, опустошен и выжат как лимон. И я обязательно сделаю это снова.

P. S. На момент выхода игра уже не в топе игр Android TV — последний релиз словил высокий ANR на части «народных» ТВ, где, как оказалось, производители не обновляют WebView — видимо, для экономии, и игра там просто уходит в вечный фриз. В ближайшем обновлении это будет поправлено, и игра должна вернуться в топ, а если вдруг эту статью читает кто‑то из производителей бюджетных ОЕМ ТВ — буду признателен, если вы отдадите парочку устройств в мобильную ферму SunQ для живых тестов.

Комментарии (0)