Привет, Хабр! Меня зовут Анатолий Овчинников, я продакт-менеджер PRO-сервисов платформы Insight (ИТ-холдинг LANSOFT). Отвечаю за архитектуру продуктов, которые живут в проде годами и переживают не один состав команды. ИИ мы используем каждый день — поэтому его эффекты я вижу не на демо, а на дистанции в месяцы, когда к коду возвращаются. Три месяца назад я заметил неприятную закономерность в бэклоге: все чаще туда попадали мелкие фиксы вокруг кода, который до этого писал ИИ. Не аварии, не падения прода, не критичные инциденты — обычные доработки, которые на первый взгляд не выглядели тревожно. Сам код тоже не был плохим: аккуратная структура, нормальные имена, тесты, местами удачные абстракции. Такой PR сложно развернуть на ревью просто потому, что «что-то не нравится»: формально он выглядит как результат нормальной инженерной работы.

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

Что такое comprehension debt

В марте 2026 года Addy Osmani описал эту проблему как comprehension debt — долг понимания. Это разрыв между кодом, который уже живет в системе, и кодом, который команда действительно понимает: почему решение устроено именно так, какие компромиссы в него заложены, какие сценарии оно покрывает и где проходят его границы. Важно не то, видел ли кто-то этот файл на ревью, а сможет ли команда безопасно изменить его через месяц или год.

От обычного технического долга comprehension debt отличается тем, что он хуже заметен. Технический долг часто выдает себя сам: запутанными зависимостями, дублированием, хрупкими тестами, медленной сборкой или модулем, к которому никто не хочет прикасаться. Долг понимания может прятаться в аккуратном коде: структура есть, тесты зеленые, ревью пройдено, но команда умеет воспроизвести поведение лучше, чем объяснить его причины. В AI-assisted разработке это особенно опасно: в репозиторий попадает не просто код, а решение, которое команда еще не успела присвоить инженерно.

Почему ИИ-код быстрее создает долг понимания

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

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

Современные инструменты умеют читать файлы проекта, учитывать инструкции, работать с длинным контекстом и опираться на документацию. Это повышает качество результата, но не заменяет инженерную память команды. Если локальные договоренности, исторические ограничения и причины прошлых решений не зафиксированы явно, модель заполнит пробелы сама — правдоподобно, но не обязательно правильно. Поэтому долг понимания возникает не из-за самого факта генерации, а в тот момент, когда команда принимает результат быстрее, чем успевает разобраться в его логике.

Данные: это не личная паранойя, а системный эффект

Можно было бы списать это на локальный опыт: конкретная команда, конкретный стек, конкретный способ работы с ИИ. Но похожие сигналы уже видны в больших выборках. Они не сводятся к простому выводу «ИИ пишет плохой код». Картина интереснее: ИИ-инструменты действительно ускоряют производство кода, но вместе с этим растет нагрузка на сопровождение, ревью и последующее исправление.

GitClear в отчете по качеству AI-assisted кода анализировал 211 млн измененных строк за 2020–2024 годы. В выборке заметен сдвиг в сторону менее поддерживаемых изменений: доля строк, связанных с рефакторингом (в терминологии GitClear — «перемещенный» код), снизилась с 25% в 2021 году до менее 10% в 2024-м, а доля copy/paste-кода выросла с 8,3% до 12,3%. В более раннем отчете GitClear по 153 млн измененных строк за 2020–2023 годы отдельно фиксировался рост code churn — строк, которые откатывают или существенно меняют в течение двух недель после появления.

Это важный сигнал именно для темы comprehension debt. Проблема не только в том, что в проект попадает больше кода. Проблема в том, что больше кода начинает вести себя как временный: его быстрее добавляют, быстрее переписывают, чаще дублируют и реже перерабатывают в устойчивую структуру. Для команды это означает не просто рост объема репозитория, а рост объема решений, которые нужно потом заново читать, объяснять и приводить к общей архитектурной картине.

Есть и более прямые исследования ИИ-коммитов в реальных репозиториях. В работе Debt Behind the AI Boom авторы собрали 304 362 подтвержденных AI-authored коммита из 6 275 GitHub-репозиториев и отслеживали, какие проблемы вносят такие изменения: code smells, correctness issues и security issues. По их данным, более 15% коммитов от каждого из пяти рассмотренных ИИ-инструментов вносили хотя бы одну проблему, а 24,2% отслеженных AI-introduced issues доживали до последней ревизии репозитория. То есть часть долга не рассасывается сразу после merge, а остается жить в кодовой базе.

Отдельно стоит посмотреть на то, кто платит за этот долг. Исследование влияния GitHub Copilot на OSS-проекты показывает неприятный перекос: общий рост продуктивности в основном возникает за счет менее опытных или периферийных разработчиков, но дополнительная нагрузка по ревью и переделке ложится на core-разработчиков. После внедрения Copilot они ревьюят на 6,5% больше кода, при этом их собственная продуктивность по написанию оригинального кода падает на 19%.

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

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

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

Особенно наглядно эта проблема проявилась не в рабочем проекте, а в игре, которую мы делали вместе с ребенком. Я показывал сыну, как формулировать задачи для ИИ в рамках школьного проекта. Он придумал зомби, 13 этажей, Короля-скелета, королевский рубин и золотой сундук, а я помог превратить все это в более-менее связное описание задачи. После того как мы передали его ИИ, получили вполне внятную архитектуру: с отдельными системами, генерацией уровней, логикой врагов, предметами и тестами.

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

Баг «зомби сквозь стены»: две правильные части

Часть А — коллайдер стен

GameScene.js, метод _buildFloor, строки 116–122:

} else {

// Физическое тело только у стен вплотную к проходимым тайлам.

// Стены внутри массивов стен игрок никогда не достигнет — тела не нужны.

if (this._isBorderWall(x, y, walkable)) {

this.wallGroup.create(px, py, 'wall'); // Коллайдер есть

} else {

this.add.image(px, py, 'wall'); // Коллайдера нет, только изображение

}

}

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

Логика в комментарии тоже кажется убедительной: игрок до внутренних стен никогда не доберется. Для игрока это действительно так.

Часть Б — движение зомби

Zombie.js, метод _scheduleMove, строки 30–45:

const tx = Math.round(this.sprite.x / TILE_SIZE);

const ty = Math.round(this.sprite.y / TILE_SIZE);

const openDirs = DIRS.filter(

d => walkable.has(${tx + d.x},${ty + d.y})

);

// Выбор направления движения

const d = pool[Math.floor(Math.random() * pool.length)];

this.sprite.setVelocity(

d.x * ZOMBIE_SPEED,

d.y * ZOMBIE_SPEED

);
// Следующие 600–1200 мс никто не проверяет,
// где зомби находится на самом деле

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

Почему ревью не всегда спасает

Кажется, что проблему непонятного ИИ-кода должно решать обычное ревью: внимательнее смотреть PR, запускать тесты и задавать больше вопросов. Но классическое ревью прежде всего проверяет корректность изменения: соответствует ли код задаче, проходят ли тесты, нет ли явных проблем со стилем, безопасностью, производительностью или сложностью.

Для разработки с ИИ этого недостаточно. Код может быть аккуратно разложен по файлам, покрыт тестами и не вызывать подозрений, но при этом оставаться решением, логику которого команда не сможет уверенно восстановить через несколько месяцев.

Поэтому на ревью ИИ-кода важно проверять не только diff, но и причины принятых решений. Автор PR должен уметь объяснить, почему выбран именно этот подход, какие альтернативы рассматривались, какие предположения заложены в реализацию и где проходят ее границы. Если смысл изменения нельзя пересказать без истории промптов, текущей сессии с моделью или долгого восстановления контекста, значит, команда еще не приняла это решение инженерно — она лишь добавила его в репозиторий.

На ревью AI-generated и AI-assisted изменений стоит отдельно спросить

  • Почему выбран именно этот подход?

  • Какие альтернативы рассматривались и почему не подошли?

  • Какие предположения в коде не зафиксированы явно?

  • Где проходят границы применимости решения?

  • Что произойдет при частичном отказе соседней системы?

  • Как изменится поведение при росте нагрузки или объема данных?

  • Тесты проверяют контракт поведения или только текущую реализацию?

  • Сможет ли другой разработчик изменить этот код через полгода, не восстанавливая всю историю с нуля?

Практики: как работать с AI-кодом и не терять контроль

Из этого опыта у меня сложилось главное правило: нетривиальную задачу нельзя начинать с просьбы «напиши код». Сначала нужно разобрать решение: какие есть архитектурные варианты, какие ограничения важны, какие части системы затрагиваются, где возможны edge cases, что будет при росте нагрузки и частичных отказах. На этом этапе модель полезна не как исполнитель, а как собеседник: она может предложить альтернативы, подсветить риски и задать вопросы, которые команда могла пропустить. Хороший первый запрос звучит не «сгенерируй сервис», а «разбери подходы, покажи плюсы, риски и ситуации, где каждый вариант лучше не использовать; код пока не пиши».

Вторая практика — фиксировать требования до генерации. Это не обязательно должна быть тяжелая спецификация, но в задаче или PR стоит явно указать цель изменения, ограничения текущей архитектуры, сценарии, которые нельзя сломать, известные edge cases, требования к производительности и безопасности, а также части системы, которые нельзя менять без отдельного обсуждения. Иначе модель все равно заполнит пустоты сама: достроит недостающий контекст из похожих задач и вернет правдоподобное решение. Иногда удачное, иногда нет. Но в обоих случаях команда может не заметить, где заканчивается исходное требование и начинается догадка ИИ.

ИИ-код должен быть объяснен, задокументирован и проверен на стыках

Для AI-assisted изменений у нас есть жесткое правило: если автор PR не может словами объяснить сгенерированный код, его нельзя мержить. Речь не о том, чтобы помнить каждую строку, а о понимании решения: какую задачу оно закрывает, почему выбран именно этот подход, какие предположения заложены внутрь, что покрыто тестами, и где поведение может сломаться. Если на эти вопросы нет ответа, код уже может быть в репозитории, но еще не стал частью инженерной картины проекта.

Для нетривиальных изменений это стоит фиксировать прямо в пулл реквесте или рядом с кодом. Не в формате большой документации, а коротко: почему решение устроено так, какие ограничения были важны, какие риски остаются, какие сценарии проверены, и что нужно знать будущему разработчику. Особенно важно записывать причины решений, которые выглядят неочевидно: почему здесь не используется кэш, почему обработка сделана синхронно, почему условие проверяется до вызова внешнего сервиса, почему тест фиксирует именно такой контракт. ИИ-код часто оставляет после себя аккуратную реализацию, но не оставляет историю выбора. Если ее не зафиксировать, через несколько месяцев команда будет восстанавливать не только логику, но и мотивы.

Отдельно нужно проверять не только компоненты, но и стыки между ними. История с игрой показала именно это: коллайдер был, проверка тайлов была, но ошибка возникла на границе двух подсистем. В продуктовой разработке такие границы встречаются постоянно: кэш и источник данных, очередь и обработчик, API и ретраи, новая логика и старые клиенты. Хороший тест проверяет не то, вызывает ли функция нужный метод, а сохраняется ли обещанное поведение, когда соседняя часть системы ведет себя неидеально.

Как понять, что у команды накапливается долг понимания

Долг понимания сложно заметить напрямую. Код может выглядеть аккуратно, тесты — проходить, а ревью — не вызывать вопросов. Поэтому смотреть стоит не на сам факт использования ИИ, а на косвенные признаки того, что команда постепенно теряет владение решением.

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

Когда обсуждаете код:

  • На вопрос «Почему решение устроено именно так?» автор отвечает не причиной, а историей генерации: «так предложила модель» или «так получилось».

  • Чтобы объяснить решение, приходится открывать историю чата с ИИ, а не код или документацию. Объяснение существует вне репозитория.

  • На вопрос «Почему?» отвечают пересказом того, что делает код. Именно разницу между «что» и «почему» важно отслеживать.

Когда меняете код:

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

  • Некоторые участки никто не решается менять «по-быстрому»: любое изменение начинается с полного восстановления контекста.

  • Все чаще звучит фраза «проще переписать, чем разобраться» — хотя коду всего несколько недель или месяцев.

Когда что-то ломается:

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

  • Исправление устраняет симптом, но никто в команде не может объяснить, почему проблема вообще возникла.

Самые тихие сигналы:

  • Тесты проходят, но команда не может ответить, какое поведение они гарантируют. Они фиксируют текущую реализацию, а не контракт.

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

  • Комментарии объясняют, что делает код, но нигде не зафиксировано, почему решение принято именно таким.

  • Код читается легко, но ощущения владения им не возникает. Глаз чешется, а показать пальцем не на что.

Именно так чаще всего и ощущается долг понимания — задолго до того, как он проявится в серьезном инциденте.

Важно не превращать это в охоту на ведьм*перечеркнуто ИИ-код: ручной код тоже может быть непонятым. Разница в скорости. ИИ позволяет быстрее добавлять решения в репозиторий, поэтому команде нужны более явные способы проверять, что вместе с кодом в проект попало и понимание.

Вывод

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

Поэтому AI-код опасен не тогда, когда сразу ломается. Сломанный код быстро показывает, что с ним нужно разобраться. Гораздо опаснее код, который выглядит достаточно хорошо, чтобы попасть в прод, но остается недостаточно понятым, чтобы команда могла спокойно его менять. Главный вопрос уже не в том, может ли модель написать рабочую реализацию. Может. Вопрос в том, успеваем ли мы превратить эту реализацию в часть инженерной картины проекта: понять ее границы, зафиксировать причины решений и взять ответственность за то, что теперь живет в системе.

В проде живет не промпт, не чат с моделью и не красивая генерация. В проде живет решение. И отвечать за него все равно будет команда.

Комментарии (5)


  1. mist56
    25.08.2026 12:23

    >GitClear в отчете по качеству AI-assisted кода анализировал 211 млн измененных строк за 2020–2024 годы.

    Не, ну серьёзно?


    1. C4etovod Автор
      25.08.2026 12:23

      Справедливо, и претензия по адресу. Слабое место у GitClear не в объеме, а в атрибуции: они не размечают авторство строк и не отделяют AI-код от написанного руками. Там временной ряд 2020–2024 по их собственной классификации изменений плюс допущение, что тренд совпал с распространением ассистентов. Выборка тоже не отраслевая: две трети это компании-клиенты сервиса, подключившиеся добровольно, треть - пара десятков крупных опенсорсов, где один Chromium способен перевесить остальных по объему.

      Тезис статьи на GitClear и не держится, он там для описания направления. Прямая эмпирика идет следующим абзацем: 302 тысячи коммитов с подтвержденным AI-авторством, статический анализ до и после каждого изменения, отслеживание каждой внесенной проблемы до последней ревизии. А сам долг понимания метрикой из гита в принципе не ловится: он живет не в коде, а в  головах команды. Обнаруживается в два часа ночи, когда дежурный видит, где упало, но не может сказать, почему оно вообще так устроено.


      1. mist56
        25.08.2026 12:23

        Думаю уже даже скептикам очевидно, что современные модели, а главное - агентская разработка, о которой серьёзно можно говорить только с декабря 2025ого, и "AI" тех времён - малость разные AI, что бы притягивать за уши те лохматые годы.

        > Обнаруживается в два часа ночи, когда дежурный видит, где упало, но не может сказать, почему оно вообще так устроено.

        Задача дежурного - найти ответственного, а не знать всю кодовую базу большого отдела. Такое и доИИшные врема с людей требовать было странно. А ИИшка по логам очень часто быстрее людей "поймёт", что происходит и из-за чего проблема. Главное, что бы эти логи и аналитика была, что задача инженера ТЗ сформулировать.


  1. scrllock
    25.08.2026 12:23

    Тут возникает проблема с измерением производительности.

    Если код теперь пишется в два раза быстрее, а его ревью, понимание и сопровождение требуют больше времени, то скорость написания кода перестает что-либо говорить о скорости разработки.

    К слову, в твиттере как раз был пост вчера, о том, что ИИ-облако упало и пользователь не смог выполнить деплой на сайт, потому что не помнил как организованы деплой-скрипты. :-)


    1. mist56
      25.08.2026 12:23

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