Как писать код, удобный для агентов
Агенты усиливают паттерны — хорошие и плохие. Чистый код порождает ещё больше чистого кода. Разбросанная логика порождает ещё больше разбросанной логики. Исследования это подтверждают: код, сгенерированный ИИ, содержит в 8 раз больше дублирующихся блоков, чем код, написанный человеком1. Агенты не создают дублирование — они усиливают существующие паттерны, которые видят при исследовании кода.
Важная оговорка: даже при идеальных паттернах агенты остаются стохастическими системами: генерация токенов LLM вероятностна, а не детерминирована. Выдумки, галлюцинации и малозаметные ошибки возникают случайно независимо от качества паттернов. Состояния с высокой энтропией — сложные рефакторинги, сквозные изменения — повышают вероятность ошибок. Твоя задача не в том, чтобы предотвратить все ошибки — для вероятностных систем это невозможно, — а в том, чтобы активно отсеивать ошибки во время ревью, не давая им войти в цикл накопления.
Каждый фрагмент кода, который ты принимаешь сегодня, завтра становится контекстом образцов для агентов. Это создаёт экспоненциальные кривые качества — восходящие или нисходящие. Направление контролируешь ты.
Механизм накопления
Во время исследования кода агенты ищут паттерны через grep, читают реализации и загружают примеры в контекст. Найденный код становится контекстом образцов для генерации.
Код, удобный для агентов
Качество накапливается через кодовую базу
Два источника ухудшения качества
При работе с ИИ качество кода ухудшается двумя принципиально разными способами:
1. Эффект копировального аппарата (предсказуемое усиление)
Агенты находят существующий код и используют его как пример. Если в твоей кодовой базе есть дублирование, агент усваивает «здесь принято делать так» и создаёт ещё больше дублирования. Если в похожих файлах нет тестов, агент генерирует код без тестов. Если ошибки обрабатываются непоследовательно, агент воспроизводит непоследовательную обработку.
Это предсказуемо: покажи агенту беспорядочные паттерны — получишь беспорядочный код. Агент не проявляет творчество, а сопоставляет с образцами то, что уже существует.
2. Бросок кубика (случайные ошибки ИИ)
LLM — вероятностные системы: они генерируют код через взвешенную случайность, а не логические рассуждения. Даже если твоя кодовая база безупречна, ИИ случайным образом создаёт ошибки:
- Выдумки: ссылается на несуществующую функцию
getUserProfile(), импортирует из файлов, которых нет - Сложность приводит к сбоям: простые задачи выполняются хорошо, но рефакторинг нескольких файлов или сложное управление состоянием повышают вероятность ошибок
- Особенности модели: разные версии моделей, ограничения контекста и паттерны внимания создают непредсказуемую вариативность
Эти случайные ошибки нельзя устранить более удачными промптами или более чистыми паттернами — они присущи самому устройству LLM.
Почему это важно:
Обе проблемы подпитывают одну и ту же экспоненциальную кривую. Когда на ревью ты принимаешь случайную ошибку ИИ, она становится паттерном для копирования. Один выдуманный вызов API в первой итерации к третьей становится шаблоном для пяти похожих галлюцинаций.
Твоя ключевая роль: ревью кода — место, где ты разрываешь цикл. Отклоняй плохие паттерны, прежде чем они размножатся. Отклоняй случайные ошибки, прежде чем они станут паттернами. Каждое решение о принятии влияет на все будущие генерации.
Главное
- Агенты усиливают паттерны И создают стохастические ошибки — хорошие паттерны накапливаются в более качественный код. Плохие — в технический долг. Даже при идеальных паттернах LLM создают вероятностные ошибки, которые накапливаются, если их принимать. Каждый принятый PR становится контекстом образцов для будущих агентов.
- Ты прерываешь цепь ухудшения качества — ревью кода предотвращает накопление негативных эффектов. Принимая плохие паттерны, ты допускаешь их в контекст образцов будущих агентов. Отклоняя их, разрываешь негативный цикл обратной связи.