Когда надоело ждать мидлов
Признаюсь честно — я DevOps. Моя зона комфорта — CI/CD, кубер, терраформ. Мобильная разработка для меня темный лес. Но когда очередная идея для pet-проекта умерла из-за того, что не мог найти React Native разработчика на аутсорс, я психанул. И решил: напишу всё сам. С помощью ИИ. Без единой строчки кода, написанной мной лично. Звучит как сказка? Спойлер: это работает, но с костылями.
Я поставил себе задачу — сделать Android-приложение для трекинга привычек с бэкендом, авторизацией и синхронизацией. Стек нарисовался сам: Kotlin для нативного Android, Node.js + Express для бэка, PostgreSQL для данных, всё это обернуто в Docker Compose. И никакого React Native (хотя ради VIP-версии потом добавил React-панель для админа). Весь код генерировали Claude 4 и Gemini 3 Flash (да, я переключался между ними, когда один начинал тупить).
В этой статье я расскажу, как прошел путь от пустого экрана до релиза в Google Play, какие грабли собрал и почему vibe-кодинг — это не серебряная пуля, а мощный инструмент в руках того, кто хотя бы понимает архитектуру.
Важный контекст: до этого я уже пробовал vibe-кодинг на десктопе — делал клиппер подкастов в Replit за 5 часов. Но мобильная разработка — совсем другой зверь. Тут и экраны, и lifecycle, и гугловые сервисы. Без понимания базовых концепций Android вы просто утонете в промптах.
Шаг 1: Промпт как искусство
Моя первая ошибка — я думал, что ИИ читает мысли. Написал: «Сделай приложение для привычек с бэкендом». Получил 500 строк кода, который даже не компилировался. Пришлось учиться формулировать точно.
Вот реальный промпт, который запустил проект:
Создай Android-приложение на Kotlin с Compose для трекинга ежедневных привычек.
Архитектура: MVVM с одним Activity, di через Hilt.
Бэкенд: Node.js Express + Prisma ORM + PostgreSQL, запуск через Docker Compose.
Экраны: список привычек (с группировкой по статусу), форма добавления, экран статистики.
Auth: JWT токены, регистрация по email + пароль, хранение токена в EncryptedSharedPreferences.
Сеть: Retrofit + OkHttp, перехватчик для подстановки токена.
Напиши полный код для экрана списка привычек, включая ViewModel, Repository, DTO, а также эндпоинты на бэке.
Я отправил это в Claude 4 (версия от февраля 2026, с improved coding capabilities). Через 20 секунд получил 4 файла. Работало с первой попытки? Чёрта с два. Пришлось править типы в DTO и добавлять обработку ошибок. Но скелет был.
1 Промпт-инжиниринг для кода
Совет: добавляйте в промпт не только желаемый функционал, но и анти-паттерны, которые ИИ часто генерирует. Например: «Не используй GlobalScope, не сохраняй пароли в SharedPreferences, не блокируй UI поток». Иначе получите legacy сразу из коробки.
Архитектура, которую ИИ собрал, а я ревьюил
Одна из частых критик vibe-кодинга — убитая архитектура. И да, первый вариант от ИИ выглядел как слоёный пирог из рандомных паттернов. Но я не просто копипастил — я нанял ИИ в качестве архитектора, задавая вопросы: «Почему ты выбрал Repository pattern? А как тут реализован offline-first?»
В итоге архитектура получилась такой:
| Слой | Технология | Что сгенерировал ИИ | Что пришлось переписать |
|---|---|---|---|
| Android UI | Jetpack Compose | 95% | Состояние экранов, анимации |
| ViewModel | Kotlin Coroutines + StateFlow | 100% | - |
| Repository | Room (local) + Retrofit (remote) | 80% | Обработка конфликтов синхронизации |
| Бэкенд API | Node.js Express | 70% | Валидация, мидлвары CORS |
| База данных | PostgreSQL + Prisma | 100% | - |
| Docker | Docker Compose | 100% | Немного изменил healthcheck |
Самое смешное — Docker Compose и Prisma-схему ИИ нагенерил идеально. Потому что это конфигурация, а не логика. Чем меньше «бизнес-логики» требуется, тем лучше работает ИИ.
Авторизация — головная боль, которую я переложил на ИИ
JWT-авторизация — классическая задача. Но когда ИИ предлагает хранить токен в обычных SharedPreferences, хочется плакать. Пришлось явно указать: EncryptedSharedPreferences, перехватчик для автоматического обновления access token, рефреш-токен в httpOnly cookie на бэке.
Вот фрагмент перехватчика, который сгенерировал Gemini 3 Flash после нескольких уточнений:
class AuthInterceptor(
private val tokenProvider: TokenProvider
) : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val original = chain.request()
val token = tokenProvider.getAccessToken()
val request = if (token != null) {
original.newBuilder()
.header("Authorization", "Bearer $token")
.build()
} else original
val response = chain.proceed(request)
if (response.code == 401) {
// Попробовать обновить токен
val newToken = tokenProvider.refreshToken()
if (newToken != null) {
val retryRequest = original.newBuilder()
.header("Authorization", "Bearer $newToken")
.build()
response.close()
return chain.proceed(retryRequest)
}
}
return response
}
}
Работает? Да. Но я потратил час на отладку race condition при параллельных запросах, когда оба получают 401 и пытаются обновить токен. ИИ такое не умеет — пришлось добавить блокировку с Mutex самому.
Типичная ошибка: ИИ часто предлагает хранить refresh token в том же месте, что и access token, или вообще в SQLite. Не ведитесь — используйте EncryptedSharedPreferences или Android Keystore. Я даже написал промпт: «Предположи, что я параноик по безопасности, и предложи самый безопасный способ хранения» — помогло.
Бэкенд: Node.js в Docker, который я не писал
С бэкендом было проще: ИИ отлично генерирует CRUD и мидлвары. Я попросил Claude 4 написать полностью Express-приложение с эндпоинтами /api/habits и /api/auth, подключить Prisma, а заодно сгенерировать docker-compose.yml с бэкендом, постгресом и nginx как reverse proxy.
Единственная проблема — ИИ положил пароль к БД прямо в docker-compose.yml. Никогда так не делайте. Используйте переменные окружения через .env. Я поправил промпт: «Используй .env для конфиденциальных данных и добавь example.env в репозиторий». ИИ перегенерировал всё корректно.
В итоге запуск бэкенда выглядит так:
docker-compose up -d
# Бэк на localhost:3000, PostgreSQL на 5432, adminer на 8080
Красота. Но если у вас нет опыта с Docker, вы не поймете, почему сервис не стартует, если порт занят. Vibe-кодинг не отменяет базовых знаний инфраструктуры.
Фронтенд? А зачем? (Спойлер: React-админка)
Изначально я планировал только нативное приложение. Но потом захотел админ-панель для просмотра статистики. ИИ предложил сделать её на React с MUI, разместить в отдельном Docker-контейнере, а на Android добавить WebView для быстрого доступа.
Я сгенерировал React-панель через Cursor (IDE с ИИ), просто описывая компоненты голосом. Да, я разговаривал с компьютером: «Сделай таблицу с колонками привычка, пользователь, частота выполнения, добавь фильтр по дате». Cursor создал компонент, но стили были ужасны. Пришлось дописать промпт «используй Tailwind CSS, примени минималистичный дизайн как в Linear». Получилось неплохо.
Любопытный момент: я использовал подход из статьи Lovable Mobile — ИИ-генерация приложений прямо на устройстве, но для себя упростил: WebView с React-панелью грузится с сервера, а не генерируется локально. Зато быстро, и не требует одобрения Apple (у нас же Android).
База данных: Prisma — лучший друг ИИ-разработчика
ORM Prisma идеально подходит для vibe-кодинга, потому что её schema language очень декларативна. ИИ легко генерирует модели, индексы, связи. Вот как ИИ описал модель Habit:
model User {
id String @id @default(cuid())
email String @unique
password String
habits Habit[]
createdAt DateTime @default(now())
}
model Habit {
id String @id @default(cuid())
userId String
title String
streak Int @default(0)
lastDone DateTime?
user User @relation(fields: [userId], references: [id])
logs HabitLog[]
createdAt DateTime @default(now())
}
model HabitLog {
id String @id @default(cuid())
habitId String
habit Habit @relation(fields: [habitId], references: [id])
doneAt DateTime @default(now())
}
Миграции создал через npx prisma migrate dev. ИИ даже сгенерировал seed-файл с тестовыми данными. Единственное — он забыл добавить составной уникальный индекс на (habitId, doneAt), чтобы нельзя было залогировать выполнение дважды в один день. Пришлось дописать самому, но это мелочь.
Сборка APK и деплой — момент истины
Собрать APK вручную с Android Studio — полчаса. Но я хотел CI/CD. ИИ сгенерировал GitHub Actions workflow, который собирает релизный APK, подписывает его и пушит в Google Play Console через Gradle Play Publisher. Работало не сразу — ИИ забыл указать путь к keystore. Но после уточнения — полет нормальный.
Бэкенд я задеплоил на VPS через Docker Compose + Nginx + Let's Encrypt. Это моя родная стихия, тут ИИ не нужен. Но для полноты эксперимента попросил Claude написать Ansible-плейбук для развёртывания. Получилось криво, но после рефакторинга — сойдёт.
Боли, грабли и откровения
- ИИ не держит контекст. После 10-15 сообщений он начинает забывать, что говорил в начале. Приходится резюмировать: «Напомни, какой паттерн мы выбрали для репозитория?»
- Галлюцинации API. Gemini предложил использовать метод
localBroadcastManager, который deprecated ещё в 2022. Пришлось явно указать: «Используй новейшие версии библиотек, проверь актуальность на 2026 год». - Код без обработки ошибок. ИИ пишет позитивный сценарий. Try-catch, логирование, fallback — нужно добавлять отдельным промптом.
- Безопасность — ваша зона ответственности. ИИ вставил API ключ от Firebase прямо в код. Я ебанулся. Всегда проверяйте, не захардкодил ли AI секреты.
Результат: приложение в продакшене
Через 2 недели (вечерами, после работы) у меня было:
- Android-приложение в Google Play (публичная бета).
- Бэкенд на Node.js + PostgreSQL, завернутый в Docker.
- React-админка.
- CI/CD — пушим в main, через 10 минут новая версия в сторе.
- ~500 активных пользователей за первую неделю (сарафанное радио).
Я не написал ни строчки кода руками. Но я написал около 200 промптов, потратил 20 часов на отладку и рефакторинг. Vibe-кодинг — это не магия, это новый способ программирования, где вы — архитектор и QA, а ИИ — клавиатура и компилятор.
Если хотите повторить — начните с малого. Не пытайтесь сразу сделать полноценный стартап. Сделайте Hello World через ИИ, потом экран с кнопкой, потом запрос к бэку. И только потом — продакшен. И обязательно читайте наш гайд по созданию Android-приложения с Claude и Android Studio — там разобраны базовые ошибки новичков.
Часто задаваемые вопросы (FAQ)
Какую модель ИИ лучше использовать для мобильной разработки?
Я переключался между Claude 4 (для длинных контекстов и архитектуры) и Gemini 3 Flash (для быстрых итераций и UI). Claude точнее в логике, Gemini быстрее. Для Android специфики (Compose, Lifecycle) лучше показал себя Claude.
Обязательно ли знать программирование?
Да. Вы должны хотя бы читать код и понимать, что такое база данных, API, JWT. Иначе вы не сможете найти ошибку в сгенерированном коде и рискуете запустить в продакшен уязвимое приложение.
Сколько это стоит?
Подписки на AI (Claude Pro $20/мес + Gemini Advanced $20/мес), сервер VPS $10/мес, аккаунт разработчика Google $25 (одноразово). Итого ~$50 в месяц. Считайте, сэкономили зарплату разработчика.
Как быть с лицензиями? Будет ли код принадлежать мне?
Код, сгенерированный ИИ, обычно принадлежит вам (читайте условия сервиса). Но я рекомендую не копипастить 1-в-1, а переписывать ключевые модули, чтобы избежать проблем с копирайтом.
На этом всё. Vibe-кодинг живёт и побеждает. Но не обольщайтесь — хороший архитектор всё ещё нужен. Им придётся стать вам.