Студия из одного человека и ИИ-команды
Я делаю приложения один: песенник, тренажёр слуха, тренажёр чешской грамматики, утилиту для печати, сайт, который подбирает аппликатуры гитарных аккордов, и тренажёр по статике для студентов технических специальностей. Один, но не в одиночку. Большую часть кода теперь пишут ИИ-агенты, а вторая модель его ревьюит. Вот как это устроено на практике, что это изменило и чего не изменило.
Кто что делает
- Я решаю, что делать, формулирую задачу, читаю результат и говорю «да» или «нет». Вкус, приоритеты и всё, что касается людей (их данных, денег, времени), остаётся за мной.
- Агент-разработчик (Claude Code) читает репозиторий, пишет изменение, запускает тесты и приложение, делает скриншоты и отчитывается, что сделал и что не проверил.
- Вторая модель в роли ревьюера (Codex, иногда Gemini) читает план или дифф свежим взглядом. Ей не важно, чтобы изменение оказалось правильным, и она замечает другие ошибки.
Агенты быстрые и не устают, но уверенно ошибаются достаточно часто, чтобы весь процесс строился вокруг того, как это ловить.
Файл правил, который растёт из ошибок
В каждом репозитории есть файл инструкций для агентов. Это не руководство по стилю. Почти каждая строка в нём — след того, что однажды пошло не так:
- «Страницы и ответы API не кешируются надолго — только
no-cacheс ETag». Однажды кеш на сутки у API оставил пользователя с чёрным экраном после деплоя: браузер держал ответ в старом формате, и новая страница на нём падала. - «Настоящую рекламу автоматически не загружать никогда: ни в тестах, ни на скриншотах». Автоматические показы — недействительный трафик, а за него могут заблокировать рекламный аккаунт.
- «Скрипты не убивают процессы по имени; запустил процесс — останавливай по PID». Однажды убийство по шаблону задело посторонние процессы.
- «Отзыв о 3D-руке — это баг-репорт: воспроизведи на тех же ладах и пальцах и добавь форму в тестовый корпус».
Этот файл — память команды. Новая сессия агента ничего не знает о вчерашнем дне, зато знает правила.
Проверки, которые не переспорить
Агент может объяснить, почему его изменение в порядке. Тест уговорить нельзя. Поэтому правила говорят, что должно быть верно, а скрипты это проверяют:
- Проверка типов и модульные тесты — раньше всего.
- Совпадение с оригиналом. Движок аккордов существует на Kotlin (в Android-песеннике) и на TypeScript (на сайте). Тест сравнивает их на данных, выгруженных из Kotlin, вплоть до порядка форм.
- Smoke-проверка в настоящем браузере после каждого деплоя: сотни проверок на живом сайте, в светлой и тёмной теме, на ширине телефона, с недоступным API, с API, отвечающим в старом формате, с заблокированным хранилищем.
- Нижняя планка качества. 3D-руку проверяют на корпусе примерно из 400 форм аккордов. Правка не может добавить новый вид проблемы, сделать какую-то проблему чаще или сдвинуть пальцы у хороших форм. Планку можно только поднимать.
- Рефакторинг бит в бит. Когда агент ускоряет решатель позы, ответы на весь корпус должны совпасть со старыми байт в байт. Быстрее и иначе — это новый решатель, а новому решателю нужно новое ревью.
Вторая модель ревьюит первую
Перед большой правкой я прошу вторую модель посмотреть план, после — дифф. Это самая дешёвая проверка из всех, и она находит настоящие вещи. В день, когда я пишу эти строки:
- В ревью новых страниц этого сайта она указала, что в юридическом подвале не стоит писать «не плательщик НДС»: это не обязательно и может устареть.
- Сверяя политику конфиденциальности с кодом приложения, она нашла, что песенник отправлял названия песен в аналитику и показывал рекламу в Европе, не спросив согласия. Оба места исправлены в приложении, а не только в политике.
- В ревью этого исправления она нашла, что поворот экрана мог показать форму согласия из уже уничтоженной активности.
Ревьюер тоже ошибается. Правило не «делай, что сказано», а «на каждое замечание есть ответ»: исправлено или объяснено.
Где по-прежнему нужен человек
Тесты проверяют то, о чём мы подумали. Остальное ловят глаза:
- Скриншоты смотрят, а не только делают. Тесты не заметят ноты, налезающие друг на друга на стане, подпись, уехавшую за край экрана телефона, или страницу, которая формально есть, но чёрная на тёмном фоне. Каждая визуальная правка заканчивается скриншотами, отправленными мне на телефон.
- Звук слушают. Ничто без экрана и динамиков не услышит неправильный аккорд.
- Утверждения проверяют. Однажды агент отчитался о проверке, которую сделать не мог: диалог согласия «вне Европы» на машине, которая стоит в Европе. Он заметил это, сказал об этом и поправился — ровно так, как я хочу. Но именно поэтому «проверено» в отчёте — утверждение, которое проверяют, а не факт.
Что изменилось
- Масштаб. Один человек может поддерживать несколько приложений живыми и развивающимися: интерфейсы на языках — до семи в одном приложении, доступность, проверка приватности, описания в магазине и тесты на всё это.
- Скорость скучных частей. Миграция, релиз со скриншотами, политика, приведённая в соответствие с кодом, — часы, а не выходные.
- Качество стало явным. Когда работу делегируешь, «хорошо» приходится записать. Записанное оказалось лучше, чем когда оно жило у меня в голове.
Что не изменилось
- Решать, что стоит делать.
- Ответственность. Код пишут агенты, выпускаю его я, и в магазине и в политике конфиденциальности стоит моё имя.
- Необходимость понимать код. Я смотрю то, что уходит в релиз. Агент — сильный коллега, а не повод перестать понимать, как всё устроено.
Если хотите посмотреть на результат: приложения и сайт аккордов сделаны именно так.