Menu
ESC

Nhập từ khóa để tìm kiếm

↑↓ Di chuyển
Enter Mở
ESC Đóng

Đang tải...

Bài 17 — User story và acceptance criteria từ góc ex-Sales

Từ Sales/BD sang BA: Lộ Trình Chuyển Đổi Bài 17/60

Mở đầu — vì sao bài này quan trọng

Nếu bạn từng đứng trước khách hàng và nói: "Phần mềm này sẽ giúp anh giảm 40% thời gian chốt đơn", thì xin chúc mừng — bạn đã viết một câu "So that" hoàn hảo mà không hề biết. Đó chính là phần khó nhất, phần mà rất nhiều BA "thuần kỹ thuật" loay hoay mãi không viết được: gắn mỗi tính năng với một giá trị kinh doanh thật sự.

User story và acceptance criteria (AC) là hai công cụ làm việc hằng ngày của BA trong môi trường Agile. Đây không phải là tài liệu trang trọng dày cộp như BRD hay SRS (chúng ta sẽ học ở Bài 16 và Bài 40), mà là những "viên gạch" nhỏ, ngắn gọn, được team dev và product dùng để xây sản phẩm từng chút một mỗi sprint. Một BA viết user story tốt sẽ giúp cả team hiểu làm cho ai, làm cái gì, để được gì, và quan trọng nhất: khi nào thì coi là xong.

Với người chuyển từ Sales/BD, bạn có một lợi thế mà ít ai có: bạn đã quen nghĩ theo ngôn ngữ giá trị. Bạn không bán "một cái nút bấm", bạn bán "sự tiện lợi cho khách hàng". Tư duy này khi đưa vào user story sẽ tạo ra những story sắc bén, có sức thuyết phục với cả product owner lẫn dev. Bài học hôm nay sẽ chỉ cho bạn cách biến bản năng bán hàng đó thành kỹ năng viết user story và AC chuẩn nghề BA — và cũng cảnh báo những cái bẫy mà chính bản năng Sales có thể đẩy bạn vào.

Khái niệm cốt lõi

User story là gì?

User story là một mô tả ngắn gọn về một nhu cầu của người dùng, viết từ góc nhìn của chính người dùng đó, theo cấu trúc kinh điển ba dòng:

As a <role>          (Với vai trò là...)
I want <feature>     (Tôi muốn...)
So that <benefit>    (Để mà...)

Ví dụ cụ thể:

As a kế toán viên,
I want xuất báo cáo công nợ ra file Excel,
So that tôi có thể đối chiếu với sổ sách kế toán mà không phải nhập tay lại.

Ba thành phần này có vai trò riêng:

  • Role (vai trò): Ai là người được hưởng lợi? Phải là một vai trò người dùng cụ thể, không phải "người dùng" chung chung. "Kế toán viên", "quản lý kho", "khách hàng VIP" — càng cụ thể càng tốt, vì mỗi vai trò có nhu cầu khác nhau.
  • Feature (tính năng/mong muốn): Người dùng muốn làm được gì? Lưu ý: mô tả mong muốn chứ không phải giải pháp kỹ thuật. "Tôi muốn xuất báo cáo" chứ không phải "tôi muốn một nút màu xanh ở góc phải gọi API export".
  • Benefit (giá trị): Tại sao người dùng muốn điều đó? Đây là phần linh hồn — nó trả lời câu hỏi "vậy thì sao?" và giúp team quyết định độ ưu tiên cũng như cách triển khai.
Một nguyên tắc quan trọng: user story KHÔNG phải là một bản đặc tả đầy đủ. Nó là một "lời hứa sẽ trò chuyện" (a promise for a conversation). Story chỉ nắm ý chính; chi tiết được làm rõ qua trao đổi giữa BA, dev và product, rồi cụ thể hóa thành acceptance criteria.

Acceptance criteria là gì?

Acceptance criteria (tiêu chí chấp nhận) là danh sách các điều kiện cụ thể, có thể kiểm chứng được, để xác định khi nào một user story được coi là "hoàn thành". Nếu user story trả lời câu "làm gì và để được gì", thì AC trả lời câu "làm thế nào thì được tính là đúng và đủ".

Có hai cách viết AC phổ biến:

Cách 1 — Dạng danh sách điều kiện (rule-oriented):

- Báo cáo xuất ra đúng định dạng .xlsx
  • Bao gồm các cột: Mã KH, Tên KH, Số tiền nợ, Ngày đến hạn
  • Chỉ hiển thị công nợ trong khoảng thời gian người dùng chọn
  • Nếu không có dữ liệu, hiển thị thông báo "Không có công nợ trong kỳ"

Cách 2 — Dạng Given/When/Then (scenario-oriented, còn gọi là Gherkin):

Given tôi đang ở màn hình Báo cáo công nợ
And tôi đã chọn khoảng thời gian từ 01/06 đến 30/06
When tôi bấm "Xuất Excel"
Then hệ thống tải về file .xlsx chứa công nợ trong kỳ đã chọn

Trong đó: Given = bối cảnh/điều kiện ban đầu, When = hành động người dùng thực hiện, Then = kết quả mong đợi. Dạng Given/When/Then đặc biệt hữu ích vì nó gần như là kịch bản test sẵn — tester và dev đọc vào là biết cần kiểm tra gì.

Tiêu chuẩn INVEST cho một user story tốt

Cộng đồng Agile dùng bộ tiêu chí INVEST để đánh giá chất lượng story:

  • Independent — độc lập, không phụ thuộc chằng chịt vào story khác.
  • Negotiable — có thể thương lượng, không phải hợp đồng cứng nhắc.
  • Valuable — có giá trị thật cho người dùng (đây là chỗ ex-Sales tỏa sáng).
  • Estimable — đủ rõ để dev ước lượng được công sức.
  • Small — đủ nhỏ để hoàn thành trong một sprint.
  • Testable — kiểm chứng được (chính là nhờ AC).

Vì sao ex-Sales có lợi thế ở phần "So that"

Đây là phần tôi muốn bạn ghi nhớ nhất. Trong nhiều năm làm Sales/BD, bạn đã được huấn luyện để luôn bán value proposition — lợi ích, chứ không phải đặc tính. Bạn không nói "điện thoại này pin 5000mAh", bạn nói "anh dùng cả ngày không cần sạc, đi công tác thoải mái". Đó chính xác là tư duy viết phần "So that".

Rất nhiều BA xuất thân kỹ thuật viết story như thế này: "As a user, I want a button, so that I can click it" — phần benefit rỗng tuếch, vô nghĩa. Còn bạn, với phản xạ Sales, sẽ tự nhiên hỏi: "Khách hàng bấm nút đó để được gì? Tiết kiệm thời gian? Tránh sai sót? Tăng doanh thu?" Chính câu hỏi đó tạo ra những story có sức nặng.

Tình huống thực tế

Tình huống 1: Sàn TMĐT Tiki và story "lưu giỏ hàng"

Bối cảnh: Một BA mới chuyển từ vị trí BD của một sàn thương mại điện tử (tạm gọi theo mô hình Tiki) được giao viết story cho tính năng "giỏ hàng tự lưu khi khách thoát app".

BA viết phiên bản đầu (kiểu kỹ thuật):

As a user, I want the cart to save, so that it is saved.

Product owner đọc xong lắc đầu: benefit lặp lại chính nó, không nói lên giá trị. BA này nhớ lại kinh nghiệm BD của mình — anh từng phân tích rằng tỷ lệ khách bỏ giỏ hàng (cart abandonment) lên tới 68%, và nhiều khách quay lại nhưng giỏ hàng trống nên bỏ luôn. Anh viết lại:

As a khách mua hàng trên di động,
I want giỏ hàng của tôi được giữ nguyên khi tôi đóng app rồi mở lại,
So that tôi không phải tìm và thêm lại sản phẩm từ đầu — tăng khả năng tôi hoàn tất đơn hàng.

Kèm AC:

Given tôi đã thêm 3 sản phẩm vào giỏ và chưa đăng nhập
When tôi đóng app và mở lại trong vòng 7 ngày
Then 3 sản phẩm đó vẫn còn trong giỏ với đúng số lượng và giá tại thời điểm thêm

Given giá sản phẩm đã thay đổi kể từ lúc tôi thêm vào giỏ When tôi mở lại giỏ hàng Then hệ thống hiển thị giá mới và gắn nhãn "Giá đã cập nhật"

Bài học: Phần "So that" gắn trực tiếp với một chỉ số kinh doanh (giảm tỷ lệ bỏ giỏ → tăng conversion). Nhờ vậy product owner xếp story này vào nhóm ưu tiên cao. Đồng thời, AC thứ hai về việc giá thay đổi là một tình huống mà BA xuất thân Sales dễ nghĩ ra hơn dev — vì anh hiểu nỗi đau của khách khi bị "đội giá" lúc thanh toán.

Tình huống 2: Ngân hàng số và cái bẫy "over-promise" của ex-Sales

Bối cảnh: Tại một dự án app ngân hàng số (mô hình tương tự MB hay TPBank), một BA cựu Sales viết story cho tính năng chuyển tiền nhanh:

As a khách hàng,
I want chuyển tiền tức thì 24/7 tới mọi ngân hàng,
So that tôi luôn chuyển được tiền bất cứ lúc nào, không bao giờ thất bại.

Nghe rất "Sales", rất hấp dẫn — nhưng đây là một cái bẫy. Cụm "không bao giờ thất bại" là một lời hứa không thể kiểm chứng và không khả thi (hệ thống Napas có thể bảo trì, ngân hàng nhận có thể lỗi). Dev không thể nào viết AC cho "không bao giờ thất bại".

BA được mentor góp ý, viết lại AC thực tế hơn:

Given tôi nhập đúng số tài khoản người nhận và số tiền hợp lệ
When tôi xác nhận giao dịch trong giờ hệ thống Napas hoạt động bình thường
Then tiền được chuyển trong vòng tối đa 30 giây và tôi nhận thông báo thành công

Given hệ thống ngân hàng nhận đang bảo trì When tôi thực hiện chuyển tiền Then giao dịch bị từ chối, tiền không bị trừ, và tôi nhận thông báo rõ lý do kèm gợi ý thử lại sau

Bài học: Bản năng Sales khiến ta dễ "thổi phồng" trong phần feature và benefit. Nhưng AC bắt buộc phải đo lường được. Hãy giữ sự hấp dẫn ở phần "So that" (giá trị thật), nhưng đưa mọi cam kết về mặt đất ở phần AC. Một con số cụ thể như "tối đa 30 giây" có giá trị gấp nghìn lần một lời hứa "tức thì, không bao giờ lỗi".

Tình huống 3: SaaS quản lý nhân sự và việc chẻ nhỏ story

Bối cảnh: Một công ty SaaS HR tại TP.HCM (mô hình tương tự Base.vn) cần tính năng "quản lý đơn xin nghỉ phép". BA cựu BD ban đầu viết một story khổng lồ:

As a nhân viên,
I want quản lý toàn bộ việc nghỉ phép,
So that tôi xin nghỉ và theo dõi phép dễ dàng.

Story này vi phạm chữ S (Small) và E (Estimable) trong INVEST — quá lớn, dev không ước lượng nổi. BA chẻ nó thành các story nhỏ, mỗi cái vẫn giữ đủ giá trị:

Story 1: As a nhân viên, I want gửi đơn xin nghỉ phép kèm lý do, so that quản lý của tôi có thể duyệt mà không cần tôi nhắn tin riêng.

Story 2: As a nhân viên, I want xem số ngày phép còn lại của mình, so that tôi biết mình còn được nghỉ bao nhiêu trước khi đặt vé du lịch.

Story 3: As a quản lý, I want nhận thông báo khi có đơn xin nghỉ mới, so that tôi duyệt kịp thời và nhân viên không bị động kế hoạch.

Bài học: Một kỹ năng Sales hữu ích bất ngờ ở đây là khả năng "phân khúc khách hàng". Bạn quen chia khách thành nhóm với nhu cầu khác nhau — hãy dùng đúng phản xạ đó để chia story theo vai trò (nhân viên vs quản lý) và theo từng nhu cầu riêng biệt. Mỗi story nhỏ vẫn phải có một "So that" đủ giá trị để tự đứng vững.

Hướng dẫn từng bước

Đây là quy trình tôi khuyên bạn áp dụng mỗi khi viết một user story kèm AC:

Bước 1 — Xác định vai trò (role) thật cụ thể. Đừng viết "user". Hỏi: ai thực sự dùng tính năng này? Nếu có nhiều vai trò, mỗi vai trò có thể cần một story riêng. Hãy nghĩ như khi bạn xác định khách hàng mục tiêu trong Sales.

Bước 2 — Mô tả mong muốn (feature), không mô tả giải pháp. Viết cái người dùng muốn đạt được, không phải cách hệ thống làm. "Tôi muốn biết đơn hàng của tôi đang ở đâu" tốt hơn "tôi muốn một bản đồ tracking GPS thời gian thực".

Bước 3 — Viết phần "So that" như một value proposition. Dùng đúng phản xạ Sales: lợi ích cuối cùng cho người dùng là gì? Nếu được, gắn với một kết quả đo lường được (tiết kiệm thời gian, giảm sai sót, tăng doanh thu).

Bước 4 — Kiểm tra story bằng INVEST. Nó có độc lập không? Có quá to không? Dev ước lượng được không? Nếu "to quá", quay lại chẻ nhỏ.

Bước 5 — Viết acceptance criteria. Liệt kê mọi điều kiện để story được coi là hoàn thành. Bắt buộc bao gồm cả "happy path" (luồng thuận lợi) lẫn các trường hợp ngoại lệ (lỗi, dữ liệu rỗng, giá thay đổi...). Ưu tiên dạng Given/When/Then cho các luồng hành vi.

Bước 6 — Rà soát tính kiểm chứng. Đọc lại từng AC và tự hỏi: "Một tester có thể kiểm tra điều này đúng/sai một cách rõ ràng không?" Nếu câu trả lời mơ hồ (ví dụ "giao diện phải đẹp", "nhanh"), hãy định lượng lại ("tải trang dưới 2 giây").

Bước 7 — Trao đổi với dev và PO. Nhớ rằng story là "lời hứa sẽ trò chuyện". Đừng ném story qua tường rồi biến mất. Hãy ngồi xuống làm rõ — đây là lúc kỹ năng giao tiếp Sales của bạn phát huy.

Lỗi thường gặp & mẹo

Lỗi 1 — Phần "So that" rỗng hoặc lặp lại. "I want to login so that I can login." Vô nghĩa. Mẹo: luôn hỏi "vậy thì sao?" ít nhất hai lần để đào tới giá trị thật.

Lỗi 2 — Nhồi giải pháp kỹ thuật vào feature. "Tôi muốn một dropdown gọi API REST." Đó là việc của dev. Mẹo: viết feature ở mức người dùng nhìn thấy và cảm nhận được.

Lỗi 3 — Over-promise như bán hàng. "Nhanh tức thì", "không bao giờ lỗi", "tốt nhất thị trường". Những từ này không viết được AC. Mẹo: giữ sự hào hứng ở "So that", nhưng định lượng mọi thứ ở AC.

Lỗi 4 — AC chỉ có happy path. Chỉ mô tả khi mọi thứ suôn sẻ, quên mất lỗi và ngoại lệ. Đây là lỗi khiến sản phẩm "demo thì đẹp, dùng thật thì vỡ". Mẹo: với mỗi story, luôn hỏi "nếu sai/rỗng/quá tải thì sao?".

Lỗi 5 — Story quá to (epic giả dạng story). "Quản lý toàn bộ X." Mẹo: nếu một story cần hơn một sprint hoặc có chữ "và", "toàn bộ", "tất cả" — hãy nghi ngờ và chẻ nhỏ.

Lỗi 6 — Vai trò chung chung. "As a user." Mẹo: thay bằng vai trò nghề nghiệp/loại khách cụ thể; điều này lộ ra những nhu cầu khác nhau bạn dễ bỏ sót.

Mẹo vàng cho ex-Sales: Mỗi khi viết "So that", hãy tưởng tượng bạn đang pitch tính năng đó cho một khách hàng khó tính, người luôn hỏi "rồi sao nữa, tôi được lợi gì?". Câu trả lời thuyết phục nhất chính là phần "So that" hoàn hảo.

Bài tập thực hành

Bài 1 — Sửa story hỏng. Cho story sau, hãy viết lại cho đúng chuẩn: "As a user, I want a search bar, so that I can search." Hãy chọn một vai trò cụ thể, một feature ở mức nhu cầu, và một "So that" có giá trị đo lường được.

Bài 2 — Viết từ đầu. Bạn là BA cho một app đặt đồ ăn (mô hình GrabFood/ShopeeFood). Viết một user story hoàn chỉnh cho tính năng "theo dõi vị trí tài xế", kèm ít nhất 3 acceptance criteria dạng Given/When/Then, trong đó có ít nhất 1 trường hợp ngoại lệ (ví dụ: mất tín hiệu GPS của tài xế).

Bài 3 — Chẻ epic. Cho epic: "As a chủ shop, I want quản lý toàn bộ đơn hàng và kho hàng, so that tôi vận hành cửa hàng hiệu quả." Hãy chẻ thành ít nhất 4 user story nhỏ độc lập, mỗi story giữ đủ một "So that" có giá trị riêng, và phân biệt rõ vai trò nếu cần.

Bài 4 — Soi lỗi over-promise. Tìm trong 3 story bạn vừa viết ở các bài trên xem có chỗ nào bạn vô tình "bán hàng quá đà" không, và định lượng lại mọi cam kết mơ hồ thành con số kiểm chứng được.

Hãy tự chấm điểm mỗi story của mình theo bộ INVEST trước khi xem là hoàn thành.

Tóm tắt

User story là viên gạch nhỏ mô tả nhu cầu người dùng theo cấu trúc "As a / I want / So that", còn acceptance criteria là danh sách điều kiện kiểm chứng được để biết khi nào story hoàn thành. Một story tốt phải đạt chuẩn INVEST: độc lập, thương lượng được, có giá trị, ước lượng được, đủ nhỏ và kiểm chứng được.

Là người chuyển từ Sales/BD, bạn có vũ khí tự nhiên ở phần "So that" — bạn đã quen tư duy theo value proposition, nên những story của bạn sẽ giàu giá trị và thuyết phục được product owner. Nhưng hãy cảnh giác với cái bẫy "over-promise": sự hào hứng bán hàng phải dừng lại ở phần benefit; mọi cam kết trong AC bắt buộc phải định lượng và kiểm chứng được. Luôn viết cả luồng thuận lợi lẫn các ngoại lệ, luôn chẻ nhỏ những story quá lớn, và đừng quên rằng story chỉ là khởi đầu của một cuộc trò chuyện với dev và stakeholder — nơi kỹ năng giao tiếp Sales của bạn tiếp tục phát huy tác dụng.