Цикл: намерение → генерация → ревью → доработка
Всё в этой книге сводится к одному циклу. Усвойте его.
Цикл крутится, пока вывод не дойдёт до вашей планки, — и ревью каждый раз остаётся воротами, которые нужно пройти:
┌──────────────────────────────────────────────┐
│ │
▼ │
┌────────┐ ┌──────────┐ ┌────────┐ ┌──────────┐
│ЗАМЫСЕЛ │ ─▶ │ ГЕНЕРАЦ. │ ─▶ │ ОБЗОР │ ─▶ │ДОРАБОТКА │
│ СПЕЦ │ │ (AI) │ │ ТЫ │ │ ТЫ │
└────────┘ └──────────┘ └───┬────┘ └──────────┘
│
прошло? ▼
┌──────────┐
│ РЕЛИЗ │
└──────────┘
- Намерение. Сформулируйте, что вы хотите, и значимые ограничения — входные данные, выходные, граничные случаи, стек, стиль. Расплывчатое намерение даёт расплывчатый код.
- Генерация. Дайте модели написать реализацию. Не водите её за руку по синтаксису; описывайте поведение.
- Ревью. Прочитайте то, что вернулось. Оно действительно делает то, что нужно? Обрабатывает ли оно пустой список, null, сбой сетевого вызова? Это простейшая рабочая версия?
- Доработка. Укажите, что не так, дайте конкретную поправку и перегенерируйте. Повторяйте, пока не дотянет до вашей планки.
Большинство новичков пропускают шаг 3. Они генерируют, оно запускается, они идут дальше. А потом оно ломается в проде на случае, который они никогда не описали. Шаг ревью — это место, где происходит инженерия.
Вот как выглядит хороший первый промпт в этом цикле:
Напиши функцию TypeScript `parseDuration(input: string): number`,
которая переводит строки вроде "1h30m", "45s", "2d" в общее число секунд.
Требования:
- Поддержи единицы: d (дни), h (часы), m (минуты), s (секунды).
- Несколько единиц можно сочетать: "1h30m" = 5400.
- Отклоняй некорректный ввод (пустой, неизвестные единицы, отрицательный),
бросая Error с понятным сообщением.
- Без внешних библиотек. Добавь 5 модульных тестов на крайние случаи.
Покажи только функцию и тесты.
Обратите внимание на структуру: точная сигнатура, явные правила, названные граничные случаи, заявленные ограничения и запрос на тесты. Вы не надеетесь, что модель угадает правильно, — вы убираете неоднозначность, которая порождает плохие догадки.
Шаг доработки — такой же навык, как и первый промпт. Расплывчатая обратная связь даёт расплывчатые правки. Сравните эти две поправки:
Плохо: "это неправильно, исправь"
Хорошо: "parseDuration('1h30m') возвращает 90 вместо 5400 — ты
складываешь числа, но игнорируешь множители единиц. Перед
сложением умножь каждое значение на секунды его единицы
(d=86400, h=3600, m=60, s=1). И добавь тест для случая '2d3h'."
Хороший вариант называет симптом, причину и исправление. Вы ревьюите так же, как ревьюили бы коллеги, — и чем точнее вы указываете, тем меньше витков тратите. Каждый цикл должен сходиться. Если вы ловите себя на хождении по кругу — это сигнал, что ваше намерение было недоспецифицировано; перестаньте перегенерировать и вместо этого перепишите спецификацию.