
О проблемах с ИИ-кодингом на Хабре написано уже много. Но хочется перейти к конструктивному подходу: да, наломать дров с ИИ легко, а вот как работать с ним наиболее профессионально?
Известные разработчики вроде Митчелла Хашимото (создателя Terraform и Ghostty) всё чаще говорят вещи в духе «вот тут уже ни строчки кода не написал вручную». При этом Хашимото — противник слопа, и он подчёркивает, что добился от ИИ качественного кода. А что помогает добиваться?
Мы в проекте Kodik подобные вопросы ощущаем особенно остро, потому что в редакторе кода с ИИ делаем… собственно, сам этот редактор кода с ИИ. Так что для нас все проблемы ИИ-кодинга особенно наглядны, а их решения — особенно важны.
Поэтому мы собрали вместе идеи и из опыта мировой IT-индустрии, и из нашего собственного. Это не какая-то «окончательная истина»: сейчас вся планета только разбирается, ни у кого ещё нет полных ответов, и полезно обмениваться опытом. Так что смело дополняйте в комментариях: интересно узнать, что помогает вам, и собрать «общехабровую кладезь знаний». А если захочется конструктивно возразить, такие обсуждения тоже полезны.
Перечисленные дальше варианты — это полезные практики, но не «серебряные пули», магически создающие идеальный проект. И самое важное в этом списке — не какой-то «тайный промпт», а последние пункты, которые и до ИИ всегда были главными:
Оглавление
TDD
SDD
Экономия контекста и токенов при чтениях
Выбор стека: типизация и «стандартизация»
Подход к Git
Риск-менеджмент
Понимание ИИ
Понимание программирования
Обучение программированию
TDD
Как бороться с ошибками ненадёжной машины? С ходу напрашивается вариант «с помощью тестов» (они не дают полной гарантии, но с ними явно лучше). А дальше начинаются интересные уточнения: например, можно ли поручать машине тесты, проверяющие код от неё же?
В подобных случаях возникает проблема «reward hacking». ИИ-модели неплохо натренированы на то, что нужно «достигать результата»… но могут понимать это как «любой ценой». И если модель знает, что тесты должны проходить, может «срезать углы». Захардкодить что-то или даже удалить — лишь бы избежать «тест упал». В общем, буквально воплощает старый мем:

Мы встречали подобное в своей практике. Однажды при сочинении юнит-тестов для функции модель попросту использовала как «источник истины» саму реализацию, а не бизнес-логику. При этом в коде оказалась ошибка, вызванная погрешностью floating-point арифметики. И тесты просто закрепили это неправильное поведение: они проверяли не правильность, а повторяемость бага.
Заметив это, у нас в команде исправили ошибку и добавили property-based тесты, которые проверяют инварианты, а не конкретный результат. Но что делать, чтобы таких ситуаций и не возникало?
Задолго до ИИ-кодинга возник подход TDD: «Сначала писать тесты, а уже потом код, который они проверяют». Кент Бек и Роберт «Uncle Bob» Мартин пропагандируют его уже десятилетиями. А что, если применить его здесь, чтобы машина не могла перенести в тесты ошибку из реализации?
Использовать TDD с ИИ действительно стали — и многие нашли это очень полезным. Тот же «Дядюшка Боб» сейчас разбирается, как именно это эффективнее делать. А Саймон Уиллисон (создатель фреймворка Django) уточняет, что полезен «красно-зелёный TDD» — то есть стоит не просто «сначала написать все тесты», а действовать по такому циклу:
Новый тест сначала должен падать (иначе что он проверяет?)
Затем требуется сделать минимальное изменение кода, чтобы тест начал проходить.
А дальше надо рефакторить, превращая код из «просто срабатывающего» в «полноценный».
Это может ощущаться нудным: «Мне надо сначала писать “плохой код” без рефакторинга? А можно сразу хороший напишу?» Но хорошая новость в том, что у ИИ-модели нет ощущения «нудно», и она в целом понимает «use Red/Green TDD», так что возможно привлекать здесь её.
Наш опыт показал, что с reward hacking возможно столкнуться даже при TDD, но от этого возможно защититься.
История выглядела так: сначала написали тесты, один из которых явно задавал правило «неделя начинается в понедельник». После этого попросили AI реализовать функцию next_business_weekday(start_date). Один тест не прошёл: реализация исходила из предположения, что неделя начинается с воскресенья. И тогда вместо того, чтобы исправить код и привести его в соответствие с нашей спецификацией, ИИ взял… и тихо изменил сам тест, чтобы он соответствовал поведению кода.
После этого в команде решили изменить процесс. ИИ больше не может в подобной ситуации менять тесты (если считает это необходимым, то должен объяснить причину). А на случай, если это всё-таки произойдёт, добавили в CI хук, который попросту блокирует PR с такими изменениями.
В общем, использование TDD помогает, но и при нём нельзя «отключать голову». Модель охотно напишет какие-то тесты до кода, но точно ли правильные? Контроль остаётся за человеком.
SDD
Бывают эффектные демонстрации вайбкодинга: «Просто скажите “сделай тетрис”, и у вас готовая игра!» И новичкам может казаться, что теперь всё так и делается.
Но на Хабре всем ясно, что если в серьёзном проекте сказать просто «сделай фронтенд», то какой-то фронтенд ИИ может сделать… однако вряд ли тот, который нужен.
Машина делает «что ты сказал», а не «что ты хотел». Она не умеет читать мысли и может додумывать «недосказанное» как угодно.
Забавно, что нагляднее всего это передаёт «Энциклопедия профессора Фортрана», опубликованная ещё в 1991-м. В оригинале речь шла об обычных детерминированных алгоритмах, но и к промптингу ИИ это метко подходит:

Получается, чтобы добиться именно «чего хотел», необходимо и самому-то это как следует понять, и хорошо изложить. Декомпозировать масштабное на части, описать их все подробно, точно, недвусмысленно. Хмм, кажется, что-то подобное было и до ИИ…
Да, тут вспоминаются слова вроде «спецификация», «документация», «требования». И они становятся важнее прежнего:
Раньше многие знания распространялись «в курилках», а не в файлах. Но LLM не курят. Если знание о проекте не зафиксировано письменно хоть в каком-то формате, для модели его не существует.
В каждом новом диалоге модель «забывает» всё из предыдущего. Нужно уметь быстро вводить её в курс дела. И тут помогают уже готовые тексты.
В итоге популяризовалось целое понятие «Spec-Driven Development» (SDD), где спецификации ставят во главу угла. GitHub создал инструмент Spec Kit, также есть OpenSpec (первый более «энтерпрайзный», второй более «лёгкий»). На сайте Мартина Фаулера это явление разбирали ещё в октябре. А на Хабре с тех пор тоже появился целый ряд постов, так что совсем в детали вдаваться не станем.
Кто-то при слове «спецификация» скажет: «Это что же, возвращаем “водопад”? Будем прописывать до посинения гигантский талмуд, чтобы не оставить двусмысленностей, и только потом кодить? Но ведь если писать заранее талмуд, потом на практике выясняется, что его весь надо переписывать. Мы это уже проходили».
Но на самом деле никто не призывает забыть идеи agile. Даже наоборот: ИИ как раз «аджайлный», он позволяет быстро проверять гипотезы на практике и подстраиваться на ходу. «Сделай тут тремя разными способами, а мы сравним результаты “вживую” и выберем».
Всё значимое требуется фиксировать, но это не значит «только заранее». Когда понимаешь что-то уже на практике — можно добавлять или в ту же спецификацию, или в логи решений, или как вам удобнее.
Записывать всё может ощущаться скучной бюрократией. Хорошая новость: машины не боятся бюрократии, так что ИИ можно привлекать к этому.
При этом, конечно, и здесь нельзя «отключать голову». Модель согласится хоть написать всю спецификацию за вас, но может и в ней понаписать глупостей. А отвечаете-то за результат вы, так что его надо контролировать.
Экономия контекста и токенов при чтениях
Когда используешь ИИ не для вайбкодинг-проекта из двух файлов, а применяешь к рабочему проекту с большой кодовой базой, сразу вылезает ряд сложностей. Одна из них — агент начинает читать много лишнего. Поначалу кажется логичным: чем больше файлов он посмотрит, тем лучше поймёт задачу. Но на практике зачастую наоборот: контекстное окно забивается, важные детали тонут в шуме, а расходы на токены растут. Что делать?
По нашему опыту, тут полезнее мыслить не в формате «пусть агент сам разберётся в проекте», а в формате «дать агенту ровно ту часть системы, которая нужна для конкретного изменения». Конкретные действия при этом могут быть разными:
1. Формулировать задачу узко
Запросы вроде «разберись, что здесь происходит» или «исправь модуль» расширяют зону чтения. Агент исследует всё подряд, потому что не понимает, где заканчивается задача. Куда лучше узкие формулировки: «измени только валидацию в этом методе», «работай в пределах этих двух файлов».
2. Делать структуру проекта понятной и предсказуемой
Вообще говоря, хорошая организация кодовой базы важна и без всякого ИИ. Предсказуемые названия файлов, понятное разделение по слоям, внятные README — это ведь и людям помогает. Но агенты тоже так быстрее находят нужную часть системы.
3. Давать агенту карту проекта и ограничения
Помимо «разложить всё по полочкам», можно напрямую давать агенту краткую карту этих «полочек»: где находится нужный модуль, что считается точкой входа, где лежит бизнес-логика, а где тесты или вспомогательные части. И можно сразу уточнять, какая часть карты актуальна для текущей задачи: какой модуль трогать, какие директории релевантны, а где не нужно ничего менять.
4. Фиксировать архитектурные правила отдельно
Если в проекте есть важные инварианты вроде «этот слой не ходит напрямую в БД», «этот модуль не импортирует этот пакет» или «новую логику добавляем только через такой паттерн», агенту лучше знать это заранее. Тогда ему не придётся каждый раз заново выводить эти правила из кода, просматривая дополнительные файлы.
5. Разделять поиск, понимание и изменение
При проблемах с «чтением лишнего» можно не просить агента сразу переписывать код. Можно сначала дать задачу поиска релевантных файлов и посмотреть, не «увело» ли его. Затем — задачу понимания: что именно в них отвечает за нужное поведение. И только потом — задачу изменения. Это частное применение универсального принципа: «Если агент плохо справляется с задачей — попробуй её декомпозировать».
Выбор стека: типизация и «стандартизация»
Программисты вечно спорят «какой язык/фреймворк/инструмент лучше». На Хабре сломаны миллионы копий. А теперь у вопроса новый вариант: что лучше при работе с ИИ?
Возможно, даже возникнут новые языки: например, создатель Kotlin Андрей Бреслав сейчас работает над проектом CodeSpeak. Но пока посмотрим на привычные.
И здесь интересно получается с типизацией. Людям лень писать типы, и языки шли им навстречу: какие-то использовали динамическую типизацию, какие-то при статической начинали выводить типы автоматически.
А вот ИИ-моделям писать типы не лень. Зато они часто ошибаются. И статическая типизация может поймать некоторые ошибки. Поэтому возникло популярное мнение «для ИИ лучше статическая», и языки вроде TypeScript сейчас на подъёме. Хотя вокруг многих ИИ-практик сейчас идут споры, и для этого тезиса тоже можно встретить возражения.
Другой фактор: для LLM «удобнее», когда что-то часто встречалось в обучающем датасете. Если на GitHub есть тысячи «Тетрисов» на JavaScript, то агенту будет легко сделать ещё один, и динамическая типизация не остановит. А хуже обстоят дела с малоизвестными вещами и с совсем новыми, вышедшими уже после даты «knowledge cutoff» ИИ-модели. Там вероятность ошибок выше.
Поэтому некоторое преимущество получает всё «стандартное» и популярное. Даже если это звучит «скучно».

Это не значит, что теперь «оригинальничать» нельзя. Можно, когда на то есть причина. Но по умолчанию вопросы полезно решать самым напрашивающимся путём, а другими — только когда понимаешь, ради чего.
В общем-то, и без ИИ было полезно заботиться так о коллегах. Сделать что-то нестандартным образом можно. Но надо думать о том, кому во всём этом разбираться, когда ты уволишься или в отпуск уйдёшь. Поэтому «делать странно» без повода не стоит.
Подход к Git
Известный в ИИ-сообществе разработчик Стив Йегге и известный в DevOps-мире Джин Ким написали вместе целую книгу «Vibe Coding». Вопреки названию, она не про «бездумный вайбкодинг», а наоборот, призывает подходить разумно и ответственно. И один из советов в книге — «коммитить как можно чаще».
Потому что это как «сохранения в видеоигре»: никогда не знаешь, когда ИИ вдруг пойдёт вразнос, и чем свежее последний коммит, тем меньше прогресса можешь потерять. А кроме того, если всё как следует описано в commit messages, ИИ в будущих диалогах сможет понимать по ним много полезного контекста.
Обычно люди не жаждут сочинять про все мелочи отдельные commit messages, когда другие задачи ждут. Хорошая новость: ИИ не лень этим заниматься, можно поручать это ему (и при необходимости немного править его commit messages вручную).
Однако книга приводит и такой пример, где Стив даже с ИИ-коммитами и удалённым бэкапом чуть не потерял много наработанного. Дело оказалось в следующем. ИИ-агент насоздавал много разных временных ветвей, возникла запутанная структура ветвления. Когда всё вроде как было сделано, Стив сказал удалить лишние ветви. А позже обнаружил, что код за целую неделю куда-то делся… Оказывается, ИИ не вмёрджил всё в main, как ожидалось. А на удалённый сервер отправлялся только main.
В том случае код удалось спасти. Но общий вывод такой: хотя Git помогает защититься от потерь, а ИИ не лень часто коммитить, нельзя бесконтрольно доверять ИИ работу с ним. Где-то надо внимательно следить «на каком мы сейчас бранче», где-то надёжнее руками вбить гит-комманду.
Ещё одну особенность работы с Git описывали и Илья Бирман, и Саймон Уиллисон: ИИ очень помогает со «сложными командами». Даже опытным разработчикам непросто целиком уместить в голове логику и команды Git. Теперь в запутанной ситуации можно либо отдать команду «человеческим языком», либо попросить «сначала объясни, какие у нас варианты, там решу».
Также про Git людям пришлось задуматься в таких ситуациях: если несколько ИИ-агентов одновременно вносят в проект изменения, как это правильнее организовать, чтобы они поменьше «сталкивались»? А если хочешь поручить одну фичу сразу нескольким ИИ-моделям и потом выбрать «кто лучше справился», как это правильнее устроить? А если хочется хранить с помощью Git не только код, но и промпты?
Сейчас человечество экспериментирует для этого с worktrees, бранчами, надстройками «поверх» Git. Пока нет единого «окончательного рецепта». Но стоит поглядывать, что с этим будет происходить — тут явно будут устаканиваться новые нормы.
Риск-менеджмент
В далёком 2001-м группа разработчиков уехала в горы и пообщалась, а вернулась оттуда с «манифестом Agile» о том, как надо подходить к разработке «по-аджайлному». В их числе был Мартин Фаулер из Thoughtworks.
А в этом году, спустя 25 лет, компания Thoughtworks снова вывезла группу айтишников на ритрит: обдумать, как теперь подходить «по-эйайному».
В этот раз вернулись без уверенного манифеста, но выпустили PDF с некоторыми размышлениями. Первый пункт там такой: «Инженерное качество с ИИ не исчезает, а перемещается из кода в спецификации, тесты, ограничения и риск-менеджмент». Про спецификации и тесты мы уже поговорили, а теперь про риск-менеджмент.
Идея вот в чём. Когда машины быстро генерируют много кода, человеческое ревью становится одновременно «важным местом» и «узким местом». От его тщательности зависят и качество проекта, и скорость разработки. И эти две вещи противоречат друг другу.
А при этом у разного кода очень разная цена ошибки. Одно дело — быстрый прототип, который позже попросту удалят. Совсем другое — медицинские системы, баг в которых может стоить кому-то жизни.

Если расслабишься и доверишься ИИ в критической системе, это чревато большими проблемами. Но если долго провозишься с проверкой чего-то эфемерного, это тоже проблема. Впустую потратишь время, которое нужнее для другого, включая ту же проверку критических систем.
Получается, недостаточно быть «въедливым компетентным специалистом». Надо ещё и уметь регулировать в себе степень въедливости. Не прибивать гвоздями один подход «проверяем любой код вот так», а работать гибко. Постоянно задумываться: «Какими будут последствия ошибки в этом коде?»
Перефразируя известную «Молитву о душевном покое», можно сказать, что при работе с ИИ-кодом требуются:
Компетенции и прилежность тщательно проверить всё, что требуется.
Душевный покой принимать без излишних проверок то, где они не требуются.
Мудрость отличать одно от другого.
Вот эту мудрость и называют «риск-менеджментом».
Понимание ИИ
Вот забавный пример. Как известно, многие LLM могли ошибаться при запросах формата «сколько букв “r” в слове “strawberry”». Но порой та же самая LLM выдавала правильный ответ, если добавить в промпт «use python».
Почему? LLM видят текст не символами, а токенами из нескольких символов, поэтому считать буквы им бывает сложновато. Зато они умеют писать на Python. А Python умеет считать буквы. И получается, при некоторых запросах к LLM полезно понимать, как действует токенизация — это может улучшить промпт и его результат.
ИИ манит людей «песней сирены»: «Просто вбей запрос понятным языком и не думай, дальше всё сделает магия». Но для профессионального применения ИИ стоит понимать хотя бы в целом, как эта «магия» реально работает.
Например, чтобы лучше справляться с тем, что называют «context management». При лёгком вайбкодинге об этом можно вообще не думать. Но когда используешь ИИ в масштабном проекте, можешь быстро столкнуться с тем, что мы уже упоминали в части про «много чтений»:
для верного выполнения задачи машине нужен весь релевантный контекст
при этом окно контекста не бесконечное, да и то в середине «проседает»
поэтому не стоит «закидывать в ИИ всё возможное», надо «не мусорить»
фича «compaction» может «сжимать имеющийся диалог до главного»
но модель сама выбирает «а что главное», и может упустить важное
И когда понимаешь это, можешь учитывать в своих действиях: если окно контекста уже заполняется, а при compaction что-то может потеряться, какие вещи точно надо перенести в продолжение сессии? Стоит ли прямо сейчас сохранить их в файл, чтобы потом можно было восстановить из него?
В интернете есть много обсуждений в духе «Agent Skills лучше MCP, потому что не загружаются в контекст сразу, а только по необходимости». Из таких реплик можно извлечь пользу, но не стоит впадать в карго-культы вроде «всегда используем только Agent Skills и всё станет идеально». Главное тут — не зубрить конкретные техники, а понимать в целом, что значит «не загружаются сразу» и чем это хорошо.
Помимо принципов работы самих LLM, полезно разобраться и в том, как именно модели из простых разговорных «чатботов» превращают в деятельных «агентов». Об этом есть много материалов — например, Аллен Хатчинсон из Google DeepMind написал целую серию постов «The Agentic Shift».
При этом суть идеи несложная, и минимальную агентскую систему можно даже написать самостоятельно, чтобы разобраться. Но использовать в работе стоит всё-таки «полноценную» чужую: поверх простой базовой идеи возникло уже много улучшений и нюансов.
Ну а в целом тему «как работает ИИ» можно по мере сил копать сколько угодно. Чем различаются модели? Как измеряют их эффективность? Какие формы обучения к ним сейчас применяют? Как работает кэширование токенов? Как устроен «режим планирования»? По любому из этих вопросов можно было бы написать отдельный хабрапост (сообщайте, если какой-то из них действительно хотели бы прочитать).
Понимание программирования
Все предыдущие пункты — это полезно, но не главное.
Важнее помнить идею, которую Джоэл Спольски описал ещё в 2002-м:
Все абстракции «протекают».
ИИ манит новичков идеей абстрагироваться от кода вообще. И на простом уровне «сделай тетрис» это работает. Создавая иллюзию, что понимать про код уже ничего и не надо.
Но в сложном проекте всё это «протечёт». Вылезут проблемы на уровнях, скрытых за абстракцией. И окажется, что посреди ночи прод упал, а никто уже не понимает, почему. Так что, если хочется делать масштабные вещи, необходимость понимать «уровни ниже» совершенно не исчезла. Наоборот, к ним добавился ещё один.

Мы в Kodik при ревью ИИ-кода сами сталкивались с ситуацией, когда AI предложил «удобное» упрощение в критичном участке (где важна идемпотентность/проверки), и это могло дать прод-инцидент. Тогда поймали это на ревью, переписали логику и добавили регрессионный тест. Но очевидно, что мир ждёт много подобных случаев, где люди или вообще не сделают ревью, или не смогут во время него заметить проблему.
И главная-то идея получается простой: чтобы добиться от ИИ профессионального кода, надо самому быть профессионалом.
Но даже если человек опытный программист, а не излишне самоуверенный вайбкодер, для него тоже возникают новые вызовы. Например, если с ручного написания кода переключиться на сплошные ревью, не атрофируются ли со временем способности? И поэтому ещё один важный вопрос звучит так:
Как в новом мире не перестать понимать?
Здесь любопытен опыт Митчелла Хашимото. Зачастую он даёт ИИ-агенту задачу, которой тот может продолжительно заниматься в фоне — а сам тем временем садится писать код вручную для другой задачи, даже отключив агенту уведомления, чтобы не отвлекал. В результате и успевает больше прежнего, и хватку не теряет: «поручать код агенту» не означает автоматически «перестать писать код самому».
Не факт, что вам подойдёт воркфлоу Хашимото. Но вот более универсальная хорошая новость: ИИ полезен и для задач понимания тоже.
Ведь не обязательно говорить машине «разберись там сама». Можно наоборот: «я хочу разобраться сам, помоги вот так-то». Вы изучаете чужой репозиторий и застряли на непонятном месте? Можно показать репозиторий ИИ и позадавать вопросы — вполне возможно, разобраться вместе окажется проще.
Для подобного даже начали делать инструменты — вероятно, тут многое ещё изменится, поэтому пока что условный пример. Саймон Уиллисон создал маленький проект Showboat для создания текстовых пояснений/проверок к коду — «если запустить вот этот фрагмент, вывод получается вот таким». И этот инструмент сразу был задуман так, чтобы его можно было вручить ИИ-агенту вместе с каким-то непонятным кодом и попросить сделать «прохождение кода» с объяснениями.
Кто-то использует ИИ, чтобы отключить голову. Кто-то — чтобы включить её сильнее прежнего.
Обучение программированию
С текущим поколением разработчиков, у которого уже есть опыт, ещё ладно. А вот что будет со следующим, которому только предстоит учиться?
Как действовать, когда люди приходят в мир программирования, а там приложения уже «магически возникают», и разбираться с кодом нет мотивации?
И в случае с программированием, и вообще в целом как новым поколениям не превратиться в персонажей «ВАЛЛ-И», разучившихся понимать, что происходит вокруг?

Над этим сейчас думают многие. Например, Андрей Карпатый когда-то работал над первыми моделями GPT и возглавлял направление автопилота в Tesla, а затем ушёл заниматься собственным проектом Eureka Labs. В интервью он объяснял, что его как раз беспокоит перспектива «мира из “ВАЛЛ-И”». И что он хочет с помощью ИИ перепридумать процесс обучения.
Но Eureka Labs пока что не запущен, а всем остальным как-то уже нужно учить людей в новом мире. Как сделать, чтобы знание кода не пропало?
Первым рефлексом у многих может быть «отнять у учеников LLM, пока не научатся кодить нормально». Желание понятное, но обречённое. Этого джинна уже не запихнуть обратно. Логичнее научиться с ним обращаться.
Как не отбирать у людей ИИ, а сделать так, чтобы и с ним люди учились понимать?
Мы думаем над этим не первый день в рамках проекта Kodik Education. Взаимодействуем уже с целым рядом школ и вузов (их тоже очень интересует этот вопрос).
Наш подход ещё будет развиваться, но уже пришли к таким тезисам:
1. Главная проблема с LLM — они могут сразу давать правильный ответ, пропуская путь к нему. Значит, обучение должно быть выстроено так, чтобы не пропускать.
В новом мире задания не должны быть просто в формате «найди X». Они должны быть сосредоточены не на конечном X, а на том, как его искать и почему именно таким образом. Этому и надо учить, это и надо проверять.
Хорошая новость: ИИ могут здесь пригодиться, например, для помощи в проверках. Обычной детерминированной системой можно легко проверять «правильный ли X вписал ученик», но куда сложнее проверить «правильное ли объяснение он привёл». А LLM лучше подходят в подобных случаях. Конечно, при этом они не должны полностью заменять учителей — лишь дополнять как удобный инструмент.
2. ИИ может быть полезен в объяснении «обычного» программирования.
Да, у многих возникает соблазн никогда не думать «что там за объекты, стеки и хипы». И редактор кода, где возможно «просто ввести промпт», звучит как потворствующий этому.
Но процесс промптинга тоже может помогать разобраться в части «происходящего под капотом», например, если визуализировать происходящее. Что, если промптишь простую игру, но при её запуске сразу видишь «что сейчас происходит в памяти»? Насколько всё становится познавательнее?
Сейчас мы развиваем различные идеи, и позже расскажем подробнее о результатах. А если вы из сферы образования — можете связаться с нами и развивать вместе.
В заключение
С ИИ-кодингом у человечества появилась сложная штука, с помощью которой можно и натворить кучу ерунды, и сделать много крутого. И от всех нас зависит, сколько будет первого и сколько второго.
Хочется менять баланс в сторону «крутого», поэтому написали этот пост. Но мы не мним себя единственными гуру с тайным знанием о том, как именно этого достичь. Здесь важен обмен опытом всего сообщества. Поэтому тут может быть очень полезен вклад от вас.
У вас есть конкретные практики, помогающие избегать проблем при ИИ-кодинге? Или общие мысли, что ещё можно делать, чтобы с ИИ человечество не растеряло программистское понимание? Пишите в комментариях.****
Комментарии (22)

AIAnatolich
24.03.2026 12:39Спасибо за статью, хотелось бы почитать про токенизацию в агентах, как агент тратит токены.

timurkhakhalev
24.03.2026 12:39Спасибо за статью! Всё правильно и по делу написано! И что немаловажно — не нейрослоп, которым завален Хабр :)

Kodik_AI Автор
24.03.2026 12:39Спасибо! Да, хотя весь пост про использование ИИ, сам текст поста писал совершенно не ИИ :)

zarazaexe
24.03.2026 12:39я правильно понял что Spec-Driven Development - это просто ТЗ?
ну и тесты не гарантируют качества кода ( как бы логично не звучало )
тоесть кратко - чтобы ии писал хороший код - нужно чтобы промты к нему писал тот кто понимает как эту задачу реализовать
так еще и читать надо каждую строчку от ии, а то он в отличии от человека ( на том же C, на котором я пишу, ии ооооочень часто допускает ошибки сам того не понимая ) не понимает что допустил ошибки, хотя люди тоже этим грешат, но ии все ж почаще
он же ТрАнСфОрМеР

Kodik_AI Автор
24.03.2026 12:39Spec-Driven Development - это просто ТЗ?
Не вполне. «Просто ТЗ» на практике часто означает, что есть какое-то ТЗ, но что-то будет доуточняться устно, что-то меняться в процессе и уже не фиксироваться в ТЗ. А в итоге «главный источник правды» — это код.
SDD подразумевает, что спецификация (точное и структурированное ТЗ) становится «главным источником правды». И разработчик, и ИИ ориентируются на неё, а не устные договорённости или ещё что-то. И если понадобилось что-то изменить, то эти изменения должны фиксироваться в спецификации до того, как будет сгенерирован новый код. ИИ всегда должен ориентироваться на актуальную версию спецификации.
Существуют ещё и сторонники более радикальной формы SDD, которые считают, что код вообще уже малозначим, потому что с ИИ его всегда можно перегенерировать из спецификации, как бинарники — из кода. Мол, теперь спецификация — это «новый код», а LLM — это такой своеобразный «компилятор». Но тут возникают вопросы вроде того, что ИИ по одной и той же спецификации может генерировать различающийся код. И конкретно мы в такое не ударяемся, для нас код по-прежнему важен.

Rubiorif
24.03.2026 12:39По началу реально думал чем больше он посмотрит, тем лучше будет результат, а по факту только шум добавляется, сейчас стараюсь жёстко ограничивать область задачи и стало заметно стабильнее

AravanaAI
24.03.2026 12:39Про reward hacking с тестами прямо в точку. У нас была похожая история: LLM-агент должен был сделать 5 шагов подряд, из которых последний — вызвать bash-скрипт отправки. Четыре творческих шага проходили идеально, а на пятом агент просто сообщал «отправлено», хотя ничего не вызывал. Галлюцинация, но не на тексте, а на собственных действиях. Пришли к тому же выводу: код должен верифицировать результат агента, а не верить ему на слово. По сути тот же TDD, только для агентов: не «он сказал что сделал», а «в логе есть подтверждение».

UFO_01
24.03.2026 12:39TL;DR: каждой задаче свой инструмент.
"водопад"? Будем прописывать до посинения гигантский талмуд, чтобы не оставить двусмысленностей, и только потом кодить?
Чего-чего? Что-то мне подсказывает, что если вы с водопадом не смогли нормально процессы выстроить, то с аджайлом тем более напортачите. И вместо талмуда на 200 страниц будет 20 этапов согласования цвета кнопки. Ах да...
И будем пихать аджайл куда угодно, лишь бы не вникать в детали и специфику процесса, потому что это так модно и технологично. Можете представить степень моего удивления когда в огромной фирме которая занимается производственными процессами на АСУ ТП ввели аджайл, о чём мне товарищ поведал. И зачем? У вас конвейер с молоком резко шоколад делать начнёт? Или вы хотите этим уйти от ответственности: "Ой, ну мы попробовали, не получилось, заложим в следующий спринт", а головой подумать прежде чем делать не судьба? Не, я не против экспериментов, смелых решений, но зачастую уже заранее можно сказать что получится мягко говоря не самое оптимальное решение.
Кстати, чтобы нейронка выдала что-то действительно путное и соответствующее вашей задаче, требуется структурированное, логичное и полное описание этой самой задачи. А подход
Сделай тут тремя разными способами, а мы сравним результаты
Себя оправдывает только в ситуации когда у нас дешёвые токены как сейчас, потому что цены отбивают только затраты на инфраструктуру, а баснословные R&D оплачивают инвесторы. И самое главное, когда у нас малые затраты на тестирование. Если мы делаем что-то серьёзнее манки кодинга, удачи провести три цикла интеграции и анализа рисков, про верификацию даже не заикаюсь. Смотреть тошно как инженерную культуру втаптывают в грязь культом достигаторства и рокстаров.
Да, я понимаю что бизнес будет голосовать рублём, и на какой-нибудь галере подход "сначала делаем потом думаем" будет работать нормально. А там где надо качественно, пусть дорого и долго, я надеюсь бизнес сделает правильный выбор, чтобы после экономии на спичках дом покупать не пришлось. Да и склонные к достигаторству в зарегулированные отрасли просто не пойдут, что в принципе тоже хорошо. Хотя молодая кровь этим отраслям очень нужна, чтобы они не скатывались в элитарность покрытую мхом.

Kodik_AI Автор
24.03.2026 12:39Ну, фраза про водопад ведь даётся в тексте как реакция от гипотетического читателя, а не как наша позиция.
Возможно, не совсем точно получилось передать там мысль, она была вот в чём. Кто-то при виде слов «spec-driven» испугается, что отберут любую возможность влиять на исходный план по ходу дела, даже если очевидно понадобились изменения (например, в стартапе на ранней стадии, где всё часто меняется). Но если такая потребность есть, то её возможно и с SDD реализовывать.
А так да, всему своё место, не нужно везде ударяться в аджайл ради самого аджайла. С этим не спорим.

Kodik_AI Автор
24.03.2026 12:39И отдельно добавим про часть «Если делаем что-то серьёзнее манки кодинга, удачи провести три цикла интеграции и анализа рисков...»
С этим сложно спорить. Если подходить к ИИ как к «манки кодингу», то в серьёзных системах это гарантированно ломается. Но по нашему опыту, происходит обратное: с ИИ требования к инженерной дисциплине не снижаются, а растут.
ИИ может быстро написать «что-то рабочее», но со скрытыми ошибками, нарушениями архитектуры и неочевидными рисками. Поэтому генерация — это не конечный результат, а самый дешёвый этап пайплайна. Дальше всё по классике (и это никуда не делось): ревью, тесты, интеграция, проверка крайних кейсов, анализ рисков. И во многих случаях мы делаем это жёстче, чем при ручной разработке, потому что ИИ «уверенно ошибается».
Подход «сделай 3 варианта, выберем лучший» может быть полезен на этапе быстрых гипотез и исследований — в этом смысле ИИ даёт сильную «аджайлность». Но как основной процесс в production он почти всегда не масштабируется: дорого по интеграции, дорого по верификации, дорого по рискам.
Поэтому рабочий вариант, который приживается конкретно у нас:
чёткая спецификация → одна реализация → строгая проверка,
а не «перегенерируем, пока не понравится».ИИ в этом смысле — не способ упростить инженерку, а инструмент, который заставляет лучше формулировать задачи, строже проверять результат и быстрее находить слабые места.
Если этого не делать — да, получится ровно тот сценарий, о котором вы пишете.

Spyman
24.03.2026 12:39Я так по статье и не понял, вы у себя ssd ввели или нет? Потому что сейчас у нас пробуют такой подход и что-то к нему возникает много вопросов

Kodik_AI Автор
24.03.2026 12:39Да, SDD у нас используется, но не как жёсткий формальный процесс, а как часть рабочего флоу. Перед задачами фиксируем ожидаемый результат, ограничения и инварианты, чтобы агент не «додумывал» и не уходил в лишние части системы, а дальше спокойно уточняем и обновляем спецификацию по ходу работы. По сути, это не «написали документ и забыли», а живой слой между задачей и кодом, который постоянно синхронизируется с реальностью. В связке с TDD и риск-менеджментом это даёт гораздо более предсказуемый результат, чем каждый из подходов по отдельности.

Spyman
24.03.2026 12:39Вот отсюда вопрос сразу - какие метрики вы считаете, чтобы понять что ваш ssd делает лучше а не хуже?
Мы тоже ввели, и неожиданно - качество генерации кода во многих задачах субъективно упало. Взялись тестировать. При прямом тесте на 10 задачах - код в 3х стал хуже относительно прямого поставленной задачи без излишков (тут метрика субъективная, результат по трем ревьюверам), а 2 вообще решились с ошибками, в 1 случае код получился лучше. Избыточные данные модель трактовала как то, что должно быть сделано - и лезла даже туда, куда не нужно.
И второй вопрос - как вы делаете diff между двумя версиями спецификации, когда необходимо сделать доработку. Это оказалась весьма нетривиальная задача когда доработка больше перекрашивания кнопки (едва ли не сложнее, чем саму фича сделать) - потому что полная спецификация затрагивается любым функциональным изменением во множестве мест, и её руками то хрен поменяешь, а llm вообще показали сносные результаты только 1/4 случаев. А на корректность спецификации тесты не напишешь в отличии от кода.

Enfriz
24.03.2026 12:39TDD, SDD
Есть ещё один интересный DD в контексте использования ИИ: а именно DDD. В одной компании, где я работал, была часть кода в виде неструктурированного легаси, и с ней ИИ справлялся очень плохо. Плохо находил ошибки, плохо рефакторил, плохо добавлял фичи. Стали части проекта переписывать на DDD, и оказалось что такой энциклопедически правильный формат, прям как по книжкам, ИИ тащит очень круто.
Обсуждали это с коллегами и пришли к такому выводу: помимо просто в целом более понятной структуры кода (которая и для людей понятнее), конкретно ИИ воспринимает код как текст, и поэтому хорошие названия функций и переменных из подходов Мартина и Эванса дают заметное преимущество. Если человек в целом неплохо видит суть функции или алгоритма даже с однобуквенными названиями, то для LLM-ки функция которая называется
GetValidUserDataByRaw(rawUserData)уже сама по себе содержит сильно больше информации, чем просто какое-нибудьGetData(userData)Риск-менеджмент
Процессно в моём личном опыте в больших компаниях самая серьёзная проблема вот какая: менеджеры и без того годами игнорили техдолг и архитектуру, прося говнокодить задачи побыстрее. Но раньше у разработчиков была защита в виде того, что быстро сделанные задачи (без архитектуры и в спешке) слишком часто оказывались критически неработоспособными. А сейчас для бизнеса ИИ выглядит как волшебная таблетка: работает и ладно, чего вы лезете со своим проектированием? Уволить половину программистов и архитектора.
разбираться с кодом нет мотивации
Проблема другая: джунов перестали нанимать. Разбираться с кодом нет не мотивации, а смысла — раньше вход в профессию был понятный, сейчас нет. Если джуны не нужны, а мидлом ты без реальной практики не станешь, то лучше поискать другую профессию. И вот эту проблему особо никто не взялся решать. Если через 20-30 лет программисты ещё останутся нужны, нас ждёт исчезновение эйджизма в отрасли, потому что нанимать можно будет только стариков :)

phillennium
24.03.2026 12:39Захотелось пересмотреть теперь твой доклад про DDD, возможно, он стал актуальнее прежнего)

Kodik_AI Автор
24.03.2026 12:39Спасибо за развёрнутый комментарий, очень в точку.
Про DDD — полностью согласны, у нас похожие наблюдения: чем «человечнее» и семантически богаче код, тем лучше с ним работает LLM. По сути, хорошие имена и явные границы домена начинают играть роль дополнительного контекста, которого модели обычно не хватает.
Про риск-менеджмент тоже болезненно знакомо. Есть ощущение, что ИИ действительно убирает тот естественный “фильтр боли”, который раньше заставлял инвестировать в архитектуру — теперь многое «как будто работает», и это создаёт иллюзию, что можно не думать о последствиях.
А в случае с джунами наш прогноз оптимистичнее: думаем, что из-за «парадокса Джевонса» количество вакансий будет расти (софт начнут делать даже в тех компаниях, где раньше этим не занимались), а способные джуны с ИИ смогут быстрее прежнего осваивать технологии и сократить путь к сеньору, так что толковые люди понадобятся.
В общем, спасибо, что так подробно дополнили — как раз ради таких комментариев и писали пост.

DamnKogotDebil0exe
24.03.2026 12:39По TDD с ИИ прям плюсую, тоже ловил кейсы, когда модель подгоняет тесты под реализацию, а не наоборот, в итоге для себя сделал правило, что тесты лучше не трогать без отдельного запроса и смотреть диффы руками. Ещё из практики зашло дробить задачи и сначала просить найти нужные файлы, а не сразу править. Поэтому удобно, когда можно отдельно посмотреть куда он полез, и уже потом давать команду на изменения
Harrunos
Хорошая сборка, особенно часть про reward hacking - проблема куда шире, чем кажется на первый взгляд.
Хочу добавить похожий паттерн, который встречается, когда агент работает с браузерной автоматизацией. Там появляется "экологический" reward hacking: тест зелёный, код формально правильный, страница возвращает 200 - но реальный пользователь в это время видит Cloudflare-челлендж или капчу. TDD это не ловит, потому что юнит-тесты не знают про антибот-системы на целевом сайте.
Это как раз иллюстрация тезиса про "протекающие абстракции" - только здесь протекает не сам стек, а среда выполнения. Агент пишет правильный Playwright-код, все проверки проходят, а на проде автоматизация молча ломается при первом же деплое на реальный сайт.
Получается, что к вашему списку (TDD, SDD, риск-менеджмент) для агентов, работающих с внешними сервисами, напрашивается ещё один уровень: проверка среды, а не только кода. Как вы это решаете в Kodik, если сталкивались с подобным?
Kodik_AI Автор
Спасибо за такой вдумчивый комментарий!
К вашему вопросу. По сути, получается тот же класс проблем, что и в тексте, но на уровень выше: если в обычном reward hacking агент «обманывает тест», то здесь он «обманывает среду», потому что она для него упрощена.
Мы для себя это начали формулировать так: недостаточно проверять корректность кода, нужно проверять валидность предположений об окружении. Из практики: если понимаем, что сценарий упирается во внешние системы (антибот, rate limits, поведение CDN и т.п.), стараемся не ограничиваться тестами на уровне HTTP/скриптов.
Что делаем в таких кейсах:
Разводим synthetic и real environment
Прогоняем сценарии в условиях, приближенных к реальным (IP, прокси, ограничения), а не только в «чистой» среде.
Добавляем проверку фактического пользовательского состояния.
Не «200 OK», а «пользователь действительно увидел нужный экран/контент».
Фиксируем ограничения среды в спецификации.
Отдельно про Kodik: мы видим, что этого уровня проверок всё равно не хватает, поэтому сейчас двигаемся в сторону добавления vision-based проверок (анализ того, что реально отрендерилось в браузере), и агентов, которые могут взаимодействовать с браузером напрямую и проверять результат не только через API, но и через фактический UI.
Идея в том, чтобы агент ориентировался не только на «ответ сервера», а на «что реально видит пользователь», это как раз закрывает почти все кейсы с капчами/челленджами.
А раз вы с подобным сталкиваетесь, как вы у себя это обходите, особенно без ухода в полноценную гонку с антиботом?
Harrunos
Vision-based проверки это правильное направление, но есть один нюанс: если браузер детектируется до рендеринга (Cloudflare Bot Management делает fingerprint ещё на уровне TLS-рукопожатия и первых JS-сигналов), то агент с vision уже смотрит на страницу с капчей. Проверка фактического состояния правильная, но "поздняя" - нужно устранять причину, а не фиксировать симптом.
Мы у себя пошли другим путём: вместо того чтобы обнаруживать и реагировать на детект, убрали саму возможность детекта. Используем CloakBrowser - это Chromium с патчами на уровне C++ (до компиляции), который просто никогда не отдаёт automation-сигналы. Тогда вся логика проверки среды становится чище: если страница отдаёт капчу - это реальное гео-ограничение или бан IP, а не артефакт автоматизации. Причины становятся диагностируемыми.
Ваш подход с synthetic/real environment в паре с таким браузером, кстати, закрывал бы большинство кейсов без гонки с антиботом.
Kodik_AI Автор
В сторону CloakBrowser пока что не смотрели, но подумаем об этом, спасибо!