claude-help

Hướng dẫn viết Prompt hiệu quả cho Claude Code CLI

Prompt tốt = Kết quả chính xác + Tiết kiệm thời gian + Ít phải chỉnh sửa


1. Nguyên tắc viết prompt

1.1. Cụ thể và rõ ràng

Prompt mơ hồ sẽ cho kết quả mơ hồ. Luôn nêu rõ bạn muốn gì.

Không nên:

Tạo API cho user

Nên:

Tạo REST API quản lý user với các endpoint:
- POST /api/users — đăng ký tài khoản mới
- GET /api/users/:id — lấy thông tin user theo ID
- PUT /api/users/:id — cập nhật thông tin user
- DELETE /api/users/:id — xóa user (soft delete)
Sử dụng Express + TypeScript, validate input bằng Zod.

1.2. Cung cấp ngữ cảnh

Claude Code hoạt động tốt hơn khi hiểu bối cảnh dự án của bạn.

Dự án hiện tại dùng:
- Node.js 20 + TypeScript 5
- Prisma ORM với PostgreSQL
- Clean architecture (controller → service → repository)
- Đã có sẵn middleware auth ở src/middlewares/auth.ts

Thêm endpoint GET /api/reports/revenue cho phép admin xem báo cáo doanh thu theo tháng.
Trả về JSON gồm: tổng doanh thu, số đơn hàng, doanh thu trung bình mỗi đơn.

1.3. Chia nhỏ task phức tạp

Thay vì yêu cầu tất cả cùng lúc, hãy chia thành từng bước.

Không nên:

Tạo hệ thống e-commerce hoàn chỉnh với giỏ hàng, thanh toán, quản lý đơn hàng,
quản lý kho, báo cáo, notification, và admin panel.

Nên — Bước 1:

Tạo database schema cho hệ thống e-commerce gồm các bảng:
- products (id, name, price, stock, category_id)
- categories (id, name, parent_id)
- orders (id, user_id, status, total, created_at)
- order_items (id, order_id, product_id, quantity, price)
Viết Prisma migration và seed data mẫu.

Nên — Bước 2:

Dựa trên schema đã tạo, viết CRUD API cho products:
- Listing với filter theo category, giá, search theo tên
- Pagination cursor-based
- Upload ảnh sản phẩm

1.4. Chỉ định format đầu ra

Nói rõ bạn muốn kết quả trả về dạng gì.

Phân tích cấu trúc thư mục dự án hiện tại và trả về:
1. Sơ đồ cây thư mục (tree format)
2. Mô tả ngắn vai trò của từng thư mục chính
3. Đánh giá: cấu trúc có theo chuẩn nào không (MVC, Clean Architecture, DDD...)
4. Đề xuất cải thiện nếu có

2. Prompt templates cho các tình huống phổ biến

2.1. Tạo dự án mới

Tạo dự án Node.js TypeScript mới với:
- Express server cổng 3000
- PostgreSQL với Prisma ORM
- JWT authentication (access token + refresh token)
- Cấu trúc thư mục clean architecture:
  src/
    controllers/
    services/
    repositories/
    middlewares/
    routes/
    utils/
    types/
- Docker Compose cho development (app + postgres + redis)
- ESLint + Prettier đã config
- File .env.example với các biến cần thiết
- Script: dev, build, start, lint, test
Khởi tạo dự án Next.js 14 App Router với:
- TypeScript strict mode
- Tailwind CSS + shadcn/ui
- NextAuth.js cho authentication (Google + GitHub provider)
- Prisma ORM kết nối PostgreSQL
- Cấu trúc: app/(auth), app/(dashboard), app/api
- Layout mặc định có sidebar và header
- Dark mode toggle
- Docker Compose cho development
Tạo dự án Golang REST API với:
- Gin framework
- GORM với PostgreSQL
- JWT middleware
- Cấu trúc thư mục:
  cmd/server/
  internal/handler/
  internal/service/
  internal/repository/
  internal/model/
  pkg/
- Makefile với các target: run, build, test, migrate
- Dockerfile multi-stage build

2.2. Fix bug

Template cơ bản:

File src/auth/login.ts đang bị lỗi: user login thành công nhưng không redirect về dashboard.
Error log:
TypeError: Cannot read properties of undefined (reading 'role')
    at AuthService.login (src/auth/auth.service.ts:45:23)

Hãy tìm nguyên nhân và sửa lỗi.

Template chi tiết (cho bug phức tạp):

Bug: API trả về 500 khi upload file lớn hơn 5MB.

Các bước tái hiện:
1. Gọi POST /api/upload với file 6MB
2. Server trả về 500 Internal Server Error

Hành vi mong muốn: Chấp nhận file tối đa 10MB, trả lỗi 413 nếu vượt quá.

Hành vi thực tế: Crash với error "PayloadTooLargeError"

File liên quan: src/routes/upload.ts, src/middlewares/multer.ts

Hãy tìm nguyên nhân gốc, sửa lỗi, và thêm xử lý lỗi phù hợp.

Template cho lỗi không rõ nguyên nhân:

Ứng dụng bị chậm dần sau khi chạy vài giờ, memory tăng liên tục.

Hãy kiểm tra codebase để tìm:
1. Memory leak tiềm ẩn (event listener chưa remove, connection chưa close...)
2. Các vòng lặp hoặc đệ quy có thể gây tích tụ bộ nhớ
3. Cache không có TTL hoặc max size
Liệt kê tất cả vấn đề tìm được và cách sửa.

2.3. Thêm tính năng

Thêm chức năng gửi email thông báo vào module đơn hàng:
- Gửi email xác nhận khi tạo đơn hàng mới
- Gửi email khi đơn hàng thay đổi trạng thái (đang giao, đã giao, hủy)
- Sử dụng Nodemailer với template HTML
- Template email đặt trong src/templates/
- Thêm queue xử lý gửi email bằng BullMQ để không block API
- Viết unit test cho email service
Thêm chức năng export báo cáo ra Excel cho module thống kê:
- Endpoint GET /api/reports/export?type=revenue&from=2024-01-01&to=2024-12-31
- Dùng thư viện exceljs
- File Excel gồm: header, data rows, summary row cuối
- Format: số tiền có dấu phẩy, ngày theo dd/mm/yyyy
- Trả về file .xlsx để download
- Viết test kiểm tra file xuất ra đúng format

2.4. Refactor

Refactor file src/services/order.service.ts theo Single Responsibility Principle.
File hiện tại 800 dòng, xử lý cả: tạo đơn, tính phí, gửi email, cập nhật kho.

Tách thành các service riêng:
- OrderService — quản lý CRUD đơn hàng
- PricingService — tính giá, phí ship, khuyến mãi
- InventoryService — cập nhật tồn kho
- NotificationService — gửi thông báo

Giữ nguyên behavior, đảm bảo các test hiện tại vẫn pass.
Chạy test sau khi refactor.
Refactor các API endpoint để dùng chung error handling:
- Tạo custom error classes (NotFoundError, ValidationError, UnauthorizedError...)
- Tạo global error handler middleware
- Thay thế tất cả try-catch trong controller bằng asyncHandler wrapper
- Đảm bảo error response format thống nhất:
  { "error": { "code": "NOT_FOUND", "message": "..." } }

2.5. Code review

Review code trong file src/controllers/payment.controller.ts:
- Kiểm tra logic errors và edge cases chưa xử lý
- Tìm lỗ hổng bảo mật (SQL injection, XSS, IDOR...)
- Đánh giá performance (N+1 query, thiếu index...)
- Kiểm tra error handling đã đầy đủ chưa
- Code style có nhất quán không
Liệt kê từng vấn đề kèm mức độ (critical/warning/info) và gợi ý sửa.
Review toàn bộ thư mục src/middlewares/:
- Kiểm tra auth middleware có handle đúng các case: token hết hạn, token sai format, không có token
- Rate limiting đã config hợp lý chưa
- CORS config có an toàn không
- Có middleware nào thừa hoặc trùng chức năng không

2.6. Database

Tạo migration cho bảng products với các field:
- id: UUID, primary key, auto-generate
- name: varchar(255), not null
- slug: varchar(255), unique, not null
- description: text, nullable
- price: decimal(12,2), not null, default 0
- compare_price: decimal(12,2), nullable
- stock: integer, not null, default 0
- category_id: UUID, foreign key tới categories
- is_active: boolean, default true
- created_at: timestamp, default now
- updated_at: timestamp, auto-update

Thêm index cho: slug, category_id, is_active, price.
Thêm composite index cho (category_id, is_active, price) phục vụ filter.
Viết seed data 20 sản phẩm mẫu.
Tối ưu query cho trang listing sản phẩm:
- Query hiện tại trong src/repositories/product.repository.ts
- Trang hiện load mất 3-5 giây với 100k sản phẩm
- Hãy phân tích query plan (EXPLAIN ANALYZE)
- Đề xuất index phù hợp
- Viết lại query tối ưu hơn
- So sánh performance trước và sau

2.7. API Design

Thiết kế REST API cho resource "courses" (hệ thống e-learning):

Endpoints cần có:
- CRUD cho courses
- Enroll/unenroll student
- Lấy danh sách students trong course
- Lấy danh sách courses của student
- Thống kê tiến độ học

Yêu cầu:
- Validate input bằng Zod schema
- Error response theo chuẩn RFC 7807
- Pagination cursor-based cho listing
- Filter: status, category, instructor, price range
- Sort: newest, price_asc, price_desc, popular
- Swagger/OpenAPI docs
- Rate limiting: 100 req/min cho authenticated, 20 req/min cho anonymous
Thiết kế GraphQL schema cho hệ thống quản lý task:
- Type: User, Project, Task, Comment, Label
- Query: tasks (filter, sort, paginate), task by ID, projects
- Mutation: createTask, updateTask, assignTask, addComment
- Subscription: taskUpdated, commentAdded
- Sử dụng DataLoader để giải quyết N+1
- Implement authorization ở resolver level

2.8. Deploy

Tạo cấu hình deploy cho AWS ECS Fargate:
- Dockerfile multi-stage (build → production)
- GitHub Actions CI/CD pipeline:
  + Chạy lint và test
  + Build Docker image
  + Push lên ECR
  + Deploy lên ECS
- Task definition với health check endpoint /health
- Environment variables từ AWS Parameter Store
- Auto-scaling: min 2, max 10, target CPU 70%
- ALB với SSL certificate từ ACM
- File docker-compose.yml cho test local
Tạo cấu hình deploy lên VPS Ubuntu với:
- Dockerfile multi-stage optimized
- Docker Compose production (app + postgres + redis + nginx)
- Nginx reverse proxy với SSL Let's Encrypt
- GitHub Actions: test → build → deploy qua SSH
- Script backup database hàng ngày
- Monitoring với health check endpoint
- File .env.production.example

3. Prompt patterns nâng cao

3.1. Chain of Thought — Suy luận từng bước

Yêu cầu Claude phân tích trước khi hành động, phù hợp cho vấn đề phức tạp.

Trước khi code, hãy phân tích:
1. Liệt kê tất cả file cần thay đổi
2. Mô tả thay đổi cho từng file
3. Xác định rủi ro và cách xử lý
4. Sau đó mới tiến hành implement

Task: Chuyển authentication từ session-based sang JWT-based.
Hãy debug theo các bước:
1. Đọc error log và xác định file/dòng gây lỗi
2. Đọc file đó và phân tích logic
3. Tìm root cause (không chỉ triệu chứng)
4. Đề xuất cách sửa và giải thích tại sao
5. Implement fix
6. Kiểm tra xem fix có gây side effect không

Error: "FATAL: too many connections for role postgres"

3.2. Few-shot — Cho ví dụ mẫu

Cung cấp ví dụ để Claude hiểu pattern bạn muốn.

Tạo validation schema cho các model còn lại, theo pattern giống ví dụ dưới đây.

Ví dụ đã có — file src/validations/user.validation.ts:

import { z } from 'zod';

export const createUserSchema = z.object({
  body: z.object({
    email: z.string().email('Email không hợp lệ'),
    password: z.string().min(8, 'Mật khẩu tối thiểu 8 ký tự'),
    name: z.string().min(2, 'Tên tối thiểu 2 ký tự'),
  }),
});

export const updateUserSchema = z.object({
  params: z.object({ id: z.string().uuid() }),
  body: z.object({
    email: z.string().email().optional(),
    name: z.string().min(2).optional(),
  }),
});

Tạo tương tự cho: Product, Order, Category.

3.3. Role-based — Đặt vai trò chuyên gia

Gán vai trò để Claude tập trung vào góc nhìn cụ thể.

Với tư cách Senior Security Engineer, hãy audit toàn bộ codebase:
- Tìm tất cả lỗ hổng bảo mật (OWASP Top 10)
- Kiểm tra cách lưu trữ password, token, secret
- Đánh giá input validation
- Kiểm tra authorization logic
- Xếp hạng mức độ nghiêm trọng: Critical / High / Medium / Low
- Đề xuất cách sửa cho từng lỗ hổng
Với tư cách Database Performance Expert, phân tích:
- Tất cả query trong thư mục src/repositories/
- Tìm N+1 queries
- Tìm query thiếu index
- Tìm query có thể gộp hoặc cache
- Đề xuất cải thiện kèm ước tính mức độ cải thiện

3.4. Constraint-based — Đặt ràng buộc

Đưa ra giới hạn rõ ràng để kiểm soát kết quả.

Tối ưu performance cho trang dashboard với các ràng buộc:
- KHÔNG thay đổi database schema
- KHÔNG thêm thư viện mới
- KHÔNG thay đổi API response format
- Chỉ được sửa code ở frontend và caching layer
- Mục tiêu: giảm load time từ 5s xuống dưới 1s
Refactor module authentication với ràng buộc:
- Giữ nguyên tất cả API endpoint paths
- Giữ nguyên request/response format
- Backward compatible với mobile app v2.x đang dùng
- Không downtime khi deploy
- Phải có migration script cho data hiện tại

4. Prompt cho từng ngôn ngữ/framework

4.1. Node.js / TypeScript

Tạo TypeScript utility type cho API response chuẩn:
- SuccessResponse<T> — data: T, message: string
- ErrorResponse — error: { code: string, message: string, details?: unknown }
- PaginatedResponse<T> — data: T[], pagination: { page, limit, total, totalPages }
- Dùng generic để type-safe
- Export từ src/types/response.ts
Viết middleware xử lý async error cho Express TypeScript:
- Wrapper function asyncHandler bọc route handler
- Tự động catch error và chuyển cho error handler
- Giữ nguyên TypeScript type cho Request, Response
- Tương thích với custom Request type đã extend thêm field user
Tạo module cache với Redis cho dự án Express TypeScript:
- CacheService class với các method: get, set, del, clearByPattern
- Decorator @Cacheable(ttl, keyPrefix) cho method của service
- Auto-invalidate khi dữ liệu thay đổi
- Fallback khi Redis disconnect (log warning, không crash)
- Unit test với Redis mock

4.2. Golang

Tạo middleware chain cho Gin framework:
- Logger middleware: log request method, path, status, duration
- Recovery middleware: recover panic, trả 500 có error ID
- Auth middleware: verify JWT, inject user info vào context
- RateLimit middleware: dùng golang.org/x/time/rate, 100 req/s per IP
- CORS middleware: config cho phép frontend domain
Viết test cho từng middleware.
Implement Repository pattern cho Go với GORM:
- Interface ProductRepository định nghĩa các method
- Struct productRepository implement interface
- Method: Create, FindByID, FindAll (filter + pagination), Update, SoftDelete
- Dùng context.Context cho timeout và cancellation
- Viết table-driven test
Tạo worker pool pattern xử lý background job trong Go:
- Configurable số worker (goroutine)
- Job queue dùng channel
- Graceful shutdown khi nhận signal SIGTERM
- Retry logic: tối đa 3 lần, exponential backoff
- Dead letter queue cho job thất bại
- Metrics: số job xử lý, thời gian trung bình, số lỗi

4.3. Next.js

Tạo trang dashboard Next.js 14 App Router:
- Layout: sidebar trái (co lại được), header trên, main content
- Sidebar: navigation links với active state, user avatar ở dưới
- Dùng Server Component cho layout, Client Component cho interactive
- Suspense boundary với loading skeleton
- Responsive: sidebar thành hamburger menu trên mobile
- Dùng Tailwind CSS + shadcn/ui components
Implement infinite scroll cho trang sản phẩm Next.js:
- Server Component fetch data ban đầu (SSR)
- Client Component handle scroll và load thêm
- Dùng Intersection Observer API
- Hiển thị loading spinner khi đang fetch
- Giữ scroll position khi navigate back
- Cache đã load bằng React Query
Tạo form đa bước (multi-step form) trong Next.js:
- Bước 1: Thông tin cá nhân (tên, email, phone)
- Bước 2: Địa chỉ (tỉnh/thành, quận/huyện, phường/xã, chi tiết)
- Bước 3: Xác nhận thông tin
- Dùng React Hook Form + Zod validation
- Progress bar hiển thị bước hiện tại
- Lưu draft vào localStorage, tự khôi phục khi reload
- Submit qua Server Action

4.4. PostgreSQL

Viết query phân tích doanh thu PostgreSQL:
- Doanh thu theo tháng trong năm (kể cả tháng chưa có đơn)
- So sánh với cùng kỳ năm trước (year-over-year)
- Tính growth rate phần trăm
- Top 10 sản phẩm bán chạy nhất
- Dùng CTE cho dễ đọc
- Tạo materialized view nếu query phức tạp
- Viết function tính tự động
Tối ưu PostgreSQL cho dự án hiện tại:
- Phân tích slow query log (query > 100ms)
- Kiểm tra missing index bằng pg_stat_user_tables
- Kiểm tra unused index
- Kiểm tra bloat trên các bảng lớn
- Đề xuất config postgresql.conf cho server 8GB RAM, 4 CPU
- Viết script maintenance: VACUUM, ANALYZE, REINDEX

5. Anti-patterns — Những điều cần tránh

5.1. Prompt quá mơ hồ

# Tránh
Làm cho code tốt hơn

# Nên
Refactor file src/services/user.service.ts:
- Tách hàm registerUser (đang 120 dòng) thành các hàm nhỏ hơn
- Thêm TypeScript type cho tất cả parameter và return value
- Thay thế magic number bằng constant
- Thêm JSDoc comment cho public method

5.2. Yêu cầu quá nhiều cùng lúc

# Tránh
Tạo hệ thống hoàn chỉnh gồm frontend, backend, database, authentication,
payment, notification, admin panel, mobile app, analytics, và deploy lên cloud.

# Nên — chia thành nhiều prompt riêng
Prompt 1: Thiết kế database schema cho hệ thống quản lý đơn hàng
Prompt 2: Tạo REST API cho module sản phẩm
Prompt 3: Tạo REST API cho module đơn hàng
Prompt 4: Thêm authentication và authorization
Prompt 5: Tạo admin dashboard frontend
...

5.3. Không cung cấp ngữ cảnh

# Tránh
Sửa lỗi login

# Nên
Sửa lỗi login ở file src/auth/login.controller.ts:
- User nhập đúng email/password nhưng API trả về 401
- Lỗi chỉ xảy ra với tài khoản tạo sau ngày 01/03/2024
- Trước đó chạy migration thêm field email_verified
- Nghi ngờ liên quan đến field email_verified mới thêm

5.4. Không đặt ràng buộc

# Tránh
Thêm caching cho API

# Nên
Thêm caching cho API GET /api/products:
- Dùng Redis (đã có sẵn trong docker-compose)
- TTL 5 phút cho listing, 30 phút cho chi tiết sản phẩm
- Invalidate cache khi product được tạo/sửa/xóa
- Cache key format: products:list:{query_hash}, products:detail:{id}
- Không cache nếu user đang filter theo giá (giá thay đổi thường xuyên)

5.5. Không chỉ rõ yêu cầu chất lượng

# Tránh
Viết API tạo đơn hàng

# Nên
Viết API tạo đơn hàng với đầy đủ:
- Validate: kiểm tra sản phẩm tồn tại, còn hàng, giá khớp
- Transaction: đảm bảo atomicity (tạo order + giảm stock)
- Error handling: trả error code cụ thể cho từng case
- Idempotency: tránh tạo đơn trùng khi client retry
- Logging: log đủ thông tin để debug
- Test: unit test cho service, integration test cho API

6. Kết hợp prompt với skills

6.1. Quy trình phát triển tính năng mới

Bước 1 — Thiết kế:

Thiết kế module quản lý coupon cho hệ thống e-commerce:
- Các loại coupon: giảm %, giảm số tiền, free ship
- Điều kiện áp dụng: đơn tối thiểu, danh mục sản phẩm, user cụ thể
- Giới hạn: số lần dùng, thời hạn
Chỉ cần thiết kế database schema và API endpoints, chưa code.

Bước 2 — Implement:

Implement module coupon theo thiết kế đã thống nhất ở trên.
Bắt đầu với: Prisma schema, migration, và CRUD API cho coupon.

Bước 3 — Review bằng skill:

/code-review

Bước 4 — Test:

Viết test cho module coupon:
- Unit test cho CouponService (tất cả business logic)
- Integration test cho API endpoints
- Edge cases: coupon hết hạn, hết lượt dùng, đơn không đủ điều kiện

Bước 5 — Kiểm tra bảo mật:

/engineering-skills:senior-security

Bước 6 — Commit:

/commit

6.2. Quy trình fix bug

Bước 1 — Mô tả bug:

Bug: Trang checkout hiển thị sai tổng tiền khi áp dụng coupon giảm %.
Ví dụ: Đơn 500k, coupon giảm 20%, tổng hiển thị 450k thay vì 400k.
Tìm và sửa lỗi.

Bước 2 — Verify bằng test:

Thêm test case cho bug vừa sửa để đảm bảo không tái phát:
- Test giảm % với các mức: 10%, 20%, 50%, 100%
- Test giảm % với đơn hàng nhiều sản phẩm
- Test edge case: coupon giảm nhiều hơn tổng đơn

Bước 3 — Review:

/simplify

Bước 4 — Commit:

/commit

6.3. Quy trình refactor

Bước 1 — Đánh giá hiện trạng:

Phân tích file src/services/order.service.ts:
- Đếm số dòng, số hàm, độ phức tạp cyclomatic
- Liệt kê các code smell
- Đề xuất kế hoạch refactor (chưa thực hiện)

Bước 2 — Thực hiện refactor:

Thực hiện refactor theo kế hoạch đã đề xuất ở trên.
Refactor từng bước, chạy test sau mỗi bước để đảm bảo không break.

Bước 3 — Đánh giá kết quả:

/engineering-skills:senior-qa

Bước 4 — Review kiến trúc:

/engineering-skills:senior-architect

6.4. Bảng tổng hợp skill theo tình huống

Viết code mới  →  /simplify → /code-review → /commit
Fix bug         →  /simplify → /engineering-skills:senior-qa → /commit
Refactor        →  /code-review → /engineering-skills:senior-architect → /commit
Trước deploy    →  /engineering-skills:senior-security → /engineering-skills:senior-devops
Viết API        →  /engineering-skills:senior-backend → /code-review
Viết frontend   →  /engineering-skills:senior-frontend → /frontend-design
Thiết kế DB     →  /engineering-skills:senior-backend → /code-review
Viết test       →  /engineering-skills:senior-qa → /engineering-skills:tdd-guide
Viết docs       →  /document-skills:doc-coauthoring
Review PR       →  /code-review → /qodo-skills:qodo-pr-resolver

Tổng kết

Nguyên tắc Mô tả
Cụ thể Nêu rõ file, endpoint, field, format mong muốn
Ngữ cảnh Cho biết tech stack, cấu trúc dự án, code liên quan
Chia nhỏ Mỗi prompt làm một việc rõ ràng
Ràng buộc Đặt giới hạn: không thay đổi gì, dùng thư viện nào
Chất lượng Yêu cầu test, error handling, logging, type safety
Kết hợp skill Dùng skill để review, audit, kiểm tra sau khi code

Prompt hiệu quả nhất là prompt mà khi đọc lại, bất kỳ developer nào cũng hiểu chính xác bạn muốn gì.