ИИ-агент — не программист: пять наблюдений и три следствия

ИИ-агент — не программист: пять наблюдений и три следствия

Вторая статья из цикла о разработке с ИИ-агентами. Рассказывает, чем агент принципиально отличается от человека и какие последствия это влечёт для инженерного процесса.

Случай, после которого всё стало понятно

Задача: создать архитектурную документацию по легаси-системе на Java. Код — 15 лет разработки, 17 модулей, никакой актуальной документации. Агент справился блестяще: выдал структурированное описание модулей, зависимостей, интерфейсов. Казалось — идеально.

Но когда документ прочитал инженер, который писал этот код десять лет назад, выяснилось: в нескольких местах агент не распознал костыли. В частности, прокси-слой между сервисами, оставшийся после миграции на очереди сообщений, был описан как штатная архитектура. Агент не просто ошибся — он придумал логичное объяснение, зачем это нужно и как работает. Уверенно, детально, неправильно.

В этом суть. Агент отлично видит то, что есть в коде. Но там, где код содержит исторические костыли, он не распознаёт их как таковые. Вместо этого он строит правдоподобную логику, будто всё задумано именно так. Без пометок «это предположение» или «требует проверки».

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

Работа была качественной. Но именно это и показало главную проблему: чем лучше агент в среднем, тем сложнее заметить, где он ошибся.

Другой исполнитель: пять наблюдений

У агента нет прошлого проекта

Программист живёт в контексте проекта. Он помнит, что в марте чинили баг с дублями, и это влияет на его решения. Агент работает только с тем, что получил сейчас. Историю решений не передали — её для него не существует.

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

На новых или незнакомых проектах это особенно опасно: собственного фильтра нет, а доверие к результату — завышенное.

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

Агент исполняет задачу буквально

Задача: «при конфликте синхронизации показывать диалог выбора версии». Программист задал бы уточняющие вопросы: а если изменены несколько полей? А если нет сети? Агент молча генерирует компонент для одного поля — аккуратный, чистый, проходящий тесты.

В бою он ломается: при конфликте по трём полям показывает только первый, остальные теряет.

Программист видит реальный мир. У агента есть только текст задачи.

Можно добавить в промпт: «при неоднозначности спрашивай». Но и тогда агент спросит только в половине случаев.

Поэтому теперь я требую: задача не берётся, пока не определены цель, критерии приёмки и хотя бы один негативный сценарий. В стандарте SENAR это — шлюз качества на входе. Звучит бюрократично, но закрывает пространство для додумывания.

Одна ошибка агента — это несколько ошибок сразу

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

У человека ошибка локализована. У агента — распространяется. Он копирует неверный паттерн во все подходящие файлы.

Вывод: если агент генерирует серию похожих модулей, ошибка в одном почти наверняка есть в других. Проверять один и считать остальные такими же — ловушка. Лучше проверять выборочно.

Агент не видит архитектуры за горизонтом задачи

Задача: реализовать поиск. Агент сделал прямой запрос из обработчика в хранилище — проще, быстрее. Но в перспективе это ведёт к разрастанию кода: кэширование, ранжирование, A/B-тесты моделей — всё ляжет прямо в обработчик.

Я выбрал сервисный слой — с учётом будущих потребностей. Но агент не знал моих планов, потому что я их не описал.

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

Агент не живёт с последствиями

Агент сгенерировал миграцию, где каскадное удаление пользователя приводило к удалению всех его отчётов и фотографий. Ни один тест это не поймал. Проблему заметили только при ручной проверке.

Программист живёт с кодом. Он знает: то, что он закоммитит, вернётся к нему через месяц. Агент проходит мимо. Каждая новая задача — чистый лист.

Код на выходе и код на входе следующей задачи для него не связаны. Без внешнего контроля долг копится незаметно.

Следствие: ответственность за результат остаётся на человеке. Полностью. На каждом этапе.

Когнитивный долг: код работает, но никто не знает как

Технический долг — код работает, но менять его дорого. Когнитивный долг — код работает, но человек не понимает, как. Причём код может быть отличным. Проблема в том, что его не писал человек, не читал построчно, не принимал решений.

При классической разработке когнитивный долг накапливается медленно: уволился разработчик, не оставил документацию. При работе с агентами он возникает сразу. Агент выдал 500 строк. Код работает, тесты проходят. Но ментальной модели нет. Спрашивать не у кого.

Пример: агент сгенерировал модуль кэширования. Через две недели нужно было добавить сброс устаревших данных. Оказалось — непонятно, какая стратегия выбрана и почему. Вместо часа на доработку ушло полдня на анализ.

Когнитивный долг опаснее технического: нельзя оценить, сколько займёт изменение. Планирование становится невозможным.

Теперь я требую от агента краткий комментарий к каждому архитектурному решению: что выбрано и почему. Две-три минуты на задачу экономят часы в будущем.

Полностью избежать когнитивного долга не удаётся. Но можно сделать его управляемым. Этому и служат три следствия.

Следствие первое: считать ручные правки отдельно

Каждая ручная правка после работы агента — сигнал. Где-то в системе дыра: задача плохо сформулирована, контекст неполный, архитектура не описана.

В методологии SENAR это — MIR (Manual Intervention Rate): доля задач, где потребовалась ручная правка. Это не баг-трекер. Это инструмент для улучшения процесса.

MIR не должен быть нулём. На зрелых проектах — 5–15%. На старте — выше. Например, на проекте Сортул в первый месяц MIR был около 20%.

Пример: три задачи с ошибками в пагинации API. Анализ MIR показал общую причину — отсутствие описания формата. Решение: добавить раздел в архитектурный контекст. После этого MIR по API-задачам упал до 5%.

Следствие второе: роль человека сдвигается

Распределение времени в день:

  • 60% — формулировка задач, сбор контекста, архитектурные решения
  • 30% — проверка результатов
  • 10% — настройка инструментов, метрики, сопровождение процесса

Ноль процентов — на написание кода. Самая заметная часть процесса (генерация кода) занимает наименьшую долю времени.

Роль человека — как у инженера по качеству: определяет допуски, проверяет результат. Проверять чужой код восемь часов тяжелее, чем писать свой. Через 4–5 часов начинаешь пропускать ошибки. Решение — сессии по 90 минут с перерывами.

Проверка — узкое место. Ни один линтер не поймает логическую ошибку в бизнес-правиле. Только человек.

Следствие третье: что не записано, для агента не существует

На Сортуле модули имели чёткие зоны ответственности — в голове у меня. В коде они могли обращаться друг к другу. Агент начал использовать внутренние функции одного модуля из другого. Архитектура сломалась. Код выглядел нормально, но связи были нарушены.

Решение — описать границы явно: что от чего зависит, что не должно использоваться. Не абстрактно, а конкретно. С объяснением, почему.

Такая документация, созданная для агента, оказалась полезной и для людей. Новый разработчик сказал: «Наконец-то проект, где не надо три дня разбираться в архитектуре. Всё написано».

О людях и границах

Вопрос: а зачем тогда программисты?

Потому что разложить сложную задачу на части может только тот, кто видел, как такие задачи разваливаются. Заметить гонку данных — только тот, кто её встречал. Предвидеть архитектурные тупики — только тот, кто их разгребал. Хорошая спецификация сложнее кода: в ней нужно предусмотреть, что может пойти не так.

Профессия не упрощается. Меняется распределение времени.

Это — опыт одного человека. Полтора года, более 30 проектов. У начинающего инженера фильтр слабее. Как он вырастет в опытного, если не будет писать код? Ответа пока нет. Возможно, через разбор чужого кода и практику проверки. Возможно, ручной этап останется обязательным на старте — как обучение математике без калькулятора.

Если унести из статьи одну мысль

Разница между программистом и агентом не в скорости. Она в том, как каждый поступает, когда чего-то не знает. Программист останавливается и спрашивает. Агент заполняет пробел сам — уверенно, детально, иногда неправильно.

Из этого различия выросли все наблюдения. Из провалов — правила. Из правил — стандарт SENAR.

Агент — не программист. А кто тогда человек рядом с ним? Чем он занят, если не пишет код? Почему ручная правка маскирует проблемы? Об этом — в следующей статье.

Читать оригинал