JavaRush /Курсы /Claude code /Plan-first и review-first workflow

Plan-first и review-first workflow

Claude code
4 уровень , 3 лекция
Открыта

1. «Делай» — самая дорогая команда

Доказательства собраны, критерии приёмки готовы — тянет сразу сказать Claude «правь». Не торопитесь. Самый дорогой артефакт на нетривиальной задаче — не плохой код, а плохой порядок работы. План починить дешевле, чем diff.

В нашем Commerce OS refund-запрос иногда обрабатывается повторно: платежи, внешняя интеграция, риск повторных списаний. Скажете «исправь refunds и покажи готовое» — Claude и сделает ровно это, быстро и с энтузиазмом. На выходе diff, где полезные правки перемешаны с лишним рефакторингом и «улучшениями», которых никто не просил.

Сравните:

Плохо:
«Исправь проблему с refund и сразу сделай всё, что нужно».

Лучше:
«Сначала исследуй refund flow, назови затронутые файлы, риски и план.
Код пока не меняй».

Вторая покупает главное — паузу до редактирования. С неё начинается plan-first. Пауза не тормозит работу, а снижает цену ошибки — особенно где цена в деньгах и данных, а не только во времени.

2. Шесть фаз цикла

У каждой фазы своя задача и свой результат. Это не бюрократия, а инженерная последовательность.

Фаза Главный вопрос Что должно появиться на выходе
Explore Что у нас есть сейчас? Файлы, текущий поток, evidence, риски
Plan Что и в каком порядке меняем? Короткий план шагов, границы, стоп-условия
Implement Что делаем прямо сейчас? Небольшой diff по одному шагу
Verify Работает ли это по плану? Тесты, команды, логи, наблюдаемые результаты
Review Стоит ли принимать именно такое изменение? Проверка scope, качества diff, рисков
Commit / PR Как зафиксировать результат? Понятный commit, краткое описание, артефакт для ревью

Цикл не линейный. Падают проверки на Verify — назад к Plan. На Review diff полез не в те файлы — откатываетесь, а не дожимаете.

flowchart TD
    A[Explore] --> B[Plan]
    B --> C[Implement]
    C --> D[Verify]
    D --> E[Review]
    E --> F[Commit / PR]
    D -- проверки не прошли --> B
    E -- scope поплыл или найден риск --> B

В этом и review-first: думаете не только как быстрее поменять, но и как другой человек — или вы сами через час — будет это читать и принимать.

3. Explore — карта до правок

Explore кажется скучной до первого «я и так всё понял», после которого нужная логика оказывается не там. Это исследование перед действием: вы не чините систему, а строите её рабочую карту. В refund-задаче просите Claude пройти цепочку возврата, назвать входные точки, сервисы, тесты и опасные места. Ключевое — без редактирования.

Исследуй refund flow. Код не меняй.
Верни:
1) затронутые файлы,
2) текущий путь данных,
3) существующие tests,
4) возможные риски.

Плохой результат: «кажется, проблема в PaymentClient». Хороший: «Возврат начинается в RefundController, идёт в RefundService, вызывает PaymentClient. Есть RefundServiceTest, но нет теста на повторный retry. Риск — изменить публичный refund API». Это ещё не Plan — пока карта местности.

Здесь и видно, зачем мы раньше собирали пакет доказательств. Дадите логи, affected files и reproduction steps — Claude исследует предметно. Дадите «refund работает странно» — начнёт гадать, причём уверенно.

4. Plan — договор, а не пожелание

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

## План
1. Добавить защиту от повторной обработки в `RefundService`.
2. Пробросить идентификатор идемпотентности в `PaymentClient`.
3. Добавить regression test на повторный retry.

## Риски
- случайное изменение публичного refund API
- несовместимость с текущим retry-поведением

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

Запишите ожидаемый workflow прямо в TASK_SPEC.md — отдельным разделом того же task package, рядом с критериями приёмки и планом проверки. Claude получает не только цель, но и порядок работы:

## Ожидаемый workflow
1. Explore: прочитать текущий refund flow без edits
2. Plan: вернуть шаги и риски
3. Implement: менять по одному шагу
4. Verify: выполнить проверки из плана проверки
5. Review: показать diff и ограничения

План утверждается до кода — и будущий diff удобно читать. Иначе заранее программируете себе тяжёлое ревью.

Тот же путь Explore → Plan → Review можно вынести в облачный планировщик — агента с расширенным контекстом и встроенной проверкой плана (условно /ultraplan или аналогичная команда; точное имя и доступность могут меняться от версии к версии). Подробнее разберём в следующих уровнях курса — сначала на реальной issue, затем на плане миграции.

Одно неизменно: решение «берём этот план в работу» остаётся за человеком. Планировщик ускоряет проработку и даёт второе мнение, но утверждает план разработчик.

5. Implement — по одному шагу

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

Для первой итерации:

Сделай только шаг 1 из плана.
Не переходи к шагу 2.
Меняй только `RefundService` и связанный test, если это действительно нужно.
После правок покажи diff и остановись.

Это не лимит объёма, а защита Review. Diff на два файла и двадцать строк — с ним можно жить. Тронул форматирование в шести соседних классах — проблема видна сразу, пока маленькая.

После каждого meaningful step смотрите хотя бы сводку:

git diff --stat
# RefundService.java     | 12 +++++++++---
# RefundServiceTest.java |  8 ++++++++

Локально и предсказуемо. Вместо двух файлов одиннадцать — момент нажать на тормоз, а не «потом разберёмся».

Plan-first не запрещает скорость. Он не даёт ей перейти в беспорядок.

6. Verify и Review — это разные фазы

Здесь спотыкаются: обе фазы вроде про проверку. Но Verify отвечает на «работает ли решение по критериям?», а Review — на «готовы ли принять именно такое изменение в проект?».

Сравнить это удобно в маленькой таблице:

Фаза На что смотрим
Verify Тесты, команды, логи, скриншоты, ожидаемое поведение
Review Границы задачи, лишние файлы, понятность правок, риски, совместимость

Запустили проверку из плана проверки:

./gradlew :billing:test --tests RefundServiceTest
# BUILD SUCCESSFUL

Verify прошла. Праздновать рано: тесты зелёные, а diff мог изменить публичный метод, добавить рефакторинг или тихо поменять поведение в соседнем классе. На Review вы смотрите на diff глазами. Почему правка полезла в эти файлы? Не проскочил ли «заодно» рефакторинг? Не исчезли ли важные комментарии? Не изменился ли внешний контракт? Это не недоверие к Claude, а приёмка инженерного изменения.

Запомните: зелёный тест доказывает, что в проверяемом месте ничего не сломалось. Не то, что изменение хорошее, чистое и безопасное.

7. Commit / PR — фиксация решения

Тянет закончить на «тесты зелёные, значит готово». Но пока результат не упакован в commit или PR-описание, у вас не завершённая задача, а набор изменений в рабочем каталоге. Даже один аккуратный commit меняет качество работы:

Плохо:
misc fixes

Лучше:
fix(refunds): предотвратить дубликат возврата при повторе

Во втором случае сразу понятно, что произошло. Ещё лучше — описание в стиле PR-summary:

## Что изменено
Защита от повторной обработки refund при retry.

## Как проверено
Regression test + локальный сценарий из плана проверки.

## Риски
Нужно следить за совместимостью текущего retry-поведения.

Оформляете не «лишь бы закоммитить», а чтобы следующее чтение было лёгким. Через два дня деталей в голове не останется, а commit message и summary хранят смысл лучше памяти. Коммит — не археологический слой из случайных правок и комментариев «потом убрать». Он фиксирует принятое решение.

8. Когда plan-first обязателен, а когда короче

Полный цикл на всё подряд — возненавидите свой workflow. Нет цикла где он нужен — возненавидите свои диффы. Соотносите процесс с риском задачи:

Формальный plan-first обязателен Можно обойтись коротким путём
незнакомый участок проекта исправление опечатки
multi-file change локальная правка текста в README
auth / payments / database / config одноточечная правка комментария
refactor в боевом коде маленькое форматирование в одном файле
неясный scope очевидный фикс в одну строку без побочных эффектов
чувствительное production-поведение мелкая косметика в уже понятном месте

И помните: permission mode не заменяет plan-first. Даже если Claude правит файлы без подтверждений, задача понятнее не становится. Быстрый хаос остаётся хаосом — просто быстрее.

Правило на каждый день: появился хотя бы один признак риска — несколько файлов, неочевидная причина бага, чувствительная зона, угроза совместимости — включаете паузу до редактирования. Сначала Explore, потом Plan, и только потом Implement.

Так Claude перестаёт быть автоматом по выдаче diff'ов и становится инженерным инструментом. Не потому, что поумнел, а потому, что вы перестали бросать его в код без карты, плана и точки приёмки.

1
Задача
Claude code, 4 уровень, 3 лекция
Недоступна
Review текущего diff внутри Claude CLI
Review текущего diff внутри Claude CLI
1
Задача
Claude code, 4 уровень, 3 лекция
Недоступна
Анализ нарушения plan-first workflow
Анализ нарушения plan-first workflow
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ