1. Введение и мотивация
В 2025 году вопрос полноценной генерации продуктового кода с помощью LLM («вайб-кодинг») становится все более актуальным, но при этом остается и достаточно дискуссионным: насколько такие подходы вообще применимы в реальных проектах, действительно ли они сокращают время и стоимость разработки, и что происходит с тестируемостью и поддержкой такого кода в долгосрочной перспективе?
Сложность этого вопроса не только в качестве самой генерации, но и в том, как интегрировать LLM в инженерные процессы, чтобы получить управляемый, масштабируемый и архитектурно устойчивый код.
Моя мотивация была проста: попробовать выстроить полноценный продуктовый backend для нетривиального телеграм-бота с функциями агента (планированием, напоминаниями, памятью и проактивным поведением, возможностью дальнейшей расширяемости и интеграции сторонних сервисов), при этом — не писать руками ни строчки кода. Чтобы человек участвовал только как архитектор и асессор, а все проектирование и реализация шли через промпты в специализированные IDE-агенты (Cursor, Copilot, Codex, Zed) и LLM (как доступные через API/CLI, так и в «пользовательской» продуктовой обвязке).
2. Организация процесса: от постановки задачи к первому пайплайну
Основной принцип таким образом — формулировать каждую новую задачу, архитектурный паттерн или бизнес-сценарий исключительно через промпты для LLM. На первом этапе важно определить не только функциональные требования, но и правила построения пайплайнов внутри чат-бота, архитектуру memory-layer и границы доступа к данным. Особое внимание уделяется тестам: минимальные автотесты покрывают ключевые переходы между фазами, работу с памятью и access control, чтобы изменения в коде не приводили к сложным переписываниям тестов, но при этом сохранялась надежность.
Пример минимального начального промпта для IDE:
Design a backend structure for a Telegram bot using typed Python 3.12, aiogram, SQLAlchemy, and langchain for llm-first decision chains: router, analysis, processing, response.Implement strict CRUD separation, memory-layer abstraction, clear access control, and ensure that all business logic is separate and covered by minimal tests w/ typification.
3. Ключевые LLM-паттерны и проектирование бизнес-логики
Одна из сильных сторон заданного таким образом LLM-first подхода — возможность реализовать даже сложную бизнес-логику в виде цепочки, не прибегая к ручному кодингу для каждого кейса. Ключевой в данном случае элемент архитектуры — LangChain с его runnable chains: пайплайн строится из независимых фаз (router, analysis, processing, response
), каждая из которых может быть отдельно протестирована и переиспользована.
Пример декларативной композиции фаз через pipe-operator (|
):
main_chain = router_chain | analysis_chain | processing_chain | response_chain
Несмотря на специфичность паттерна (при всей его популярности, он достаточно свежий и используется до сих пор помимо langchain ещё всего в паре оберток над библиотеками вроде pandas), LLM после явного указания в промпте и фазы «гугления» успешно справляется как с генерацией подобного кода, так и, я это покажу позже, с автоматизацией его тестирования. В указанном подходе все сценарии реализуются как линейные пайплайны. Ветвление между ними и fallback как правило реализуются внутри конкретной цепи через явный код (для прозрачности и тестируемости), но в langchain возможно декларативное ветвление прямо в пайплайне. Для задач планировщика с памятью и напоминаниями пример ветвления по intent может выглядеть так:
from langchain.chains import RunnableBranch
main_chain = (
router_chain
| RunnableBranch(
(lambda input: input["intent"] == "create_task", create_task_chain),
(lambda input: input["intent"] == "set_reminder", set_reminder_chain),
default_chain, # no intent detected
)
| processing_chain
| response_chain
)
В подобном пайплайне на этапе routing выделяется намерение пользователя (например, «создать задачу», «поставить напоминание», «посмотреть задачи»), после чего запускается соответствующая цепочка обработки. Это делает поведение чат-бота не только гибким, но также более предсказуемым и удобным для тестирования: каждая ветка покрывается автотестом и может развиваться независимо.
Такой декларативный паттерн особенно хорошо работает при добавлении новых сценариев, поскольку не требует рефакторинга всей логики, а только расширения «ветвей» в конфиге RunnableBranch.
Важная деталь: четкая фиксация поведения с разделением фаз, выделением промптов в вынесенные шаблоны и порождающие функции, фабричные методы для инъекции контекста, и тестируемость каждого шага должна закладываться при построении первичной архитектуры, что позволяет в дальнейшем поддерживать и масштабировать бизнес-логику с минимальными издержками.
При этом вся логика построения prompt-mastery, популяции истории диалога и паттерны инъекции RAG/MCP согласно оригинальной постановке задачи должны самостоятельно реализовываться LLM в IDE (или отдельно в традиционном чат-боте) согласно требованиям человека-архитектора задачи.
4. Внутренняя модель данных и архитектурные паттерны
В подходе LLM-first проектирование моделей и связей осуществляется вместе с LLM уже в готовом развернутом фреймворке проекта — это позволяет быстро эволюционировать структуру данных, не рискуя совместимостью и надежностью.
Основные сущности в нашем случае будут:
User, Task, Reminder, Message — с формализованными связями (user ↔ task, task ↔ reminder
) и строгой типизацией.
Persistent vs Dynamic context:
Только атомарные состояния (задачи, напоминания, настройки) хранятся в БД, динамический контекст формируется на лету (для персонализации, истории).
Проактивность и реактивность:
Инициирование диалогов и напоминаний при таком подходе работает по тому же фазовому принципу, что и реакция на команды пользователя:
контекст → решение LLM → запуск цепочки фаз
Access control и безопасность:
Вся работа с БД — строго через memory-layer, доступ к данным реализуется на этом уровне, LLM при этом не управляет правами доступа и не видит «сырых» данных. Об этом мы также прямо говорим IDE при запросах на генерацию кода.
5. Управление структурой данных и миграциями
Быстрое развитие бизнес-логики, типичное для AI-first проектов, невозможно без гибкой системы управления изменениями структуры данных. Классические подходы с ручным написанием миграций тут не подходят — темпы и частота изменений требуют большей автоматизации и прозрачности.
Связка SQLAlchemy + Alembic: фундамент для автоматизации
В основе управления схемой данных в проекте лежит связка SQLAlchemy (для описания моделей) и Alembic (для контроля и применения миграций).
SQLAlchemy используется как основной ORM: все модели (User, Task, Reminder, Message) должны быть описаны декларативно, строго типизированы и интегрированы с Pydantic для безопасной сериализации и валидации.
-
Alembic — стандарт для управления версионностью базы данных: генерирует, отслеживает и применяет миграции на лету, полностью интегрирован в workflow разработки.
Вот например подробная статья, как этим пользоваться.
Автоматизация миграций: как это работает
Ключевая особенность — миграции, как и модели, проектируются LLM еще на этапе промптов. После того как меняется структура моделей (например, добавляется новое поле или сущность):
LLM IDE автоматически инициирует генерацию миграции через Alembic (
alembic revision --autogenerate
),дальше миграция валидацируется ревьюером,
все изменения миграций и моделей обязательно проходят через проверки на корректность применения в тестовой базе.
модели после обновления сразу же обвязываются в memory CRUD-методами без ручного SQL, исключительно средствами ORM.
после этого дополнительно формируются миграции на создание необходимых для новых методов индексов.
Такой подход позволяет:
быстро эволюционировать структуру данных вместе с логикой;
избегать ошибок и ошибок доступа к чужим данным;
хранить историю всех изменений схемы с понятным аудитом и возможностью отката.
CI/CD и надежность данных
Миграции являются частью общего CI/CD-процесса:
при каждом обновлении моделей автоматически генерируются новые миграции,
на тестовом окружении они прогоняются полностью с нуля для проверки целостности,
автотесты покрывают всю логику memory-layer,
поддерживается возможность отката при обнаружении ошибок или несовместимостей.
Интеграция с AI-first подходом
AI-first разработка подразумевает, что не только бизнес-логика, но и эволюция структуры данных задается исключительно через промпты к LLM:
описание новых сущностей, связей, полей и ограничений полностью формируется на этапе архитектурного промпта,
генерация миграций и подготовка автотестов для новых сценариев также автоматизируются и накатывается одновременно с новым кодом.
Это позволяет развивать продукт на порядок быстрее классических методов, сохраняя при этом надежность и предсказуемость эволюции базы данных. При этом понятно, что всё это относится к миграции структуры, но не миграции существующих данных: поскольку это очень чувствительная и часто необратимая операция, подход к ней остается во многом завязанным на написание специальных миграционных сценариев с предварительными бэкапами и подробным ручным review тактики исполнения миграции.
6. Расширяемость архитектуры на примере новой сущности
AI-first архитектура изначально проектируется с прицелом на простоту добавления новых сценариев и бизнес-сущностей без необходимости кардинального рефакторинга или риска нарушить логику работы всей системы. Примером этого послужит внедрение новой сущности — Reminders.
Как устроено расширение поведения
1. Проектирование через LLM
Новый сценарий или сущность (например, напоминания) сначала формулируется как задача для LLM: через промпт описывается роль новой сущности, связи с уже существующими объектами (например, связка Reminder ↔ Task
), возможные бизнес-статусы и варианты использования.
Современные LLM (GPT 4.1, Claude 4 Sonnet, Gemini 2.5 Pro) вполне способны предлагать разумные реляционные связи между сущностями, даже если входные требования заданы достаточно общо — на основе индустриальных паттернов и типовых сценариев проектирования. Например, при формулировке задачи «добавить напоминания в планировщик», LLM способна сама предложить такие решения:
Каждое напоминание (Reminder) должно быть связано с конкретной задачей (Task),
поскольку в реальной жизни напоминания обычно служат для контроля сроков выполнения какой-либо задачи.
Если пользователь создает напоминание без явной привязки к задаче, LLM предлагает автоматически создавать для такого напоминания специальную dummy-задачу (фиктивную), чтобы не нарушать целостность данных и сохранять единый формат работы с памятью. Такой dummy-объект позволяет унифицировать дальнейшую обработку: все напоминания, даже отдельно стоящие, всегда имеют связанный Task и проходят тот же pipeline (валидируются, отображаются в истории, участвуют в access control).
Особенности построения динамического контекста:
Когда появляются новые связи или бизнес-сущности, их обязательно нужно обсуждать с LLM на этапе проектирования промптов и сценариев взаимодействия. Только так можно добиться корректного включения новых элементов в общий динамический контекст:
LLM получает точные указания, как формировать summary, историю, агрегировать и включать в RAG данные с учетом новых связей. Это предотвращает недопонимание при интерпретации или дублирование, когда, например, напоминания без задачи могли бы отображаться «как попало» или выпадать из пользовательской истории.
Явное обсуждение новых паттернов в промптах и архитектурных подсказках помогает LLM автоматически интегрировать новые сущности во все ключевые сценарии работы memory-layer, пайплайнов и коммуникаций.
2. Обновление memory-layer и API
Появляются новые методы в memory-layer: например, create_reminder, update_reminder, get_reminders_for_task
.
Строгая типизация сохраняется — все новые операции описываются через Pydantic-схемы и интегрируются в существующий API, не нарушая работу старых сценариев.
3. Актуализация пайплайнов обработки
В фазовых цепочках LangChain добавляются новые ветки или параметры — теперь маршрутизатор, анализатор и умеют распознавать, создавать и управлять напоминаниями.
Для проактивных сценариев (автоматические напоминания) появляется новый триггер — периодическая или событийная проверка необходимости отправки коммуникации, обработка через ту же фазовую структуру (routing → analysis → processing → response
).
Пример промпта в его части настройки формата вывода:
**Response Format**:
Return a JSON object with the following structure:
{{
"needs_notification": true/false,
"reason": "Brief explanation of why notification is needed or not needed",
"notification_type": "task_reminder|follow_up|check_in|progress_update|proactive_engagement|reminder_behavior",
"priority": "high|medium|low",
"urgency": "immediate|soon|later"
}}
На этом примере генерации сложного роутинга заметно, как формирование формального текстового ответа позволяет далее декомпозировать его генерацией параметрической части ответа до конечного дерева решений в виде готовых цепочек.
4. Тестируемость и минимизация риска
Для всех новых методов и фаз автоматически генерируются (или дополняются) минимальные автотесты, особенно на связки Task ↔ Reminder
и корректность контроля доступности.
Миграции через стандартный CI/CD: тестовая база обновляется, изменения валидируются на «чистом» старте и при апгрейде с прошлой схемы.
Практические выводы
Расширяемость по модели: подобная архитектура позволяет быстро внедрять любые новые сущности или сценарии, не ломая существующие цепочки и минимально затрагивая старый код.
Единый контроль типов и доступа: все проверки, типизация и контроль доступности централизованы в memory‑layer, что гарантирует предсказуемость и безопасность при росте числа сущностей и бизнес‑операций.
Устойчивость к ошибкам: промпты формулируются так, чтобы при ошибках новых сценариев старый функционал продолжал работать, а откаты миграций не приводили к потере данных.
Скорость изменений: интеграция новой логики (как в примере с reminders) требует минимальных усилий — изменения отражаются в моделях, миграциях, memory‑layer и фазовых пайплайнах практически синхронно.
AI-first = гибкость без хаоса
В результате, расширяемость такой архитектуры становится не теоретической, а реально воспроизводимой на практике: LLM-подсказки и автоматизация работы с моделями, пайплайнами и миграциями позволяют быстро масштабировать и менять продукт без хаоса и страха сломать остальной фреймворк. Это открывает путь для быстрой эволюции даже сложных AI-first сервисов, где сценарии и требования меняются буквально каждую неделю.
7. Best Practices
Попробую сформулировать главные инсайты паттернов проектирования, полученные по итогам эксперимента, которых следует явно требовать от LLM при генерации кода.
Безопасный LLM-routing и работа с CRUD
Вся маршрутизация, реализуемая через LLM, строго ограничена заранее определенными CRUD-методами memory-layer без доступа к «сырой» базе, инкапсулирована в единой цепи и/или их методах run, даже в очень сложных случаях она получается достаточно компактной, безопасной, читаемой, тестабельной и поддерживаемой.
Промпты для LLM (как для генерации кода, так и для обслуживания внутренней механики фазирования) оформляются как паттерны: в них явно описаны возможные сценарии, формат аргументов и условия fallback.
Для каждого нового запроса — четкий routing, валидация параметров и возврат ошибки при несоответствии формату.
При проектировании промптов важно предусмотреть не только «оптимальные» сценарии, но и обработку нештатных ситуаций: неполные или противоречивые данные, неявные поведения (routing на создание сущности потом отдельно валидируется промптом, формирующим ее payload и т.д.).
Асинхронность, очереди, работа с внешними API
Для сценариев с длительной обработкой, уведомлениями и интеграциями применяется асинхронный подход (например, через aiogram, cron-like воркеры APScheduler или внешние очереди сообщений).
Все вызовы внешних сервисов и API инкапсулируются и отделяются от чистой бизнес-логики; ошибки и timeouts всегда обрабатываются с корректным fallback.
При необходимости работы с большим числом напоминаний/триггеров или долгими операциями используются изолированные воркеры и периодические задачи.
Поддержка тестируемости memory-layer
Тесты для memory-layer должны быть максимально изолированы, не зависеть от состояния пайплайна LLM или внешних сервисов.
Для сложных сценариев (например, массовые напоминания, асинхронные триггеры) при помощи агента пишутся интеграционные тесты с фиктивными задачами и контролем вызова мок-методов и результатов выполнения.
Вся логика безопасного доступа тестируется отдельно, включая сценарии разделения данных между пользователями.
Расширение API memory-layer осуществляется по тем же принципам: сначала отдельным промптом проектируется безопасный CRUD, затем интегрируется в фазовые цепочки, они тестируются на уровне автотестов.
Фазовые пайплайны тестируются «сверху» через моковые сценарии, с контролем состояния persistent и динамического контекста.
Пример системы фикстур для роутинг-пайплайна:
@pytest.fixture
def mock_memory(self) -> MagicMock:
"""Create mock memory manager."""
memory = MagicMock()
memory.get_user_by_id = AsyncMock(return_value=MagicMock(data={}))
memory.create_reminder = AsyncMock()
return memory
@pytest.fixture
def router_manager(
self, mock_llm: MockLLM, mock_memory: MagicMock
) -> RouterChainManager:
"""Create RouterChainManager instance."""
manager = RouterChainManager(mock_llm, mock_memory)
manager.router_chain = AsyncMock()
manager.reminder_creation_chain = AsyncMock()
manager.normal_chain = AsyncMock()
return manager
Подобные моки также успешно генерятся вайб-кодингом, постепенно обрастая инструментами для тестирования все более сложных сценариев. Сами тесты сложного поведения поведения при этом выглядят достаточно лаконично:
result = await router_manager.process_message("Remind me to call John", 1)
assert "Reminder created successfully!" in result
mock_memory.create_reminder.assert_called_once()
router_manager.normal_chain.run.assert_called_once_with("Reminder created")
При это корректно проинструктированный агент успешно переиспользует уже наработанные паттерны готовых моков при расширении кодовой базы на новые сценарии, даже если это простая директива «покрой новое поведение тестами, опираясь на уже существующую тестовую базу». Это же зачастую лучший способ переписать тесты сильно изменившегося пайплайна — просим снести существующие тести и написать их же с нуля, это куда быстрее чем традиционные итеративные попытки починить устаревшие тесты.
Единый codestyle и автоматическая валидация кода
Строгое соблюдение code style (PEP8, импортов, аннотаций типов и других стандартов) — обязательное условие для масштабируемого AI-first проекта. Четкая структура и единообразие кода позволяют как LLM, так и инженерам легко читать, проверять и дорабатывать проект, при этом необходимо помнить, что генератор кода регулярно забывает об этих требованиях (и особенно плохо справляется с элиминацией ненужных зависимостей и неиспользуемых переменных), а потому:
Для контроля кода крайне рекомендуется использовать pre-commit hooks, автоматически запускающие инструменты проверки:
black
иisort
для форматирования и сортировки импортов,flake8
илиruff
для PEP8 и поиска неиспользуемых импортов,mypy
для строгой проверки типизации,-
при необходимости — кастомные линтеры для проектных соглашений.
Важно: тесты, отладочные скрипты и их вспомогательные файлы стоит исключить из части автоматических проверок (особенно типизации и стайлгайда). Опыт показал, что автоматизация в тестах часто приводит только к рутинным фиксам и не дает прироста качества — время ревью и рефакторинга тестов обычно не окупается. Достаточно поддерживать в них базовый порядок и проводить ручной аудит edge-cases.
8. Итог: Организация работы и процессы
Давайте подведем итоги эксперимента — как именно была организована работа, что из этого реально сработало, а что потребовало ручного вмешательства. Ниже — рабочие результаты, которые показали себя лучше всего, и важные наблюдения по процессу.
Практика AI-first разработки
С самого начала проект строился как AI-first: инженер или тимлид формулирует задачи, ограничивает архитектурные рамки и требования, после чего LLM берет на себя генерацию кода и тестов на базе заранее подготовленных промптов и паттернов. Получилась непрерывная петля:
быстрый вайб-кодинг: экспериментальные сессии проектирования, генерации, сборки компонентов пайплайна (здесь важна не идеальная чистота кода, а скорость в поиске решений);
затем — ассесмент и e2e тестирование: ручная валидация, доработка сложных сценариев, «боевой» прогон новых фич в реальном API, обсуждение получившейся архитектуры.
Роль асессора и ручное e2e тестирование
В реальности полностью отказаться от ручной проверки не получилось: автоматизация закрывает стандартные сценарии, но для сложных кейсов, интеграции с внешними сервисами, нюансов пользовательского опыта и неожиданных цепочек асессор остается критически важен.
Асессор здесь — не просто человек, который «принимает» или «бракует» фичи, а полноценный гарантийный инженер:
следит за соответствием архитектурным стандартам,
проверяет документацию для LLM,
оценивает надежность и SLA.
Отдельно отмечу — в будущем даже эта роль может частично перейти к LLM: ревью кода, анализ логов тестов, формирование changelog, автоматизация репортов — все это уже сейчас начинает делаться полуавтоматически. Это значит, что работа асессора становится менее рутинной и больше стратегической.
Живой changelog и ретроспектива
Еще одна важнейшая практика, которая реально сэкономила время и помогла избежать хаоса, — автоматизация changelog.
Каждое значимое изменение фиксировалось прямо в процессе вайб-кодинга: добавлены фичи, обновлены модели, миграции, изменены сценарии e2e-тестов.
Важно, что этот changelog не был «дописан задним числом», а собирался на лету и был максимально подробным — благодаря чему к концу спринта можно было быстро провести ретроспективу, найти слабые места и точно оценить time-to-feature и time-to-fix.
Такой подход помог видеть картину целиком, а не в стиле «где-то там что-то поправили» — и, главное, давал возможность всей команде (и LLM!) ориентироваться в реальной истории изменений.
Оптимизация, узкие места и новые правила
Как показал опыт, время от постановки задачи до фичи и от бага до фикса оказалось лучшим индикатором эффективности. Благодаря автоматизации многие архитектурные узкие места обнаруживались быстро: где LLMка не поняла промпт, где тесты не покрыли кейс, где миграции создали конфликт. Все эти истории фиксировались не просто как баги, а как точки для улучшения паттернов промптов и архитектурных соглашений, при этом не заметались под ковер, а фиксились как можно быстрее, минорные релизы выпускались за время эксперимента ежедневно, всего их состоялось 20 за 15 рабочих дней, плюс 4 релиза носили статус полноценного мажорного обновления.
Что получилось по времени и ресурсам
Итого за три недели эксперимента:
~50 часов ушло на чистый вайб-кодинг (генерация пайплайнов, моделей, тестов, промптов),
~60 часов — на ручной ассесмент, кодстайл, дополнительное покрытие unit-тестами, интеграционные тесты, ретроспективу,
остальное время — архитектурные встречи, ревью, доработка changelog, устранение всплывших проблем.
Такой темп дал возможность реализовать не только весь основной функционал, но и гибко расширять его под новые требования — без потери управляемости и качества. Всего в проекте 6к строк основного кода (не считая тестов, всего их в проекте более 500) плюс два десятка feature-reach шаблонов промптов, все они были сгенерены чистым вайб-кодингом, по сути, руками редактировался только .env.
Потенциал автоматизации
Особенно интересно, что по мере развития инфраструктуры роль человека в цикле становится все более стратегической: часть рутинных проверок, ревью фич и edge-case тестирование можно постепенно автоматизировать, а команде остается формулировать цели, уточнять архитектурные паттерны и корректировать промпты.
9. Перспективы и выводы
Давайте без иллюзий: удалось ли реализовать production-ready backend целиком в AI-first парадигме? Какие уроки этот опыт дал мне и может дать командам, которые подступаются к подобным задачам?
Что реально получилось
Современная LLM — отличный архитектор и кодогенератор (если заранее определены строгие паттерны проектирования и зафиксированы ожидания через промпты): за три недели проект был собран не только быстрее и гибче, чем классическим путем, но — что принципиально важно — устойчивее. Такой подход позволил с нуля выстроить взрослую архитектуру полноценного backend-проекта с четкой модульностью, строгой типизаций, формальными интерфейсами, валидацией данных, memory-layer и прозрачными правилами безопасности.
Код получился легко тестируемым: структура кода вокруг memory, фазовых пайплайнов при строгой типизации обеспечивает покрытие автотестами более 93% кода. Актуализация тестов при изменениях моделей и сценариев на работающих примерах проходит почти без боли — тесты «живут» вместе с архитектурой и эволюционируют синхронно.
Вся архитектура получилась гибкой и масштабируемой: добавить новую сущность или сценарий теперь — это не рефакторинг «всего и сразу», а последовательное расширение memory, моделей и пайплайнов происходит точечно и интактно.
Memory-layer и строгий контроль доступа спасли от множества ошибок: безопасность и надежность не оказались жертвой автоматизации, а наоборот — стали центром всей инженерной работы.
Живой changelog, ретроспективы и autotest-coverage — инструменты, которые позволили сохранять прозрачность и контроль даже при высокой скорости изменений.
Где остались ограничения
Без ручного ассесмента пока нельзя: даже самый продвинутый LLM не угадает бизнес-нюансы, детали пользовательского опыта и тонкие моменты, которые для продукта могут быть критичны. Роль тимлида, асессора и ревьюера в ближайшем будущем только будет расти.
Сложные сценарии требуют особого внимания к промптам: ошибки архитектурных паттернов или неявные связи в данных впоследствии могут привести к «магическим» багам и сложностям в покрытии тестами. Формализация и постоянная актуализация промптов — must have для стабильности подхода.
Автоматизация — это не анархия: любая попытка «ускорить все подряд» без ранней фиксации интерфейсов и правил рано или поздно приводит к хаосу. Четкие границы между LLM и кодом, ручной контроль доступа и миграций — неотъемлемая часть подхода.
Почему этот опыт стоит тиражировать
AI-first подход — это уже не эксперимент, а зрелая инженерная практика. Если команда готова формализовать архитектуру, строить пайплайны, поддерживать memory-layer и CI/CD — LLM может брать на себя большинство всех задач по проектированию, реализации и тестированию нового функционала.
Проектирование «через промпт» ускоряет не только старт и точечные «допилки», но и стратегическое развитие сформировавшегося проекта: скорость обновления, масштабируемость и прозрачность изменений существенно выше, чем в традиционных подходах даже для очень опытных команд.
Что дальше
Уже сейчас часть ручного ассесмента удалось автоматизировать — например, ревью миграций, сбор changelog, формирование отчетов по тестам.
В перспективе роль тимлида будет все больше смещаться от «суперкодера» к архитектору сценариев и фасилитатору промптов.
Следующий логичный шаг — интеграция LLM в процесс архитектурного ревью, автоматический аудит паттернов и анализ security на лету.
Рано или поздно доступные на рынке модели дорастут и до того, чтобы им можно было разрешить после очередной фазы кодогенерации или фиксов самим автоматически запускать тесты и написанные ими ad-hoc отладочные скрипты (сейчас я вам такого не советую, агенты любят увлеченно ходить по кругу в тщетной попытке что-то починить, и без участия живого человека с навыками опытного разработчика к утру вы получите не работающий код, а круглый счет за потраченные токены).
-
Также пока практически бесполезны для вайб-кодинга и «рассуждающие» модели, ничего кроме стремительной потраты токенов в случае feature-reach проекта они вам не принесут, смело отключайте их в меню выбора модели. А вот для единомоментного верхнеуровневого анализа и проектирования в традиционном чатбот-режиме они бывают весьма полезны. Но покуда обязательно продолжайте следить за их действиями и требуйте подтверждения каждого нового запуска тестов.
Главное:
AI-first backend — в настоящий момент это не только про скорость или «чтобы не писать руками», а про новую инженерную культуру: фокус на подходящих паттернах проектирования «на входе»,
тестируемость и безопасность производимого кода в процессе,
использование архитектуры, спроектированной так, чтобы быть способной быстро и гибко меняться.
Этот опыт можно и нужно внедрять в production — если команда готова учиться новому и не боится формализовать собственные архитектурные привычки.
Комментарии (8)
S1908
09.07.2025 12:04Llm не для всех кейсов подходит. То что есть в базе обучение хоть и весь гитхаб покрывают но имеет лимит. Llm больше справляются с проектами опен сорс и задачами которые имеющие шаблоны в обученной модели. Если что-то креативное то что не имеет аналогов а ведь это суть продукта! Llm не справиться с такой задачей.
Но выход разумеется есть и я им пользуюсь :)
agray
09.07.2025 12:04Хоть когда-то люди, заявляющие что написали код через LLM, оставляли открытый репозитарий? Ни разу такого не видел. Все кто пользуется нейронками знают что они выдают нерабочий код, глупые и безумные алгоритмы, любая архитектура от нейронок попахивают. Рабочий проект создать невозможно. Почему меня, а я ежедневно пользуюсь LLM, пытаются убедить в обратном?
Даже не уверен что все эти бесконечный статьи пишут реальные люди, это какой-то маркетинг и хитрый план? Какой в этом смысл? Хотя бы немного отодвинуть намечающийся кризис?
JVyacheslav
09.07.2025 12:04Заговор массонов, не иначе.) Ну, что сейчас популярно - о том и пишут.
И да, репозитории оставляют, но редко. Потому что "работает что-то, значит пофиг, как оно работает, даже если там вместо продвинутого алгоритма 1000 вложенных ифов."))))
И нет, рабочий проект создать можно. Но очень мелкий, багнутый, незащищённый и часто бесполезный. Тут всё зависит от понятия "рабочий". Для тех, кто это делает, как правило "запускающийся и что-то делающий".
blackyblack
09.07.2025 12:04https://github.com/blackyblack/identity_server
Неделю назад подключил Codex от OpenAI. Теперь каждую новую фичу начинаю с запроса к агенту. Руками дорабатывать тоже приходится, но все равно буст к производительности и качеству очень хороший.
Ext_Art
Этот текст без указания реального GIT репозитория с результатом имеет мало смысла.
Muliwe Автор
Мой опыт подсказывает, что конкретный код (без хотя бы кратко расписанных задач, зачем это сделано) имеет мало смысла. Всё-таки целью проекта было не только отработать методологии, а и написать нечто реально работающее с конечной целью (закрыть конкретные таски), иначе три недели работы это как-то дороговато для чистого эксперимента. Я подумаю, как можно при помощи той же LLMки собрать минимальный фреймворк, демонстрирующий архитектуру, но не закапывающийся в детали конкретных конечных юзер-стори. Но боюсь что это только уведёт тему в очередной кодстайлосрач.
Суть эксперимента, как это описано во введении - подобрать набор методик, которые позволяют удобно и быстро код модифицировать, не трогая руками. А не "написать код, который всем понравится". Как эта штука будет вообще кому-то видна из статичного слепка репозитория? Ну вот есть конкретный коммит с конкретным диффом, как из него можно понять, мучился я с ним полдня или с первого промпта получил то, что нужно? Он меня конкретного устроил потому что я такой вот говнокодер, а моя ЛЛМка ничего другого не умеет, или напротив, это ровно то, что было нужно для счастья исходя из конкретной постановки задачи? Видео разве что записывать, с матерными комментариями! Но это уже другой формат, лайв-кодинг в режиме ютуб-стриминга пока не мой жанр, да я и не уверен, что это мероприятие будет таким уж увлекательным для любой реально существующей аудитории, чтобы в итоге окупиться.
В общем, я подумаю над вашим предложением, но не уверен, что это вообще то направление, куда стоит двигаться, поскольку оно на мой взгляд пока только уводит от основной темы публикации, и не факт, что приведёт обратно.
usiqwerty
Если результат плохой, то игра не стоит свеч.
Я сейчас занимаюсь сравнением процессов написания кода самостоятельно и через ИИ и как раз наблюдаю, что через LLM выходит быстро, но сомнительно в плане качества.
anarchomeritocrat
И я с этим утверждением полностью согласен. Считайте текст статьи спецификацией принципа работы. Я, например, и так всё понял, без кода на гитхабе.