Код, написанный человеком, против ИИ-кода

Код, написанный человеком, против ИИ-кода

Umbrella IT

Написанный с помощью искусственного интеллекта код уже нельзя считать редкой примесью в репозитории. В исследовании 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, хардкод токенов, слабую валидацию, обход авторизации в тестовом коде, который потом уезжает дальше.
СопровождаемостьЧеловек пишет с разным качеством, но обычно понимает, кому потом поддерживать этот код и где он может сломаться.ИИ-код может выглядеть чисто на поверхности, но быть трудным для сопровождения из-за скрытых предположений, лишних обобщений и слабой связи с архитектурой проекта.
ДокументацияЧеловек часто пишет документацию сухо или не пишет ее совсем, но может зафиксировать реальные ограничения и причины решения.ИИ быстро генерирует читаемое описание, однако текст может звучать уверенно и при этом неточно отражать поведение системы. Особенно опасны комментарии, которые объясняют не фактическую логику, а предполагаемое намерение.
Роль ревьюРевью человеческого кода чаще сводится к проверке логики, стиля, тестов и соответствия задаче.Ревью ИИ-кода требует восстановления скрытой цепочки решений: откуда взялся этот подход, какие предположения модель сделала, какие части проекта она не увидела и не повторяет ли уже существующую логику.
Главный рискЧеловеческий код чаще страдает от спешки, усталости, нехватки времени на рефакторинг и локальных компромиссов.ИИ-код чаще страдает от неполного контекста, архитектурной слепоты, избыточного объема и убедительной внешней формы при слабой связи с реальной системой.

Чек-лист: как проверять ИИ-код до слияния веток

Генерируя код с помощью искусственного интеллекта, главное — помнить, что он не безупречен, даже если с виду и кажется таким. Наш небольшой чек-лист поможет досконально проверить код, прежде чем брать его в работу.

  1. Автор понимает каждую строку. Если разработчик не может объяснить, почему код устроен именно так, его нельзя принимать только потому, что он проходит тесты.
  2. Изменение не дублирует существующую логику. Перед слиянием стоит проверить, нет ли в проекте уже готового сервиса, helper, mapper, validator или правила обработки такого сценария.
  3. Код попал в правильный слой. Бизнес-логика не должна внезапно появляться в контроллере, инфраструктурный код — в доменной модели, а интеграционная логика — расползаться по UI или API-слою.
  4. Абстракция оправдана задачей. Новый интерфейс, фабрика, adapter или универсальный helper нужны только там, где есть реальная точка расширения. ИИ часто добавляет архитектуру «на вырост», которая начинает мешать уже сейчас.
  5. Ошибки обрабатываются по правилам проекта. Нужно проверить, что код не гасит исключения молча, не возвращает null вместо явного сценария, не теряет контекст ошибки и не логирует чувствительные данные.
  6. Тесты проверяют поведение, а не реализацию. Хороший тест фиксирует контракт, граничные значения, ошибки, пустые ответы, таймауты и деградацию внешних сервисов. Слабый тест просто повторяет структуру сгенерированного кода.
  7. Моки не скрывают проблему. Если тест замокал почти все внутренние вызовы, он может подтверждать только то, что мок настроен правильно. Для критичных сценариев нужны интеграционные проверки.
  8. Изменение не увеличивает связность без причины. Стоит смотреть, сколько модулей затронуто, какие зависимости появились и не стало ли одно изменение тянуть за собой слишком много соседних участков.
  9. Документация совпадает с поведением кода. Комментарии и README, сгенерированные ИИ, нужно читать так же внимательно, как сам код: гладкая формулировка не гарантирует точность.
  10. Размер PR позволяет провести нормальное ревью. Большой pull request, сгенерированный ИИ, лучше разбить. Если ревьюер не может быстро понять смысл изменения, проблема уже не в ревьюере.
  11. Ответственность остается у разработчика. Модель может быть автором черновика, но владельцем решения остается человек. Именно он отвечает за архитектурные последствия, безопасность, тесты и дальнейшую поддержку.

Подытожим

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

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

Есть задача? Поможем решить.

Содержание