Bỏ qua tới nội dung
Phạm Thủy
Quay lại

User Story và Acceptance Criteria cho BA

Note này giúp BA viết user story và acceptance criteria đủ tốt để team phát triển và kiểm thử mà không phải đoán. Story không phải là mô tả màn hình; nó là cam kết về một lát giá trị cho một actor.

Note này dùng để làm gì

Mở note khi cần viết story từ requirement đã làm rõ, review story trước refinement, hoặc khi dev/test phàn nàn “AC mơ hồ”. Đọc sau Agile conceptsRequirement Elicitation (để có requirement đầu vào).

User Story Hierarchy — Từ Epic lớn đến Task nhỏ

1. User story không phải là solution description

Đây là storyĐây không phải story
Là Khách hàng, tôi muốn xem trạng thái đơn hàng, để không phải gọi điện hỏi”Làm màn hình order status có 5 cột”
Là Chủ shop, tôi muốn được cảnh báo khi sản phẩm sắp hết, để kịp nhập hàng trước khi hết”Thêm notification bell vào header”

Story trả lời ai, cần gì, vì sao. Nó không mô tả layout, màu sắc, hay animation. Để solution space mở cho team.

2. Template chuẩn

<role>, tôi muốn <objective>, để <value>.

Thiếu “để…” → không có value → không ưu tiên đúng. Thiếu role → không biết actor nào cần → không thiết kế đúng permission.

3. Acceptance Criteria: chứng minh “done”

AC là điều kiện observable, testable để xác nhận story đã hoàn thành. Không có AC = không có Definition of Ready.

Hai phong cách (chọn một, giữ nhất quán trong cùng một story):

Gherkin (Given/When/Then): hợp cho story có flow rõ ràng.

Given Khách hàng đã đăng nhập và đang ở trang catalog
When Khách hàng chọn 2 sản phẩm và bấm "Đặt hàng"
Then Hệ thống kiểm tra stock và tạo order với trạng thái Pending Payment

Checklist: hợp cho story constraint, UI, permission.

- [ ] Nút "Đặt hàng" bị disable khi giỏ hàng trống
- [ ] Chỉ chủ shop xem được danh sách payment
- [ ] Stock check xảy ra ở thời điểm submit, không phải lúc add to cart

🛑 Không trộn Gherkin + checklist trong cùng một story — làm rối reviewer và khó tự động hoá test.

4. INVEST: test nhanh chất lượng story

ChữÝ nghĩaCâu hỏi kiểm
Independentstory không phụ thuộc story khácCó thể làm story này trước story kia không?
Negotiablechi tiết có thể thương lượng, không phải hợp đồng cứngDev có thể đề xuất cách implement khác không?
Valuablemang giá trị cho actor/businessNếu bỏ story này, ai mất gì?
Estimableteam ước lượng được effortStory có đủ context để estimate không?
Smalllàm xong trong 1 sprintStory có cần split không?
TestableAC có thể kiểm tra pass/failTester có thể viết test case từ AC này không?

5. Split story: khi story > 8 điểm hoặc > 1 sprint

PatternVí dụ trướcVí dụ sau split
Theo workflow step”Tạo và thanh toán order""Tạo order” + “Thanh toán order”
Theo actor”Quản lý stock""Nhân viên kho xem stock” + “Nhân viên kho nhập hàng”
Theo data type”Quản lý sản phẩm""Thêm/sửa sản phẩm” + “Upload ảnh sản phẩm”
Theo happy/exception”Xử lý order""Tạo order thành công” + “Xử lý khi stock thiếu” + “Xử lý khi payment fail”

Running case: ShopFlow

Tám story SF-2..SF-9 trong Epic SF-1 được viết theo template:

StoryTemplateAC styleĐiểm
SF-2 Browse CatalogLà Khách hàng, tôi muốn xem danh mục sản phẩm, để chọn món trước khi đặtChecklist (filter hoạt động, ảnh hiển thị, mobile responsive)3
SF-3 Create OrderLà Khách hàng, tôi muốn tạo đơn hàng từ catalog, để mua hàng không cần gọi điệnGherkin (Given catalog → When bấm Đặt → Then check stock + tạo order)5
SF-4 Simulate PaymentLà Khách hàng, tôi muốn thanh toán an toàn, để hoàn tất đơn hàngGherkin (Given order Pending → When payment mock → Then status → Paid)3
SF-5 Delivery StatusLà Khách hàng, tôi muốn xem trạng thái giao hàng, để không phải gọi hỏiChecklist (hiển thị timeline, trạng thái rõ, mobile)3
SF-6 Manage StockLà Nhân viên kho, tôi muốn xem và cập nhật tồn kho, để biết chính xác hàng còn bao nhiêuGherkin (Given inventory → When nhập/xuất → Then available = on_hand − reserved)5
SF-7 Receive StockLà Nhân viên kho, tôi muốn ghi nhận nhập hàng từ supplier, để stock trong hệ thống khớp thực tếGherkin (Given supplier giao → When kiểm và nhập → Then stock tăng + audit trail)3
SF-8 Process ReturnLà Chủ shop, tôi muốn xử lý hoàn hàng, để cập nhật stock và trả tiền cho kháchGherkin (Given order Delivered → When return approved → Then stock restock + payment refund)5
SF-9 Low Stock AlertLà Chủ shop, tôi muốn nhận cảnh báo khi sắp hết hàng, để kịp nhập thêmChecklist (threshold configurable, hiển thị badge, không spam)2

Ví dụ AC của SF-3 (Gherkin):

Given Khách hàng đã đăng nhập và có 2 sản phẩm trong giỏ
When Khách hàng bấm "Đặt hàng"
Then Hệ thống kiểm tra availableStock của từng item trong một transaction
  And Nếu tất cả item có availableStock >= quantity, tạo order với status Pending Payment
  And Nếu bất kỳ item nào thiếu, reject toàn bộ order với message "Sản phẩm [tên] chỉ còn [availableStock]"

Split story thực tế: SF-3 ban đầu là “Tạo order và thanh toán” — 8 điểm, quá lớn. BA split thành SF-3 Create Order (5 điểm) + SF-4 Simulate Payment (3 điểm). Lý do: thanh toán có thể mock, không cần làm cùng sprint với order.

Bài học: Nếu một story > 8 điểm, đừng cố nhồi vào sprint. Split theo workflow step hoặc actor. SF-5 Delivery Status có thể làm độc lập với SF-4 Payment — đừng tạo dependency giả.

Anti-patterns

Anti-patternVì sao nguy hiểmCách sửa
Story là mô tả màn hìnhkhóa solution, bỏ lỡ cách implement tốt hơnmô tả actor + goal + value, để dev chọn cách
AC chỉ có happy pathsót exception, lộ ra khi test/UATthêm ít nhất 1 failure scenario cho mỗi story
Trộn Gherkin + checklist trong cùng storyrối reviewer, khó automate testchọn 1 style, giữ nhất quán
Story quá lớn (> 8 điểm)không hoàn thành trong sprint, thành mini-waterfallsplit theo workflow/actor/data type
”AC sẽ viết sau”story vào sprint không có DoR, dev đoánAC phải có trước refinement
Thiếu “để…” trong storykhông biết value → ưu tiên sailuôn kết thúc story bằng “để <value>

Checklist nhanh

References


Chia sẻ bài viết:

Bài trước
Change Request và Impact Analysis cho BA
Bài sau
Document Analysis cho BA