Mục tiêu học tập
Sau bài này, bạn sẽ có thể:- ✅ Nắm vững 4 phases của workflow EPCC (Explore, Plan, Code, Commit) và mục đích riêng của từng phase
- ✅ Biết khi nào nên skip phase nào và khi nào cần lặp lại nhiều vòng
- ✅ Dùng Plan Mode đúng cách để align với Claude trước khi code, tránh course-correct tốn kém
- ✅ Setup test suite và tools phù hợp để Code phase chạy mượt, ít back-and-forth
- ✅ Tạo subagent code reviewer cho Commit phase để có “fresh pair of eyes” trước khi push
Mở đầu: Hai dev, cùng task, kết quả ngược nhau
Hãy tưởng tượng hai backend engineer — Minh và An — nhận cùng một ticket vào sáng thứ Hai:“Add WebP conversion to the image upload pipeline.”Minh (làm việc theo cách cũ): Mở Claude Code, prompt thẳng:
“Add WebP conversion to our image upload pipeline.”Claude bắt đầu viết code. Nó tìm một file tên
upload.ts, thêm thư viện sharp, viết converter. Trông có vẻ ổn. Minh approve, Claude tiếp tục. 20 phút sau, build error vì project thực ra dùng jimp không phải sharp. Fix xong, lại có lỗi khác — hoá ra pipeline upload không phải ở upload.ts mà ở một middleware chain phức tạp hơn nhiều. Claude đã đoán sai entry point. Sửa tiếp. Test fail. Debug. 2 tiếng sau, Minh vẫn đang loay hoay với một đống code chắp vá.
An (dùng EPCC workflow): Shift+Tab vào Plan Mode, prompt:
“I need to add WebP conversion to our image upload pipeline. Figure out where in the pipeline it should happen, whether we need new dependencies, and how to approach it.”Claude đọc file, khám phá codebase, tìm ra: pipeline upload nằm ở
middleware/storage.ts và project đã có jimp rồi — không cần thêm dependency. 5 phút sau, Claude trả ra plan chi tiết. An đọc, thấy hợp lý, comment thêm một yêu cầu về xử lý animated GIF, Claude revise plan. An approve. Claude execute từng bước theo plan, chạy test suite, commit gọn. Tổng thời gian: 25 phút.
Sự khác biệt không phải do An giỏi hơn Minh. Sự khác biệt nằm ở workflow.
“If you take one thing away from this course, let it be this workflow.”— Boris Cherny, creator of Claude CodeEPCC không phải overhead. Nó là cái làm cho bạn nhanh hơn, không phải chậm hơn.
EPCC: Bức tranh toàn cảnh
Tỷ lệ thời gian trên là ước tính minh hoạ cho một task medium complexity (vài giờ). Với task nhỏ hơn, Explore + Plan có thể chỉ chiếm 10-15%. Với task phức tạp (refactor kiến trúc), Plan có thể chiếm 50%+. Không phải con số cứng.
Phase 1: EXPLORE — Đừng để Claude đoán
Tại sao phase này tồn tại
Claude Code không có sẵn kiến thức về codebase của bạn. Nó không biết:- Image upload pipeline của bạn nằm ở đâu
- Project đã có những thư viện nào
- Convention đặt tên function/file của team bạn
- Business logic đặc thù nào đang được xử lý trong pipeline đó
Hai cách Explore
Cách 1: Plan Mode (read-only)
Nhấn Shift + Tab cho tới khi thấy “Plan Mode” xuất hiện dưới text input. Trong Plan Mode, Claude không thể edit files — nó chỉ đọc, search, và nghiên cứu codebase của bạn. Đây là trạng thái lý tưởng cho Explore vì:- Claude không thể “slip” và bắt đầu viết code giữa chừng
- Mọi “tool call” đều là read-only (grep, glob, file read, web search)
- Bạn có thể để Claude chạy thoải mái mà không lo nó sửa nhầm gì
Cách 2: Prompt explicit (không cần Plan Mode)
Nếu bạn chỉ muốn hiểu codebase mà không có ý định thay đổi ngay:Explore nên tìm ra điều gì
Sau phase Explore, bạn và Claude nên biết được:Anti-pattern: Skip Explore
Triệu chứng phổ biến nhất khi skip Explore:- Claude viết code sử dụng thư viện không có trong project (phải thêm dependency không cần thiết)
- Claude sửa file không phải entry point thực sự
- Code mới không match convention của codebase (naming, structure, error handling)
- Build lỗi ngay lần đầu vì môi trường không phù hợp
Phase 2: PLAN — Nơi rẻ nhất để course-correct
Tại sao Plan quan trọng hơn Code
Hãy nghĩ về chi phí thay đổi ở từng giai đoạn:Cách vào Plan Mode
Cách viết prompt tốt cho Plan phase
Prompt Plan phase phải trả lời 3 câu hỏi:- Task là gì? (mô tả rõ ràng, không mơ hồ)
- Constraints là gì? (thứ Claude KHÔNG được làm hoặc phải tuân theo)
- Success trông như thế nào? (test suite pass? API endpoint trả đúng response? UI render đúng?)
Claude trả plan — bạn làm gì?
Sau khi Claude trả plan, đừng approve ngay. Đây là lúc bạn đọc kỹ và hỏi:- Plan này có miss bất kỳ edge case nào không?
- Có bước nào mà bạn không đồng ý về approach?
- Thứ tự các bước có hợp lý không?
- Plan có conflict với architectural decision nào của team không?
Bảng: Plan tốt vs Plan kém
Lặp lại Plan nếu cần
Với task phức tạp, bạn có thể cần nhiều vòng Plan trước khi approve:Phase 3: CODE — Execute có kiểm soát
Sau khi approve plan
Khi bạn approve plan, Claude sẽ bắt đầu execute từng bước. Thoát khỏi Plan Mode (nhấn Shift + Tab để quay lại chế độ bình thường), và bạn cần quyết định: Auto Accept hay Manual Accept?
Với task medium (như WebP conversion), Auto Accept sau khi đã review plan là hợp lý. Với task liên quan auth, payment, hay security — Manual Accept an toàn hơn.
3 yếu tố làm Code phase mượt
Yếu tố 1: Success criteria explicit
Claude cần biết “đúng” trông như thế nào. Nếu success criteria mơ hồ, Claude sẽ không biết khi nào nên dừng và sẽ over-engineer hoặc dừng quá sớm. Trong plan hoặc prompt đầu Code phase, nói rõ:Yếu tố 2: Add tools phù hợp
Claude Code làm việc tốt hơn khi có tools để verify kết quả của nó. Ví dụ:- Web UI? Cài Claude in Chrome extension để Claude Code control browser tab, test UI trực tiếp mà không cần bạn describe lại
- Test suite? Đảm bảo lệnh chạy test rõ ràng (
npm test,pnpm test --run,pytest -v). Claude sẽ tự chạy sau khi implement - Linting? Nếu bạn muốn Claude tự sửa lint errors, cho Claude biết lệnh lint (
npm run lint --fix)
Yếu tố 3: Test suite là source of truth
Đây là yếu tố quan trọng nhất. Nếu bạn có test suite mà Claude có thể chạy liên tục, Code phase sẽ thành một vòng lặp tự sửa:Xử lý khi Claude bị kẹt lặp lại
Đôi khi Claude mắc đi mắc lại cùng một lỗi. Đây là dấu hiệu nó đang thiếu một context quan trọng. Cách xử lý:CLAUDE.md — từ session sau, nó không cần học lại lỗi đó nữa. Xem chi tiết ở Bài 2.7: File CLAUDE.md.
Multi-Claude: Chạy song song cho task lớn
Khi bạn có nhiều task không liên quan, không cần đợi task này xong mới làm task kia. Một pattern phổ biến trong cộng đồng:“People run 4-6 Claude instances simultaneously — separate git worktrees, different tasks, no interference.”Cách setup:
Async Accept mode
Một tính năng ít được biết đến: Async Accept mode. Nhấn Shift + Enter khi Claude đang chạy để chuyển sang chế độ này. Trong Async Accept:- Claude tiếp tục chạy trong background
- Bạn có thể switch sang task khác hoàn toàn
- Terminal notification khi Claude xong
Phase 4: COMMIT — Gate trước khi push
Tại sao cần phase riêng cho Commit
Nhiều người coi commit là một thao tác kỹ thuật đơn giản:git add -A && git commit -m "..." && git push. Nhưng với workflow AI-assisted, Commit phase có vai trò quan trọng hơn: đây là lúc bạn hoặc subagent reviewer đọc lại toàn bộ changes với “fresh eyes”.
Claude đã ở trong session đó từ đầu. Nó có bias — nó đã viết code đó, nó “biết” code đó “đúng”. Một subagent reviewer bắt đầu fresh, không có bias đó.
Subagent code reviewer
Trước khi commit, spawn một subagent để review:Claude generate commit message
Sau khi review xong (hoặc fix issues từ review), để Claude generate commit message:GitHub Actions integration
Nếu bạn đã setup GitHub Actions với Claude (xem Bài 2.6), bạn có thêm một layer automation sau khi push:Khi nào skip phase nào?
EPCC là workflow tối ưu cho task vừa và lớn. Nhưng áp dụng full 4 phases cho mọi task là overhead không cần thiết. Đây là bảng quyết định:
Tiny task — Không cần Explore hay Plan:
Ví dụ thực chiến đầy đủ: “Add WebP conversion to image pipeline”
Đây là toàn bộ workflow EPCC từ đầu đến cuối, dùng chính task từ story mở đầu.Setup
Phase 1: EXPLORE (5-7 phút)
- Pipeline:
middleware/storage.ts(entry point) →services/upload.service.ts(business logic) - Library:
jimpđã có trongpackage.json - Tests:
tests/upload/— 12 test cases hiện tại - S3:
services/s3.service.tsvới methoduploadBuffer()
Phase 2: PLAN (8-10 phút)
Phase 3: CODE (15-20 phút)
- Install
@jimp/plugin-webp, updatepackage.json - Tạo
services/image.service.tsvớiconvertToWebP()function - Update
middleware/storage.ts— gọi converter trước upload - Update
services/upload.service.ts— handle WebP filename - Viết
tests/upload/webp-conversion.test.ts— 6 test cases
npm test fail ở test case “large file error” vì Claude implement sai điều kiện. Claude tự đọc error log, sửa, chạy lại. Test pass.
Output cuối:
Phase 4: COMMIT (3-5 phút)
convertToWebP(), thêm test.” Claude sửa, test pass.
Case studies theo role
Backend Engineer: Refactor service architecture
Tình huống: Senior BE Engineer ở fintech startup cần refactor payment service từ monolithic sang microservices pattern. Scope lớn (~2 ngày estimate). EPCC approach:- Explore: Spawn 4 subagents song song, mỗi cái map 1 module (payment, billing, notification, webhook). Main agent tổng hợp map tổng thể — 30 phút thay vì 1 ngày đọc code thủ công.
- Plan: Nhiều rounds — Plan tổng thể phases (ngày 1), Plan chi tiết phase 1 (sáng ngày 2), Plan chi tiết phase 2 (chiều). Mỗi plan document được lưu ra file
.mdtrong repo và commit vào branch. - Code: Phased execution. Phase 1 extract payment → commit. Phase 2 extract billing → commit. Không làm một lần vì scope quá lớn.
- Commit: Per-phase commit với review. Tổng cộng 8 commits nhỏ thay vì 1 commit khổng lồ.
Frontend Engineer: Ship UI feature mới
Tình huống: FE Engineer implement “dark mode toggle” cho dashboard. Task medium, 1 buổi sáng. EPCC approach:- Explore: Claude đọc
theme/,tailwind.config.ts, tìm hiểu cách color tokens được defined. - Plan: Một round đủ — plan đơn giản, 10 phút. Bao gồm: CSS variables, localStorage persistence, system preference detection.
- Code: Auto Accept mode. Claude in Chrome extension để verify UI trực tiếp trong browser. Claude test light/dark toggle, verify cả 3 cases (manual, system pref, localStorage).
- Commit: Subagent review nhanh. Commit gọn.
Open source maintainer: Review và merge contributor PRs
Tình huống: Maintainer của popular npm package, nhận PR từ contributor. Code đã được review về logic, cần verify implementation và run tests. EPCC approach (modified):- Explore: Skip (đã biết codebase của mình rồi)
- Plan: Skip (contributor đã có plan trong PR description)
- Code: Checkout PR branch, run test suite, dùng Claude để verify logic và edge cases
- Commit: Subagent review nhanh → approve → merge hoặc request changes
Anthropic team: 22.000-line RL code change
Đây là case study thực từ inside Anthropic, được chia sẻ trong engineering blog:“Days of human planning. Concentrated implementation on ‘leaf nodes’ — code that nothing else depends on. Human review focused on extensible parts. Stress tests for stability, verified inputs/outputs without reading all code. Result: just as confident as any other change, delivered in a tiny fraction of time.”Bài học:
- Explore: Extensive — toàn bộ team hiểu codebase trước khi plan
- Plan: Days — không phải giờ, không phải phút
- Code: Focused trên leaf nodes — code mà không có gì depend vào, nên technical debt nhỏ ở đây acceptable
- Commit: Chia nhỏ, nhiều phases, với stress test riêng
Solo founder (vibe-coding): Ship nhanh, iterate
Tình huống: Indie hacker build SaaS một mình, ưu tiên speed-to-market, codebase chỉ mình biết. EPCC approach (simplified):- Explore: Ngắn — bạn đã biết codebase của mình
- Plan: Dài hơn mức cần thiết vì Plan là lúc bạn think through feature, không chỉ align với Claude
- Code: Skip manual review chi tiết từng dòng. Trust test suite. Focus vào behavior, không phải code.
- Commit: Light review, commit nhanh, iterate
Anti-patterns: Những cái bẫy phổ biến
Anti-pattern 1: Skip Plan để “save time”
Triệu chứng: “Plan Mode tốn thêm 10 phút, tôi muốn đi thẳng vào code.” Tại sao sai: 10 phút Plan → tiết kiệm 30-90 phút debug. Đặc biệt với task medium trở lên. Hệ quả: Claude đoán sai approach, viết code không match codebase, phải rollback và restart. Fix: Luôn Plan cho task medium+. Đối với tiny task (fix typo, rename), skip Plan là đúng — nhưng đó là exception, không phải rule.Anti-pattern 2: Analysis paralysis — Plan mãi, không Code
Triệu chứng: Revise plan lần thứ 6, vẫn thấy “chưa perfect”, không dám approve. Tại sao sai: Plan không thể predict mọi thứ. Một số vấn đề chỉ xuất hiện khi bắt đầu implement. Fix: Plan đủ tốt (không cần perfect) → approve → Code → điều chỉnh khi gặp vấn đề thực tế. Nguyên tắc: nếu plan đã cover happy path + main edge cases, approve. Refinement xảy ra trong Code phase.Anti-pattern 3: Code không có test suite
Triệu chứng: Không có test, hoặc test nhưng không reliable. Tại sao sai: Không có test → Claude không thể tự verify → phải hỏi bạn sau mỗi bước → back-and-forth tốn thời gian của cả hai. Tệ hơn: bạn không biết feature “đúng” hay không cho đến khi manual test. Fix: Đầu tư viết test suite ngay từ đầu. Nếu chưa có, prompt Claude viết test trước khi implement. Test là “source of truth” cho cả bạn và Claude.Anti-pattern 4: Commit không review
Triệu chứng: Code xong →git add -A && git commit -m "..." && git push không review.
Tại sao sai: Claude có bias từ session. Nó “biết” code đó đúng vì chính nó viết. Subagent reviewer fresh không có bias đó và thường catch được issues Claude bỏ qua.
Fix: Dù review nhanh 2 phút hay subagent chi tiết 5 phút — luôn có một bước review trước commit.
Anti-pattern 5: Full EPCC cho tiny task
Triệu chứng: Fix typo một chữ mà vẫn vào Plan Mode, viết plan chi tiết. Tại sao sai: Overhead của workflow lớn hơn task. Làm mất đà và demotivating. Fix: Calibrate theo task size. Tiny task → Code + Commit trực tiếp. Workflow là công cụ, không phải nghi lễ bắt buộc mọi lúc.Mẹo nâng cao
Mẹo 1: /rewind — rollback khi đi sai hướng
Nếu Claude bắt đầu implement theo hướng sai (ngay cả khi bạn đã approve plan), bạn có thể rollback:/rewind đưa bạn về conversation state trước đó, bao gồm cả code state (nếu Claude dùng checkpoint). Không phải lúc nào cũng rollback hoàn hảo — git worktree hoặc git stash vẫn là safety net tốt hơn — nhưng /rewind nhanh hơn nhiều cho quick course-correct.
Mẹo 2: /compact giữa các phases
Sau Explore phase, context đã chứa nhiều nội dung file bạn explore. Trước khi vào Plan phase, compact:Mẹo 3: Plan-as-document
Với task lớn, đừng để plan chỉ tồn tại trong conversation. Lưu ra file:- Plan được commit vào repo — team khác xem được
- Nếu session crash, bạn vẫn có plan
- Sau khi done, plan trở thành documentation
- Có thể reference lại trong future sessions
Mẹo 4: Test-driven prompt
Thay vì “implement feature X”, thử:Mẹo 5: Sử dụng CLAUDE.md để persist workflow rules
Nếu bạn có workflow rules mà muốn Claude follow mọi lúc (ví dụ: “luôn chạy tests trước commit”, “không thêm dependency mà không hỏi”), đưa vàoCLAUDE.md:
Áp dụng ngay
Bài tập 1: Full EPCC trong 30 phút
Chọn 1 task vừa phải trong project bạn đang làm. Không quá lớn (không phải refactor toàn bộ architecture), không quá nhỏ (không phải sửa typo). Ví dụ tốt: thêm 1 endpoint mới, implement 1 validation logic mới, refactor 1 function phức tạp. Áp dụng full EPCC và ghi chép:Bài tập 2: A/B test workflow
Trong 1 sprint, làm 2 task tương tự nhau. 1 task với full EPCC, 1 task không dùng EPCC (làm theo cách cũ). Đo:- Time-to-merge (từ lúc bắt đầu đến khi PR được merge)
- Số lần phải rollback hoặc rewrite
- Số bug report sau khi merge (nếu có)
- Cảm giác chủ quan: task nào ít stress hơn?
Tóm tắt
Explore → Plan → Code → Commit là workflow trung tâm của mọi thứ trong khoá này. 5 takeaways quan trọng nhất:- EPCC không phải overhead — đây là cái làm cho bạn nhanh hơn, không chậm hơn. 50% thời gian dành cho Explore + Plan là investment, không phải waste.
- Plan Mode là công cụ alignment — nó force bạn và Claude phải agree trước khi code được viết. Đây là nơi rẻ nhất, nhanh nhất để course-correct.
- Test suite là multiplier — có test suite = Code phase tự vận hành. Không có test suite = bạn phải làm QA thủ công sau mỗi bước.
- Subagent reviewer = fresh eyes — Claude có bias từ session. Subagent reviewer không có. 5 phút review có thể catch bug mà 2 tiếng code không thấy.
- Calibrate theo task size — Tiny task: Code + Commit. Medium: full EPCC. Hard: EPCC nhiều vòng, commit nhiều phases. Workflow là công cụ, không phải nghi lễ.
Bài tiếp theo
Bạn vừa học workflow EPCC — vòng lặp cốt lõi khi làm việc với Claude Code. Nhưng khi áp dụng trong thực tế, bạn sẽ gặp ngay vấn đề: context window. Session dài, nhiều file đọc, nhiều tool calls → context bắt đầu đầy và Claude bắt đầu “quên” giữa chừng. Bài 2.5: Quản lý Context sẽ dạy bạn cách dùng/context, /compact, /clear đúng lúc để session dài mượt hơn — và 5 chiến thuật tiết kiệm context từ đầu. Đây là kỹ năng bạn cần ngay lần đầu chạy EPCC trên task thực.
➡️ Bài tiếp theo: Bài 2.5 — Quản lý Context
Tài liệu tham khảo
- Claude Code best practices — Anthropic engineering blog
- Introducing Claude Code — Launch post với demo workflow
- Vibe coding in production — Philosophy của workflow AI-assisted development
- Video transcript: “The Explore → Plan → Code → Commit Workflow” — Claude Code 101 course, Lesson 2.4
- Claude in Chrome extension — Tool cho Code phase (web UI testing)
- Lệnh quan trọng: Shift+Tab (Plan Mode), Shift+Enter (Async Accept mode), Escape Escape (/rewind)