Theo khảo sát Pragmatic Engineer tháng 2/2026 với 15.000 developer, 73% team kỹ thuật đã dùng AI coding tool hàng ngày, tăng từ 41% năm 2025 (Pragmatic Engineer, 2026). Trong số đó, 46% gọi Claude Code là tool đáng yêu nhất, cao gấp 2,4 lần Cursor (19%) và gấp 5 lần GitHub Copilot (9%).
Mình bắt đầu dùng Claude Code từ tháng 8/2025. Sau 8 tháng và hơn 50 dự án (cả side project lẫn production cho khách hàng), mình rút ra một sự thật phũ phàng: cùng một task, prompt khác nhau ra kết quả khác nhau gấp 3 đến 5 lần. Không phải Claude Code dở. Hầu hết dev dùng chưa đúng cách thôi.
Bài này gom 10 tip mình đang chạy hàng ngày, xếp theo độ tác động giảm dần.
Key Takeaways - 73% team engineering dùng AI coding tool daily năm 2026, tăng 78% so với 2025 (Pragmatic Engineer, 2026) - CLAUDE.md là tip impact lớn nhất: 1 tiếng setup tiết kiệm hàng chục tiếng về sau - Anthropic ghi nhận task average rút từ 3,1 giờ xuống 15 phút (giảm 92%) khi dùng Claude đúng cách (Anthropic, 2026) - Scope context đúng task quan trọng hơn nhồi nhét cả codebase vào prompt
Mục lục
- CLAUDE.md, foundation của mọi thứ
- Scope context, ít hơn là nhiều hơn
- Chia nhỏ task trước khi hỏi
- Spec trước, code sau
- Test-driven prompting
- Slash command custom
- Sub-agent orchestration
- Error context, copy đúng thứ
- Mẹo ngôn ngữ cho dev Việt
- Workflow với Git
Tip 1: CLAUDE.md, Foundation Của Mọi Thứ
Tại sao CLAUDE.md là tip có impact lớn nhất? Vì nó cắt được chi phí context lặp lại. Theo tài liệu chính thức của Anthropic về prompt caching, đặt phần static (system instructions, conventions) ở đầu prompt giảm 90% chi phí và 85% độ trễ (Anthropic, 2026). CLAUDE.md chính là cách áp dụng nguyên tắc đó vào quy trình hàng ngày.
CLAUDE.md là file config Claude Code đọc tự động mỗi khi mở session trong project. Bạn không cần lặp lại "dùng FastAPI nhé", "nhớ viết test nhé" mỗi lần. Mọi convention, stack, ràng buộc đều nằm sẵn ở đó.
Xem chi tiết về Claude Code và setup ban đầu tại Claude Code là gì? So sánh Cursor vs Copilot.
# CLAUDE.md, Project: E-commerce API
## Stack
- Backend: Python 3.12, FastAPI, SQLAlchemy 2.0, PostgreSQL 16
- Testing: pytest, httpx (async client)
- Infra: Docker, GitHub Actions, Railway
## Code Style
- Functions: snake_case, max 40 dòng
- Type hints: bắt buộc cho tất cả function signatures
- Error handling: raise HTTPException, không return error dict
- Comments: tiếng Việt OK, technical term giữ tiếng Anh
## Database Conventions
- Model: singular (User, Product, Order)
- Migration: alembic, chạy `alembic upgrade head` sau mỗi model change
- Query: ORM-first, raw SQL chỉ cho performance-critical
## Testing Rules
- Mỗi endpoint phải có ≥ 3 test case: happy path, error case, edge case
- Mock: dùng pytest-mock, không mock database (dùng test DB)
- Coverage target: ≥ 80%
## DO NOT
- Đừng dùng global state
- Đừng commit .env
- Đừng hardcode URL, dùng settings từ pydantic-settings
Kết quả thực tế: trên 50+ dự án mình đo, rate compile-on-first-try tăng từ khoảng 60% lên hơn 85% sau khi có CLAUDE.md đầy đủ. Không phải phép màu, đơn giản là Claude không phải đoán convention nữa.
Tip 2: Scope Context, Ít Hơn Là Nhiều Hơn
Sao phải scope context kỹ? Vì ngay cả model có context window dài như Claude Opus 4.7 (1M token) vẫn bị "lost in the middle", chất lượng output giảm khi prompt nhồi quá nhiều file không liên quan (Stanford research on long-context LLMs, 2024 cập nhật 2025). Scope đúng giúp Claude tập trung vào đoạn cần sửa.
Sai lầm phổ biến: bật Claude Code rồi hỏi vague kiểu "fix lỗi authentication".
Bad:
Fix lỗi authentication trong project của mình
Good:
Đọc file src/auth/jwt_handler.py và src/middleware/auth_middleware.py.
Lỗi: token refresh trả về 401 khi access token còn valid 5 giây.
Expected: refresh chỉ trigger khi access token hết hạn.
Chỉ sửa 2 file đó, đừng touch file khác.
Pattern mình dùng đi dùng lại:
- Read file X, chỉ file liên quan
- Files to modify: [list], giới hạn scope rõ ràng
- Don't touch: [list], exclusion explicit
Đơn giản vậy thôi. Bạn càng nói rõ ranh giới, output càng sạch.
Tip 3: Chia Nhỏ Task Trước Khi Hỏi
Claude Code làm tốt nhất với task dưới 100 dòng code thay đổi. Nghiên cứu của METR năm 2026 đo rằng accuracy của AI coding agent giảm gần 40% khi task vượt quá 200 LOC một lần submit (METR, 2026). Ý nghĩa thực tế: chia task thành nhiều bước nhỏ luôn hơn dồn cục.
Bad (1 prompt cho cả feature):
Build tính năng order management: tạo order, update status,
cancel order, refund, notify email, generate invoice PDF
Good (sub-task tuần tự):
Task 1: Tạo Order model + migration (chỉ schema, chưa business logic)
---
Task 2: POST /orders endpoint, validate cart, create order, return order_id
---
Task 3: Webhook handler cho payment provider, update order status
---
Task 4: Email notification khi order confirmed (dùng template ở templates/email/)
Mỗi task xong, review, commit, rồi mới qua task kế. Rollback dễ. Bug truy ngược dễ. Đỡ stress.
Tip 4: Spec Trước, Code Sau
Có nên cho Claude code thẳng feature lớn không? Không. Theo framework CRISP (Context, Role, Instructions, Specifications, Polish) phổ biến trong cộng đồng dev 2026, viết spec trước khi code cải thiện chất lượng output 20-60% trên benchmark chuẩn (Lakera, 2026). Spec ngắn rẻ hơn code sai gấp nhiều lần.
Mình cần build rate limiting cho API.
Trước khi code, hãy viết spec ngắn (10-15 dòng) covering:
- Algorithm (token bucket, sliding window, hay fixed window?)
- Storage (Redis, in-memory?)
- Config: rate per endpoint hay global?
- Response khi bị limit (HTTP status, body, headers)
- Test case sẽ viết
Khi mình approve spec thì mới code.
Claude viết spec rất tốt. Output thường bắt được edge case bạn chưa nghĩ tới. Mình đã tránh được hai ba lần refactor đau đớn nhờ bước này.
Tip 5: Test-Driven Prompting
Đây là kỹ thuật quan trọng vì nó ép Claude define behavior trước khi viết logic. Theo khảo sát của Stack Overflow 2025, 84% developer đã dùng AI tool trong workflow, nhưng chỉ một phần nhỏ dùng kèm test-first (Stack Overflow Developer Survey, 2025). Đó là cơ hội để tách bạn ra khỏi đám đông.
Prompt Claude viết test trước, code sau, y hệt TDD nhưng AI làm:
# Bước 1: Viết test trước
# Prompt: "Viết pytest tests cho UserService.create_user().
# Test case cần: valid input, duplicate email, invalid email format,
# weak password, missing required fields."
# Bước 2: Claude viết tests (chưa có implementation)
# tests/test_user_service.py
import pytest
from unittest.mock import Mock
from app.services.user_service import UserService
class TestCreateUser:
def test_create_user_success(self, db_session):
service = UserService(db_session)
result = service.create_user(
email="[email protected]",
password="SecurePass123!",
name="Nguyen Van A"
)
assert result.id is not None
assert result.email == "[email protected]"
def test_create_user_duplicate_email(self, db_session):
service = UserService(db_session)
service.create_user(email="[email protected]", password="Pass123!", name="User 1")
with pytest.raises(EmailAlreadyExistsError):
service.create_user(email="[email protected]", password="Pass456!", name="User 2")
# ... thêm test
# Bước 3: Prompt: "Bây giờ implement UserService.create_user() để pass tất cả tests trên"
Coverage có ngay từ đầu, ít bug hơn. Chi tiết workflow ở Claude Code viết Unit Test, Workflow thực tế.
Tip 6: Slash Command Custom
Khi nào nên tự build slash command? Khi bạn lặp đi lặp lại cùng một loại prompt. Theo Anthropic, slash command đóng vai trò như prompt template version-controlled, giảm "prompt drift" giữa các session (Anthropic Claude Code docs, 2026). Mình thường có 5-7 command trong mỗi project lớn.
Claude Code cho phép tạo slash command trong .claude/commands/. Một số command mình hay dùng:
<!-- .claude/commands/review.md -->
# /review
Review code được chỉ định theo checklist:
1. Security: SQL injection, XSS, auth bypass, data leak
2. Performance: N+1 queries, missing index, blocking I/O
3. Error handling: uncaught exception, missing validation
4. Tests: coverage gap, missing edge case
5. Naming: rõ ràng, comment tiếng Việt cho business logic phức tạp
Output: numbered list với severity (critical/warning/info) và đề xuất fix cụ thể.
<!-- .claude/commands/docstring.md -->
# /docstring
Thêm docstring cho tất cả function trong file được chỉ định.
Format: Google-style docstring.
Ngôn ngữ: tiếng Anh cho technical param, có thể note ngắn tiếng Việt cho business context.
Cách dùng: /review src/api/orders.py hoặc /docstring src/services/payment.py.
Tip 7: Sub-agent Orchestration
Sub-agent có giúp ích thật không? Có, nhưng không phải task nào cũng đáng. Dữ liệu nội bộ Anthropic cho thấy task lớn được phân rã thành sub-agent parallel rút thời gian từ 3,1 giờ xuống khoảng 15 phút trên một số benchmark, giảm 92% (Anthropic, 2026). Pattern bên dưới là cách mình áp cho feature lớn cần file ownership rõ ràng.
Implement tính năng "bulk import sản phẩm từ CSV" với 3 sub-task parallel:
Sub-task A (file ownership: src/parsers/*):
- Build CSV parser với validation: required field, data type, duplicate SKU
- Output: ParsedProduct[] hoặc ParseError[]
Sub-task B (file ownership: src/services/product_import.py):
- Build ProductImportService: batch upsert, rollback on error, progress tracking
- Đợi Sub-task A define interface trước
Sub-task C (file ownership: src/api/import.py + tests/):
- POST /products/import endpoint: multipart upload, async job, return job_id
- GET /products/import/{job_id}/status: progress tracking
Chỉ merge khi cả 3 sub-task DONE và tests pass.
Tip 8: Error Context, Copy Đúng Thứ
Vì sao copy nguyên error message vẫn ra suggest sai? Vì AI cần ngữ cảnh: action gây lỗi, môi trường, file nghi ngờ, những gì đã thử. Nghiên cứu prompt engineering năm 2026 chỉ ra rằng prompt giàu context nhưng được scope rõ cải thiện accuracy 25-40% so với prompt chỉ có error trace (Lushbinary, 2026). Đừng chỉ copy stack trace.
Template debug prompt:
## Error
[paste full traceback, đừng cắt bớt]
## Context
- Xảy ra khi: [action cụ thể, ví dụ "khi gọi POST /orders với cart trống"]
- Environment: [local / staging / production]
- Khi nào bắt đầu xảy ra: [sau deploy nào, sau thay đổi gì]
## Đã thử
- [list những gì đã thử, để Claude không suggest lại]
## Files liên quan
- [file name], [dòng code nghi ngờ]
Cụ thể hơn:
# Đừng:
# "Lỗi 500 khi tạo order"
# Thay bằng:
"""
## Error
sqlalchemy.exc.IntegrityError: (psycopg2.errors.ForeignKeyViolation)
INSERT INTO orders (user_id, ...) VALUES (99999, ...)
DETAIL: Key (user_id)=(99999) is not present in table "users".
## Context
- Xảy ra khi: test E2E với user_id hardcode
- Files: src/services/order_service.py line 45, tests/e2e/test_order_flow.py line 89
## Đã thử
- Thêm user_id vào DB trước, không fix, vẫn lỗi với id khác
"""
Kết quả: Claude nhắm trúng root cause ngay lần đầu, đỡ phải đoán hai ba lượt.
Tip 9: Mẹo Ngôn Ngữ Cho Dev Việt
Claude Code có hiểu tiếng Việt tốt không? Tốt. Theo benchmark của Anthropic, model Claude xử lý đa ngôn ngữ với độ chính xác hơn 90% trên 12 ngôn ngữ phổ biến gồm tiếng Việt (Anthropic Model Card, 2024 và bản cập nhật 2026). Vấn đề không phải Claude hiểu được hay không, mà là cách bạn mix.
Mix tiếng Anh và Việt smart
# Tốt, technical term giữ tiếng Anh, ngữ cảnh business bằng tiếng Việt:
"Implement tính năng 'xét duyệt đơn hàng', khi order.status = 'pending_approval',
manager có thể approve hoặc reject. Ghi audit log mỗi action."
# Tránh, dịch technical term sang tiếng Việt:
"Triển khai tính năng quản lý trạng thái đơn đặt hàng với đăng nhập xác thực JWT"
Comment pattern cho business logic Việt
def calculate_vat(price: float, is_enterprise: bool) -> float:
"""Calculate VAT based on Vietnamese tax regulation.
Vietnamese context: Doanh nghiệp được khấu trừ VAT đầu vào.
Thông tư 80/2021/TT-BTC: VAT standard rate 10%, giảm 8% theo NĐ 44.
"""
rate = 0.08 if is_enterprise else 0.10
return price * rate
Prompt tiếng Việt cho domain Việt
Khi business logic phức tạp (thuế, luật, quy trình hành chính Việt Nam), prompt tiếng Việt ra kết quả tốt hơn vì Claude không phải translate mental model. Mình đã test trên hơn 30 case domain-specific và rate đúng cao hơn rõ rệt.
Tip 10: Workflow Với Git
Claude Code tích hợp Git như thế nào trong thực tế? Mỗi task nhỏ, một branch, một commit. Theo Faros AI, team đo Claude Code ROI dựa vào số commit per task và rework rate; team nào kết hợp Git hygiene tốt với Claude Code giảm rework 30% so với team không có quy trình (Faros AI, 2026). Pattern dưới là cách mình giữ lịch sử Git sạch.
# Trước khi bắt đầu task
git checkout -b feature/payment-webhook
claude "Task: implement Stripe webhook handler cho event: payment_intent.succeeded,
payment_intent.payment_failed, charge.refunded.
Files to create: src/webhooks/stripe_handler.py, tests/test_stripe_webhook.py
Đừng touch: src/api/ (chỉ register route sau khi handler xong)"
# Sau khi xong
git diff # review trước khi commit
git add src/webhooks/ tests/
git commit -m "feat: add Stripe webhook handler for payment events"
Auto-commit pattern:
Sau mỗi sub-task xong, hãy:
1. Run tests: pytest tests/test_stripe_webhook.py -v
2. Nếu pass: git add [changed files] && git commit -m "feat: ..."
3. Nếu fail: fix trước khi commit
Chi tiết setup ở Cài đặt Claude Code, Step by Step.
Bonus: Template Prompt Library
Một số template mình tái sử dụng nhiều nhất:
## Template: New Endpoint
Tạo [METHOD] /[path] endpoint:
- Request: [body/params schema]
- Response: [success response shape]
- Errors: [list error case và HTTP status]
- Auth: [required/optional/none]
- Files to create/modify: [list]
- Test case: [list]
## Template: Refactor
Refactor [file] với mục tiêu:
- Tách [concern A] và [concern B] thành class riêng
- Giữ nguyên public API (existing test không được fail)
- Đừng add feature mới
## Template: Performance Fix
[File] đang chậm, profiling cho thấy bottleneck ở [function/query].
Current: [đo được con số gì, ví dụ 450ms/request]
Target: < [X]ms
Constraints: không thay đổi API response shape
Ví dụ thực tế: mình đã build toàn bộ ZaloCRM integration layer chỉ dùng Claude Code với 10 tip này, hoàn thành trong 3 tuần thay vì estimate ban đầu 8 tuần.
FAQ
Claude Code có hiểu tiếng Việt tốt không, có nên prompt tiếng Anh?
Claude Code hiểu tiếng Việt rất tốt, model gốc đạt accuracy hơn 90% trên benchmark đa ngôn ngữ (Anthropic, 2024). Cách tối ưu: prompt tiếng Việt cho business context, tiếng Anh cho technical specification. Mix hai ngôn ngữ trong cùng một prompt hoàn toàn OK và đôi khi ra kết quả tốt hơn pure English, nhất là khi domain có yếu tố đặc thù Việt Nam (thuế, luật).
Tại sao Claude Code đôi khi generate code không compile?
Ba nguyên nhân chính: (1) thiếu context về dependency hiện tại, fix bằng cách cung cấp requirements.txt hoặc package.json, (2) scope task quá lớn, chia nhỏ dưới 100 LOC theo benchmark METR (METR, 2026), (3) CLAUDE.md chưa khai báo stack. Sau khi áp 10 tip này, rate compile-on-first-try của mình tăng từ khoảng 60% lên hơn 85%.
Có nên dùng Claude Code cho codebase legacy không?
Có, nhưng cần thêm bước trung gian: cho Claude đọc và tóm tắt file (không code) rồi mới yêu cầu thay đổi. Legacy code thường thiếu type hint và docstring, Claude cần context bổ sung. Theo Pragmatic Engineer, 73% team đã dùng AI coding daily (Pragmatic Engineer, 2026), trong đó nhiều team triển khai trên codebase legacy bằng cách bắt đầu với module độc lập trước.
Claude Code có nhớ conversation trước không?
Trong cùng một session: có. Khác session: không, trừ khi bạn dùng CLAUDE.md (project memory) hoặc claude-mem persistent context. Đó là lý do CLAUDE.md quan trọng đến vậy, nó là "memory" persistent duy nhất Claude Code đọc tự động ở đầu session.
Tip nào nên áp dụng đầu tiên nếu mình mới bắt đầu?
Tip 1 (CLAUDE.md) và Tip 2 (scope context). Hai tip này tự nó đã đem lại phần lớn lợi ích. Theo khảo sát Stack Overflow 2025, 51% developer dùng AI tool hàng ngày nhưng chỉ một phần nhỏ tận dụng project-level config (Stack Overflow, 2025). Setup CLAUDE.md đúng đem bạn vào nhóm thiểu số đó ngay.