Menu
ESC

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

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

Đang tải...

Bài 39 — Interface analysis: phân tích integration points

Kiến Thức Cơ Bản BA: Thu Thập Yêu Cầu Hiệu Quả Bài 39/60

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

Hãy tưởng tượng bạn đang làm BA cho một dự án thanh toán hóa đơn điện nước trên ví điện tử. Đội phát triển viết xong giao diện đẹp, luồng nghiệp vụ rõ ràng, người dùng nhập số tiền, bấm "Thanh toán" và... màn hình treo. Lý do? Hệ thống của ví cần gọi sang cổng thanh toán của Napas, rồi Napas gọi tiếp sang core banking của ngân hàng, rồi ngân hàng gọi sang hệ thống của EVN để xác nhận khoản nợ. Bốn hệ thống, ba điểm nối, mỗi điểm nối là một nơi có thể "vỡ". Và trong tài liệu yêu cầu của bạn, không có một dòng nào mô tả những điểm nối đó.

Đây chính là khoảng trống mà Interface Analysis (phân tích giao diện/điểm tích hợp) lấp đầy. Trong thực tế, phần lớn rủi ro của một dự án phần mềm hiện đại không nằm bên trong một hệ thống đơn lẻ, mà nằm ở ranh giới — nơi hệ thống của bạn phải "nói chuyện" với hệ thống khác, với người dùng, với đối tác, với cơ quan quản lý. Một BA giỏi không chỉ hỏi "hệ thống làm gì?" mà còn hỏi "hệ thống này trao đổi cái gì, với ai, qua đâu, theo định dạng nào, khi nào, và nếu hỏng thì sao?".

Interface Analysis là một trong các elicitation technique chính thức của BABOK. Nó không thay thế phỏng vấn hay quan sát, mà bổ sung một góc nhìn mà các kỹ thuật khác hay bỏ sót: góc nhìn về dòng chảy thông tin qua biên giới. Bài này giúp bạn biết cách nhận diện, mô tả và làm rõ các integration points để không có "vùng tối" nào lọt qua tài liệu yêu cầu.

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

Interface là gì?

Trong ngữ cảnh BA, interface là điểm tiếp xúc nơi hai bên trao đổi dữ liệu hoặc điều khiển. "Hai bên" ở đây có thể là hai phần mềm, một phần mềm và một con người, hoặc một phần mềm và một thiết bị/tổ chức bên ngoài. Interface Analysis là hoạt động xác định các interface đó tồn tại, làm rõ chúng trao đổi gì và đặt ra yêu cầu cho từng cái.

Điểm mấu chốt cần ghi nhớ: interface là một biên giới (boundary), và mọi biên giới đều cần một hợp đồng (contract). Hợp đồng đó quy định ai gửi, ai nhận, dữ liệu gì, định dạng nào, tần suất ra sao, và xử lý lỗi thế nào.

Bốn loại interface chính

Mở rộng từ dàn ý gốc, ta phân loại interface thành bốn nhóm để dễ quét sót:

Loại interfaceMô tảVí dụ
User interface (UI)Điểm tiếp xúc giữa hệ thống và con ngườiMàn hình app, form web, màn hình POS, IVR tổng đài
System-to-system (API/integration)Hai phần mềm trao đổi dữ liệu tự độngGọi API Napas, webhook từ GHN, đồng bộ ERP–CRM
External party interfaceNối với đối tác, nhà cung cấp, cơ quan quản lýBáo cáo gửi NHNN, kết nối thuế điện tử với Tổng cục Thuế
Hardware/device interfaceNối với thiết bị vật lýMáy quẹt thẻ, đầu đọc QR, máy in hóa đơn, cảm biến IoT
Một interface ngoài đời thường thuộc nhiều nhóm chồng lấn — ví dụ kết nối tới Tổng cục Thuế vừa là system-to-system vừa là external party. Đừng quá cứng nhắc về việc xếp loại; mục đích của bảng phân loại chỉ là một checklist để bạn không quên loại nào.

Sáu thuộc tính cần làm rõ cho mỗi interface

Với mỗi interface tìm được, một BA cần trả lời sáu câu hỏi — bạn có thể coi đây là khung "6 thuộc tính của một điểm tích hợp":

  • Mục đích (Purpose) — interface này phục vụ nghiệp vụ gì? Tại sao tồn tại?
  • Hướng và dữ liệu (Direction & Payload) — một chiều hay hai chiều? Trao đổi những trường dữ liệu nào, kiểu gì, bắt buộc hay tùy chọn?
  • Phương thức và định dạng (Protocol & Format) — REST/JSON, SOAP/XML, file CSV qua SFTP, message qua Kafka, hay quẹt thẻ vật lý?
  • Tần suất và khối lượng (Frequency & Volume) — real-time mỗi giao dịch, hay batch cuối ngày? Bao nhiêu bản ghi mỗi lần?
  • Quy tắc và ràng buộc (Rules & Constraints) — bảo mật, xác thực, timeout, idempotency, thứ tự xử lý, SLA.
  • Xử lý lỗi (Error & Exception) — nếu phía bên kia không phản hồi, trả lỗi, hoặc trả dữ liệu sai thì sao? Retry? Fallback? Báo cho ai?
Trong sáu thuộc tính này, thuộc tính số 6 — xử lý lỗi — là nơi BA non tay hay bỏ qua nhất, nhưng lại là nơi sinh ra nhiều bug nghiêm trọng và tốn kém nhất khi lên production.

Tình huống thực tế

Ví dụ 1 — Ví điện tử MoMo nối với cổng Napas (system-to-system)

Bối cảnh: Một fintech (gọi là FinPay) làm tính năng nạp tiền vào ví từ tài khoản ngân hàng. BA ban đầu chỉ viết yêu cầu: "Người dùng chọn ngân hàng, nhập số tiền, hệ thống trừ tiền tài khoản và cộng vào ví." Nghe rất gọn.

Khi làm Interface Analysis, BA vẽ ra điểm tích hợp FinPay → Napas → Core banking và phát hiện hàng loạt câu hỏi chưa có lời đáp: Napas trả kết quả real-time hay có trường hợp "pending"? Nếu Napas trả timeout sau 30 giây nhưng thực ra giao dịch đã thành công bên ngân hàng thì sao (tiền đã trừ mà ví chưa cộng)? Mã lỗi nào của Napas nghĩa là "thử lại được", mã nào là "không bao giờ thử lại"? Idempotency key được tạo thế nào để tránh nạp tiền hai lần?

Diễn giải: BA bổ sung một bảng đặc tả interface với 18 mã lỗi từ tài liệu Napas, quy tắc reconciliation đối soát cuối ngày, và luồng "giao dịch treo" cần kiểm tra lại trạng thái sau 60 giây.

Bài học: Yêu cầu nghiệp vụ "nạp tiền" chỉ là phần nổi. Phần chìm — và phần quyết định hệ thống có an toàn về tiền bạc hay không — nằm hoàn toàn ở interface. Nếu BA không làm rõ, đội dev sẽ tự đoán, và mỗi lập trình viên đoán một kiểu.

Ví dụ 2 — Sàn TMĐT nối với đơn vị vận chuyển GHN (external party + webhook)

Bối cảnh: Một sàn thương mại điện tử quy mô vừa tích hợp giao hàng với GHN. Yêu cầu ban đầu: "Khi đơn được đóng gói, tạo vận đơn GHN; khi GHN giao xong, cập nhật trạng thái đơn về 'Đã giao'."

Khi phân tích interface, BA nhận ra đây là interface hai chiều, bất đối xứng: chiều đi là sàn gọi API GHN để tạo vận đơn (sàn chủ động), nhưng chiều về là GHN bắn webhook về sàn mỗi khi trạng thái thay đổi (GHN chủ động). Hai chiều này có đặc tính rất khác nhau. Chiều webhook đặt ra câu hỏi: GHN có thể bắn webhook trùng lặp không (phải, hệ thống delivery "at-least-once")? Webhook có thể đến không đúng thứ tự không (trạng thái "đã giao" đến trước "đang giao")? Nếu server sàn đang bảo trì, GHN retry bao nhiêu lần rồi bỏ?

Diễn giải: BA đặc tả thêm yêu cầu xác thực chữ ký webhook (HMAC), quy tắc "chỉ chuyển trạng thái tiến, không lùi", và một job đối soát dự phòng gọi API GHN mỗi 6 giờ để bắt các webhook bị mất. Con số thực tế của đội này: trước khi có job đối soát, khoảng 2–3% đơn bị kẹt trạng thái sai mỗi ngày, gây hàng trăm cuộc gọi khiếu nại của khách.

Bài học: Với external party, bạn không kiểm soát được phía bên kia. Interface Analysis buộc bạn thiết kế cho trường hợp đối tác hành xử không như mong đợi, chứ không chỉ cho "happy path".

Ví dụ 3 — Hệ thống bán lẻ nối máy POS và máy in hóa đơn (hardware interface)

Bối cảnh: Một chuỗi cửa hàng tiện lợi triển khai phần mềm bán hàng mới. BA tập trung vào nghiệp vụ tính tiền, khuyến mãi, tích điểm — nhưng quên rằng phần mềm phải nói chuyện với đầu đọc mã vạch, máy quẹt thẻ và máy in hóa đơn nhiệt tại quầy.

Khi đưa lên UAT, nhân viên thu ngân phát hiện: máy quẹt thẻ của ngân hàng đối tác chỉ trả kết quả qua một giao thức riêng, và khi mất mạng giữa lúc thanh toán, phần mềm không biết giao dịch thẻ đã thành công hay chưa. Máy in hóa đơn thì in lỗi khi tên sản phẩm có dấu tiếng Việt vượt quá độ rộng giấy 58mm.

Diễn giải: BA phải bổ sung interface spec cho từng thiết bị: bảng mã trạng thái máy quẹt thẻ, quy tắc xử lý khi mất kết nối (in phiếu "chờ xác nhận", đối soát với ngân hàng cuối ca), và ràng buộc độ dài tên sản phẩm khi in.

Bài học: Hardware interface dễ bị bỏ quên vì nó "ở ngoài màn hình". Nhưng với hệ thống bán lẻ, ngân hàng, y tế hay logistics, đây thường là nơi nghiệp vụ va chạm thực tế khắc nghiệt nhất.

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

Dưới đây là quy trình sáu bước bạn có thể áp dụng cho bất kỳ dự án nào.

Bước 1 — Vẽ context diagram (sơ đồ ngữ cảnh). Đặt hệ thống của bạn vào giữa, vẽ tất cả các thực thể bên ngoài quanh nó: người dùng, hệ thống khác, đối tác, thiết bị, cơ quan quản lý. Mỗi mũi tên nối ra ngoài chính là một interface ứng viên. Đây là công cụ mạnh nhất để không sót interface, vì nó buộc bạn liệt kê mọi đường nối ra biên giới.

Bước 2 — Lập danh mục interface (interface inventory). Đánh số từng interface (IF-01, IF-02...), đặt tên, ghi nguồn–đích và hướng. Mục tiêu của bước này chỉ là liệt kê đầy đủ, chưa cần chi tiết.

Bước 3 — Phân loại và xếp ưu tiên. Gắn mỗi interface vào một trong bốn loại, rồi đánh giá mức rủi ro (cao/trung/thấp) dựa trên: liên quan tiền/dữ liệu nhạy cảm không, đối tác bên ngoài hay nội bộ, real-time hay batch. Dồn công sức vào các interface rủi ro cao trước.

Bước 4 — Đặc tả từng interface theo 6 thuộc tính. Với mỗi interface, điền đủ Purpose, Direction & Payload, Protocol & Format, Frequency & Volume, Rules & Constraints, Error & Exception. Đây là phần "thịt" của Interface Analysis.

Bước 5 — Săn tìm nguồn thông tin và validate. Bạn không tự bịa ra spec. Nguồn gồm: tài liệu API của đối tác (Napas, GHN, VNPAY...), SME kỹ thuật phía hai hệ thống, log/traffic thực tế, và các hợp đồng/SLA đã ký. Với từng trường dữ liệu chưa rõ, đặt câu hỏi thẳng cho người sở hữu hệ thống đầu kia.

Bước 6 — Playback và chốt. Trình bày lại bản đặc tả interface cho cả hai phía (đội của bạn và đội/đối tác đầu kia) để họ xác nhận. Interface là hợp đồng hai bên — chỉ một bên đồng ý là chưa đủ. Việc chốt này nên có chữ ký hoặc xác nhận bằng văn bản.

Một mẫu đặc tả tối giản cho một interface có thể trông như sau:

IF-03  Sàn → GHN: Tạo vận đơn
  • Purpose: Sinh mã vận đơn khi đơn được đóng gói
  • Direction: Sàn gọi GHN (request/response)
  • Payload: mã đơn, người nhận, địa chỉ, COD, khối lượng, kích thước
  • Protocol: REST/JSON, HTTPS, token theo shop
  • Frequency: real-time, ~5.000 đơn/ngày, đỉnh 12h trưa
  • Rules: timeout 15s; idempotency theo mã đơn; COD tối đa 5 triệu
  • Error: 401 → refresh token; 429 → backoff; 5xx → retry 3 lần rồi đẩy queue tay

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

Lỗi 1 — Chỉ mô tả happy path. BA hay viết "hệ thống gọi API và nhận kết quả" mà quên rằng API có thể timeout, trả lỗi, hoặc trả dữ liệu thiếu trường. Mẹo: với mỗi interface, ép bản thân viết ít nhất ba kịch bản lỗi trước khi coi là xong.

Lỗi 2 — Quên tính bất đồng bộ và thứ tự. Webhook, message queue, batch — những interface bất đồng bộ có thể đến trùng, đến trễ, đến sai thứ tự. Mẹo: luôn hỏi "có thể đến hai lần không?" và "có thể đến sai thứ tự không?".

Lỗi 3 — Coi đặc tả interface là việc của dev. Nhiều BA né tránh phần này vì nghĩ nó "quá kỹ thuật". Thực ra BA không cần viết code, nhưng phải làm rõ dữ liệu nghiệp vụ và quy tắc chảy qua interface. Mẹo: bạn không cần biết JSON viết thế nào, nhưng phải biết "trường COD có bắt buộc không và giới hạn bao nhiêu".

Lỗi 4 — Bỏ quên interface ẩn. Một số interface không lộ ra trên UI: job đồng bộ ban đêm, file đối soát, email/SMS gửi qua nhà cung cấp thứ ba. Mẹo: dùng context diagram và hỏi "cuối ngày/cuối tháng hệ thống có gửi hay nhận gì tự động không?".

Lỗi 5 — Không xác nhận với phía bên kia. Bạn đặc tả interface theo hiểu biết của đội mình, nhưng phía đối tác hiểu khác. Mẹo: luôn playback và lấy xác nhận hai chiều, đặc biệt với external party.

Mẹo tổng quát: Giữ một "interface register" sống suốt dự án — mỗi khi phát hiện điểm nối mới hoặc thay đổi, cập nhật ngay. Đây cũng là đầu vào quý giá cho traceability và cho việc kiểm thử tích hợp sau này.

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

Bài tập 1 — Vẽ context diagram. Chọn một hệ thống bạn quen thuộc (app đặt đồ ăn, app ngân hàng, hệ thống quản lý kho). Vẽ context diagram liệt kê tối thiểu 6 thực thể bên ngoài và đánh số mọi interface. Phân loại từng interface vào một trong bốn nhóm.

Bài tập 2 — Đặc tả một interface rủi ro cao. Từ bài 1, chọn một interface liên quan đến tiền hoặc dữ liệu nhạy cảm. Viết đặc tả đầy đủ theo 6 thuộc tính. Bắt buộc liệt kê ít nhất bốn kịch bản lỗi và cách xử lý từng kịch bản.

Bài tập 3 — Săn câu hỏi. Giả sử bạn sắp họp với SME kỹ thuật của đối tác thanh toán. Viết danh sách 10 câu hỏi để làm rõ interface — trải đều qua cả 6 thuộc tính, đặc biệt là idempotency, timeout, mã lỗi và đối soát.

Bài tập 4 — Phát hiện interface ẩn. Lấy một tài liệu yêu cầu chỉ mô tả luồng UI, đọc và liệt kê tất cả interface "ẩn" mà tài liệu đó không nhắc tới (job batch, webhook, file đối soát, thông báo qua bên thứ ba).

Tóm tắt

Interface Analysis là kỹ thuật giúp BA nhìn ra và làm rõ những điểm tích hợp nơi hệ thống va chạm với thế giới bên ngoài — con người, hệ thống khác, đối tác và thiết bị. Phần lớn rủi ro thật của dự án nằm ở các biên giới này, chứ không phải bên trong một hệ thống đơn lẻ.

Hãy ghi nhớ ba ý chính: (1) Mọi interface là một hợp đồng hai bên cần được xác nhận từ cả hai phía; (2) Với mỗi interface, làm rõ đủ 6 thuộc tính — mục đích, hướng và dữ liệu, giao thức và định dạng, tần suất và khối lượng, quy tắc, và đặc biệt là xử lý lỗi; (3) Đừng bao giờ dừng lại ở happy path — chính các kịch bản timeout, trùng lặp, sai thứ tự và mất kết nối mới là nơi phân biệt một BA non tay với một BA chuyên nghiệp.

Bắt đầu mọi phân tích bằng một context diagram, lập interface inventory, xếp ưu tiên theo rủi ro, đặc tả chi tiết, validate với nguồn đáng tin và chốt bằng playback. Làm tốt việc này, bạn sẽ loại bỏ được phần lớn "vùng tối" khiến dự án vỡ trận lúc lên production.