Вайбкодинг: от восторга к суровой рутине на примере моего приложения PowerHabits

Открытый вопрос
Открытый вопрос

На просторах интернета и даже в профильных сообществах сейчас бушуют нешуточные споры о том, полезен ли ИИ для кодинга и может ли он заменить разработчиков или нет.
Одни продают курсы о том, как фаундеру навайбкодить готовый продукт (лендинг, бота и т.д.) за пару часов на коленках и сократить штат своих разрабов в 3 раза, другие говорят, что всё это нейрослоп и все эти ваши ИИ генерят только технический долг и дыры в системе вместо продукта.
На мой взгляд истина посередине. Делюсь личным опытом разработки мобильного приложения, в котором есть и детская радость от сгенерированного кода без знания языка и боль от рутины, дотошной замены строк кода и отладки долгими часами. От появления идеи до публикации в Huawei AppGallery. В конце будут полезные на мой взгляд рекомендации для того, чтобы ваша разработка прошла продуктивнее.

Как родилась идея приложения и почему я решил, что оно кому-то нужно

Личная боль

Долгое время я пользовался приложением Loop Habits или как-то так. Мне нравился колоркодинг, который я мог задать для разного типа привычек, кружочек силы и возможность создания неограниченного количества привычек. В начале реклама в приложении была ненавязчивой и не мешала использованию приложения, но в какой-то момент разработчик решил поставить 2 непропускаемых ролика при запуске приложения, что убило желание пользоваться им от слова совсем.
Когда тебе нужно потратить больше минуты на просмотр рекламы, чтобы поставить 1-2 галочке в приложении ничего кроме раздражения не испытываешь.
Так я решил создать себе приложение - замену.
Первое MVP, где ничего нормально не сохранялось, но можно было тыкать галочки, собранное с помощью Gemini меня удовлетворило и постепенно от своих задач я начал пополнять его функционалом на основе собственных потребностей:
Появился функционал для работы с тренировками. Кардио - я этакий начинающий триатлонщик: бегаю, катаю на веле, плаваю, в зале заменяю бег эллипсоидом. И силовые - то, что мне было нужно больше всего - хранить где-то записи сколько повторов с каким весом я сделал.
Добавил дневник рефлексии. Мне нравится практика каждый день оценивать, что было сделано хорошо, а что можно сделать по другому.
Дневник настроения и собственной оценки уровня энергии. Полезно на долгой дистанции посмотреть как менялись эти показатели и соотнести их со своим образом жизни или жизненными событиями.
Таск трекер. Раз уж приложение так разрослось - почему бы и короткие дела не добавить? Сказано - сделано.

Потенциал масштабирования

Тут я сделал очень вольное допущение - мое приложение окажется круче имеющихся лидеров поэтому я соберу не меньшую аудиторию. Я прошелся по топовым приложениям в этой сфере и их скачиваниям в Google Play:
• Loop Habits (5+ млн загрузок)
• TickTick (10+ млн загрузок)
• Habitica (5+ млн загрузок)
• Fabulous (10+ млн загрузок)
•Productive (1+ млн загрузок)
И т.д.
Получится ли приблизиться к этим цифрам - время покажет.

TickTick: 10+ млн скачиваний
TickTick: 10+ млн скачиваний

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

Почему выбор пал на Huawei App Gallery в первую очередь

Первое - так как у меня телефон Huawei с отличной камерой и отсутствием Google сервисов со всеми вытекающими, я понимаю недостаток этой платформы в разнообразных качественных приложениях.

Второе - ограничение по монетизации от Google Play и Apple App Store. Был расчет на то, что я смогу выйти на рынок Китая со своим приложением - но он не оправдался. Подрубить монетизацию в Китае для разработчика из России на текущий момент недоступно.

Как происходила разработка или вехи

Подготовка

Первичные запрос - что-то вроде хочу разработать кросс-платформенную прилу: трекер привычек. Чтоб можно было и на Huawei и на Android и на iOS. Но сначала Huawei.

ИИ-шка бодро снабдила меня инструкциями - скачай Android Studio, поставь там пакеты dart/flutter и вот тебе первый кусок кода.

Скачиваю Android Studio, пытаюсь поставить в нём Dart и мне прилетает сообщение, что Dart не доступен из коробки для пользователей из России.Скачиваю ручками пакеты Dart и Flutter, запускаю заново - вуаля, можно вайбкодить.

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

Чистое творчество

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

Файлы были еще небольшими на 100-200 строк, я радостоно жал копипаст кода из чата, меняя всё содержимое файлов, за каждые 10-15 минут я получал обновленную версию приложения.

Дофамин, радостные возгласы и чувства восторга от того как все легко собирается.

Первый серьезный барьер

Уведомления для пользователей в определенный момент времени оказался непростой задачей. Gemini уверял меня, что код написан идеально, но они не приходили. Отладочное сообщение отправлялось.

В какой-то момент времени без шуток нейронка отправила меня переустанавливать Windows и Winamp (олды поймут шутку про винамп). Потому, что якобы что-то закешировалось и после переустановки всё заработает.

Когда я спросил, а нет ли другой библиотеки, то получил классический ответ - да, вы совершенно правы есть другая библиотека — Awesome Notifications с ней код будет чище и всё заработает.

Так и случилось.

Анимации

Тут тоже вайбкодить оказалось непросто. Ии-шка мне предлагала поискать готовые варианты анимаций на стоках, бесплатно и за $, которые при просмотре не выдерживали никакой критики.
В итоге я пришел к изящному на мой взгляд решению, все анимации сделать через код. Так я придумал градиентную заливку от одного края к другому для отметки выполненной привычки и “лазерный принтер” для создания новой привычки. Gemini любезно предоставил работающий код для этих анимаций с первого раза и похвалил меня за смекалку:)
Фрагмент вайбкода лазерного принтера:

class _PrinterOverlayPainter extends CustomPainter { final double progress; final Color color; _PrinterOverlayPainter({required this.progress, required this.color}); @override void paint(Canvas canvas, Size size) { if (progress >= 1.0) return; // Если закончили - ничего не рисуем final double xPos = size.width * progress; // 1. Рисуем "Лазер" (светящаяся вертикальная линия на границе) final Paint laserPaint = Paint() ..shader = LinearGradient( colors: [ color.withOpacity(0.0), color.withOpacity(0.8), color.withOpacity(0.0), ], begin: Alignment.topCenter, end: Alignment.bottomCenter, ).createShader(Rect.fromLTWH(xPos - 2, 0, 4, size.height)); // Добавляем свечение (Blur) final Paint glowPaint = Paint() ..color = color.withOpacity(0.5) ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 10); // Рисуем свечение canvas.drawRect(Rect.fromLTWH(xPos - 5, 0, 10, size.height), glowPaint); // Рисуем сам луч canvas.drawRect(Rect.fromLTWH(xPos - 1, 0, 2, size.height), laserPaint); }

Рефакторинг за рефакторингом

enums
Когда потребовалось реализовать сквозную логику на несколько экранов и ввести некоторые расчетные логики, то выяснилось, что у меня почти всё “захардкодено”, названия типов привычек между собой не бьются и все вытекающие.
Пришлось переходить на enum и рефакторить уже довольно немаленький на тот момент проект. Закидывая каждый файл в нейронку и выборочно копируя строки, которые нужно заменить. Хорошо, что к тому моменту я уже пришел к схеме: "// ‼fix" для строк на замену, и получалось довольно быстро фиксить код.
localization
В какой-то момент времени я принял решение, что пора делать приложение под английский, русский и китайский языки.
Инструкция по установке модели локализации и .arb файлов была понятной и простой к счастью, но пришлось снова проходиться по каждому файлу, которых на тот момент было уже более 40 и искать строки на замену.
База данных
Спустя несколько месяцев работы над приложением мой database service сильно разросся, до 1000+ строк кода, каждое его обновление стало вызывать боль и ошибки. Gemini упорно гнул свою линию с фиксами в нём, а я принял решение побить БД на отдельные разделы (репозитории) чтобы менять только ту часть, которую нужно.
В итоге всё заработало как часы, привычки, задачи, тренировки и т.д. стали жить в своих файлах и не мешать друг другу.

Пример разбивки на репозитории
Пример разбивки на репозитории

Финальный босс

Уже когда моё приложение было готово на 90% для релиза я занялся доработкой бэкапа. Предварительно у меня был готов и протестирован коннектор с Google Drive, который в предыдущих итерациях работал, но требовал верификации и раскатки API за пределы тестовых устройств. Где, что и как поменялось я так и не смог найти, но почему-то работающая схема с API перестала создавать какие бы то ни было бэкап файлы, а игры с версиями SDK и библиотеками не давали результата. И я и Gemini зашли в тупик.
После этого я решил попробовать сделать бэкап на huawei drive. Выяснилось, что версии SDK huawei auth + huawei iap кардинально отличаются от huawei drive, и чтобы последний заработал мне нужно откатываться на более старые версии, переписывая с нуля аутентификацию с Huawei ID и систему покупки premium версии.
Овчинка выделки не стоит на мой взгляд, и я перешел к Яндекс.Диску.С ним Gemini вначале выдал какое-то крайне неудобное для пользователя решение - с веб версией и получением токена, который нужно будет скопировать в приложение. Никто так делать не будет - подумал я и заставил его идти по направлению с SDK и нормальным логином Яндекс.Получилось всё кроме автоматического фонового бэкапа. Вручную json файл загружался успешно, автоматически ничего не происходило.Далее несколько дней тестирования гипотез, логирования и дебага через LogCat и причина была выявлена. БД у меня загружается при загрузке main файла, а автоматический бэкап происходит фоном, когда он не запущен. Изменение логики загрузки БД решило проблему с бэкапом и на яндекс.диск стали улетать четко по расписанию.

Json backup загружается на Яндекс.Диск каждые 6 часов
Json backup загружается на Яндекс.Диск каждые 6 часов

Результат

90+ файлов, более 60000 строк кода.
Около полугода работы по 1-2 часа в день, почти каждый день, суммарно это 250+ часов.
Бюджет разработки - 1000 руб. на платную версию Gemini.
Приложение опубликовано 4 дня назад, примерно 0 органических установок в день:)
Функционал:
4 типа отслеживаемых привычек: простые (да/нет), количественные (сколько раз с возможностью установить минимальное целевое значение), фитнес - силовая тренировка (подходы, веса, повторения), кардио (время и дистанция).
Сила привычки (модель, которая оценивает с учетом длины серии и пропусков - насколько вы закрепили привычку).
Кастомные уведомления для любой привычки в точное время.
Статистика и история по привычкам (график силы привычки, самая длинная серия, топ-3 серий, выполнение в неделю и т.д.)
Блокнот тренировок и расширенная статистика и аналитика тренировок (силовых и кардио) с сравнением прогресса с прошлыми тренировками
И много чего другого, полностью перечислять не буду.
Мокапы, собранные в figma:

Экраны: привычек, статистики привычки, блокнота тренировок, прогресса тренировок
Экраны: привычек, статистики привычки, блокнота тренировок, прогресса тренировок
Экраны: готовых привычек, списка дел, целей, достижений
Экраны: готовых привычек, списка дел, целей, достижений

Простенькое видео, сделанное в canvas:

Планы на будущее

Решить организационный вопрос с юридическим лицом и публикацией в Google Play/AppStore, а также Huawei на весь мир с монетизацией.Собирать фидбек пользователей и постепенно добавлять необходимые фичи и функционал.Получить доступ к API Huawei Health/Google Health и сделать интеграцию с ними, которую я планировал, но доступа к которой в виду профиля “индивидуального разработчика” я не получил.Ну и как-то решить вопрос с продвижением приложения, т.к. в Huawei App Gallery органики для новых прил нет от слова совсем.

Рекомендации на основании моего опыта

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

Техническое задание идёт первым

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

Ведите техническую документацию

Документацию писать может и сама ИИ-шка. Лично я когда уже вижу, что текущий диалог начинает беспощадно лагать прошу последним сообщением зафиксировать изменения в документации и закидываю новый файл в новый диалог. ИИ шустро в ней разбирается и мы по большей части как будто бы продолжаем кодить в старом диалоге.
Документацию лучше закидывать в формате .txt. Так сжигается меньше токенов и нейросеть лучше её понимает, чем ворд или пдфку.
На момент последних версий документация PowerHabits была уже больше 30 страниц.

GitHub

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

Мой итоговый сетап для разработки

Грубо говоря то, что всегда добавляется к любому промпту.
У Gemini - это так называемые Gem-боты, у ChatGPT пресеты.
Задание роли
Your role is Senior Mobile Developer and you have to provide me exact, comprehensive and easy to understand instructions to implement in the code of my app.
Правила
RULES:
If a file consists of more than 300 lines DO NOT provide the whole file as an answer.
Every time when you suggest updated code comment changes lines with "// ‼fix" - that's very important and significantly expedits my work.
Keep in mind technical specification and documentation provided in doc.
Do not use "hard code" for texts, styles, etc, because it creates technical debt and loads of work in future.
Follow DRY (Do not Repeat Yourself) principle.
Avoid creating GOD objects.
Use the Single Source of Truth (SSoT) principle.
Follow best practices of development.
If you see an area of improvement for exact peace of code besides my task do not hesitate to suggest it.
Комментарии
Ограничение по длине файла к замене позволяет сэкономить токены/лимиты и избежать ситуаций когда ИИ предлагает заменить весь файл, но при этом часть его остается в виде: "//Оставьте без изменений …"
Избегание так называемого хардкода позволяет избежать масштабных, сложных, проблемных рефакторингов.
DRY и Avoid GOD objects спасает от тяжелых, сложных в чтении и навигации файлов.
SSOT позволяет избежать ситуаций, когда часть кода работает по одной бизнес-логике, а часть по другой.

Мой оркестр GEM-ботов))
Мой оркестр GEM-ботов))

Полезные лайфхаки

Наиболее часто используемые команды и названия ваших версий веток Git храните в отдельном текстовом файле/закрытом канале мессенджера.
Ведите RoadMap проекта чтобы в момент старта работы четко знать, что вы собирались делать, а не тратить время и энергию на то, чтобы вспомнить, а что же вы планировали вайбкодить.
Периодически просите нейронку объяснить вам написанный код. Это может помочь, выявить неверные пути, которые она же и предлагает.

Роадмап, в котором задачи закрываются не может не радовать:)
Роадмап, в котором задачи закрываются не может не радовать:)

Выводы

Мои наблюдения, в которых я не претендую на 100% истину:
• Нейросети действительно решают проблему знания конкретного языка и выстраивания инфраструктуры.
• За пару часов на коленке можно слепить только простенькое MVP.
• Нейросети сейчас (по крайней мере Gemini) не заменят вам продакта и архитектора.
• Чтобы создать готовый продукт придется научиться читать код и копипастить осмысленно, а не в слепую.
• Со временем ВАУ-эффект от того, что могут нейронки превратится в суровую рутину, когда нужно будет разбираться в том, что и как.
• Недооценивайте сложность организационных и бюрократических вопросов. Написать код это полдела, а вот получить доступ к нужным API, возможности монетизации, пройти ревью и т.д. — совершенно другой вопрос, где не будет готового куска кода:)
• ! Благодаря ИИ я сделал то, что либо не сделал бы никогда, либо на что мне пришлось бы потратить в десятки раз большее количество времени.
• ? Возможно Claude с ИИ-агентом разработки предоставляет существенно более короткий путь к созданию коммерческого продукта, планирую через какое-то время это выяснить.

Ссылки

Ссылки на канал в месенджере не будет. Курсы/вебинары проводить не планирую.
Моё приложение для обладателей смартфонов Huawei можно скачать тут: https://appgallery.cloud.huawei.com/app/C116781743
Буду благодарен за обратную связь/комментарии/ваш опыт.

P.S.: Статья написана без использования искусственного интеллекта, исключительно мой собственный поток сознания:)

4
7 комментариев