Цикл: намерение → генерация → ревью → доработка
Всё в этой книге сводится к одному циклу. Усвойте его.
- Намерение. Сформулируйте, что вы хотите, и значимые ограничения — входные данные, выходные, граничные случаи, стек, стиль. Расплывчатое намерение даёт расплывчатый код.
- Генерация. Дайте модели написать реализацию. Не водите её за руку по синтаксису; описывайте поведение.
- Ревью. Прочитайте то, что вернулось. Оно действительно делает то, что нужно? Обрабатывает ли оно пустой список, null, сбой сетевого вызова? Это простейшая рабочая версия?
- Доработка. Укажите, что не так, дайте конкретную поправку и перегенерируйте. Повторяйте, пока не дотянет до вашей планки.
Большинство новичков пропускают шаг 3. Они генерируют, оно запускается, они идут дальше. А потом оно ломается в проде на случае, который они никогда не описали. Шаг ревью — это место, где происходит инженерия.
Вот как выглядит хороший первый промпт в этом цикле:
Write a TypeScript function `parseDuration(input: string): number`
that converts strings like "1h30m", "45s", "2d" into total seconds.
Requirements:
- Support units: d (days), h (hours), m (minutes), s (seconds).
- Multiple units can combine: "1h30m" = 5400.
- Reject invalid input (empty, unknown units, negative) by throwing
an Error with a clear message.
- No external libraries. Include 5 unit tests covering the edge cases.
Show the function and tests only.
Обратите внимание на структуру: точная сигнатура, явные правила, названные граничные случаи, заявленные ограничения и запрос на тесты. Вы не надеетесь, что модель угадает правильно, — вы убираете неоднозначность, которая порождает плохие догадки.
Шаг доработки — такой же навык, как и первый промпт. Расплывчатая обратная связь даёт расплывчатые правки. Сравните эти две поправки:
Плохо: "this is wrong, fix it"
Хорошо: "parseDuration('1h30m') returns 90 instead of 5400 — you're
summing the numbers but ignoring the unit multipliers. Multiply
each value by its unit's seconds (d=86400, h=3600, m=60, s=1)
before summing. Also add a test for the combined case '2d3h'."
Хороший вариант называет симптом, причину и исправление. Вы ревьюите так же, как ревьюили бы pull request коллеги, — и чем точнее вы указываете, тем меньше витков тратите. Каждый цикл должен сходиться. Если вы ловите себя на хождении по кругу — это сигнал, что ваше намерение было недоспецифицировано; перестаньте перегенерировать и вместо этого перепишите спецификацию.