User Story & Acceptance Criteria
Trong phát triển phần mềm hiện đại theo Agile, user story là công cụ chủ lực để diễn đạt yêu cầu từ góc nhìn người dùng. Không phải đặc tả kỹ thuật khô khan — mà là cuộc hội thoại được ghi lại.
---
1. Cấu trúc User Story: As a / I want / So that
Một user story chuẩn gồm ba phần:
As a [loại người dùng],
I want [hành động / tính năng],
So that [lợi ích / mục tiêu kinh doanh].
Ví dụ thực tế — ứng dụng đặt xe nội địa (kiểu Grab):
As a hành khách đang ở Hà Nội,
I want xem ước tính giá chuyến đi trước khi xác nhận đặt xe,
So that tôi có thể so sánh và quyết định có nên đặt hay không.
As a tài xế đối tác,
I want nhận thông báo đơn hàng mới kèm điểm đón và ước tính quãng đường,
So that tôi có thể chấp nhận hoặc từ chối đơn phù hợp với vị trí của mình.
Lỗi phổ biến: Viết 'As a user' — quá chung chung. Cần xác định rõ loại người dùng cụ thể (hành khách VIP, tài xế mới, admin vùng, v.v.).
---
2. INVEST — Tiêu chí đánh giá User Story tốt
| Chữ | Ý nghĩa | Kiểm tra nhanh |
|---|---|---|
| I — Independent | Không phụ thuộc story khác để test | Có thể đưa lên sprint độc lập? |
| N — Negotiable | Không phải hợp đồng cứng nhắc | Team có thể thảo luận thay đổi? |
| V — Valuable | Tạo giá trị cho người dùng hoặc business | Nếu bỏ qua, ai bị ảnh hưởng? |
| E — Estimable | Team có thể ước lượng effort | Đủ rõ để estimate story points? |
| S — Small | Hoàn thành trong 1 sprint | Có thể deliver trong 2 tuần? |
| T — Testable | Có thể viết AC để kiểm tra | Biết khi nào gọi là 'done'? |
> 'As a user, I want the app to be fast.'
- Không Estimable (fast là bao nhiêu?)
- Không Testable (không có số đo cụ thể)
- Không Small (bao gồm cả hệ thống)
As a hành khách,
I want màn hình danh sách tài xế gần đây tải trong vòng 2 giây,
So that tôi không bỏ app khi đang vội.
---
3. Acceptance Criteria (AC) — Tiêu chí chấp nhận
AC trả lời câu hỏi: 'Story này hoàn thành khi nào?'
Có hai dạng phổ biến:
Dạng bullet (checklist):
Story: Hành khách xem ước tính giá trước khi đặt xe.AC:
- [ ] Giá ước tính hiển thị trước khi user nhấn 'Đặt ngay'
- [ ] Giá tính theo loại xe (Tiêu chuẩn / 7 chỗ / VIP)
- [ ] Nếu giá thay đổi >10% so với ước tính ban đầu, app cảnh báo user
- [ ] Hiển thị được trên cả iOS 15+ và Android 11+
- [ ] Nếu không có kết nối mạng, hiển thị thông báo lỗi rõ ràng
Dạng Gherkin — Given / When / Then:
---
4. Gherkin: Given / When / Then
Gherkin là ngôn ngữ mô tả hành vi (BDD — Behavior-Driven Development). Rất hữu ích khi làm việc với QA và dev.
Feature: Ước tính giá chuyến đi Scenario: Hành khách xem giá trước khi đặt
Given hành khách đã nhập điểm đón tại 'Hoàn Kiếm, Hà Nội'
And đã nhập điểm đến 'Sân bay Nội Bài'
When hành khách chọn loại xe 'Tiêu chuẩn'
Then app hiển thị ước tính giá từ 250.000đ đến 300.000đ
And nút 'Đặt ngay' được kích hoạt
Scenario: Giá tăng đột biến do giờ cao điểm
Given hành khách đang xem ước tính giá 200.000đ
When hệ thống cập nhật giá do surge pricing tăng lên 260.000đ
Then app hiển thị popup cảnh báo 'Giá đã tăng 30%'
And hành khách phải xác nhận lại trước khi đặt
Scenario: Không có mạng
Given hành khách đã tắt dữ liệu di động
When hành khách nhấn 'Tính giá'
Then app hiển thị thông báo 'Không có kết nối mạng. Vui lòng thử lại.'
And không navigate sang màn hình đặt xe
---
5. Story Splitting — Tách Story lớn thành nhỏ
Khi story quá lớn (epic), cần tách theo một trong các cách:
- Theo workflow: Đặt xe → Thanh toán → Đánh giá (3 stories riêng)
- Theo loại dữ liệu: Tìm kiếm theo tên → Tìm kiếm theo vùng → Tìm kiếm theo giá
- Theo happy path trước: Đặt xe thành công → Sau đó mới làm story hủy đơn
- Theo vai trò: Hành khách xem lịch sử → Tài xế xem lịch sử (2 stories)
| Epic | Stories con |
|---|---|
| Quản lý tài khoản người dùng | 1. Đăng ký bằng SĐT • 2. Đăng nhập bằng SĐT+OTP • 3. Cập nhật ảnh đại diện • 4. Đổi số điện thoại • 5. Xóa tài khoản |
Tự luyện
- Chọn một app bạn dùng hàng ngày (ví dụ: MoMo, Shopee, Zalo). Viết 3 user story theo chuẩn As a / I want / So that.
- Kiểm tra từng story theo INVEST — đánh dấu các tiêu chí nào chưa đạt.
- Viết AC dạng Gherkin cho 1 story bạn vừa viết, tối thiểu 2 scenario (happy path + error case).