Hai bài trước giải thích cách tổ chức Frontend (Next.js)Backend (Firebase). Bài này hướng dẫn cách viết prompt để yêu cầu Claude Code thêm mới hoặc cập nhật tính năng — theo đúng kiến trúc đã học.
Dành cho ai? Bạn không cần biết code. Bài viết cung cấp công thức viết prompt chuẩn, kèm ví dụ thực tế. Chỉ cần điền thông tin vào mẫu → Claude Code sẽ tạo code đúng cấu trúc.

Nguyên tắc vàng khi viết prompt

1. Mô tả CÁI GÌ, không mô tả CÁCH LÀM

Claude Code biết cách viết code. Việc của bạn là mô tả kết quả mong muốn — không phải hướng dẫn từng dòng code.
❌ Không nên✅ Nên
”Tạo một useState để lưu danh sách tasks, rồi dùng useEffect gọi getDocs…""Tạo trang hiển thị danh sách tasks, dữ liệu lấy từ Firestore collection ‘tasks’"
"Dùng Dialog component từ shadcn/ui, bên trong đặt form với Input và Select…""Tạo modal thêm mới task, gồm các trường: tiêu đề, mô tả, người phụ trách, deadline”

2. Cung cấp đủ 4 thông tin

Mỗi prompt nên trả lời 4 câu hỏi:

Ở ĐÂU?

Trang nào? URL nào? Nằm trong phần nào của giao diện?

CÁI GÌ?

Hiển thị gì? Giao diện trông như thế nào? Có những thành phần nào?

DỮ LIỆU GÌ?

Lấy từ collection nào? Gồm những trường (field) nào? Liên kết với collection nào?

HÀNH VI GÌ?

Bấm nút thì sao? Submit form thì sao? Thành công/thất bại thì hiển thị gì?

3. Chia nhỏ yêu cầu

Không yêu cầu cả tính năng phức tạp trong 1 prompt. Chia thành từng bước nhỏ.
❌ Prompt quá lớn✅ Chia nhỏ thành từng bước
”Tạo toàn bộ tính năng quản lý task: trang danh sách, form thêm mới, chỉnh sửa, xóa, lọc, tìm kiếm, phân trang, realtime, thông báo”Bước 1: “Tạo trang danh sách tasks”
Bước 2: “Thêm modal tạo task mới”
Bước 3: “Thêm modal chỉnh sửa task”
Bước 4: “Thêm chức năng xóa task”
Bước 5: “Thêm bộ lọc và tìm kiếm”

4. Nêu rõ ràng buộc

Nếu có yêu cầu đặc biệt, hãy nêu rõ:
"Trang này chỉ admin mới truy cập được."
"Form phải validate: tiêu đề bắt buộc, deadline không được ở quá khứ."
"Sau khi tạo thành công → đóng modal, hiển thị toast thông báo."
"Danh sách cập nhật realtime, không cần reload."

Công thức prompt theo loại tính năng

Công thức 1: Thêm trang mới (Page)

"Tạo trang [TÊN TRANG] tại [URL].

Giao diện gồm:
- [Mô tả phần header / tiêu đề]
- [Mô tả phần nội dung chính]
- [Mô tả các nút / hành động]

Dữ liệu:
- Lấy từ Firestore collection '[TÊN COLLECTION]'
- Hiển thị các trường: [LIỆT KÊ FIELDS]
- [Realtime hay không]

Hành vi:
- [Mô tả tương tác]"

Công thức 2: Thêm modal (Dialog)

"Tạo modal [TÊN MODAL] trên trang [URL].

Khi nào mở: [Mô tả trigger — bấm nút nào, ở đâu]

Form gồm các trường:
- [Tên trường]: [Loại input] — [Ghi chú nếu có]
- ...

Khi bấm Lưu:
- Ghi vào Firestore collection '[TÊN]' với các field: [LIỆT KÊ]
- [Xử lý thành công: đóng modal, toast, refresh]
- [Xử lý thất bại: hiển thị lỗi]

Validation:
- [Trường nào bắt buộc]
- [Ràng buộc đặc biệt]"

Công thức 3: Thêm chức năng trên component có sẵn

"Trên trang [URL], thêm chức năng [MÔ TẢ].

Vị trí: [Ở đâu trên giao diện — trong bảng, trên header, cạnh mỗi item]

Hành vi:
- Khi [TRIGGER] → [HÀNH ĐỘNG]
- [Xác nhận trước khi thực hiện? (dialog confirm)]
- Sau khi xong → [CẬP NHẬT GÌ]"

Công thức 4: Cập nhật / sửa đổi tính năng

"Trên trang [URL], sửa [MÔ TẢ PHẦN CẦN SỬA].

Hiện tại: [Mô tả hoạt động hiện tại]
Mong muốn: [Mô tả hoạt động mới]

[Chi tiết thay đổi]"

Ví dụ thực tế từng bước: Xây dựng tính năng quản lý Tasks

Bước 1 — Tạo trang danh sách Tasks

"Tạo trang danh sách tasks tại /dashboard/tasks.

Giao diện gồm:
- Header: tiêu đề 'Danh sách công việc', nút 'Thêm task' ở góc phải
- Bảng dữ liệu hiển thị danh sách tasks với các cột:
  + Tiêu đề (title)
  + Trạng thái (status) — hiển thị dạng badge màu:
    todo = xám, in_progress = xanh dương, completed = xanh lá
  + Người phụ trách (assignee) — hiển thị avatar + tên
  + Deadline — hiển thị ngày, tô đỏ nếu quá hạn
  + Hành động — nút Sửa, nút Xóa
- Khi bảng trống: hiển thị empty state 'Chưa có task nào'

Dữ liệu:
- Lấy từ Firestore collection 'tasks'
- Sắp xếp theo createdAt mới nhất lên trước
- Cập nhật realtime

Trang này nằm trong dashboard layout (có sidebar)."

Bước 2 — Tạo modal thêm mới Task

"Trên trang /dashboard/tasks, tạo modal thêm mới task.

Khi nào mở: bấm nút 'Thêm task' trên header.

Form gồm các trường:
- Tiêu đề (title): input text, bắt buộc
- Mô tả (description): textarea, không bắt buộc
- Trạng thái (status): dropdown với 3 giá trị: Todo, In Progress, Completed.
  Mặc định: Todo
- Độ ưu tiên (priority): dropdown với 3 giá trị: Low, Medium, High.
  Mặc định: Medium
- Người phụ trách (assigneeId): dropdown lấy danh sách users từ
  Firestore collection 'users', hiển thị tên user
- Deadline: date picker, không được chọn ngày trong quá khứ
- Dự án (projectId): dropdown lấy từ collection 'projects',
  hiển thị tên project

Khi bấm Lưu:
- Validate: tiêu đề bắt buộc
- Ghi vào Firestore collection 'tasks' với các field trên,
  thêm createdBy = UID người đang đăng nhập,
  thêm createdAt = thời điểm hiện tại
- Thành công: đóng modal, hiển thị toast 'Tạo task thành công'
- Thất bại: hiển thị thông báo lỗi, giữ modal mở

Khi bấm Hủy hoặc click ngoài modal: đóng modal, reset form."

Bước 3 — Tạo modal chỉnh sửa Task

"Trên trang /dashboard/tasks, tạo modal chỉnh sửa task.

Khi nào mở: bấm nút 'Sửa' trên mỗi dòng trong bảng tasks.

Form giống modal thêm mới nhưng:
- Tự động điền dữ liệu hiện tại của task vào form
- Tiêu đề modal: 'Chỉnh sửa task'
- Nút submit: 'Cập nhật' thay vì 'Lưu'

Khi bấm Cập nhật:
- Ghi đè dữ liệu trong Firestore document tương ứng
- Thêm updatedAt = thời điểm hiện tại
- Thành công: đóng modal, toast 'Cập nhật thành công'
- Thất bại: hiển thị lỗi, giữ modal mở"

Bước 4 — Thêm chức năng xóa Task

"Trên trang /dashboard/tasks, thêm chức năng xóa task.

Khi bấm nút 'Xóa' trên mỗi dòng:
- Hiển thị dialog xác nhận: 'Bạn có chắc muốn xóa task [tên task]?
  Hành động này không thể hoàn tác.'
- Có 2 nút: 'Hủy' và 'Xóa'
- Nút Xóa màu đỏ

Khi xác nhận xóa:
- Xóa document khỏi Firestore collection 'tasks'
- Thành công: đóng dialog, toast 'Đã xóa task'
- Bảng tự cập nhật nhờ realtime listener"

Bước 5 — Thêm bộ lọc và tìm kiếm

"Trên trang /dashboard/tasks, thêm bộ lọc phía trên bảng.

Gồm:
- Ô tìm kiếm: lọc theo tiêu đề task (client-side filter)
- Dropdown trạng thái: Tất cả / Todo / In Progress / Completed
- Dropdown người phụ trách: Tất cả / [danh sách users từ Firestore]

Hành vi:
- Lọc ngay khi thay đổi giá trị (không cần bấm nút)
- Các bộ lọc kết hợp được (ví dụ: status = Todo VÀ assignee = User A)
- Hiển thị số lượng kết quả: 'Hiển thị X / Y tasks'"

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

Thêm trang chi tiết (Detail page)

"Tạo trang chi tiết task tại /dashboard/tasks/[id].

Khi truy cập URL này (ví dụ /dashboard/tasks/abc123):
- Lấy task từ Firestore document 'tasks/abc123'
- Nếu không tìm thấy: hiển thị trang 404

Giao diện:
- Header: tiêu đề task, badge trạng thái, nút 'Sửa', nút 'Quay lại'
- Phần thông tin: mô tả, người phụ trách (avatar + tên),
  deadline, độ ưu tiên, dự án, ngày tạo
- Phần bình luận (comments): danh sách bình luận + form thêm bình luận mới
  Bình luận lưu trong subcollection 'comments' của task document"

Thêm trang Dashboard tổng quan

"Tạo trang dashboard tổng quan tại /dashboard.

Hiển thị thống kê:
- Card 'Tổng tasks': đếm tất cả tasks trong Firestore
- Card 'Đang thực hiện': đếm tasks có status = 'in_progress'
- Card 'Hoàn thành': đếm tasks có status = 'completed'
- Card 'Quá hạn': đếm tasks có deadline < hôm nay VÀ status != 'completed'

Biểu đồ:
- Biểu đồ tròn: tỷ lệ tasks theo trạng thái

Danh sách:
- 5 tasks gần đây nhất (sắp xếp theo createdAt)
- 5 tasks sắp đến hạn (deadline gần nhất)"

Thêm chức năng upload file

"Trên modal tạo/sửa task, thêm phần đính kèm file.

Giao diện:
- Khu vực kéo-thả file hoặc bấm chọn file
- Giới hạn: tối đa 5 file, mỗi file tối đa 10MB
- Hiển thị danh sách file đã chọn với nút xóa từng file

Khi submit form:
- Upload file lên Firebase Storage tại đường dẫn: tasks/[taskId]/[filename]
- Lưu danh sách URL vào field 'attachments' (array) trong task document

Hiển thị trên trang chi tiết task:
- Danh sách file đính kèm với icon theo loại file (PDF, ảnh, Excel)
- Bấm vào file → mở trong tab mới"

Thêm phân quyền

"Thêm phân quyền cho trang /dashboard/tasks:

- Admin (role = 'admin'): xem tất cả tasks, sửa/xóa bất kỳ task nào
- Member (role = 'member'): chỉ xem tasks mình được giao (assigneeId = UID)
  hoặc tasks mình tạo (createdBy = UID). Chỉ sửa/xóa tasks của mình.

Kiểm tra role từ Firestore document 'users/[UID]' field 'role'.
Ẩn nút Xóa nếu user không có quyền xóa task đó."

Thêm thông báo realtime

"Thêm hệ thống thông báo.

Biểu tượng chuông trên Header:
- Hiển thị số thông báo chưa đọc (badge đỏ)
- Bấm vào → dropdown danh sách thông báo
- Mỗi thông báo: icon + nội dung + thời gian
- Bấm vào thông báo → đánh dấu đã đọc + chuyển đến trang liên quan

Dữ liệu:
- Lấy từ Firestore collection 'notifications'
- Lọc: userId = UID người đang đăng nhập
- Sắp xếp theo createdAt mới nhất
- Realtime listener để cập nhật ngay khi có thông báo mới"

Prompt sửa lỗi và cải thiện

Khi giao diện không đúng mong muốn

"Trên trang /dashboard/tasks, sửa bảng danh sách:

Hiện tại: Cột trạng thái hiển thị text thuần 'in_progress'.
Mong muốn: Hiển thị badge màu với text tiếng Việt:
- todo → badge xám, text 'Chờ xử lý'
- in_progress → badge xanh dương, text 'Đang làm'
- completed → badge xanh lá, text 'Hoàn thành'"

Khi có lỗi

"Trang /dashboard/tasks bị lỗi khi mở.

Lỗi hiển thị trên màn hình: [dán nội dung lỗi]
Hoặc: lỗi trong console trình duyệt: [dán nội dung lỗi]

Hành vi mong muốn: [mô tả trang nên hoạt động thế nào]"

Khi cần cải thiện UX

"Trên trang /dashboard/tasks, cải thiện trải nghiệm:

1. Thêm loading skeleton khi đang tải dữ liệu
   (thay vì màn hình trắng)
2. Thêm toast notification khi thao tác thành công/thất bại
3. Khi xóa task, disable nút Xóa và hiển thị spinner
   trong lúc đang xử lý"

Checklist trước khi gửi prompt

Trước khi gửi prompt cho Claude Code, kiểm tra:
#Kiểm traVí dụ
1URL / vị trí rõ ràng?/dashboard/tasks, “trên header”, “mỗi dòng trong bảng”
2Giao diện mô tả đủ chi tiết?”Bảng có cột: tiêu đề, status (badge), assignee (avatar + tên)“
3Dữ liệu chỉ rõ collection và fields?”Firestore collection ‘tasks’, fields: title, status, assigneeId”
4Hành vi khi tương tác?”Bấm Lưu → ghi Firestore → đóng modal → toast thành công”
5Xử lý lỗi / trường hợp đặc biệt?”Nếu không có tasks → hiển thị empty state”
6Validation nếu có form?”Tiêu đề bắt buộc, deadline không được ở quá khứ”

Mẹo nâng cao

Dùng tham chiếu đến code có sẵn

Khi dự án đã có một số tính năng, hãy tham chiếu để Claude Code tái sử dụng:
"Tạo trang /dashboard/projects tương tự trang /dashboard/tasks.

Thay đổi:
- Collection: 'projects' thay vì 'tasks'
- Cột bảng: Tên dự án, Trạng thái, Số thành viên, Ngày tạo
- Modal thêm mới: Tên, Mô tả, Chọn thành viên (multi-select từ users)"

Mô tả luồng nhiều bước

"Thêm luồng mời thành viên vào project:

Bước 1: Trên trang chi tiết project, có nút 'Mời thành viên'
Bước 2: Mở modal với dropdown chọn user (từ collection 'users',
        loại bỏ users đã là member)
Bước 3: Bấm 'Mời' → thêm userId vào array 'members' trong
        project document
Bước 4: Tạo notification cho user được mời:
        'Bạn đã được thêm vào dự án [tên project]'
Bước 5: Đóng modal, cập nhật danh sách thành viên trên trang"

Yêu cầu cấu trúc code rõ ràng

"Khi tạo tính năng này, đảm bảo:
- Service functions đặt trong services/tasks.ts
- Components đặt trong components/tasks/
- Tái sử dụng TaskForm cho cả thêm mới và chỉnh sửa (truyền prop mode)"

Câu hỏi thường gặp

Chất lượng quan trọng hơn độ dài. Prompt ngắn nhưng đủ 4 thông tin (ở đâu, cái gì, dữ liệu gì, hành vi gì) tốt hơn prompt dài nhưng mơ hồ.Tuy nhiên, đừng ngại chi tiết. Khi mô tả form có 8 trường, hãy liệt kê đủ 8 trường với loại input và validation. Thiếu thông tin = Claude Code tự đoán = có thể sai.
Gửi prompt chỉnh sửa cụ thể:
"Sửa modal thêm task:
Hiện tại: dropdown trạng thái có 2 giá trị (Todo, Completed)
Mong muốn: có 3 giá trị (Todo, In Progress, Completed), mặc định Todo"
Mô tả rõ hiện tại vs mong muốn giúp Claude Code hiểu chính xác cần sửa gì.
Không bắt buộc nhưng hữu ích khi dự án đã lớn. Nếu biết, hãy nêu:
"Sửa component TaskTable trong components/tasks/TaskTable.tsx:
thêm cột 'Độ ưu tiên' hiển thị badge."
Nếu không biết, mô tả theo URL và vị trí giao diện:
"Trên trang /dashboard/tasks, trong bảng danh sách,
thêm cột 'Độ ưu tiên' hiển thị badge."
Mỗi prompt nên tạo ra 1 thay đổi có thể kiểm tra được. Sau mỗi prompt, bạn có thể mở trình duyệt, xem kết quả, và xác nhận đúng trước khi tiếp tục.Quá lớn: “Tạo toàn bộ tính năng quản lý tasks với CRUD, filter, phân trang, realtime, thông báo”Vừa đủ: “Tạo trang danh sách tasks hiển thị bảng với dữ liệu từ Firestore”Quá nhỏ: “Thêm 1 cột tiêu đề vào bảng” (trừ khi đang sửa lỗi cụ thể)
Có, rất hữu ích. Nếu bạn có bản phác thảo (vẽ tay, Figma, screenshot từ ứng dụng tham khảo), hãy đính kèm vào prompt:
"Tạo trang dashboard theo bố cục trong ảnh đính kèm.
[Đính kèm ảnh mockup]
Dữ liệu lấy từ Firestore collection 'tasks'."