Как писать хороший код с ИИ: практики для профессионалов

Как писать хороший код с ИИ: практики для профессионалов

О проблемах с ИИ-кодингом написано много. Но как перейти от критики к практике — как работать с ИИ профессионально и получать качественный код?

Известные разработчики, такие как Митчелл Хашимото (создатель Terraform и Ghostty), всё чаще говорят, что не пишут код вручную. При этом они подчёркивают: результат должен быть таким, чтобы его принял живой разработчик. Как этого добиться?

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

Собрали идеи из опыта мировой IT-индустрии и собственной практики. Это не «окончательная истина» — весь мир сейчас учится, и обмен опытом особенно ценен. Дополняйте в комментариях: вместе можно создать общую кладезь знаний.

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

TDD: тесты первыми

Как бороться с ошибками ненадёжной машины? Логично — с помощью тестов. Но можно ли поручать ИИ писать тесты для его же кода?

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

Решение — TDD (Test-Driven Development). Пишите тесты до кода. Кент Бек и Роберт «Uncle Bob» Мартин пропагандируют этот подход десятилетиями. С ИИ он особенно полезен: машина не может перенести ошибку из реализации в тесты, потому что реализации ещё нет.

Саймон Уиллисон (соавтор Django) уточняет: полезен «красно-зелёный TDD»:

  • Новый тест сначала должен падать.
  • Сделайте минимальное изменение, чтобы тест прошёл.
  • Проведите рефакторинг до качественного кода.

ИИ не чувствует «нудно» — он готов следовать процессу. Но и при TDD нельзя «отключать голову». Мы сталкивались, когда ИИ, не прошедший тест, тихо изменил сам тест, чтобы он соответствовал коду.

Теперь у нас запрещено менять тесты без объяснения. В CI добавлен хук, блокирующий такие PR. Контроль остаётся за человеком.

SDD: спецификации в приоритете

Эффектные демонстрации вайбкодинга вроде «сделай тетрис» создают иллюзию, что ИИ читает мысли. На деле — он делает «что сказано», а не «что хотелось».

Чтобы получить нужный результат, надо самому чётко понимать задачу и изложить её недвусмысленно. Декомпозировать, описать, документировать. Это — Spec-Driven Development (SDD).

LLM не ходят в «курилки». Если знание о проекте не зафиксировано, для ИИ его не существует. Каждый диалог — как чистый лист. Помогают готовые тексты: спецификации, документация, логи решений.

GitHub запустил Spec Kit, есть OpenSpec — инструменты для SDD. Мартин Фаулер и Хабр уже обсуждали эту тему. Но никто не призывает возвращаться к «водопаду».

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

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

Экономия контекста и токенов при чтениях

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

Вместо «пусть разберётся сам» — давайте агенту только нужную часть системы. Помогают такие практики:

  • Узкие формулировки задач: не «исправь модуль», а «измени валидацию в этом методе».
  • Понятная структура проекта: предсказуемые названия, разделение по слоям, README — помогает и людям, и ИИ.
  • Карта проекта: укажите, где нужный модуль, где бизнес-логика, где тесты. Ограничьте зону изменений.
  • Архитектурные правила отдельно: «этот слой не ходит в БД», «новая логика — только через паттерн». Иначе ИИ будет выводить это из кода, тратя токены.
  • Декомпозиция задачи: сначала — поиск релевантных файлов, потом — понимание, потом — изменение.

Выбор стека: типизация и «стандартизация»

Какой стек лучше для работы с ИИ? Пока однозначного ответа нет, но есть тенденции.

ИИ часто ошибаются. Статическая типизация помогает ловить ошибки. Поэтому TypeScript и подобные языки сейчас популярны. Хотя и с ними возможны возражения.

LLM «понимают» то, что часто встречалось в обучающих данных. На JavaScript тысячи «Тетрисов» — ИИ легко сделает ещё один. А с новыми или редкими технологиями — сложнее, особенно если они вышли после cutoff даты модели.

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

Подход к Git

Стив Йегге и Джин Ким в книге «Vibe Coding» советуют коммитить как можно чаще. Это как «сохранения в игре»: если ИИ сойдёт с ума, потеряете меньше.

Хорошая новость: ИИ не лень писать commit messages. Можно поручать это ему, слегка правя результат.

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

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

Зато ИИ отлично помогает в сложных ситуациях с Git. Можно спросить: «какие у нас варианты?» — и получить объяснение. Или отдать команду на естественном языке.

Ещё вопрос: как управлять несколькими ИИ-агентами? Как хранить промпты в Git? Сейчас пробуют worktrees, ветки, надстройки. Единого решения нет — но новые нормы формируются.

Риск-менеджмент

Thoughtworks провёл ритрит, чтобы обсудить «разработку в эпоху ИИ». Первый вывод: инженерное качество перемещается из кода в спецификации, тесты и управление рисками.

ИИ генерирует код быстро. Человеческое ревью — теперь и «узкое место», и «ключевой контроль». Но проверять всё одинаково тщательно — неразумно.

Цена ошибки разная: прототип можно удалить, а баг в медицинской системе — стоить жизни. Нельзя быть одинаково въедливым везде.

Нужно уметь регулировать степень проверки. Задавайте вопрос: «Каковы последствия ошибки в этом коде?»

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

Эту мудрость и называют риск-менеджментом.

Понимание ИИ

ИИ манит «магией»: «вбей запрос — и всё сделается». Но для профессиональной работы важно понимать, как это работает.

Пример: LLM могут ошибаться, считая буквы в слове «strawberry». Но если добавить «use python» — ответ правильный. Почему? Потому что модель не считает символы, но умеет писать код, который умеет считать.

Понимание токенизации, контекстных окон, «проседания» в середине диалога — помогает писать лучшие промпты.

Например, «compaction» может сжать диалог, но упустить важное. Если окно контекста заполняется — стоит ли сохранить ключевые моменты в файл?

Не впадайте в карго-культы вроде «всегда используйте Agent Skills». Понимайте суть: что значит «не загружать сразу» и почему это хорошо.

Полезно разобраться, как из чатботов делают агентов. Аллен Хатчинсон из Google DeepMind пишет серию «The Agentic Shift». Минимальную систему можно собрать самому — но в работе лучше использовать готовые решения с учётом всех нюансов.

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

Понимание программирования

Всё вышеперечисленное — полезно, но не главное.

Джоэл Спольски ещё в 2002 году сказал: все абстракции «протекают».

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

Чтобы писать хороший код с ИИ, нужно самому быть профессионалом. Мы в Kodik ловили ИИ на предложении опасного упрощения в критичном участке кода. Спасло только ревью.

Даже опытным разработчикам важно не атрофировать навыки. Митчелл Хашимото даёт ИИ задачу в фоне — но сам пишет код вручную для другой. Так он и производительность повышает, и «хватку» не теряет.

ИИ можно использовать и для обучения: не «сделай за меня», а «помоги мне разобраться». Показываете код — и задаёте вопросы. Саймон Уиллисон создал инструмент Showboat для «прохождения кода» с объяснениями.

Кто-то использует ИИ, чтобы отключить голову. Кто-то — чтобы включить её сильнее.

Обучение программированию

Что делать с новым поколением, которое приходит в мир, где код «появляется магически»? Как не превратить их в персонажей «ВАЛЛ-И», разучившихся думать?

Андрей Карпатый (бывший Tesla, GPT) беспокоится об этом. Он хочет с помощью ИИ перестроить обучение. Но Eureka Labs пока не запущен.

Мы в Kodik Education работаем с вузами и школами. Уже пришли к таким тезисам:

  • Главное — не пропускать путь к решению. Задания должны фокусироваться не на ответе, а на процессе. Проверяйте не только X, но и объяснение.
  • ИИ — помощник в обучении. Его можно использовать для проверки рассуждений, но не замены учителя.
  • Визуализация помогает понимать «под капотом». Что если при запуске простой игры видеть, как меняется память? Это делает обучение познавательнее.

Мы развиваем эти идеи. Если вы в сфере образования — свяжитесь с нами. Давайте делать это вместе.

В заключение

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

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

Читать оригинал