Vì sao chủ đề quan trọng
User story được viết theo hành trình của người dùng, nên nó mạnh ở phần người dùng làm gì nhưng yếu ở phần dữ liệu sống ra sao. Story map của Căng tin số rất có thể có "Sinh viên xem thực đơn hôm nay" và "Sinh viên đặt cơm trước". Nhưng ai tạo ra thực đơn đó? Ai sửa khi một món hết lúc 12:30? Một đơn đặt trước bị bỏ quên thì ai dọn nó?
Ma trận CRUD trả lời những câu đó một cách cơ học. CRUD là viết tắt của bốn thao tác cơ bản trên dữ liệu: tạo (Create), đọc (Read), sửa (Update), xoá (Delete). Với nghiệp vụ, "xoá" thường nên hiểu là lưu trữ hoặc huỷ, vì tiền và đơn hàng gần như không bao giờ bị xoá thật.
Bài này nhận vào danh sách đối tượng cốt lõi và vòng đời của chúng (khóa Hiểu nghiệp vụ trước khi xây), cộng với backlog từ khóa Từ journey tới user story. Đầu ra là trang CRUD trong tệp kiểm tra, mỗi ô có một người làm hoặc một câu hỏi mở.
Bức tranh lớn
Quy trình rất đơn giản, và sức mạnh nằm ở chỗ nó không cho bạn bỏ qua ô nào:
flowchart TD
A[Liệt kê bảy đối tượng cốt lõi] --> B[Kẻ bốn cột Tạo Đọc Sửa Xoá]
B --> C[Điền vai trò làm thao tác đó]
C --> D{Ô có story tương ứng?}
D -->|Có| E[Ghi mã story vào ô]
D -->|Không| F[Ghi câu hỏi mở và người cần hỏi]
F --> G[Đưa câu hỏi vào buổi gặp stakeholder]
E --> H[Sang ô tiếp theo]
G --> HQuy tắc vàng của bài: mọi ô trống là một câu hỏi. Ô trống không có nghĩa "không cần", mà có nghĩa "chưa ai nghĩ tới". Có thể câu trả lời đúng là "không ai được xoá", nhưng câu trả lời đó phải là một quyết định được ghi lại, không phải một sự im lặng.
Bảy đối tượng của Căng tin số là: Thực đơn ngày, Món, Đơn đặt trước, Khung giờ nhận, Thanh toán, Phiếu suất hỗ trợ, Phản hồi. Ba đối tượng đầu tiên cần làm kỹ nhất là Thực đơn ngày, Đơn đặt trước và Phiếu suất hỗ trợ, vì chúng gắn với tiền, với quy tắc và với nhóm sinh viên dễ tổn thương.
Ví dụ chi tiết
Dưới đây là ma trận đầy đủ cho ba đối tượng. Cột "Câu hỏi mở" là sản phẩm thật của bài, không phải phần phụ.
| Đối tượng | Thao tác | Ai làm | Quy tắc hoặc bằng chứng | Câu hỏi mở |
|---|---|---|---|---|
| Thực đơn ngày | Tạo | Quản lý căng tin | R2, chốt 16:00 hôm trước | Ai nhập món cho từng quầy, Anh Tuấn hay từng bếp trưởng? |
| Thực đơn ngày | Đọc | Sinh viên, giảng viên và nhân viên, quầy, bếp | P4, thực đơn chỉ có trên bảng | Có cần xem thực đơn ngày mai trước 16:00 không? |
| Thực đơn ngày | Sửa | Quản lý căng tin, chỉ khi hết món | R2, trong ngày chỉ đổi khi hết món | Ai đánh dấu hết món giữa giờ cao điểm khi Cô Hạnh không cầm được điện thoại? |
| Thực đơn ngày | Xoá hoặc lưu trữ | Chưa ai | Không có | Thực đơn cũ giữ bao lâu? Bếp có cần xem lại để dự đoán lượng nấu theo P6 không? |
| Đơn đặt trước | Tạo | Sinh viên, giảng viên và nhân viên | C3, bếp cần chốt lúc 10:00 | Câu lạc bộ đặt 20 tới 30 suất theo P8 thì ai tạo đơn? |
| Đơn đặt trước | Đọc | Người đặt, quầy, bếp, quản lý | P11, bếp không xem được điện thoại | Bếp đọc danh sách đơn ở đâu, bằng màn hình gì? |
| Đơn đặt trước | Sửa | Chưa ai | Không có | Sinh viên đổi món trước 10:00 được không? Sau 10:00 thì sao? |
| Đơn đặt trước | Xoá hoặc lưu trữ | Người đặt huỷ, hệ thống chuyển trạng thái quá hạn theo R3 | R3, giữ 30 phút; R6, hoàn tiền chỉ quản lý duyệt | Huỷ trước 10:00 có được hoàn tiền tự động không, hay luôn chờ Anh Tuấn duyệt? |
| Phiếu suất hỗ trợ | Tạo | Chưa rõ | Khoảng 300 sinh viên, phiếu giấy | Danh sách sinh viên được nhận do Phòng Quản trị – Đời sống cấp hay nhập tay? |
| Phiếu suất hỗ trợ | Đọc | Sinh viên được nhận, quầy | P12, ngại đưa phiếu giữa hàng | Quầy cần thấy gì để xác nhận mà không làm lộ hoàn cảnh của Thảo Vy? |
| Phiếu suất hỗ trợ | Sửa | Hệ thống ghi đã dùng trong ngày | R4, tối đa 1 suất mỗi ngày, ngày thường, không đồ uống | Ai sửa khi quầy ghi nhầm, và có để lại dấu vết không? |
| Phiếu suất hỗ trợ | Xoá hoặc lưu trữ | Chưa ai | Không có | Sinh viên hết học bổng giữa học kỳ thì ai thu hồi quyền? |
Bốn đối tượng còn lại làm nhanh hơn, nhưng vẫn sinh ra câu hỏi đáng giá:
Món: ai tạo món mới và ghi thành phần dị ứng theo P3? ai sửa món đã hết? ai ngừng bán một món?
Khung giờ nhận: ai đặt số suất tối đa mỗi khung? sửa khung khi lớp tan muộn được không?
Thanh toán: ai sửa giao dịch chuyển khoản treo? ai xem báo cáo đối soát theo P7?
Phản hồi: sinh viên gửi, căng tin đọc theo P9; ai trả lời? ai xoá phản hồi xúc phạm?
Câu "ai sửa món đã hết" nghe giống câu về Thực đơn ngày, nhưng thật ra là hai việc khác nhau. Món là danh mục lâu dài, ví dụ trứng chiên hay một món mặn quen thuộc. Thực đơn ngày là việc chọn món nào bán hôm nay ở quầy nào. Khi một món mặn hết lúc 12:30, như Quốc Bảo vẫn gặp, cái cần sửa là trạng thái của món trong thực đơn hôm nay, không phải bản thân món. Ma trận giúp bạn tách hai việc này, và tách đúng thì lập trình viên mới thiết kế dữ liệu đúng.
Câu "ai xoá phản hồi" cũng thú vị. Nếu không ai được xoá, một phản hồi xúc phạm nhân viên sẽ nằm mãi. Nếu Anh Tuấn được xoá, căng tin có thể xoá luôn những phàn nàn bất lợi, và Chị Lan, người đang nhận khoảng 25 email phàn nàn mỗi tháng, mất nguồn thông tin. Đây là câu hỏi quyền lực, không phải câu hỏi kỹ thuật, nên phải đưa lên Chị Lan và Anh Tuấn cùng quyết.
Thao tác "Sửa" của Đơn đặt trước nên đọc cùng vòng đời của nó:
stateDiagram-v2
Moi : Mới đặt
DaTra : Đã thanh toán
DangNau : Bếp đang chuẩn bị
SanSang : Sẵn sàng lấy
DaNhan : Đã nhận
QuaHan : Quá hạn, bán cho hàng
DaHuy : Đã huỷ
Moi --> DaTra
DaTra --> DangNau
DaTra --> DaHuy
DangNau --> SanSang
SanSang --> DaNhan
SanSang --> QuaHanĐặt ma trận cạnh sơ đồ, bạn thấy ngay: "Sửa" chỉ hợp lý ở trạng thái Mới đặt hoặc Đã thanh toán, trước khi bếp nấu. Từ Bếp đang chuẩn bị trở đi, sửa đơn là sửa một suất cơm đã nằm trong khay.
Lộ trình từng bước
- Mở trang CRUD trong tệp kiểm tra. Mỗi đối tượng là một dòng, hoặc bốn dòng nếu bạn tách theo thao tác như bảng trên.
- Với mỗi ô, điền vai trò thực hiện. Dùng đúng sáu vai trò của case, không viết "người dùng" chung chung.
- Ghi quy tắc hoặc bằng chứng liên quan: mã R, mã P, hoặc câu trích nguyên văn.
- Tra backlog: có story nào phủ ô này không? Có thì ghi mã story. Không thì ô đó thành câu hỏi mở.
- Viết câu hỏi mở thành câu hỏi thật, có tên người cần hỏi. "Ai thu hồi phiếu?" kém hơn "Chị Lan: sinh viên hết học bổng giữa kỳ thì ai báo cho hệ thống?".
- Đối chiếu thao tác Sửa và Xoá với vòng đời: thao tác đó được phép ở trạng thái nào?
- Gom câu hỏi theo người cần hỏi, để mỗi buổi gặp stakeholder giải quyết một loạt.
Thói quen & kỷ luật
| Thói quen | Tần suất | Kết quả mong đợi |
|---|---|---|
| Làm ma trận CRUD cho mọi đối tượng mới xuất hiện trong ghi chép | Mỗi khi có đối tượng mới | Không đối tượng nào chỉ có Tạo mà không có vòng đời |
| Viết "Chưa ai" thay vì để trống hoặc tự điền | Mỗi ô | Câu hỏi mở hiện rõ |
| Đọc ma trận cùng sơ đồ trạng thái | Mỗi đối tượng | Sửa và Xoá được giới hạn theo trạng thái |
| Gắn tên người cần hỏi cho mỗi câu hỏi | Mỗi câu hỏi | Câu hỏi được trả lời, không trôi |
Cần luyện tập
Drill một: Làm trọn ma trận CRUD cho đối tượng Khung giờ nhận. Gợi ý: nhớ rằng có lớp tan 11:30 và vào lại 12:45, và quầy cơm bán khoảng 600 suất mỗi trưa. Ai quyết định mỗi khung nhận tối đa bao nhiêu đơn?
Drill hai: Với đối tượng Thanh toán, viết ba câu hỏi mở cho ô Sửa, mỗi câu gắn với một trong P5, P7 và R6.
Drill ba: Lấy một ứng dụng bạn dùng hằng ngày, chẳng hạn ứng dụng đặt đồ ăn. Chọn đối tượng "đánh giá". Ai tạo, ai đọc, ai sửa, ai xoá? Ứng dụng đó trả lời câu "ai xoá đánh giá xấu" như thế nào?
Checklist hành động tuần này
- [ ] Điền đủ ma trận CRUD cho bảy đối tượng
- [ ] Đánh dấu mọi ô "Chưa ai" và viết câu hỏi tương ứng
- [ ] Đối chiếu thao tác Sửa và Xoá của Đơn đặt trước với vòng đời
- [ ] Gom câu hỏi theo Chị Lan, Anh Tuấn, Cô Hạnh
- [ ] Thêm story mới cho những ô đã có câu trả lời rõ
Chỉ số cho cách làm
Các con số dưới đây đo cách nhóm làm bước này, không đo app có thành công hay không. Câu hỏi app có hiệu quả không, và làm gì tiếp, là việc của khóa Đo lường thành công.
| Loại chỉ số | Ví dụ | Vai trò |
|---|---|---|
| North Star | Tỉ lệ ô CRUD có story hoặc quyết định ghi rõ, mục tiêu 100% | Ma trận đầy đủ là điều kiện để giao cho kỹ thuật |
| Chỉ số dẫn dắt | Số ô "Chưa ai" còn lại | Đo khối lượng câu hỏi chưa giải quyết |
| Chỉ số dẫn dắt | Số câu hỏi mở đã có người trả lời trong tuần | Đo tốc độ khép lỗ hổng |
| Chỉ số kết quả | Số story mới sinh ra từ ma trận | Cho thấy giá trị thật của phép kiểm tra |
Dấu hiệu bạn đã thành thạo
- Bạn phân biệt được Món với Thực đơn ngày, và giải thích vì sao sự phân biệt đó ảnh hưởng tới thiết kế dữ liệu.
- Bạn không bao giờ chấp nhận một đối tượng chỉ có thao tác Tạo và Đọc.
- Bạn nhận ra câu hỏi "ai được xoá" thường là câu hỏi về quyền lực và trách nhiệm.
- Ma trận của bạn khiến stakeholder nói "à, cái này chưa ai nghĩ tới".
Cạm bẫy thường gặp
| Cạm bẫy | Biểu hiện | Cách tránh |
|---|---|---|
| Điền "Admin" vào mọi ô khó | Một vai trò ảo làm mọi việc hậu trường | Dùng sáu vai trò thật; "Admin" phải được chỉ ra là ai |
| Hiểu Xoá là xoá vĩnh viễn | Thiết kế nút xoá đơn đã thanh toán | Với tiền và đơn, dùng huỷ hoặc lưu trữ có dấu vết |
| Bỏ qua đối tượng "nhỏ" | Không làm ma trận cho Phản hồi | Đối tượng nhỏ thường chứa câu hỏi quyền lực lớn |
| Ma trận tách rời vòng đời | Cho sửa đơn ở mọi trạng thái | Luôn ghi thao tác được phép ở trạng thái nào |
Chốt lại
Ma trận CRUD buộc bạn nhìn từng đối tượng qua bốn thao tác và hỏi ai làm. Mỗi ô trống là một câu hỏi, không phải một khoảng trống được phép. Với Căng tin số, ba đối tượng đã sinh ra mười hai câu hỏi và ít nhất năm tính năng vắng mặt. Ma trận nhìn theo dữ liệu; bài 3 nhìn theo con người, với ma trận vai trò và hành động.