Đánh giá mức sẵn sàng làm Business Analyst
Chấm từng chiều kỹ năng và cho ra hồ sơ — biết mình đứng ở đâu trước.
Làm bài này
Product Management
Lỗi của nhà cung cấp vẫn là trải nghiệm của khách hàng ta — và giới hạn của họ là điều khoản hợp đồng, không phải thông số kỹ thuật.
Đăng nhập để đánh dấu kỹ năng và theo dõi tiến độ.
Làm bài Đánh giá Nền tảng Kỹ thuật cho PM/BA — 3 người đã làm. Một lần làm chấm điểm cho tất cả kỹ năng trong nhóm Technical Basics, không chỉ kỹ năng này.
Làm bài đánh giáSản phẩm chạy trên các nhà cung cấp (thanh toán, eKYC, SMS/OTP, vận chuyển) — lỗi và giới hạn của họ ảnh hưởng tới ta ngay cả khi code ta đúng; môi trường staging thường không có provider thật.
Biết ranh giới provider-vs-ta trong luồng của mình; spec trạng thái chờ/thất bại cho mọi bước đi qua provider; kiểm tra giới hạn của từng provider trước khi cam kết với stakeholder.
Rất ít thứ trong một sản phẩm thương mại điện tử hay fintech do đội bạn tự làm hết. Tiền đi qua cổng thanh toán (MoMo, VNPay, thẻ ngân hàng). Xác minh danh tính đi qua nhà cung cấp eKYC. Mã OTP đi qua nhà cung cấp SMS. Đơn hàng đi qua đơn vị vận chuyển (GHN, GHTK). Mỗi cái là một hệ thống của người khác, chạy trên máy chủ của người khác, theo lịch bảo trì của người khác.
Hệ quả quan trọng nhất với BA/PO: code của đội bạn có thể đúng hoàn toàn mà khách hàng vẫn không đặt được hàng. Nhưng khách không phân biệt được điều đó — với họ chỉ có một câu: "app của các anh lỗi". Nên dù chỗ hỏng nằm bên kia ranh giới, trạng thái mà khách nhìn thấy vẫn luôn là việc của ta, và nó phải được viết ra trong spec chứ không phải để dev tự nghĩ.
Thêm một điều dễ bất ngờ: môi trường test thường không nối tới hệ thống thật của nhà cung cấp mà nối tới bản sandbox của họ. Sandbox trả lời nhanh, không bao giờ bận, không áp giới hạn và luôn cho kết quả thành công. Nghĩa là mọi trạng thái lỗi mà bạn quan tâm nhất lại chính là những trạng thái không tự xuất hiện khi test.
| Khái niệm | Nghĩa là gì | Dấu hiệu bạn đã hiểu |
|---|---|---|
| Ranh giới trách nhiệm | Vạch phân chia giữa phần ta kiểm soát và phần của nhà cung cấp. | Bạn vẽ được nó cho luồng mình phụ trách. |
| Mã giao dịch phía họ | Số duy nhất cả hai bên cùng tra được khi đối soát. | Bạn luôn lấy nó trước khi mở một cuộc trao đổi. |
| Trạng thái chờ | Giai đoạn ta đã gửi nhưng chưa có kết quả từ họ. | Bạn spec riêng cho nó, không coi là chớp mắt. |
| Timeout | Ta chờ quá thời gian cho phép mà họ không trả lời. | Bạn biết đây khác hẳn "họ trả lời là thất bại". |
| Giới hạn request | Số lệnh tối đa họ nhận trong một giây hoặc một phút, theo hợp đồng. | Bạn tra nó trước khi hứa quy mô cho một chiến dịch. |
| Sandbox | Bản thử nghiệm của nhà cung cấp dùng cho môi trường test. | Bạn không coi test xanh là bằng chứng chạy được thật. |
| Chống trùng | Cơ chế để một kết quả gửi hai lần không tạo ra hai đơn. | Bạn hỏi nó cho mọi luồng có tiền. |
| Đối soát | So sổ giữa hệ thống ta và hệ thống họ theo định kỳ. | Bạn biết luồng tiền nào cũng cần nó. |
Tình huống: khách nhắn vào trang chăm sóc khách hàng: "Tôi thanh toán bằng MoMo, tiền đã bị trừ nhưng trong app không có đơn nào." Trong nhóm chat của đội, câu đầu tiên mọi người hỏi nhau là "lỗi của mình hay lỗi của MoMo?" — và thường không ai trả lời được, nên ticket nằm im nửa ngày.
Chia luồng thành ba đoạn, mỗi đoạn hỏng theo một kiểu khác nhau:
Tiền đã bị trừ nghĩa là đoạn 1 và đoạn 2 đã xong. Vấn đề nằm ở đoạn 3 — hoặc họ chưa báo về, hoặc họ đã báo mà ta xử lý lỗi. Chỉ riêng việc nói được câu này đã thu hẹp phạm vi từ cả luồng xuống một đoạn.
Hai thứ phải lấy trước khi hỏi bất kỳ ai:
Bug report copy được nguyên văn:
Khách 09xxxxxxxx, đơn DH-88421, ngày 12/08 lúc 20:14 (giờ Việt Nam).
Thanh toán MoMo, mã giao dịch phía MoMo: 2408122014xxxx, số tiền 349.000đ.
Tiền đã bị trừ — khách gửi ảnh biến động số dư lúc 20:14.
Trên hệ thống ta: đơn đang ở trạng thái "Chờ thanh toán", không có bản ghi nào
trong bảng giao dịch sau 20:14.
Câu hỏi cho dev: mình có nhận được kết quả nào từ MoMo cho mã giao dịch này không?
- Có, nhưng xử lý lỗi -> việc của mình, ưu tiên cao.
- Không nhận được gì -> cần đối soát với MoMo, và mình phải có cơ chế
tự hỏi lại trạng thái thay vì chỉ ngồi chờ họ báo.
Học được: "lỗi ở đâu" không phải câu hỏi cảm tính. Nó được trả lời bằng một mã giao dịch và đúng một câu hỏi: ta có nhận được kết quả từ họ không. Và dù câu trả lời là gì, khách vẫn là khách của ta — nên đơn kẹt ở "Chờ thanh toán" mà không ai xử lý là vấn đề của ta, không phải của MoMo.
Tình huống: bạn spec luồng mở tài khoản có xác minh danh tính. Người dùng chụp CCCD, chụp khuôn mặt, hệ thống gửi sang nhà cung cấp eKYC để đối chiếu.
Bước 1 — liệt kê từng bước và đánh dấu bước nào ra khỏi hệ thống của ta:
| Bước | Ai làm | Thời gian điển hình | Ra khỏi hệ thống ta? |
|---|---|---|---|
| Chụp ảnh CCCD | App của ta | Tức thì | Không |
| Kiểm tra ảnh đủ sáng, đủ nét | Ta | Dưới 1 giây | Không |
| Đối chiếu thông tin trên CCCD | Nhà cung cấp eKYC | 3–30 giây, có lúc vài phút | Có |
| So khớp khuôn mặt với ảnh giấy tờ | Nhà cung cấp eKYC | 3–30 giây | Có |
| Ghi nhận kết quả, mở tài khoản | Ta | Tức thì | Không |
Bước 2 — mọi bước đánh dấu "Có" đều cần đủ bốn trạng thái, thiếu một cái là một lỗ hổng:
| Trạng thái | Người dùng thấy gì | Hệ thống làm gì |
|---|---|---|
| Đang chờ | "Đang xác minh, thường mất dưới một phút" kèm vòng quay | Giữ hồ sơ ở trạng thái chờ, lưu mã yêu cầu phía nhà cung cấp |
| Thành công | "Xác minh thành công" | Mở tài khoản, ghi thời điểm và mã yêu cầu |
| Họ trả lời: không đạt | "Ảnh CCCD bị loá, bạn chụp lại giúp nhé" | Cho phép chụp lại, tối đa 3 lần |
| Họ không trả lời | "Hệ thống xác minh đang bận. Chúng tôi sẽ báo bạn trong 15 phút, bạn không cần chụp lại." | Chuyển sang hàng đợi kiểm tra thủ công, gửi thông báo khi có kết quả |
Điều mà chỉ BA nghĩ ra được: phân biệt "họ trả lời là không đạt" với "họ không trả lời". Trong code, nếu không ai spec, hai trường hợp này rất dễ bị gộp làm một nhánh lỗi chung. Nhưng với người dùng thì một bên nghĩa là "ảnh của tôi có vấn đề", một bên nghĩa là "hệ thống đang hỏng". Nói nhầm sẽ khiến khách chụp đi chụp lại năm lần, càng chụp càng thất vọng, rồi bỏ luôn việc mở tài khoản — và trong báo cáo, con số đó hiện ra dưới dạng "tỷ lệ hoàn tất eKYC thấp", không ai biết nguyên nhân.
Các dòng viết vào spec, copy được:
Học được: ranh giới ta và nhà cung cấp không phải kiến thức kỹ thuật, nó là danh sách những chỗ spec của bạn phải có thêm trạng thái. Đánh dấu xong các bước đi ra ngoài, bạn biết chính xác mình còn thiếu bao nhiêu màn hình — và đó là những màn hình không ai vẽ nếu bạn không yêu cầu.
Tình huống: marketing chốt flash sale 20:00 ngày 20/08, dự kiến 5.000 đơn trong giờ đầu. Mỗi đơn gửi một mã OTP qua SMS để xác nhận, cộng một tin nhắn báo đặt hàng thành công — tức hai tin cho mỗi đơn. Trong buổi họp, bạn đã gật đầu.
Con số thật, tính ra sau khi về bàn. Đây là phép tính lẽ ra phải làm trước khi gật đầu, và nó chỉ mất hai phút:
5.000 đơn trong 60 phút, nhưng không rải đều:
mười phút đầu chiếm khoảng một nửa -> 2.500 đơn trong 10 phút
-> 250 đơn mỗi phút
mỗi đơn 2 tin (OTP + báo thành công) -> 500 tin nhắn mỗi phút ở đỉnh
Hợp đồng với nhà cung cấp SMS: 100 request mỗi phút; vượt thì họ trả về
lỗi 429 và không gửi.
-> thiếu 400 khe mỗi phút, suốt mười phút đông nhất của chiến dịch.
Chú ý phép tính trung bình, vì nó ru ngủ: 5.000 đơn chia đều 60 phút chỉ là 83 đơn mỗi phút, nghe như 100 khe mỗi phút vẫn còn thừa. Con số 83 đó sai theo hai cách cùng lúc, và hai cái sai nhân vào nhau chứ không cộng:
5.000 đơn / 60 phút ~ 83 đơn/phút <- mức trung bình
x 3 mười phút đầu đông gấp ba mức trung bình -> 250 đơn/phút
x 2 mỗi đơn tốn hai khe, không phải một -> 500 tin nhắn/phút ở đỉnh
500 tin nhắn/phút = gấp năm lần trần 100 request/phút của nhà cung cấp.
Cái làm hỏng chiến dịch không bao giờ là mức trung bình. Khi so lưu lượng với giới hạn của nhà cung cấp, luôn so ở đỉnh, và luôn so đúng đơn vị mà họ đếm — họ đếm request, không đếm đơn hàng.
Cái bẫy, gọi tên thẳng: đừng cam kết một con số quy mô trước khi đọc giới hạn của từng nhà cung cấp trong luồng đó. Giới hạn này không nằm trong code của ta, không ai trong đội dev nhìn thấy nó hằng ngày, và nó không lộ ra ở môi trường test — sandbox của nhà cung cấp thường không áp cùng giới hạn với hệ thống thật. Nghĩa là mọi thứ chạy hoàn hảo trong suốt quá trình chuẩn bị, cho tới đúng 20:03 ngày mở bán.
Cái giá, nếu chạm trần. 400 tin mỗi phút bị từ chối — nhưng con số phải mang vào cuộc họp không phải số tin, mà số khách. Và nó phụ thuộc vào việc ta có ưu tiên OTP hay không:
Không nhận được OTP nghĩa là không đặt hàng được, không phải đặt chậm. Cộng thêm: tổng đài quá tải vì tất cả cùng gọi một lúc, đội vận hành không biết chuyện gì đang xảy ra vì hệ thống của ta không báo lỗi gì cả (lỗi nằm ở phía họ), và flash sale chỉ diễn ra một lần nên không có cách nào "chạy lại". Doanh thu mất đi trong mười phút đó không lấy lại được bằng bất kỳ bản vá nào.
Năm việc phải làm, theo đúng thứ tự:
Câu hỏi bạn phải hỏi trong buổi họp chốt chiến dịch, trước khi gật đầu: "Con số 5.000 đơn này đi qua những nhà cung cấp nào, và giới hạn của từng bên là bao nhiêu?" Nếu chưa ai trả lời được thì câu trả lời cho marketing chưa phải là "được", mà là "để tôi xác nhận trong hai ngày". Một câu đó là toàn bộ phần việc của BA ở đây.
Học được: giới hạn của nhà cung cấp là một điều khoản hợp đồng chứ không phải một thông số kỹ thuật — nên nó thuộc về BA/PO, không phải về dev. Và nó có một đặc tính khó chịu: chỉ lộ ra đúng vào lúc đông khách nhất, tức là lúc đắt nhất để phát hiện.
Với mỗi luồng có bước đi qua nhà cung cấp, ticket của bạn phải trả lời được năm câu:
Chấm từng chiều kỹ năng và cho ra hồ sơ — biết mình đứng ở đâu trước.
Làm bài nàyHọc kỹ năng này ở đâu?
Có 2 khóa dạy đúng phần này, miễn phí và bằng tiếng Việt.
Thảo luận & tài liệu thêm 0
Chia sẻ kinh nghiệm, đặt câu hỏi, hoặc đính kèm tài liệu/YouTube giúp người khác học kỹ năng này.