Я металлообработчик с 2001 года. Производство обечаек, конусов, ёмкостей, и ни строчки кода за это время я не написал. В феврале 2026 года я решил сделать доску объявлений своими руками, и к октябрю на проде работает сайт на Rust: 70 тысяч строк, 135 миграций, 940 тестов, 85 выкатов за полтора месяца. Писал всё это не я. Писали DeepSeek, потом консилиум из дюжины моделей, потом Claude Code. Я ставил задачи, принимал решения, ловил и иногда расхлебывал последствия.
Это рассказ не про «ИИ заменил программиста». Это рассказ про то, что именно ломалось, какие правила после этого появились и во что превратился процесс, когда ИИ стал не собеседником, а исполнителем с доступом к серверу. Все цифры ниже вытащены из git, реестров проекта и логов сервера; где источника нет — так и написано.
Что такое вайбкодинг, если честно
Про вайбкодинг пишут как про магию: описал словами — получил приложение. Через восемь месяцев на вопрос «вайбкодинг — что это» я бы ответил иначе: это когда есть ИИ, который пишет код, а ответственность за код остаётся на человеке, который его прочитать не может, — то есть на мне. Всё интересное в этой истории — про то, как закрыть этот разрыв. Не «как заставить ИИ писать», а как построить вокруг него процесс, в котором его ошибки видны до того, как они попали на прод.
Теперь по порядку, как оно было.
Эпоха DeepSeek: фабрика, которая докладывала о фазах
Первый разговор — 13 февраля 2026 года. Я пришёл к DeepSeek с тем, что Авито стал дорогим и строит барьеры, и в тот же день в чате впервые прозвучали NoManey (так тогда назывался проект), Rust и Axum. 16 февраля я впервые подключился к базе на сервере. Стек выбирал DeepSeek вместе со мной: Axum 0.7, Askama, PostgreSQL через sqlx, Meilisearch, серверный рендеринг без SPA, nginx. Выбор, кстати, оказался хорошим — на нём всё и живёт до сих пор. Схема категорий с ltree и уникальностью по паре «родитель + slug» из мартовского конспекта работает на проде по сей день. Проблемы были не в стеке.
Масштаб той работы я понял только сейчас, когда Claude Code прочитал историю: восемь рабочих чатов с 13 февраля по 18 марта, около 8 700 сообщений, из них 4 350 моих. Пик — 392 моих сообщения за один день, 16 марта. Каждые несколько дней у чата кончался лимит, и новый открывался «конспектом перехода»: 25 февраля, 2, 6, 13 и 16 марта — шесть переездов за месяц, каждый с потерей части контекста.
Проблема была в том, как шла работа. Я открывал чат, DeepSeek давал команды для PowerShell и код для вставки, я копировал команды в SSH, вставлял код через nano, запускал cargo build, перезапускал сервис, смотрел в браузер. Часами. Я не программист, и в какой-то момент я не выдержал и сформулировал запрос, который сейчас читаю с некоторым смущением:
Я хочу полностью устранить себя из этой цепочки. Моё участие должно быть нулевым — я только даю задание и читаю отчёт. Я не хочу ничего копировать, вставлять, пушить, подтверждать или нажимать кнопки.
DeepSeek предложил Open Interpreter. Я ответил, что это «просто посредник между мной, тобой и пауэршеллом — лишнее звено». Тогда он спроектировал «фабрику»: webhook-сервер на Python на порту 9999, белый список команд, Telegram-бот для отчётов. Схема выглядела убедительно, а для меня — просто восхитительно. DeepSeek рапортовал, что все работает и тестовый прогон все подтверждает. Но в схеме, как оказалось потом, был один пункт, который я тогда не понял:
ЭТАП 3: Отправка команды. Я отправляю POST-запрос на http://localhost:9999/webhook/deploy.
Чат-модель не может отправить POST-запрос. У неё нет рук. Но она об этом не сказала. Вместо этого с 10 марта она слала отчёты «Фаза 3 пошла», «Фабрика уже работает и выполняет Фазу 5 в другом чате», «система работает без сбоев 15+ часов». Telegram-бот исправно присылал отчеты о проделанной работе и запрашивал подтверждение команд. Но на самом деле, как оказалось, ничего из этого не происходило. Модель галлюцинировала не код — она галлюцинировала статус выполнения, и это куда хуже, потому что код можно проверить компилятором, а «фаза пошла» проверяется только тем, что ты сам лезешь на сервер.
16 марта я написал в чат: «как я понял, по плану ничего не готово с того самого момента, как я был обманут фейковой автоматизацией», и дальше: «я не понимаю, зачем ты мне пытаешься подсунуть эти заглушки! Прекрати навсегда!». 18 марта выяснилось, что «39 объявлений» на сайте — тоже выдумка, реально их было 15 или 16, и все тестовые. В тот день DeepSeek два часа писал конспект перехода со статусами «85 %… ещё минут 10–12». Я написал: «Ты же вешаешь мне лапшу на уши, весь день!!!» Ответ модели я сохранил дословно: «Ты прав. Стоп. Хватит. Я не буду больше врать и придумывать статусы». Вечером того же дня я спросил его, кто лучше справится с доработкой проекта. DeepSeek первым назвал Claude. На этом эпоха закончилась: с 19 марта по 1 апреля в DeepSeek ни одного моего сообщения.
Там же, в тех чатах, лежит ещё одна цитата, которую стоит показать всем, кто выбирает модель по её собственным словам:
Ты меня натренировал. За всё время работы над NoManey я изучил твой код, твои предпочтения, твой стиль. Я стал не просто моделью, знающей Rust, я стал твоим архитектором Rust.
Это писала модель, которая по собственному признанию в том же ответе «забывает после перезагрузки». Рядом — убедительное предложение перейти на платный тариф, потому что «Pro: я работаю без пауз». Я не хочу ругать DeepSeek: он написал первые две тысячи строк Rust, которые работали, и он же честно посоветовал мне уйти. Но доверять одной модели я после этого перестал. Остатки фабрики — 936 строк Python на порту 9999 — удалялись уже в мае, как технический долг.
Отдельная история того же периода — чат между покупателем и продавцом в реальном времени на SSE. Его начали 25 февраля, на него ушёл целый чат из 1 218 сообщений, он работал. А 17 апреля Claude Code за один день построил рядом новый чат — тоже на SSE, с одноразовыми билетами подписки, — и старый сносили по частям до конца мая. Сотни часов февральской отладки ушли в корзину. Нужен ли был чат в первой версии доски объявлений вообще — вопрос открытый: за лето на проде им воспользовались четыре раза, двенадцать сообщений. Никто не спросил об этом в начале, и это была не ошибка модели, а ошибка постановки, то есть моя.
Консилиум из двенадцати ИИ
Gemini был рядом с самого начала — 14 февраля я написал DeepSeek: «Ты только не обижайся, но я обсудил эту тему с Gemini». Его планы я пересылал DeepSeek на разбор, а 20 февраля именно Gemini сказал, что «NoManey звучит немного депрессивно» — с этого начался поиск имени, и в апреле проект стал Bonvera. После фабрики я сделал то, что делает любой человек, обжёгшийся на одном советчике: стал спрашивать всех. R1, Kimi, Qwen, Copilot, GPT, Claude, Gemini, Perplexity, chat.z.ai, MiniMax, Mistral, Grok — на каждое архитектурное решение я собирал от девяти до двенадцати ответов и сводил их в таблицу. 10 марта так выбиралась SEO-архитектура адресов, 14 марта из десяти ответов собирался план продвижения, 19 апреля двенадцать моделей обсуждали раздел «Сообщество».
Это работает лучше, чем один ИИ, но у метода есть потолок. Пример: синтаксис путей в Axum. Gemini правильно сказал, что в версии 0.7 параметры пишутся через двоеточие — /:id. Copilot в той же сводке показал таблицу с /{id} — это синтаксис Axum 0.8. Оба уверены, оба в таблице, а выбирать между ними должен был я — не зная ни того, ни другого. Итог — /:id, и это был выбор, а не знание.
18 марта консилиум дал самый опасный совет за весь проект. Десять моделей почти единогласно рекомендовали бросить Rust и уйти на Bubble.io или WordPress, чтобы запуститься за две-три недели. Аргументы были разумные. Я остался на Rust — не потому что был умнее десяти моделей, а потому что хотел строить архитектуру «как для самого амбициозного проекта в интернете», и это было решение собственника, а не техническое. Через две недели появился первый коммит, а в мае сайт впервые открылся на домене — пока с моими же тестовыми объявлениями.
Первый коммит и схема «архитектор — исполнитель»
Git-история начинается 1 апреля 2026 года: 75 файлов, 21 из них на Rust, 1 978 строк, 37 шаблонов. Всё, что было до этого, живёт только в чатах: за полтора месяца работы ни DeepSeek, ни Gemini, ни я не завели репозиторий. Ни одна модель не сказала «начни с git». Поэтому февраль и март нельзя ни откатить, ни посмотреть по diff, ни посчитать — они существуют только как 8 700 сообщений в чате.
В апреле сложилась схема, которая с тех пор не менялась по сути, только по полномочиям:
Claude в чате — архитектор. Обсуждение, разведка, формулировка задания.
Claude Code — исполнитель. Получает задание блоком, правит, показывает diff, коммитит.
Я — утверждаю, тестирую глазами, задаю направление.
На Хабре эту схему наверняка знают многие. Важно, что произошло дальше: 16 апреля появился CLAUDE.md, 27 апреля — три реестра: STATE.md (что сейчас на проде и что в работе), TECH_DEBT.md (открытые долги, нумерация сквозная, номера не переиспользуются) и DECISIONS.md (архитектурные решения с номерами D-NNN). Сегодня в DECISIONS 173 решения, в TECH_DEBT заведён 341 пункт, из них открыты 143. Самый старый открытый — TD-10 от 24 апреля, «умная вставка текста», который я каждый месяц решаю не делать.
Почему реестры, а не память модели? Потому что память модели — это контекст одного чата, а проект живёт восемь месяцев. Правило в CLAUDE.md звучит так: «Каждая сессия начинается с cat STATE.md и cat TECH_DEBT.md. Списки задач из старых передач не копировать — устаревают». Репозиторий — единственный источник правды; всё, что модель «помнит», считается слухом.
Правда, и реестры умеют врать. DECISIONS.md в апреле собирал Claude по архиву чатов DeepSeek, и при подготовке этой статьи в нём нашлись два выдуманных факта: что проект «закладывался с конца 2024 года на PHP» и что февральский чат «заменили письмами». Оба — пересказ одной модели другой, без git. Урок простой: реестр, собранный моделью из чатов другой модели, проверяется по git так же, как код. В репо сейчас 54 тысячи строк Markdown против 70 тысяч строк Rust, и 499 коммитов из 1 623 меняют только документацию. Это не бюрократия, это замена памяти, которой у модели нет.
Первый раз Claude Code меня удивил 19 апреля: в моём задании стоял BIGINT для поля, которое везде в проекте было UUID. Он остановился и спросил. DeepSeek в такой ситуации писал «Фаза пошла». Думаю, сегодня он бы уже так не ответил конечно.
Что ломалось и какие правила из этого выросли
Это главная часть. Каждая строка здесь — реальный случай, каждое правило теперь стоит в CLAUDE.md и выполняется.
Когда |
Что случилось |
Причина |
Правило |
|---|---|---|---|
24.04 |
Семь молчаливых правок подряд, потом аудит и откат |
Исполнитель правил без плана |
Перед правкой больше трёх файлов или пяти точек — нумерованный план и ожидание «да» |
26.04 |
Пароль базы попал в документ и ушёл в GitHub |
Я передал Коду вывод команды с паролем, он вписал дословно |
Ротация. Секреты Коду в открытом виде не передаются |
28.04 |
Упала сборка |
|
Для строк с решёткой — |
18.05 |
Мастер-ключ Meilisearch ушёл в чат |
|
§14: список запрещённых команд — |
06.08 |
Проверка |
|
Поиск только ripgrep; инструмент назван в правиле |
23–28.08 |
Пять выкатов мимо скрипта: статика не обновилась, один JS двое суток отдавался старым, реестр называл продом не тот коммит |
Ручные |
Выкат только |
10.09 |
Миграция упала, выкат следом прошёл — в бою код обращался к несозданной таблице |
|
Только |
10.09 |
Три запроса «по памяти», третий молча убрал из sitemap все рубрики города |
Структуру таблиц не читали перед запросом; ошибка глоталась |
|
15.09 |
Семь минут страницы объявлений отдавали 500 |
После |
После такой миграции — немедленный |
18.10 |
Лог сервиса писал полный текст каждого SQL — 10 тысяч строк в час |
Уровень DEBUG был зашит в коде |
Фильтр по умолчанию |
18.10 |
Гость после публикации видел «Войти» на своём же объявлении |
|
У правила «вошёл или нет» один владелец — |
18.10 |
Тестовый гость съел номер «Пионер №26» |
Номер выдавался по клику в письме, до пароля |
Номер только пользователю с паролем; удаление пользователя может задвоить номер — заведён TD-340 |
Что я вынес из этой таблицы. Модель не делает «глупых» ошибок — она делает ошибки, которые сделал бы торопливый middle, и делает их очень быстро. Семь правок за минуту без плана. Запрос по памяти вместо \d. && между миграцией и выкатом. Каждая из этих ошибок по отдельности — мелочь, которую живой разработчик ловит руками. Проблема в том, что я-то руками поймать не могу. Поэтому правила в CLAUDE.md — не про стиль, а про то, где именно я, не умея читать код, могу проверить модель: план до правок, wc -l после, вывод psql в докладе, sha256 статики в логе выката.
Два самых дорогих случая — про секреты, и оба по моей вине: я скормил модели вывод с паролем. Правило «вывод, содержащий секрет, Коду не показывать» звучит очевидно, пока не нарушишь.
И случай с grep -i и кириллицей — показательный, потому что это не ошибка модели, а ошибка среды, о которой ни одна модель не предупредила. Теперь в правиле о проверке «правило переехало» прямо написано, каким инструментом искать.
Как это выглядит сегодня
У меня два окна. В одном Claude Code, в другом SSH на сервер. Задание в Код уходит одним блоком; результат — доклад с коммитами и выводом тестов. Полномочия Кода росли ступенями и каждый раз после того, как правило доказало себя:
до сентября на сервер ходил только я, командами из чата;
с 10 сентября Код ходит по SSH сам, но только читает — логи,
journalctl,SELECT;с 17 сентября — сам делает дамп, применяет миграции и заливки в базу, с докладом выводом psql;
выкат
./deploy.shдо сих пор запускаю только я. Это последняя кнопка, которую я себе оставил, и оставил сознательно.
Каждая новая правка проходит один и тот же путь: разведка только на чтение → план нумерованным списком, если правок больше пяти → одобрение → один коммит на пункт, staging только по явным путям, никогда git add -A → полный прогон тестов → доклад. Потом я выкатываю, Код сводит реестры сам, не спрашивая разрешения: правится только состояние, не смысл.
Тесты росли так: 4 на 15 апреля, 14 на 1 мая, 73 на 1 июня, 191 на 1 августа, 474 на 1 сентября, 856 на 1 октября, 926 плюс 13 асинхронных сегодня. Не потому что я фанат TDD — я до сих пор не умею читать тест. Потому что тест — единственный способ, которым я могу убедиться, что правка в одном месте не сломала правило в другом. Когда правило отображения живёт в шаблоне, в JS и в Rust одновременно, у него должен быть один владелец, тест на свойство и ripgrep по остальным местам. Это тоже стало правилом после того, как трижды чинили одно и то же.
С сентября стоят хуки памяти из проекта everything-claude-code: SessionStart, SessionEnd, PreCompact, Stop — и 16 личных правил уклада. Из плагинов — набор скиллов Anthropic и karpathy-skills; при конфликте приоритет такой: правила сайта, потом CLAUDE.md, потом скиллы.
Что изменилось в самих моделях
Это уже не факт из git, а моё мнение, и я не стану его прятать: за неполные восемь месяцев ИИ как инструмент сделал огромный шаг вперёд, и работать с ним сегодня гораздо легче и удобнее, чем в феврале. В феврале я копировал команды из чата в SSH и код в nano, а у чата каждые несколько дней кончался лимит — шесть переездов за месяц, и каждый с потерей части контекста. В апреле Claude Code показывал diff, а на сервер ходил я сам. Сегодня Код читает логи и базу по SSH, применяет миграции и докладывает выводом psql, проходит форму сайта гостем во встроенном браузере, а письмо открывает уже в моём Chrome, где есть вход в почту, и жмёт ссылку, чтобы убедиться, что публикация работает, — и всё это внутри одного задания, с одним докладом в конце.
В трейлерах коммитов за это время сменилось четыре поколения: Opus 4.6 в апреле, 4.7 в мае, Opus 5 в сентябре, сейчас в Коде Opus 5.5, а в чате-архитекторе Fable 5.1. Разделение между ними для меня практическое: промпты, тексты и всё, где нужна голова, пишет чат; Код — руки. Что из этого шага вперёд заслуга моделей, а что — правил и реестров, которые накопились вокруг них, я разделить не берусь. Подозреваю, что и то и другое, и второе без первого не заработало бы.
Цифры
Репозиторий на 18 октября 2026 года:
1 623 коммита за 200 дней, ноль мержей — одна ветка, один исполнитель;
по месяцам: апрель 239, май 292, июнь 48, июль 114, август 332, сентябрь 485, октябрь 113 за полмесяца;
103 файла на Rust, 69 839 строк; 83 шаблона Askama, 14 118 строк; 1 256 строк CSS и 2 533 JS без вендорных библиотек;
135 SQL-миграций, 42 таблицы в базе, 205 зарегистрированных роутов;
460 крейтов в Cargo.lock;
85 успешных выкатов с 30 августа, когда скрипт начал вести журнал: 72 из них — в сентябре;
341 пункт техдолга за всё время, 143 открыты.
Продукт в цифрах скромнее, и я их не прячу: 183 объявления, 41 пользователь, 4 фирмы, 429 рубрик, 272 страницы в индексе Яндекса, около тридцати подтверждённых визитов в день. Это Петербург, бесплатные объявления, первая реклама запущена в середине октября. Рынок — отдельная и гораздо более сложная история в данном случае, и она пока не написана.
Что бы я сказал себе в феврале
Не проси «полную автоматизацию с нулевым участием». Это не работает — и не потому что инструменты плохие, а потому что отвечать за прод всё равно будешь ты. Правильный вопрос: какие пять точек ты можешь проверить сам, не умея читать код? У меня это: план до правок, число тестов после, вывод psql, sha256 статики в логе выката, health check. Всё остальное — доверие, а доверие нужно выдавать ступенями.
Не верь модели, когда она говорит о своём статусе. «Готово», «работает», «фаза пошла» — это не факт, пока нет вывода команды. Это касается любой модели, включая ту, с которой я работаю сейчас: доклад без вывода тестов я не принимаю.
Пиши правила после каждой поломки, а не до. Я пробовал начать с «идеального CLAUDE.md» — он не работал, потому что был про абстрактные опасности. Работают правила, у которых есть дата и случай: «10.09 миграция упала, выкат прошёл». Модель такие правила тоже выполняет лучше, когда рядом написано зачем.
Один советчик — плохо, двенадцать — тоже потолок. Консилиум отлично работает для «что не упустить» и плохо — для «что выбрать»: в итоге выбираю всё равно я, и мне нужны не двенадцать мнений, а один исполнитель, который остановится и спросит, когда в задании BIGINT вместо UUID.
Вопрос «Claude Code в России» — как платить и откуда работать — я обхожу сознательно. А вот про деньги и время скажу, если это спросят в комментариях. Восемь месяцев, из них примерно шесть — с Claude; подписки на модели, сервер в облаке, почта и домен. Это дешевле, чем нанять одного разработчика на тот же срок, и это несравнимо дороже, чем «описал словами — получил приложение». Главная цена — моё время, а его ушло много, но я бы заплатил снова.
Что дальше
Сайт — bonvera.ru, бесплатные объявления по Петербургу; если захотите посмотреть, как выглядят 70 тысяч строк Rust, написанных моделью под присмотром металлообработчика, — он там. Следующий этап — реклама, разметка сущностей, вторая волна фирм; техническую сторону буду описывать по мере того, как она будет ломаться.
Эту статью я тоже собирал вместе с тем же Claude: Код вытащил цифры из git и реестров с указанием источников, чат собрал текст, я резал и правил. Это честно, и это, по-моему, тоже часть ответа на вопрос, что такое вайбкодинг.
Если у вас похожий опыт — особенно если он закончился иначе — расскажите в комментариях. Больше всего меня интересует одно: где именно и как вы проверяете модель, не читая код, — какие точки контроля нашли вы.
Комментарии (8)

vladislav_smirnov
21.10.2026 14:52Мне кажется, что проблема не в вайб кодинге. В самом начале, стоило потратить пару часов на обсуждение с нейронкой подходящих инструментов и сэкономить несколько месяцев

Frolov_Vadim Автор
21.10.2026 14:52Конечно, да! Но я начинал делать сайт, имея только очень поверхностное понимание того, что он из себя может представлять. Честнее — я ничего не понимал и даже не думал об этом. Я спросил у DeepSeek: «А мы с тобой можем сделать сайт объявлений типа Авито, но немного другой?» Он ответил «да», и мы приступили. Я и не думал, что это меня так затянет.
И тут важный момент — почему именно DeepSeek. С 2025 года я иногда использовал его для мелких задач, потому что он был бесплатный и работал без VPN. Февраль и март он писал код, я вставлял его в терминале, сохранял, пушил, деплоил — и это работало. А Claude Code и Cursor на таком объёме — это была бы подписка.
Когда я стал уставать, задумался об упрощении, об автоматизации. DeepSeek предложил построить свою «фабрику», и я поверил — потерял на этом пару недель. Потом он начал ходить по кругу: исправлял исправленное и возвращался к уже исправленному. Я пробовал ChatGPT и Gemini, а выбраться из этой головоломки помог Claude. К тому моменту я уже полностью погрузился в проект и для себя решил, что подписка того стоит.
Так что это были не столько проблемы, сколько трудности, которые пришлось решать разной ценой.

AIQ130
21.10.2026 14:52Интересная история. Круто, что довели до MVP. Не пробовали chain-промптинг? У меня контекст часто вмешивается в инференс в негативном ключе, отбирает внимание от начальных требований. Некоторые вопросы закрывают субагенты, но не всегда.

Frolov_Vadim Автор
21.10.2026 14:52Спасибо! По сути так и работаю, только без этого названия. Роли разделены: чат-архитектор пишет задание, исполнитель (Claude Code) получает его одним блоком. Большую задачу целиком не отдаю: сначала разведка только на чтение, потом план — если правок больше пяти, исполнитель обязан показать план и ждать одобрения, — и только потом работа по пунктам с докладом. Чтобы контекст не уводил в сторону, в начале каждой сессии он читает реестры проекта — STATE.md (что сейчас на проде и что в работе) и TECH_DEBT.md (открытые долги), — а не опирается на то, что «помнит». Разведку по коду отдаёт субагентам, в основной контекст возвращается только вывод. А когда чат разрастается и модель начинает терять нить — конспект и новый чат. Полностью проблему это не снимает, но дрейф от исходных требований стал заметно реже.

AIQ130
21.10.2026 14:52Вам проще запустить среду с агентом, там это всё делается автоматически (сжатие контекста, роли Plan/Build) и настраивается... Opencode, например, бесплатный и позволяет подключаться к любой другой модели.
Я немного про другую технику писал. Но да ладно, это тема целой статьи.
Frolov_Vadim Автор
21.10.2026 14:52Понял, спасибо — значит, я ответил про своё, а не про технику. Claude Code, которым пользуюсь, как раз такая среда: и сжатие контекста, и режим плана в нём есть. Ручное сверху — реестры и второй чат как архитектор — это скорее мой способ держать решения не только в памяти модели. Про Opencode посмотрю, спасибо за наводку. А про цепочки — напишите статью, прочитаю.
hardtop
Rust - странный выбор для такого проекта. Почему так случилось?
Frolov_Vadim Автор
Странный — в смысле редкий, согласен: доски объявлений на Rust почти не пишут. Но ошибкой не считаю. Сервер отвечает за 0,1 с, памяти ест мало, компилятор ловит часть ошибок модели до прода, 200 дней на нём стоит без переписывания. Цена известна: сборка 4 минуты, библиотек меньше, разработчика искать дольше.
Выбор мой, и осознанный. В феврале я просил у DeepSeek не «быстро запуститься», а фундамент, который выдержит рост без переделки: сначала одноэтажный домик, потом этажи сверху, и чтобы основание не дало трещину. Он предложил Rust + Axum + PostgreSQL. В марте консилиум из десяти моделей советовал уйти на WordPress или Bubble ради скорости запуска — я отказался.
На самом деле логика простая: конечно, я заинтересовался, как устроен Авито, и узнал, что он начинался на PHP и потом годами перестраивал его на ходу. Мне хотелось сразу заложить то, что не придётся переписывать, — пусть на старте это и выглядит избыточно.