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

Теперь встает главный вопрос, который сегодня не дает спать тысячам разработчиков по всему миру:

«Если ИИ пишет код быстрее меня, находит библиотеки за миллисекунды и закрывает рутинные таски пачками — в чем вообще заключается моя работа как инженера?»

Ответ прост, но для многих болезнен: ваша ценность больше не в скорости набора символов и не в знании наизусть методов стандартной библиотеки.

Ваша работа — быть гарантом целостности системы. Быть тем, кто не дает набору разрозненных скриптов превратиться в гниющую свалку.

Ниже — инженерный фреймворк, к которому мы с коллегами пришли после сотен часов практической работы с автономными coding-агентами в реальном проде.


Паттерн «Skeleton + Pluggable Modules» (Каркас и сменные блоки)

Главная ошибка при работе с ИИ — пустить агента в свободное плавание по всему проекту со словами: «Сделай нам модуль биллинга».

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

Чтобы ИИ работал безопасно, система должна строиться по принципу нерушимого скелета и одноразовых мышц:

                       ┌────────────────────────────────────────┐
                       │          АРХИТЕКТОР (ЧЕЛОВЕК)          │
                       │   Инварианты, Схемы данных, Контракты   │
                       └───────────────────┬────────────────────┘
                                           │ проектирует

                       ┌────────────────────────────────────────┐
                       │           SKELETON (КАРКАС)            │
                       │  Auth Context │ Event Bus │ DB Schemas │
                       └─────┬────────────────────────────┬─────┘
                             │                            │
             изолированный   │                            │ изолированный
             контракт        ▼                            ▼ контракт
       ┌───────────────────────────┐        ┌───────────────────────────┐
       │     PLUGGABLE MODULE A    │        │     PLUGGABLE MODULE B    │
       │    (Сгенерирован AI)      │        │    (Сгенерирован AI)      │
       │  Быстро пишется /         │        │  При деградации —         │
       │  Легко удаляется целиком  │        │  перегенерируется с нуля  │
       └───────────────────────────┘        └───────────────────────────┘
  1. Человек проектирует Каркас (Skeleton):

    • Единая точка валидации входных данных (например, схемы Zod / Pydantic).
    • Границы транзакций и контекст пользователя (User/Tenant context).
    • Шина событий и строгие протоколы межмодульного общения.
    • Централизованный аудит и обработка ошибок.
  2. ИИ наполняет Сменные Модули (Pluggable Modules):

    • Каждый модуль заперт в жесткие границы своего контракта. Он не имеет прямого доступа к чужим таблицам базы данных или чужому состоянию.
    • Вся логика модуля — локальна.

В чём фундаментальная сила этого подхода?
Если через полгода выяснится, что модуль написан неидеально или требования бизнеса изменились на 180 градусов, вы не тратите недели на рефакторинг спагетти-кода. Вы просто удаляете папку модуля целиком и просите агента перегенерировать его с нуля по обновленному контракту. На это уходит 15 минут.


Смерть Pull Request и рождение DESIGN.md

Классический процесс Code Review окончательно изжил себя.

Вычитывать вручную PR на 3 000 строк от агента — это чистое лицемерие. Человеческое внимание рассеивается уже на третьем файле. Разработчик ставит механический LGTM («Looks good to me»), молясь, чтобы тесты поймали критические баги.

Сальваторе Санфилиппо в своем эссе предложил куда более жизнеспособную альтернативу: артефакт DESIGN.md.

Перед тем как агент напишет хотя бы одну строчку кода, вы с моделью составляете документ спецификации архитектуры. Это не бюрократическое ТЗ на 50 страниц, а компактный манифест инженерных решений (на 1–2 страницы), включающий:

  1. Инварианты системы (Что НЕ МОЖЕТ произойти ни при каких условиях):
    Например: «Баланс пользователя не может стать отрицательным ни при каких сетевых сбоях; списание средств и начисление бонусов происходят строго в одной транзакции».
  2. Структуры данных и жизненный цикл (State Machine):
    Четкие состояния сущности: Draft → Pending → Paid → Fulfilled. Никаких переходов в обход машины состояний.
  3. Границы сбоев (Failure Modes):
    Что происходит, если внешний платежный шлюз не ответил за 2 секунды? Что происходит при дублирующем вебхуке? (Идемпотентность).
  4. Критерии доказательства качества (Acceptance Invariants):
    Какие именно стресс-тесты и негативные сценарии обязан пройти сгенерированный код.

Когда DESIGN.md утвержден архитектором — написание кода становится тривиальной технической процедурой. А на ревью вы смотрите не на синтаксический сахар, а на соответствие реализации зафиксированным инвариантам.

Практический инструмент:
Чтобы не проектировать каркас и шаблоны спецификаций с нуля под каждый репозиторий, я выложил готовый открытый стартер: AVP-Dev / agent-starter-kit на GitHub. В нём собраны базовые архитектурные рельсы, шаблоны DESIGN.md, правила для coding-агентов и примеры изоляции модулей, которые можно сразу форкать и брать в реальную работу.


Матрица делегирования: Что отдавать ИИ, а что держать руками

Чтобы не скатиться ни в параноидальный микроменеджмент, ни в безответственный «вайб-кодинг», я использую в работе жесткую матрицу разделения ответственности:

Уровень задачиКому доверятьЧто входит в скоуп
1. Полное делегирование (100% AI)ИИ-агентЧистые функции без сайд-эффектов, DTO-конвертеры, юнит-тесты пограничных условий, верстка UI-компонентов по дизайн-системе, парсеры и скрипты миграции данных.
2. Контрактное делегирование (50 / 50)Человек проектирует контракт → AI реализуетCRUD-эндпоинты, интеграции со сторонними API, фоновые воркеры очередей, логика генерации отчетов. Человек проверяет только контракты и поведение на сбоях.
3. Нулевое делегирование (Только человек)АрхитекторМодель владения данными (Data Ownership), финансовые транзакции, модель разграничения прав (RBAC/ABAC), протоколы согласованности в распределенных системах, архитектура безопасности.

Если вы отдаете пункты из третьей категории на откуп автогенерации — вы больше не инженер. Вы просто пассажир в машине, у которой отказали тормоза.


Главный вывод: Настоящая роль инженера

Индустрия программного обеспечения проходит через болезненный, но неизбежный этап взросления.

На протяжении сорока лет мы романтизировали сам процесс набора кода. Мы спорили о пробелах и табах, мерялись знанием редких конструкций компилятора и гордились тем, сколько часов потратили на отладку глупой опечатки.

Теперь эта эпоха закончилась.

ИИ может быть потрясающим, феноменально быстрым и неутомимым программистом. Но он никогда не станет владельцем результата.

  • ИИ не несет ответственности перед бизнесом, когда в Черную Пятницу база данных ложится под наплывом покупателей.
  • ИИ не сидит на ночном созвоне с инцидент-менеджерами, когда обнаруживается утечка пользовательских данных.
  • ИИ не видит общую картину через год и два года развития компании.

За систему всегда отвечает человек.

И чем больше кода вокруг нас способна генерировать машина, тем выше ценится инженер, который способен подняться над синтаксисом, увидеть архитектурный каркас и сказать:
«Этот код мы выкидываем. Мы построим систему иначе».


Серия статей об инженерном мышлении в эпоху AI:

  1. Код стал дешёвым. Инженерное мышление — нет
  2. AI любит прямые дороги: почему локальная оптимизация рушит сложные системы
  3. Архитектор будущего: от построчного ревью к Design Review (эта статья)