Mục tiêu học tập
Sau bài này, bạn sẽ có thể:- ✅ Viết prompt hiệu quả — đủ context, đủ constraint, đủ success criteria
- ✅ Phân biệt 3 permission modes: Default, Auto Accept, Plan Mode — và biết khi nào dùng cái nào
- ✅ Kích hoạt Plan Mode đúng lúc để tránh Claude “lao đầu viết code” khi task còn mơ hồ
- ✅ Hiểu Boris’s 3-task framework — Easy/Medium/Hard — để chọn cách tiếp cận phù hợp
- ✅ Tự tay chạy demo Dark Mode Toggle end-to-end theo Plan Mode workflow
Mở đầu: Tại sao prompt đầu tiên quan trọng hơn bạn nghĩ
Hãy hình dung bạn mới cài Claude Code xong. Terminal đang mở. Bạn hào hứng gõ vào:“Viết cho tôi một function login.”Claude bắt đầu chạy. Sau 2 phút, bạn nhận được một file
login.ts 80 dòng. Nhưng khi nhìn kỹ — nó dùng express-session, trong khi project của bạn đang dùng JWT. Nó tạo endpoint /login riêng, trong khi codebase đã có authRouter. Nó viết bcrypt theo kiểu cũ, trong khi team đã chuẩn hoá dùng argon2.
Bạn mất 20 phút gỡ ra và viết lại. Lần này tốn nhiều thời gian hơn làm tay.
Vấn đề không phải ở Claude. Vấn đề ở prompt.
Boris Cherny — kỹ sư chủ chốt trong nhóm phát triển Claude Code tại Anthropic — có một lời khuyên ngược đời mà nhiều người bỏ qua:
“Don’t use Claude Code to write code first. Use it to ask questions about the codebase.”Đây là sự khác biệt về mindset: prompt không phải là command — prompt là brief. Bạn không đang ra lệnh cho một cái máy. Bạn đang brief cho một kỹ sư mới vào team, người cực kỳ tài năng nhưng chưa biết gì về codebase của bạn. Một kỹ sư giỏi khi nhận brief sẽ làm gì? Họ sẽ hỏi lại. Họ sẽ đọc code hiện tại trước. Họ sẽ đề xuất plan trước khi gõ dòng code đầu tiên. Claude Code được thiết kế để làm đúng như vậy — nếu bạn biết cách prompt. Bài này sẽ dạy bạn cách làm điều đó.
3 Permission Modes: Claude Code hoạt động ở chế độ nào?
Trước khi gõ prompt, bạn cần chọn “chế độ làm việc” của Claude Code. Đây không phải chi tiết kỹ thuật nhỏ — đây là quyết định ảnh hưởng trực tiếp đến mức độ kiểm soát của bạn trong toàn bộ session. Claude Code có 5 permission modes, toggle bằng Shift+Tab: Nếu ở VS Code, bạn cũng có thể toggle bằng cách click vào thanh trạng thái dưới cùng. Tóm gọn: mức độ tự chủ tăng dần từ trái sang phải — từ “hỏi từng bước” đến “làm hết không hỏi gì”.Ask before edit
Mỗi khi Claude muốn sửa một file hoặc chạy một lệnh, nó dừng lại và hỏi bạn. Bạn đọc, approve hoặc reject.
Khi nào dùng: Production branch. Codebase của khách hàng. Bất kỳ khi nào cost của sai lầm cao.
Trade-off: Bạn phải approve liên tục. Nếu task gồm 20 bước, bạn sẽ approve 20 lần.
Edit automatically
Claude tự động edit và tạo file mà không hỏi. Nhưng khi cần chạy lệnh shell (chạy test, install package, restart server) — vẫn hỏi bạn.
Khi nào dùng: Khi bạn đã hiểu rõ scope của task và muốn Claude chạy nhanh.
Trade-off: Nếu Claude hiểu sai yêu cầu, nó có thể edit nhiều file trước khi bạn nhận ra.
Plan Mode
Claude chỉ dùng read-only tools: đọc file, grep, tìm kiếm, phân tích. Nó không sửa bất kỳ thứ gì. Kết quả là một bản plan chi tiết với các bước cụ thể. Sau khi bạn review và approve plan, Claude mới chuyển sang execute — thường là trong Edit automatically mode.
Khi nào dùng: Task đủ lớn để cần plan trước. Feature mới trên codebase bạn chưa rõ.
Trade-off: Chậm hơn cho task nhỏ. Không phù hợp khi bạn chỉ cần fix typo.
Auto Mode
Claude tự động chạy toàn bộ: edit file + chạy lệnh + tool calls — không có interrupt nào trong quá trình thực thi. Tốc độ cao nhất.
Khi nào dùng: Khi task đã rõ ràng, bạn muốn Claude tự chạy từ đầu đến cuối mà không cần can thiệp.
Trade-off: Không thể can thiệp giữa chừng. Dùng khi đã hiểu rõ Claude và task đủ đơn giản.
Bypass permissions
Claude bỏ qua mọi giới hạn permission — không hỏi edit, không hỏi chạy lệnh, không hỏi gì cả.Bảng so sánh: Khi nào dùng mode nào
Quy tắc nhanh: Task dưới 5 phút — Ask before edit hoặc Edit automatically. Task trên 30 phút hoặc chạm nhiều file — Plan Mode trước.
Boris’s 3-Task Framework
Boris Cherny chia mọi task Claude Code thành 3 loại, và mỗi loại có cách tiếp cận khác nhau:Bảng tổng quan
Easy: One-shot task
Với task rõ ràng, nhỏ, risk thấp — chỉ cần prompt cụ thể và để Claude chạy. Ví dụ thực tế: Bạn đang review PR trên GitHub. Thấy comment “add loading state cho button”. Thay vì assign cho ai, bạn tag @Claude trong issue:@Claude, thêm loading state vào button Submit trongClaude đọc file, sửa, tạo commit. Done.src/components/SubmitButton.tsx. KhiisLoading=true, disable button và hiển thị spinner thay cho text.
Medium: Plan trước, execute sau
Task đủ lớn để cần plan. Bạn cần align với Claude về approach trước khi nó bắt đầu viết code. Workflow chuẩn:“Shift+Tab into plan, align with Claude first. Once I feel good about the plan, I go into Edit automatically.”
1
Bước 1: Shift+Tab — Plan Mode
2
Bước 2: Viết prompt với đủ context
3
Bước 3: Claude trả về plan chi tiết
4
Bước 4: Review plan, comment nếu cần điều chỉnh
5
Bước 5: Approve — Claude chuyển sang Edit automatically để execute
Hard: Bạn là người điều hướng
Task phức tạp, nhiều unknowns, cần judgment calls liên tục. Claude là pair programmer, nhưng bạn drive. Mindset: Đừng viết prompt dài và để Claude làm một mình. Thay vào đó:- Chia task thành subtask nhỏ hơn
- Làm từng subtask với Ask before edit mode
- Bạn review và quyết định hướng đi sau mỗi bước
- Dùng Plan Mode cho từng subtask nếu cần
Ví dụ thực chiến: Add Dark Mode Toggle (Step-by-step)
Đây là ví dụ Medium task theo đúng Plan Mode workflow. Task này từ video gốc của khóa học — được expand chi tiết để bạn có thể tự reproduce.Tình huống
Bạn có một app React + Tailwind CSS đang chạy ở light mode. Product manager yêu cầu:- Dark mode toàn app (background, text, card, border đều phải đổi)
- Toggle switch ở header để user tự chọn
- Preference phải lưu lại khi reload trang
- Contrast color phải đẹp, không xung đột với light theme hiện tại
Bước 1: Vào Plan Mode
Trong terminal tại root directory của project:Bước 2: Viết prompt có đủ context và constraint
Prompt yếu (đừng làm thế này):Thêm dark mode vào app của tôi.Prompt mạnh (làm thế này):
Bước 3: Claude trả về plan 7 bước
Claude đọc các file liên quan (không sửa gì — Plan Mode) và trả về plan:Bước 4: Review plan và comment điều chỉnh
Bạn đọc plan. Có một điểm muốn điều chỉnh: không cần animation cho version 1 (cần ship hôm nay), và muốn update toàn bộ component luôn. Gõ vào:Plan trông tốt. Một điều chỉnh:Ready to proceed.
- Skip animation/transition cho toggle và color switching ở V1 (cần ship hôm nay, animation sau)
- Step 7: Update tất cả component, không chỉ layouts/pages
Bước 5: Approve plan
Claude xác nhận điều chỉnh và hỏi bạn có muốn chuyển sang execute không. Bạn confirm.Bước 6: Claude execute với Edit automatically
Claude tự động chuyển mode (hoặc bạn Shift+Tab sang Edit automatically). Claude bắt đầu execute từng bước:- Đọc
tailwind.config.ts— thêmdarkMode: 'class' - Tạo
src/hooks/useDarkMode.ts - Tạo
src/context/DarkModeContext.tsx - Update
src/App.tsx - Tạo
src/components/DarkModeToggle.tsx - Update
src/layouts/Header.tsx - Update 12 component files với
dark:variants
Bước 7: Verify visual và run tests
Sau khi Claude xong:- Light mode: đúng màu cũ
- Dark mode: contrast đẹp, không có text khó đọc
- Reload: preference giữ lại
- OS dark mode: auto-detect đúng
Card trongsrc/components/ProductCard.tsxchưa có dark mode. Background vẫn white. Fixdark:bg-gray-800cho card container.
Kết quả
Anatomy của prompt tốt
Mỗi prompt hiệu quả có 4 thành phần. Không nhất thiết phải có đủ 4 cho task nhỏ — nhưng task càng lớn, càng cần đủ:Bảng đối chiếu: Prompt yếu vs Prompt mạnh
Cùng một task — khác biệt về kết quả:Pattern quan sát được: Prompt mạnh luôn trả lời 3 câu hỏi ngầm:
- Claude cần đọc file nào để hiểu vấn đề?
- Constraint là gì (không được làm gì, phải dùng gì)?
- “Done” trông như thế nào?
Anti-patterns: 5 sai lầm phổ biến nhất
Anti-pattern 1: Prompt quá broad — “Build me an app”
Anti-pattern 2: Skip Plan Mode cho task trên 30 phút
Bạn biết task này lớn — nhiều file, nhiều edge case — nhưng vẫn gõ thẳng prompt mà không dùng Plan Mode. Claude bắt đầu viết. Sau 10 phút, bạn nhận ra Claude đang đi theo hướng khác với bạn muốn. Bạn interrupt. Claude phải rollback. Mất nhiều thời gian hơn nếu plan từ đầu.Quy tắc: Task ước tính trên 30 phút làm việc của bạn — Plan Mode trước, không ngoại lệ.
Anti-pattern 3: Edit automatically trên production branch
Anti-pattern 4: Không define “done” — Claude loop vô tận
Anti-pattern 5: “Hãy fix tất cả bugs”
Mẹo nâng cao
Mẹo 1: “Think hard” và extended thinking
Với bug khó, bài toán phức tạp, hoặc architecture decision quan trọng — thêm trigger extended thinking vào cuối prompt:
Ví dụ:
Race condition trong payment processing — 2 request gửi đồng thời cùng order ID đôi khi tạo 2 transaction. File: src/api/payment.ts. Phân tích và đề xuất fix. Think hard trước khi trả lời.
Extended thinking giúp Claude “viết nháp” quá trình suy luận trước khi đưa ra câu trả lời. Kết quả thường chính xác hơn đáng kể cho task phức tạp.
Mẹo 2: Reference file cụ thể bằng @filename
Thay vì mô tả file, dùng @:Mẹo 3: Multi-line prompt — ngắn nhưng cụ thể
3 dòng đủ cho hầu hết task medium, nếu mỗi dòng đều cụ thể:Mẹo 4: Interrupt khi Claude đi sai hướng
Nếu Claude bắt đầu làm gì đó không đúng ý bạn — đừng để nó chạy hết rồi mới sửa. Bấm ESC ngay để interrupt.Áp dụng ngay
Bài tập 1: Reproduce Dark Mode Demo (15 phút)
Dùng bất kỳ project React + Tailwind nào của bạn (hoặc tạo project mới bằng Vite):1
Mở terminal tại root project, chạy
claude2
Shift+Tab — Plan Mode
3
Copy prompt Dark Mode từ bài này (có điều chỉnh cho tech stack của bạn)
4
Đọc plan Claude trả về — ghi lại:
- Claude đề xuất bao nhiêu bước?
- Claude hỏi clarifying question nào?
- Có bước nào bạn muốn điều chỉnh không?
5
Comment điều chỉnh (nếu có) — approve — Claude execute
6
Verify: toggle hoạt động, preference lưu lại, contrast đẹp
Bài tập 2: Prompt yếu vs Prompt mạnh — so sánh kết quả (10 phút)
Chọn 1 task đơn giản trong project của bạn (ví dụ: thêm loading state vào một button). Lần 1 — Prompt yếu:Thêm loading state vào button.Ghi lại: Claude làm gì? Hỏi lại bao nhiêu lần? Kết quả có match không? Lần 2 — Prompt mạnh (cùng task):
Thêm loading state vào component [YourButton] trong [path/to/file]. Khi prop isLoading=true: disable button + hiển thị spinner (Tailwind animate-spin). Khi isLoading=false: trở về bình thường. Update TypeScript interface. Test: Thêm 2 cases (loading/not loading) trong [YourButton.test.tsx].So sánh:
Bài học: Prompt mạnh thường nhanh hơn và ít token hơn, dù bản thân prompt dài hơn.
Tóm tắt bài học
- Prompt là brief, không phải command. Cung cấp đủ context (file, area), constraint (không được dùng gì, phải dùng gì), và success criteria (kết quả trông như thế nào).
- 5 permission modes — mỗi cái có use case riêng: Ask before edit (production, an toàn nhất), Edit automatically (sandbox, sau khi đã có plan), Plan Mode (task complex, cần align trước), Auto Mode (tự động chạy toàn bộ), Bypass permissions (automation/CI).
- Boris’s 3-task framework: Easy — one-shot với Edit automatically. Medium — Plan Mode trước, Edit automatically sau. Hard — bạn drive, Claude là pair programmer với Ask before edit mode.
- Plan Mode là best practice cho task trên 30 phút. Read-only, không risk. Claude hỏi clarifying questions, trả plan chi tiết. Bạn review và điều chỉnh trước khi approve.
- Extended thinking với “think hard” / “think harder” / “ultrathink” khi task phức tạp — Claude suy nghĩ sâu hơn trước khi đưa ra câu trả lời, kết quả chính xác hơn đáng kể.