
Код, написанный человеком, против ИИ-кода
Написанный с помощью искусственного интеллекта код уже нельзя считать редкой примесью в репозитории. В исследовании Debt Behind the AI Boom авторы изучили 304 362 подтвержденных коммита с ИИ-кодом из 6 275 GitHub-репозиториев и нашли 484 606 проблем, внесенных им.
89,1% из них оказались признаками ухудшения сопровождаемости, а 24,2% сохранились до последней версии репозитория. Это важный сигнал: сгенерированный код может пройти ревью, попасть в основную ветку и остаться в системе надолго.
Из этого не следует, что вариант, созданный человеком, по умолчанию качественнее. Люди тоже пишут временные решения, плодят дубли, забывают про тесты и нарушают архитектурные границы. Но типовые слабые места у сотрудника и модели выявляются разные — выясняем, какие именно.
Код человека и код модели: сравнительная таблица
ИНЖЕНЕРНЫЙ АСПЕКТ | КОД, НАПИСАННЫЙ ЧЕЛОВЕКОМ | ИИ-КОД |
| Понимание контекста | Разработчик знает историю задачи, ограничения продукта, внутренние договоренности команды и причины старых архитектурных решений. Даже спорное решение часто связано с конкретным компромиссом. | Модель опирается на переданный контекст. Если в промпте или репозитории нет правил проекта, она достраивает решение по общим паттернам и может не учитывать локальную историю системы. |
| Скорость появления | Человек пишет медленнее, особенно если нужно разобраться в доменной логике, зависимостях и старом коде. Зато часть проверки происходит уже в голове во время работы. | ИИ быстро выдает готовый фрагмент, тест, миграцию, адаптер или обработчик. Скорость генерации высокая, но время может вернуться на этапе проверки и исправлений. |
| Архитектурная связность | Разработчик чаще видит, куда изменение ложится в системе: в доменный слой, инфраструктуру, API, интеграцию или UI. Ошибки все равно бывают, но они чаще обсуждаются как инженерный выбор. | ИИ может написать локально правильный код, который плохо ложится в архитектуру: добавить бизнес-логику в контроллер, обойти существующий сервис, создать новый helper вместо использования старого. |
| Работа с существующими паттернами | Человек обычно помнит, как в проекте принято логировать ошибки, валидировать данные, работать с ретраями, транзакциями, моками и DTO. | Модель может смешать несколько подходов: часть кода написать в стиле проекта, часть — в стиле обучающей выборки. В результате появляются «почти правильные» участки, которые сложно заметить при беглом ревью. |
| Дублирование | Человек может не найти готовую функцию или сознательно продублировать логику из-за сроков. Обычно такой долг хотя бы понятен команде. | ИИ легко генерирует похожую реализацию рядом с уже существующей. Отличия могут быть мелкими, но со временем они расходятся в поведении. |
| Абстракции | Разработчик чаще чувствует, где достаточно прямого решения, а где нужна точка расширения. У опытных инженеров это часть профессиональной интуиции. | Модель может переусложнить простую задачу: добавить фабрику, универсальный интерфейс, лишний слой конфигурации или набор мелких классов. Бывает и обратное: вместо существующего расширяемого механизма появляется новая if-ветка в старом методе. |
| Обработка ошибок | Человек лучше понимает, какие ошибки критичны для бизнеса, где нужно повторить действие, где откат, где логирование, а где жесткий отказ. | ИИ часто пишет обработку ошибок формально: ловит общий exception, возвращает null, гасит сбой или добавляет лог без понятного сценария восстановления. |
| Тесты | Человеческие тесты могут быть неполными, но опытный разработчик чаще проверяет поведение, контракты и граничные случаи. | ИИ быстро генерирует тесты, но часто проверяет happy path, повторяет текущую реализацию и плотно мокает внутренности. Покрытие растет, а защита от регрессии может почти не измениться. |
| Безопасность | Разработчик может учитывать внутренние политики, чувствительность данных, права доступа, особенности инфраструктуры и прошлые инциденты. | Модель может предложить рабочее, но рискованное решение: лишнее логирование данных, небезопасную обработку input, хардкод токенов, слабую валидацию, обход авторизации в тестовом коде, который потом уезжает дальше. |
| Сопровождаемость | Человек пишет с разным качеством, но обычно понимает, кому потом поддерживать этот код и где он может сломаться. | ИИ-код может выглядеть чисто на поверхности, но быть трудным для сопровождения из-за скрытых предположений, лишних обобщений и слабой связи с архитектурой проекта. |
| Документация | Человек часто пишет документацию сухо или не пишет ее совсем, но может зафиксировать реальные ограничения и причины решения. | ИИ быстро генерирует читаемое описание, однако текст может звучать уверенно и при этом неточно отражать поведение системы. Особенно опасны комментарии, которые объясняют не фактическую логику, а предполагаемое намерение. |
| Роль ревью | Ревью человеческого кода чаще сводится к проверке логики, стиля, тестов и соответствия задаче. | Ревью ИИ-кода требует восстановления скрытой цепочки решений: откуда взялся этот подход, какие предположения модель сделала, какие части проекта она не увидела и не повторяет ли уже существующую логику. |
| Главный риск | Человеческий код чаще страдает от спешки, усталости, нехватки времени на рефакторинг и локальных компромиссов. | ИИ-код чаще страдает от неполного контекста, архитектурной слепоты, избыточного объема и убедительной внешней формы при слабой связи с реальной системой. |
Чек-лист: как проверять ИИ-код до слияния веток
Генерируя код с помощью искусственного интеллекта, главное — помнить, что он не безупречен, даже если с виду и кажется таким. Наш небольшой чек-лист поможет досконально проверить код, прежде чем брать его в работу.
- Автор понимает каждую строку. Если разработчик не может объяснить, почему код устроен именно так, его нельзя принимать только потому, что он проходит тесты.
- Изменение не дублирует существующую логику. Перед слиянием стоит проверить, нет ли в проекте уже готового сервиса, helper, mapper, validator или правила обработки такого сценария.
- Код попал в правильный слой. Бизнес-логика не должна внезапно появляться в контроллере, инфраструктурный код — в доменной модели, а интеграционная логика — расползаться по UI или API-слою.
- Абстракция оправдана задачей. Новый интерфейс, фабрика, adapter или универсальный helper нужны только там, где есть реальная точка расширения. ИИ часто добавляет архитектуру «на вырост», которая начинает мешать уже сейчас.
- Ошибки обрабатываются по правилам проекта. Нужно проверить, что код не гасит исключения молча, не возвращает null вместо явного сценария, не теряет контекст ошибки и не логирует чувствительные данные.
- Тесты проверяют поведение, а не реализацию. Хороший тест фиксирует контракт, граничные значения, ошибки, пустые ответы, таймауты и деградацию внешних сервисов. Слабый тест просто повторяет структуру сгенерированного кода.
- Моки не скрывают проблему. Если тест замокал почти все внутренние вызовы, он может подтверждать только то, что мок настроен правильно. Для критичных сценариев нужны интеграционные проверки.
- Изменение не увеличивает связность без причины. Стоит смотреть, сколько модулей затронуто, какие зависимости появились и не стало ли одно изменение тянуть за собой слишком много соседних участков.
- Документация совпадает с поведением кода. Комментарии и README, сгенерированные ИИ, нужно читать так же внимательно, как сам код: гладкая формулировка не гарантирует точность.
- Размер PR позволяет провести нормальное ревью. Большой pull request, сгенерированный ИИ, лучше разбить. Если ревьюер не может быстро понять смысл изменения, проблема уже не в ревьюере.
- Ответственность остается у разработчика. Модель может быть автором черновика, но владельцем решения остается человек. Именно он отвечает за архитектурные последствия, безопасность, тесты и дальнейшую поддержку.
Подытожим
Код, сгенерированный искусственным интеллектом, совсем не обязательно хуже человеческого. Его риск в том, что он часто выглядит готовым раньше, чем становится понятным для команды. Поэтому важно проверять архитектурную связность, качество тестов, обработку ошибок, дублирование логики и будущую стоимость сопровождения — анализа одной только работоспособности недостаточно.
Если команда принимает ИИ-код по тем же правилам, что быстрый черновик от junior-разработчика, долг будет копиться незаметно. Если проверяет его как полноценное инженерное решение, ИИ становится полезным ускорителем.
Есть задача? Поможем решить.





