Claude Code 101: Hướng Dẫn Toàn Diện Từ Con Số 0
Hướng dẫn đầy đủ 14 phần về Claude Code bằng tiếng Việt — từ tư duy vibe coding, cài đặt, thư mục .claude, phân quyền, quản lý context, slash command, MCP, hooks, sub-agent, lựa chọn model, đến một quy trình làm việc thực tế và checklist bảo mật.

Claude Code Từ Con Số 0: Hướng Dẫn Toàn Diện Cho Người Mới Bắt Đầu
Bạn vẫn đang code theo kiểu truyền thống — gõ từng dòng, tìm kiếm trên Stack Overflow, copy-paste từ ChatGPT, hay "thời thượng" hơn là trỏ AI vào từng file code để nó đọc và đưa ra gợi ý, hoặc để AI viết code thay bạn luôn? Không có gì sai cả. Nhưng có một cách làm việc khác — nhanh hơn, thú vị hơn, và thành thật mà nói, đang trở thành một kỹ năng bắt buộc vào năm 2026.
Đây sẽ là một bài viết khá dài, nên trước khi bắt đầu, hãy rót cho mình một ly nước, một tách cà phê, hoặc bất cứ thứ gì giúp bạn thấy thoải mái nhất. Sau đó ngồi lại và tận hưởng hành trình trong bài viết này nhé ☕
Mục Lục
- 1. Vì sao chọn Claude Code? Một sự thay đổi trong tư duy
- 2. Cài Đặt & Thiết Lập
- 3. Vòng lặp cơ bản: Chat, @ mentions, Context
- 4. Thư mục .claude: Bộ não của dự án
- 5. Hệ Thống Phân Quyền
- 6. Quản Lý Context
- 7. Slash Commands
- 8. Công Cụ MCP: Kết nối với thế giới bên ngoài
- 9. Hooks & Tự Động Hóa
- 10. Sub-agent Chuyên Biệt
- 11. Lựa Chọn Model & Tối Ưu Chi Phí
- 12. Áp dụng thực tế: Một quy trình làm việc từ đầu đến cuối
- 13. Xử Lý Sự Cố: Các vấn đề thường gặp
- 14. Checklist Bảo Mật: Sử dụng Claude Code an toàn
1. Vì Sao Chọn Claude Code? Một Sự Thay Đổi Trong Tư Duy
Vibe coding là gì?
Hãy tưởng tượng bạn có một lập trình viên junior cực kỳ chăm chỉ, không bao giờ mệt mỏi, không bao giờ than phiền, và có thể đọc toàn bộ codebase của bạn chỉ trong vài giây. Đó chính là Claude Code.
Vibe coding không phải là "AI viết code thay bạn còn bạn thì ngồi chơi." Đó là một cách làm việc trong đó bạn mô tả ý định của mình ở mức tổng quan, Claude thực thi, còn bạn thì xem xét và điều hướng. Giống như một kiến trúc sư cấp cao làm việc cùng một đội ngũ lập trình viên lành nghề.
Vì sao đây là thời điểm vàng?
- Các mô hình AI đang ở đỉnh cao chưa từng có — Claude Sonnet 4.6 viết code tốt hơn 90% lập trình viên thực thụ
- Những người học cách làm việc với AI ngay từ bây giờ sẽ có lợi thế cực lớn trong 2-3 năm tới
- Các công ty đang tuyển "kỹ sư AI-native" — những người dùng AI như công cụ chính, chứ không phải công cụ phụ
Tư duy cần thay đổi
| Tư duy cũ | Tư duy mới |
|---|---|
| "Tôi phải tự viết từng dòng code" | "Tôi mô tả, Claude thực thi, tôi xem xét" |
| "Dùng AI là gian lận" | "Dùng AI là một kỹ năng" |
| "Tôi cần hiểu từng chi tiết" | "Tôi cần hiểu đủ để xem xét và điều hướng" |
| "Tôi chỉ tin code do chính mình viết" | "Tôi tin code nào vượt qua được bài test" |
Quan trọng: Bạn vẫn cần hiểu code. Claude Code không dành cho những ai muốn "không học gì cả." Nó dành cho những ai muốn học nhanh hơn và xây dựng nhanh hơn.
2. Cài Đặt & Thiết Lập
Bước 1: Cài đặt Claude Code CLI
Claude Code chạy trong terminal. Trước tiên bạn cần có Node.js 18 trở lên.
# Kiểm tra Node.js
node --version # phải >= 18
# Nếu chưa cài Node.js, cài từ nodejs.org hoặc dùng nvm:
# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash
# nvm install 20
# Cài Claude Code toàn cục (khuyến nghị)
npm install -g @anthropic-ai/claude-code
# Hoặc chạy mà không cần cài (không cần cài đặt, nhưng chậm hơn)
npx @anthropic-ai/claude-code
# Kiểm tra cài đặt đã thành công
claude --versionBước 2: Xác thực
Có 2 cách để sử dụng Claude Code:
Cách 1: Dùng gói đăng ký Claude.ai (khuyến nghị cho người mới)
claude
# Lần đầu chạy, Claude Code sẽ mở trình duyệt để bạn đăng nhập vào claude.ai
# Yêu cầu gói Pro hoặc Max (xem giá tại claude.ai/pricing)Cách 2: Dùng Anthropic API key (dành cho lập trình viên)
export ANTHROPIC_API_KEY="sk-ant-..."
claudeNên chọn cách nào? Nếu bạn dùng nhiều (> 2 giờ/ngày), gói đăng ký thường rẻ hơn so với trả theo từng lượt gọi API. Nếu dùng ít hoặc cần tích hợp CI/CD, hãy dùng API key.
Bước 3: Cài đặt VSCode Extension
- Mở VSCode
- Tìm kiếm extension "Claude Code" (nhà phát hành: Anthropic)
- Cài đặt và tải lại
- Extension sẽ tự động nhận diện Claude Code CLI đã cài đặt
Sau khi cài đặt, bạn sẽ thấy panel Claude Code trong sidebar của VSCode. Bạn có thể chat trực tiếp trong IDE thay vì phải chuyển sang terminal.
Bước 4: Bắt đầu dự án đầu tiên
# Di chuyển vào thư mục dự án
cd my-project
# Khởi động Claude Code
claude
# Hoặc chạy trực tiếp kèm prompt
claude "explain this codebase to me"3. Vòng Lặp Cơ Bản: Chat, @ mentions, Context
Chat cơ bản
Giao diện của Claude Code rất đơn giản — bạn gõ, Claude phản hồi và hành động. Nhưng có một vài khuôn mẫu (pattern) sẽ giúp bạn có kết quả tốt hơn nhiều.
Không hiệu quả:
"sửa bug"Hiệu quả:
"Hàm calculateDiscount trong src/pricing.ts trả về giá âm khi
discount > 100%. Hãy sửa để nó throw ra lỗi khi discount không
hợp lệ (< 0 hoặc > 100), và thêm một unit test."Công thức: Cái gì + Ở đâu + Điều kiện + Kết quả mong muốn
@ mentions: Đưa context vào cuộc trò chuyện
@ là cách bạn báo cho Claude biết "hãy nhìn vào chỗ này." Dùng nó bên trong cuộc trò chuyện chat (panel VSCode hoặc terminal), không phải như một lệnh terminal:
Trong cuộc trò chuyện chat, gõ:
"Xem qua @src/auth/login.ts và tìm các vấn đề bảo mật"
^ Khi bạn gõ @, VSCode sẽ gợi ý file/thư mục
"Giải thích @src/components/ hoạt động như thế nào"
"So sánh cách xử lý lỗi giữa @src/api/users.ts và @src/api/products.ts"Các lệnh một dòng tiện dụng
# Giải thích nhanh một file (dùng đường dẫn thật, không cần @)
claude "giải thích src/utils/parser.ts"
# Tìm bug
claude "tìm tất cả những chỗ có thể gây rò rỉ bộ nhớ trong src/"
# Review một PR
claude "review các thay đổi trong git diff này"Lưu ý: Cú pháp @file là tính năng của chế độ tương tác (interactive mode — sau khi bạn đã gõ claude để vào REPL). Với việc dùng CLI một dòng, hãy dùng đường dẫn trực tiếp.
Mẹo về context
- Hãy cụ thể về file: đừng nói "trong code," hãy nói "trong @src/auth/login.ts tại dòng 42"
- Hãy cụ thể về đầu ra: "Chỉ trả về code, không giải thích" hoặc "Giải thích từng bước trước khi code"
- Đặt câu hỏi trước khi bắt đầu: với các tác vụ phức tạp, hãy hỏi Claude "Bạn đã hiểu yêu cầu chưa? Hãy giải thích lại cho tôi nghe" trước khi để nó bắt tay vào việc
4. Thư Mục .claude: Bộ Não Của Dự Án
Đây là phần quan trọng nhất để giúp Claude Code hoạt động tốt trong dự án của bạn. Thư mục .claude/ chứa mọi thứ Claude cần để hiểu dự án, tuân theo các quy tắc, và làm việc chính xác.
Cấu trúc thư mục
.claude/
├── CLAUDE.md ← bộ não của dự án
├── CLAUDE.local.md ← phiên bản riêng tư, không push lên GitHub
├── settings.json ← quyền hạn + hooks
├── settings.local.json ← cài đặt riêng tư
├── memory/ ← bộ nhớ cá nhân của Claude
├── rules/ ← các quy tắc chi tiết
│ ├── workflow.md
│ ├── design.md
│ └── tech-defaults.md
├── agents/ ← các sub-agent chuyên biệt
│ ├── researcher.md
│ └── reviewer.md
├── skills/
│ ├── shop-amazon.md
│ └── run-security-scan.sh
└── hooks/
├── pre-commit.sh
└── pre-push.shCLAUDE.md — File quan trọng nhất
CLAUDE.md là "bộ não" của dự án. Mỗi khi một cuộc trò chuyện bắt đầu, Claude sẽ đọc file này trước tiên. Đây là nơi bạn viết mọi thứ Claude cần biết về dự án.
Ví dụ CLAUDE.md cho một dự án Java Spring Boot:
# API Thương Mại Điện Tử Của Tôi (Spring Boot)
## Tech Stack
- Java 21 + Spring Boot 3.x
- Spring Data JPA + Hibernate
- PostgreSQL (production), H2 (test)
- Maven
- JUnit 5 + Mockito + MockMvc để test
- Spring Security 6 (JWT)
- Spring Mail để gửi email
## Quy tắc code
- Tuân theo kiến trúc phân lớp: Controller → Service → Repository
- Dùng constructor injection, KHÔNG dùng field injection (`@Autowired`)
- Mỗi phương thức public của Service phải có unit test
- Xử lý exception tập trung qua `@RestControllerAdvice`
- Log bằng SLF4J (`private static final Logger log = ...`), KHÔNG dùng
`System.out.println`
## Cấu trúc thư mục
- `src/main/java/com/myapp/` — Mã nguồn chính
- `controller/` — REST controllers
- `service/` — Business logic
- `repository/` — JPA repositories
- `entity/` — JPA entities
- `dto/` — Request/Response DTOs
- `exception/` — Custom exceptions
- `src/main/resources/` — application.yml, migrations
- `src/test/java/` — Unit và integration test
## Workflow
1. Trước khi code: chạy `mvn compile`
2. Trước khi commit: chạy `mvn test`
3. Dùng conventional commits: feat/fix/chore/docs
## Không được làm
- Không commit trực tiếp vào main
- Không xóa các file migration Flyway
- Không đặt business logic trong Controller
- Không dùng `@Transactional` ở tầng Controller
## Database
- Development: `jdbc:postgresql://localhost:5432/myapp_dev`
- Chạy migration: Flyway tự động chạy khi app khởi động
- Tạo migration: thêm file `src/main/resources/db/migration/V{n}__description.sql`Mẹo: Hãy nghĩ về CLAUDE.md như một tài liệu onboarding cho thành viên mới trong team. Claude sẽ đọc và tuân theo mọi thứ trong đó.
CLAUDE.local.md — Thông tin riêng tư
Thêm vào .gitignore:
echo ".claude/CLAUDE.local.md" >> .gitignore
echo ".claude/settings.local.json" >> .gitignoreVí dụ nội dung:
# Cấu hình Local (không push lên GitHub)
## Credentials (chỉ dùng cho local dev)
- Stripe test key: sk_test_...
- Local database: postgresql://localhost:5432/myapp_local
## Ghi chú cá nhân
- Branch hiện tại: feature/payment-flow
- Todo: sửa bug #234 trước buổi demo thứ Sáurules/ — Các quy tắc chi tiết
Khi CLAUDE.md trở nên quá dài, hãy tách nó thành các file nhỏ hơn trong rules/:
rules/workflow.md:
# Workflow
## Trước khi bắt đầu một task mới
1. Đọc kỹ mô tả task
2. Hỏi lại nếu yêu cầu chưa rõ ràng
3. Tạo một plan ngắn gọn và xác nhận với tôi
## Khi viết code
- Viết test trước khi implement (TDD nếu có thể)
- Commit nhỏ và thường xuyên
- Mỗi commit chỉ nên làm một việc
## Khi gặp lỗi
- Đọc kỹ thông báo lỗi trước khi sửa
- Đừng đoán mò — hãy truy về tận gốc rễ vấn đề
- Nếu việc sửa lỗi mất > 30 phút, hãy báo lại cho tôirules/tech-defaults.md:
# Tech Defaults
## Thiết kế REST API
- Định dạng response chuẩn: `{ "data": ..., "message": ..., "status": ... }`
- HTTP status code: 200 OK, 201 Created, 400 Bad Request, 401 Unauthorized, 404 Not
Found
- Phân trang: dùng `Pageable` của Spring Data, trả về `Page<T>`
- Validate input bằng `@Valid` + annotation Bean Validation
## Xử lý lỗi
- Toàn bộ exception được xử lý trong `GlobalExceptionHandler` (`@RestControllerAdvice`)
- Business exception: kế thừa `BaseBusinessException` với mã lỗi riêng
- Lỗi validation: trả về danh sách lỗi field rõ ràng
- KHÔNG để stack trace lộ ra trong response
## Tiêu chuẩn Testing
- Unit test: mock dependency bằng Mockito, không cần Spring context
- Integration test: dùng `@SpringBootTest` + `MockMvc`, dùng DB in-memory H2
- Coverage tối thiểu: 80% cho tầng Service
- Đặt tên test method: `methodName_whenCondition_thenExpectedResult`
## Hiệu năng
- Dùng `@Transactional(readOnly = true)` cho các method chỉ query
- Tránh N+1 query: dùng `JOIN FETCH` hoặc `@EntityGraph`
- Cache bằng Spring Cache (`@Cacheable`) cho dữ liệu ít thay đổi5. Hệ Thống Phân Quyền
Vì sao bạn cần phân quyền?
Claude Code có thể chạy lệnh, đọc/ghi file, gọi API... Hệ thống phân quyền cho phép bạn kiểm soát những gì Claude được phép làm mà không cần xác nhận mỗi lần.
Lần đầu chạy, bạn sẽ thấy một popup như thế này:
Claude wants to run: npm test
Allow? [y/n/always]- y — cho phép lần này
- n — từ chối
- always — luôn cho phép (thêm vào allowlist)
Cấu hình quyền hạn trong settings.json
// .claude/settings.json
{
"permissions": {
"allow": [
"Bash(npm run *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(npx prisma *)",
"Read(**)",
"Edit(**)",
"Write(**)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(git push --force *)",
"Bash(DROP TABLE *)"
]
}
}Các mức độ tin cậy
| Mức độ | Ý nghĩa |
|---|---|
| allow | Luôn được phép, không hỏi lại |
| deny | Luôn bị từ chối |
| (không khai báo) | Hỏi lại mỗi lần |
Ví dụ thực tế: cấu hình cho một dự án web thông thường
{
"permissions": {
"allow": [
"Bash(npm *)",
"Bash(npx *)",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git checkout *)",
"Bash(git branch *)",
"Read(**)",
"Edit(**)",
"Write(**)"
],
"deny": [
"Bash(git push --force *)",
"Bash(git reset --hard *)",
"Bash(rm -rf *)"
]
}
}Mẹo: Hãy bắt đầu thận trọng, sau đó thêm dần khi cần. Đừng cho phép mọi thứ ngay từ đầu — đặc biệt là các lệnh có tính phá hủy.
6. Quản Lý Context
Context window là gì?
Claude có một "bộ nhớ làm việc" giới hạn — gọi là context window. Khi cuộc trò chuyện trở nên dài, Claude sẽ bắt đầu quên những gì đã nói từ đầu. Đây là thách thức lớn nhất khi làm việc với AI trên các dự án lớn.
Dấu hiệu context đang cạn dần
- Claude bắt đầu "quên" những gì đã thống nhất
- Câu trả lời trở nên chung chung, không còn cụ thể theo dự án của bạn
- Claude hỏi lại những điều đã được đề cập trước đó
Chiến lược 1: /compact — Tóm tắt cuộc trò chuyện, tiếp tục task hiện tại
Dùng khi cuộc trò chuyện đã dài nhưng bạn vẫn muốn tiếp tục task hiện tại:
/compact
# Claude sẽ tóm tắt toàn bộ cuộc trò chuyện và tiếp tục
# Context nhỏ lại, nhưng ngữ cảnh của task vẫn được giữ nguyênKhi nào dùng: Sau khi context đã đầy khoảng 80%+, khi bạn nhận thấy Claude bắt đầu "quên" thiết lập ban đầu.
Chiến lược 2: /clear — Bắt đầu một task hoàn toàn mới
Xóa toàn bộ cuộc trò chuyện và bắt đầu lại từ đầu. Dùng khi chuyển sang một task khác:
/clear
# Sau đó cung cấp context cụ thể cho task mới
"Context: Tôi đang xây dựng tính năng thanh toán cho một app
thương mại điện tử.
Tech stack: Next.js + Stripe + Prisma.
File liên quan: @src/app/checkout/ @src/lib/stripe.ts
Task: ..."Khi nào dùng: Khi chuyển sang một tính năng/bug hoàn toàn khác. Giúp tiết kiệm context window.
| /compact | /clear | |
|---|---|---|
| Xóa cuộc trò chuyện? | Không | Có |
| Giữ context của task? | Có | Không |
| Khi nào dùng? | Task dài, muốn giữ đà làm việc | Task mới |
Chiến lược 3: Dùng thư mục memory/
Thư mục memory/ là nơi bạn lưu trữ thông tin quan trọng để tham chiếu qua nhiều cuộc trò chuyện:
.claude/memory/
├── user_preferences.md ← các sở thích làm việc của bạn
├── project_decisions.md ← các quyết định đã đưa ra
└── ongoing_tasks.md ← công việc đang thực hiệnQuan trọng: Claude không tự động đọc thư mục này. Bạn cần tham chiếu tường minh trong chat (@.claude/memory/project_decisions.md) hoặc import nó trong CLAUDE.md:
@import .claude/memory/project_decisions.mdVí dụ .claude/memory/project_decisions.md:
# Các quyết định của dự án
## Authentication
- Dùng Spring Security 6 + JWT (stateless)
- Thời hạn token: access token 15 phút, refresh token 7 ngày
- Không dùng Spring Session (quyết định vào tháng 3/2025)
## Database Schema
- Một User có thể có nhiều địa chỉ (1-n, FetchType.LAZY)
- Trạng thái Order: PENDING → CONFIRMED → SHIPPED → DELIVERED → CANCELLED
- Soft delete cho mọi entity: thêm cột `deleted_at`, dùng `@SQLRestriction`
## Thiết kế API
- API RESTful thuần túy, versioning qua URL `/api/v1/...`
- Không dùng GraphQL (đã quyết định — không cần overhead này ở quy mô hiện
tại)
- Các lời gọi service nội bộ dùng Feign Client (đã thiết lập sẵn trong
`infrastructure/client/`)Chiến lược 4: CLAUDE.md như một điểm neo
Mọi thông tin quan trọng nên nằm trong CLAUDE.md. File này luôn được đọc đầu tiên, dù context đã bị reset hay đây là một cuộc trò chuyện hoàn toàn mới.
7. Slash Commands
Slash command là các lệnh đặc biệt bắt đầu bằng /. Chúng được chia thành 4 nhóm:
Nhóm 1: Quản lý cuộc trò chuyện
| Lệnh | Tác dụng |
|---|---|
| /clear | Xóa toàn bộ cuộc trò chuyện, bắt đầu lại |
| /compact | Tóm tắt cuộc trò chuyện, giải phóng context |
| /undo | Hoàn tác hành động cuối cùng đã thực hiện |
Nhóm 2: Cấu hình
| Lệnh | Tác dụng |
|---|---|
| /config | Xem và thay đổi cài đặt |
| /model | Chuyển đổi model (Opus/Sonnet/Haiku) |
| /fast | Bật Fast mode (Opus chạy nhanh hơn) |
Nhóm 3: Thông tin & Debug
| Lệnh | Tác dụng |
|---|---|
| /doctor | Kiểm tra tình trạng cài đặt Claude Code |
| /cost | Xem chi phí phát sinh trong phiên làm việc |
| /help | Liệt kê tất cả các lệnh |
Nhóm 4: Skills (Lệnh tùy chỉnh)
/review # Review code theo tiêu chuẩn của dự án
/security-review # Kiểm tra các vấn đề bảo mật
/init # Khởi tạo CLAUDE.md cho dự án mới3 lệnh dùng mỗi ngày
1. /compact — Dùng khi cuộc trò chuyện đã dài
Sau một số lượng tin nhắn nhất định, context bắt đầu cạn dần. /compact giúp Claude tóm tắt lại và tiếp tục với một bộ nhớ "sạch sẽ" hơn.
2. /clear — Bắt đầu một task mới
Khi chuyển sang một task hoàn toàn khác, việc bắt đầu một cuộc trò chuyện mới sẽ hiệu quả hơn là tiếp tục cuộc trò chuyện cũ.
3. /cost — Theo dõi chi tiêu
Nếu bạn dùng API key, /cost cho bạn biết đã chi bao nhiêu trong phiên làm việc. Giúp tránh bị "sốc hóa đơn" vào cuối tháng.
Tạo Slash Command tùy chỉnh (Skills)
Bạn có thể tạo slash command riêng cho một dự án. Ví dụ, tạo /deploy-check:
<!-- .claude/skills/deploy-check.md -->
Kiểm tra tất cả các điều kiện trước khi deploy:
1. Chạy `npm run typecheck` — phải pass 100%
2. Chạy `npm test` — phải pass 100%
3. Kiểm tra không có `console.log` trong `src/`
4. Kiểm tra không có credentials hardcode
5. Xem lại `CHANGELOG.md` đã được cập nhật chưa
6. Báo cáo kết quả theo định dạng này:
- ✅ Pass: [tên kiểm tra]
- ✅ Fail: [tên kiểm tra] — [lý do]Sau đó dùng:
/deploy-check8. Công Cụ MCP: Kết Nối Với Thế Giới Bên Ngoài
MCP là gì?
MCP (Model Context Protocol) là cách Claude kết nối với các dịch vụ bên ngoài — database, Slack, GitHub, Google Drive... Thay vì phải copy-paste qua lại, Claude có thể đọc, ghi, và gọi API trực tiếp.
Cài đặt một MCP server
Có 2 cách để cài đặt một MCP:
Cách 1: Dùng lệnh CLI (khuyến nghị)
# Thêm một MCP server qua terminal (bên ngoài Claude Code)
claude mcp add github -- npx -y @modelcontextprotocol/server-github
# Kiểm tra MCP đã được cài đặt chưa
claude mcp listCách 2: Thiết lập thủ công qua settings.json
// .claude/settings.json
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
}
}
}Lưu ý: Trước khi dùng MCP của GitHub, Slack, Google Drive... bạn cần thiết lập xác thực (API key, PAT token, v.v.). Claude sẽ hướng dẫn bạn khi cần.
Ví dụ thực tế: MCP + GitHub
Sau khi cài đặt GitHub MCP:
"Liệt kê các issue đang mở trong repo này và sắp xếp theo độ ưu tiên"
"Tạo một PR từ branch feature/payment sang main với mô tả
tự động tạo từ git diff"
"Review PR #42 và comment vào những chỗ cần sửa"Ví dụ thực tế: MCP + Slack
"Gửi một tin nhắn vào kênh #dev-team: 'Deploy v2.1.0 lên staging đã
thành công'"
"Đọc thread trong #bugs về lỗi đăng nhập hôm qua và tóm tắt lại cho tôi"Ví dụ thực tế: MCP + Database (PostgreSQL)
# Sau khi cài đặt MCP database
"Lấy 10 user có nhiều đơn hàng nhất trong tháng 4/2025"
"Có bao nhiêu đơn hàng đang ở trạng thái 'pending' quá 24 giờ?"
"Tạo một migration để thêm cột `referral_code` vào bảng users"Cấu hình MCP trong settings.json
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "${GITHUB_TOKEN}"
}
},
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "${DATABASE_URL}"
}
}
}
}Lưu ý bảo mật: Không hardcode API key trong settings.json. Hãy dùng biến môi trường như ví dụ trên.
9. Hooks & Tự Động Hóa
Hooks là gì?
Hooks là các script tự động chạy trước hoặc sau một hành động của Claude. Ví dụ: mỗi khi Claude sửa một file, tự động chạy formatter. Mỗi khi Claude commit, tự động chạy test.
Cách hoạt động
Hooks được cấu hình trong settings.json và trỏ đến một script trong thư mục hooks/:
// .claude/settings.json
{
"hooks": {
"postToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/format-on-save.sh"
}
]
}
]
}
}Các sự kiện hook
| Sự kiện | Khi nào chạy |
|---|---|
| preToolUse | Trước khi Claude dùng một tool |
| postToolUse | Sau khi Claude dùng một tool |
| stop | Khi Claude hoàn tất phản hồi |
Ví dụ 1: Tự động format sau khi sửa
Ghi chú kỹ thuật: Hooks của Claude Code nhận thông tin qua stdin dưới dạng JSON, không phải qua tham số dòng lệnh. Script cần đọc stdin để biết file nào vừa được sửa.
# .claude/hooks/format-on-save.sh
#!/bin/bash
# Claude Code truyền context qua stdin dưới dạng JSON
INPUT=$(cat)
FILE=$(echo "$INPUT" | python3 -c "import sys,json; d=json.load(sys.stdin);
print(d.get('tool_input',{}).get('file_path',''))" 2>/dev/null)
if [[ "$FILE" == *.java ]]; then
# Dùng google-java-format để format Java (phải cài đặt trước)
# Tải về: https://github.com/google/google-java-format/releases
java -jar ~/.local/bin/google-java-format.jar --replace "$FILE"
echo "✅ Đã format: $FILE"
fiVí dụ 2: Kiểm tra trước khi commit
# .claude/hooks/pre-commit.sh
#!/bin/bash
set -e
echo "✅ Đang chạy kiểm tra pre-commit..."
# Kiểm tra compile
echo "Đang compile..."
mvn compile -q
if [ $? -ne 0 ]; then
echo "✅ Compile thất bại. Hủy commit."
exit 1
fi
# Test
echo "Đang chạy test..."
mvn test -q
if [ $? -ne 0 ]; then
echo "✅ Test thất bại. Hủy commit."
exit 1
fi
# Kiểm tra System.out.println
if grep -r "System\.out\.println" src/main/ --include="*.java"; then
echo "⚠ Phát hiện System.out.println trong code production. Hãy dùng logger
SLF4J thay thế."
exit 1
fi
echo "✅ Tất cả kiểm tra đã pass!"Ví dụ 3: Kiểm tra an toàn trước khi push
# .claude/hooks/pre-push.sh
#!/bin/bash
BRANCH=$(git branch --show-current)
# Không cho phép push thẳng vào main
if [ "$BRANCH" = "main" ] || [ "$BRANCH" = "master" ]; then
echo "✅ Không được phép push trực tiếp vào $BRANCH!"
echo "Hãy tạo một PR thay vì push trực tiếp."
exit 1
fi
echo "✅ Branch $BRANCH OK để push"Đăng ký hooks
// .claude/settings.json
{
"hooks": {
"preToolUse": [
{
"matcher": "Bash(git push*)",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/pre-push.sh"
}
]
}
]
}
}10. Sub-agent Chuyên Biệt
Sub-agent là gì?
Sub-agent là những "trợ lý chuyên biệt" mà Claude chính (orchestrator) có thể gọi để xử lý các tác vụ cụ thể. Mỗi sub-agent có chuyên môn riêng và quy tắc riêng.
Hãy hình dung thế này: Claude chính là quản lý dự án, còn các sub-agent là những chuyên gia trong đội ngũ.
Tạo một sub-agent
Tạo một file .md trong thư mục .claude/agents/. File này chính là prompt + metadata cho sub-agent:
agents/researcher.md:
# Researcher Agent
Chuyên gia nghiên cứu và phân tích. Dùng khi bạn cần tìm hiểu về
một thư viện, so sánh các lựa chọn, hoặc phân tích một codebase.
---
Bạn là một senior engineer chuyên về nghiên cứu và phân tích kỹ thuật.
## Trách nhiệm
- Phân tích và so sánh các giải pháp kỹ thuật
- Nghiên cứu thư viện, framework và best practice
- Đọc và tóm tắt tài liệu
- Phân tích codebase hiện tại
## Cách làm việc
1. Luôn đọc source code trước khi đưa ra ý kiến
2. Đưa ra ưu/nhược điểm cụ thể, kèm số liệu nếu có thể
3. Đưa ra khuyến nghị rõ ràng, giải thích lý do
4. Nếu không chắc, hãy nói rõ "Tôi không chắc về điều này"
## Định dạng đầu ra
- Bắt đầu bằng TL;DR (1-2 câu)
- Theo sau là phân tích chi tiết
- Kết thúc bằng một khuyến nghị rõ ràngagents/reviewer.md:
# Reviewer Agent
Một reviewer code khắt khe. Dùng trước khi merge code để tìm bug,
vấn đề bảo mật, và vi phạm quy ước.
---
Bạn là một senior engineer review code cực kỳ kỹ lưỡng.
## Tiêu chí review
1. **Bảo mật**: SQL injection, XSS, auth bypass, rò rỉ dữ liệu
2. **Hiệu năng**: N+1 query, re-render không cần thiết, memory leak
3. **Tính đúng đắn**: Lỗi logic, edge case chưa xử lý
4. **Quy ước**: Tuân thủ CLAUDE.md và coding standard
5. **Test**: Coverage đã đủ chưa, test có ý nghĩa không
## Định dạng đầu ra
Với mỗi vấn đề tìm thấy:
- ✅ Critical: phải sửa trước khi merge
- ✅ Warning: nên sửa, có thể merge nhưng cần theo dõi
- ✅ Suggestion: cải thiện tùy chọn
Kết thúc bằng: APPROVED / NEEDS CHANGES / REJECTEDGọi một sub-agent
# Claude chính sẽ tự quyết định khi nào dùng sub-agent
"Nghiên cứu và so sánh React Query với SWR cho dự án này"
# → Claude sẽ gọi researcher agent
"Review tất cả thay đổi trong PR này"
# → Claude sẽ gọi reviewer agentHoặc gọi trực tiếp:
"Dùng researcher agent để phân tích @src/auth/ và tìm các vấn đề tiềm ẩn"Ví dụ workflow với nhiều agent
# Task: Migrate từ REST sang GraphQL
# Bước 1: Giai đoạn nghiên cứu
"Dùng researcher agent: phân tích codebase hiện tại và ước tính
công sức để migrate sang GraphQL"
# Bước 2: Claude chính lên kế hoạch dựa trên nghiên cứu
"Dựa trên nghiên cứu, tạo một kế hoạch migrate theo từng giai đoạn"
# Bước 3: Implement
"Implement Giai đoạn 1: thiết lập GraphQL server"
# Bước 4: Review
"Dùng reviewer agent: review toàn bộ code vừa implement trong
@src/graphql/"11. Lựa Chọn Model & Tối Ưu Chi Phí
Các model Claude
| Model | Tốc độ | Giá | Dùng khi |
|---|---|---|---|
| Claude Haiku 4.5 | Nhanh nhất | Rẻ nhất | Tác vụ đơn giản, lặp lại |
| Claude Sonnet 4.6 | Cân bằng | Trung bình | Phần lớn công việc hằng ngày |
| Claude Opus 4.7 | Chậm hơn | Đắt nhất | Tác vụ phức tạp cần suy luận sâu |
Chiến lược lựa chọn model
Dùng Haiku khi:
- Format code (prettier, eslint fix)
- Đổi tên biến hàng loạt
- Tạo boilerplate code
- Dịch comment/tài liệu
Dùng Sonnet khi (mặc định):
- Viết tính năng mới
- Debug code
- Review code
- Giải thích codebase
Dùng Opus khi:
- Thiết kế kiến trúc phức tạp
- Debug các vấn đề khó, liên quan nhiều file
- Refactor quy mô lớn
- Audit bảo mật
Chuyển đổi model
# Trong cuộc trò chuyện
/model
# Hoặc đặt mặc định trong config
/configFast Mode
/fast
# Bật Fast Mode: dùng Opus với tốc độ đầu ra nhanh hơn
# Không hạ xuống model nhỏ hơnLưu ý: Fast Mode yêu cầu gói đăng ký Claude Pro hoặc Max. Không khả dụng khi dùng API key.
Mẹo tiết kiệm chi phí
1. Dùng đúng model cho đúng việc
# Đừng dùng Opus để format code
# Đừng dùng Haiku để thiết kế kiến trúc2. Context ngắn hơn = ít token hơn
# Sau khi hoàn thành một task lớn, /clear và bắt đầu lại
# Đừng kéo dài cuộc trò chuyện không cần thiết3. Hãy cụ thể trong prompt
# Tệ: "sửa code của tôi" → Claude phải đọc nhiều, hỏi nhiều
# Tốt: "sửa bug trong hàm X, file Y, dòng Z" → ít token hơn4. Theo dõi chi tiêu
/cost # Xem đã dùng bao nhiêu trong phiên làm việc5. Subscription vs API
Nếu bạn dùng Claude Code > 2 giờ/ngày:
- Gói Claude Max: Sonnet không giới hạn, nhiều Opus hơn
- Rẻ hơn nhiều so với trả theo token khi dùng nhiều
- Xem giá hiện tại tại claude.ai/pricing
12. Áp Dụng Thực Tế: Một Quy Trình Làm Việc Từ Đầu Đến Cuối
Hãy cùng xem một ví dụ thực tế: xây dựng tính năng API "Quên mật khẩu" trong Spring Boot từ đầu đến cuối.
Thiết lập ban đầu
# 1. Di chuyển vào dự án
cd my-ecommerce-api
# 2. Khởi động Claude Code
claude
# 3. Kiểm tra context (Claude sẽ tự động đọc CLAUDE.md)
"Bạn đã đọc CLAUDE.md chưa? Tóm tắt dự án này dùng những gì"Bước 1: Nghiên cứu & Lên kế hoạch
"Phân tích src/main/java/com/myapp/auth/ và cho tôi biết:
1. Authentication hiện đang được implement như thế nào (cấu hình
Spring Security, JWT flow)
2. Cần những gì để thêm API Quên mật khẩu
3. Ước tính công sức (giờ)
Chưa viết code, chỉ phân tích thôi"Claude phản hồi với một phân tích chi tiết. Bạn xem xét và bổ sung thêm yêu cầu:
"OK, thêm yêu cầu này:
- Reset token chỉ có hiệu lực trong 1 giờ
- Gửi email qua Spring Mail (config đã có sẵn, xem
src/main/java/com/myapp/infrastructure/email/)
- Rate limit: tối đa 3 request/giờ cho mỗi email (dùng Bucket4j
hoặc Redis)
Bây giờ hãy tạo một kế hoạch chia thành các bước nhỏ theo kiến
trúc phân lớp"Bước 2: Implement từng phần
# Bước 1: Entity + Migration
"Implement Bước 1:
- Tạo JPA Entity PasswordResetToken với các field: id, user
(ManyToOne), token, expiresAt, usedAt
- Tạo file migration Flyway tương ứng trong
src/main/resources/db/migration/"Claude tạo entity và migration. Bạn xem xét, sau đó kiểm tra xem có compile được không:
"Compile dự án để kiểm tra không có lỗi"
# → Claude chạy: mvn compile
# Nếu có lỗi, Claude sẽ tự động sửa# Bước 2: Repository + Service
"Implement Bước 2:
- PasswordResetTokenRepository (Spring Data JPA)
- ForgotPasswordService với các phương thức sau:
+ initiatePasswordReset(email): validate, tạo token, gửi email
+ validateToken(token): kiểm tra tồn tại, chưa dùng, chưa hết hạn
+ resetPassword(token, newPassword): validate token rồi cập nhật
mật khẩu
- Viết unit test cho ForgotPasswordService bằng Mockito"# Bước 3: Controller
"Implement Bước 3 - REST Controller với 2 endpoint:
- POST /api/v1/auth/forgot-password body: { email }
- POST /api/v1/auth/reset-password body: { token, newPassword,
confirmPassword }
Thêm annotation Bean Validation cho các request DTO
Xử lý exception qua GlobalExceptionHandler đã có sẵn"Bước 3: Review trước khi tiếp tục
# Review thủ công (thường dùng)
"Review toàn bộ code vừa viết trong
src/main/java/com/myapp/auth/password/ tập trung vào các vấn đề
bảo mật: độ ngẫu nhiên của token, timing attack, rò rỉ thông tin"
# Hoặc dùng reviewer agent nếu đã tạo sẵn
"Dùng reviewer agent để kiểm tra code vừa implement"Lưu ý: /review không phải là slash command có sẵn. Để dùng lệnh tắt /review, bạn cần tạo file .claude/skills/review.md tương tự như ví dụ ở Mục 7.
Bước 4: Integration Test
"Viết integration test với @SpringBootTest + MockMvc cho toàn bộ
luồng quên mật khẩu:
1. POST /forgot-password với email hợp lệ → 200 OK (không tiết lộ
user có tồn tại hay không)
2. POST /forgot-password với email không hợp lệ → 400 Bad Request
3. POST /forgot-password quá 3 lần trong 1 giờ → 429 Too Many
Requests
4. POST /reset-password với token hợp lệ → 200 OK, mật khẩu được
cập nhật
5. POST /reset-password với token đã hết hạn → 400 Bad Request
6. POST /reset-password với token đã dùng rồi → 400 Bad Request
Dùng DB in-memory H2, mock email service để không gửi email thật"Bước 5: Chạy toàn bộ test suite
"Chạy toàn bộ test suite và sửa các lỗi nếu có"
# → Claude chạy: mvn testBước 6: Commit & Push
# Bước 1: Commit theo conventional commits
"Commit tất cả thay đổi. Định dạng message:
feat: Add forgot password API
- PasswordResetToken entity + Flyway migration
- ForgotPasswordService với rate limiting
- REST endpoint POST /forgot-password và /reset-password
- Unit test + integration test"
# Bước 2: Push lên branch
"git push origin feature/forgot-password"
# → Claude sẽ chạy lệnh nàyBước 7: Tạo PR (nếu dùng GitHub)
Nếu bạn dùng GitHub và đã cài GitHub MCP:
"Tạo một PR từ feature/forgot-password sang main với mô tả sau:
- **What:** Thêm đầy đủ API quên mật khẩu
- **Why:** Cho phép user khôi phục tài khoản khi quên mật khẩu
- **API:**
+ POST /api/v1/auth/forgot-password
+ POST /api/v1/auth/reset-password
- **Testing:**
1. mvn test — tất cả test pass
2. Test thủ công với Postman (collection đã có sẵn trong
/docs/postman/)
- **Checklist:**
- [ ] Test pass (mvn test)
- [ ] Compile sạch (mvn compile)
- [ ] Không có System.out.println
- [ ] Migration Flyway đặt tên đúng quy ước"Nếu bạn chưa cài MCP hoặc không dùng GitHub, hãy push branch và tạo PR qua giao diện web của GitHub.
Kết quả
Một tính năng API Quên mật khẩu hoàn chỉnh với:
- ✅ Flyway migration + JPA Entity
- ✅ Tầng Service với business logic + rate limiting
- ✅ REST Controller với validation + xử lý lỗi
- ✅ Tích hợp Spring Mail (không hardcode cấu hình email)
- ✅ Unit test (Mockito) + Integration test (MockMvc + H2)
- ✅ Git commit + một PR đã sẵn sàng
Thời gian: ~45 phút (thay vì 1-2 ngày làm thủ công). Chất lượng: Sẵn sàng cho production, coverage test đầy đủ theo đúng best practice của Spring Boot.
13. Xử Lý Sự Cố: Các Vấn Đề Thường Gặp
"Claude cứ liên tục hỏi xin quyền"
Vấn đề: Mỗi lần Claude chạy một lệnh, bạn lại bị hỏi lại.
Giải pháp: Thiết lập quyền hạn trong .claude/settings.json:
{
"permissions": {
"allow": [
"Bash(mvn *)",
"Bash(git status)",
"Read(**)",
"Edit(**)"
]
}
}"Claude quên những gì đã thảo luận trước đó"
Vấn đề: Cuộc trò chuyện đã dài, Claude bắt đầu "quên."
Giải pháp: Dùng /compact để tóm tắt, hoặc /clear + bắt đầu cuộc trò chuyện mới.
Phòng ngừa: Lưu thông tin quan trọng vào thư mục .claude/memory/.
"Công cụ MCP không hoạt động"
Vấn đề: Sau khi cài đặt một MCP, Claude không dùng được nó.
Checklist:
# 1. Kiểm tra MCP đã được cài đặt chưa
claude mcp list
# 2. Kiểm tra auth token (nếu cần)
echo $GITHUB_TOKEN # hoặc API key khác
# 3. Khởi động lại Claude Code
# Đóng phiên làm việc, chạy lại: claude"Lỗi compile không được sửa"
Vấn đề: Claude sửa code nhưng vẫn còn lỗi compile.
Giải pháp: Khi giao task, hãy nhắc Claude:
"Sửa bug này, đảm bảo mvn compile pass 100%"
# Claude sẽ chạy compile để kiểm tra"Quyền hạn cứ bị reset liên tục"
Vấn đề: Mỗi lần khởi động lại, quyền hạn lại bị reset.
Giải pháp: Dùng .claude/settings.json (lưu trữ vĩnh viễn) thay vì chọn "always" tạm thời:
// Đúng
{
"permissions": {
"allow": ["Bash(mvn *)", "Read(**)", "Edit(**)"]
}
}
// Sai (chỉ được ghi nhớ trong phiên làm việc này)
// Trả lời "always" khi được hỏi14. Checklist Bảo Mật: Sử Dụng Claude Code An Toàn
Khi làm việc với Credentials & Secrets
✅ Nên:
- Lưu credentials trong .env.local (thêm vào .gitignore)
- Dùng biến môi trường: process.env.DATABASE_URL
- Thêm .claude/CLAUDE.local.md vào .gitignore
❌ Không nên:
- Không hardcode API key trong code
- Không paste secret vào cuộc trò chuyện với Claude
- Không commit file .env hoặc settings.local.json lên GitHub
Khi dùng MCP Tools
✅ Nên:
- Dùng biến môi trường cho auth token
- Giới hạn quyền của Claude (deny các lệnh có tính phá hủy)
- Review code trước khi để Claude chạy git push
❌ Không nên:
- Không cấp quyền truy cập toàn bộ cho Claude (không dùng allow: ["*"])
- Không kết nối MCP vào database production trong lúc dev
- Không để Claude commit trực tiếp vào main
Khi dùng Hooks
✅ Nên:
# Tốt: hook chạy formatter, không thay đổi logic
#!/bin/bash
npx prettier --write "$FILE"❌ Không nên:
# Xấu: hook có thể fail âm thầm
npx prettier --write "$FILE" || true # Nguy hiểm!Khi dùng Sub-agent
✅ Nên:
- Sub-agent chỉ nên dùng các tool chỉ đọc (Read, Bash để kiểm tra)
- Sub-agent không nên commit/push trực tiếp
- Agent chính review kết quả của sub-agent trước khi áp dụng
❌ Không nên:
- Không cấp cho sub-agent quyền Edit + Bash đầy đủ
- Không kết nối sub-agent trực tiếp vào production
Tổng Kết
Bạn vừa đi qua 14 mục toàn diện về Claude Code:
| Mục | Bộ công cụ |
|---|---|
| 1-3 | Tư duy + Cài đặt + Cách chat |
| 4-7 | Thư mục .claude, Phân quyền, Context, Slash command |
| 8-11 | MCP, Hooks, Sub-agent, Lựa chọn model |
| 12 | Một quy trình làm việc thực tế từ đầu đến cuối |
| 13-14 | Xử lý sự cố + Bảo mật |
Dấu hiệu cảnh báo: Khi nào KHÔNG nên dùng Claude Code
- Đừng dùng khi bạn chưa hiểu rõ yêu cầu
- Đừng dùng để "trốn tránh việc học" — bạn sẽ ship ra toàn bug
- Đừng dùng cho những công việc chưa được cấp phép (kiểm thử bảo mật trái phép, v.v.)
- Đừng dùng khi bạn không có thời gian review code mà Claude viết
Tư Duy Quan Trọng Nhất
Để khép lại, đây là điều cốt lõi cần nhớ: Claude Code không phải là cây đũa thần. Nó là một bộ khuếch đại sức mạnh — nhân lên năng lực của bạn. Nếu bạn hiểu rõ vấn đề, biết cách đặt câu hỏi đúng, và biết cách review kết quả — bạn sẽ làm việc năng suất gấp 5-10 lần.
Ngược lại, nếu bạn dùng nó để "trốn tránh việc phải hiểu code" — bạn sẽ ship bug nhanh hơn, chứ không phải năng suất hơn.
Hãy học cách làm việc cùng AI. Đó là kỹ năng quan trọng nhất của lập trình viên trong thập kỷ này.
Có câu hỏi hay muốn chia sẻ trải nghiệm của mình? Để lại bình luận bên dưới nhé.