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

Functional Decomposition Diagram (FDD) cho BA

Khi danh sách yêu cầu ngày càng dài, rất dễ bỏ sót một chức năng hoặc ghi cùng một việc ở nhiều chỗ. FDD giúp gom chúng thành một cây chức năng để nhìn rõ hệ thống cần làm những gì trước khi viết Use Case hay đặc tả.

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

Mở note này khi đã có yêu cầu ban đầu nhưng chưa biết nên chia hệ thống thành những nhóm chức năng nào. Kết quả cần có là một cây chức năng và bảng cho biết mỗi chức năng xuất phát từ yêu cầu nào.

Đầu vào lấy từ Requirement Elicitation và Scope, Assumptions & Constraints. Sau khi thống nhất cây, dùng Use Case cho BA để làm rõ cách người dùng thực hiện từng mục tiêu.

Bài dùng ShopFlow làm ví dụ. Các yêu cầu và quyết định bên dưới được đặt ra để thực hành, không mô tả nguyên trạng dự án.

1. FDD cho mình thấy điều gì?

Functional decomposition là cách chia một chức năng lớn thành những phần nhỏ hơn để dễ phân tích. IIBA dùng kỹ thuật này trong việc mô hình hóa và truy vết yêu cầu; chia sâu đến đâu tùy vào việc mình đang cần làm [1].

Với FDD trong bài này, hãy hình dung một cây: trên cùng là hệ thống, bên dưới là các nhóm chức năng, rồi đến những việc cụ thể hệ thống phải làm. Đường nối từ cha xuống con có nghĩa là “gồm những chức năng này”. Nó không cho biết chức năng nào chạy trước hay gọi chức năng nào.

Mình muốn biết…Nên dùng
Hệ thống cần có những chức năng nào?FDD
Người dùng làm gì để đạt một mục tiêu?Use Case và mô tả chi tiết kịch bản
Các bước diễn ra thế nào, rẽ nhánh ở đâu?UML Activity; dùng BPMN khi cần mô hình quy trình nghiệp vụ giữa các bên
Ai quản lý ai?Sơ đồ tổ chức
Team cần làm những đầu việc nào?Work breakdown structure (WBS)
Chức năng sẽ được triển khai bằng những thành phần nào?Mô hình kiến trúc kỹ thuật

FDD ở đây là sơ đồ cây, không dùng ký hiệu UML. Ví dụ được vẽ bằng cú pháp WBS của PlantUML vì công cụ này có sẵn cách vẽ cây. Các ô vẫn chứa chức năng của hệ thống, như “Tạo đơn hàng”, chứ không phải đầu việc của team như “Code API tạo đơn”.

2. Khi nào cần FDD?

Tình huốngCách xử lý
Yêu cầu nằm rải rác, mỗi người hiểu phạm vi một kiểuVẽ FDD rồi cùng stakeholder rà lại
Nghi ngờ thiếu chức năng hoặc có chức năng bị lặpĐối chiếu cây với danh sách yêu cầu và người hiểu nghiệp vụ
Chỉ đổi một quy tắc nhỏ trong Use Case đã rõSửa đặc tả và AC hiện có; thường không cần thêm FDD
Đang cần làm rõ luồng, trạng thái hoặc tương tácDùng thêm Activity, State Machine hoặc Sequence
Yêu cầu còn nhiều điểm chưa xác nhậnVẽ nháp để đặt câu hỏi, đánh dấu chỗ đang giả định

Cây giúp nhìn tổng thể, nhưng quan hệ giữa các chức năng đôi khi phức tạp hơn một đường cha–con. IIBA cũng lưu ý giới hạn này [1]. Chẳng hạn “Tạo đơn hàng” cần dữ liệu tồn kho; không vì thế mà phải đặt nó dưới nhánh “Quản lý tồn kho”.

3. Trước khi vẽ, cần biết gì?

Ít nhất phải trả lời được:

Bắt đầu với ba cấp

Handbook này chọn ba cấp làm điểm bắt đầu:

CấpNội dungVí dụ
1Hệ thống hoặc phạm vi đang xétShopFlow — phạm vi thực hành v1
2Nhóm chức năngQuản lý đơn hàng
3Chức năng cụ thểTạo đơn hàng, Tra cứu đơn hàng

Ở đây đếm cả hệ thống là cấp 1. Trong quy tắc của nhóm, “nhánh cấp 1” là nhánh ngay dưới hệ thống, tức cấp 2 trong bảng này.

Ba cấp thường đủ để bắt đầu trao đổi. Nếu một nhánh vẫn quá rộng, chia riêng nhánh đó sâu hơn; không cần chia các nhánh còn lại cho cân hình. IIBA không ấn định số cấp, mà khuyên chọn độ sâu đủ cho mục tiêu phân tích [1].

Các nhánh cùng cấp nên được chia theo cùng một cách. Ví dụ, “Danh mục sản phẩm”, “Đơn hàng” và “Tồn kho” đều nhóm theo nghiệp vụ. Đặt “Đơn hàng”, “Màn hình admin” và “PostgreSQL” cạnh nhau sẽ khiến cây khó hiểu vì đang trộn nghiệp vụ, giao diện và công nghệ.

Tên chức năng cụ thể nên có động từ + đối tượng: “Tra cứu đơn hàng”, “Ghi nhận nhập kho”. Nếu chỉ ghi “Order” hay “Quản lý X”, người đọc vẫn chưa biết hệ thống phải làm gì.

4. Từ danh sách yêu cầu đến cây chức năng

Có thể làm theo sáu bước sau:

  1. Ghi rõ phạm vi. Hệ thống nào, đợt bàn giao nào, phần nào làm và phần nào để sau? Kèm ngày và phiên bản để biết đang review bản nào.
  2. Tìm chức năng trong từng yêu cầu. Xác định việc hệ thống phải làm, giữ mã yêu cầu để còn đối chiếu về sau.
  3. Gom thành nhóm. Chọn các nhóm có cùng mục đích, rồi kiểm tra với stakeholder xem cách chia đó có dễ hiểu không.
  4. Chia đến chức năng cụ thể. Chia đủ để bắt đầu viết Use Case hoặc user story. Nếu còn mơ hồ, ghi câu hỏi cần làm rõ.
  5. Rà chỗ trùng và chỗ thiếu. Kiểm tra từng yêu cầu đã có chỗ trên cây chưa; soát CRUD đối với các nhóm “Quản lý X”.
  6. Review và chốt. Ghi lại quyết định, lý do và việc chưa thống nhất. Cây chưa được người có thẩm quyền xác nhận vẫn là bản nháp.

Kiểm tra “không trùng, không sót” bằng MECE

MECE hữu ích để tự hỏi xem cách chia đã hợp lý chưa:

Một yêu cầu có thể liên quan đến nhiều chức năng. Với chức năng dùng chung, chọn một chỗ để mô tả rồi ghi rõ các chức năng cần dùng đến nó.

Ví dụ, ở một phạm vi rộng hơn v1, hệ thống có thể cần gửi thông báo khi đặt đơn và khi tồn kho thấp. Đặt “Gửi thông báo” trong nhóm “Thông báo”, rồi ghi hai quan hệ: “Tạo đơn → Gửi thông báo” và “Cảnh báo tồn thấp → Gửi thông báo”. Nếu cách gửi hoặc quy tắc khác nhau, mô tả phần khác đó; đừng gom hai việc chỉ vì chúng cùng tên.

Dù cây đã gọn và ít trùng lặp, vẫn cần đối chiếu với yêu cầu gốc. Nhìn vào hình thôi chưa đủ để biết đã hết thiếu sót.

Với “Quản lý X”, nhớ soát CRUD

Hỏi lần lượt: có cần tạo, xem, sửa và xóa không? Nếu bỏ một thao tác, ghi lại lý do. Soát đủ CRUD giúp phát hiện thiếu sót, chứ không có nghĩa mọi đối tượng đều phải có đủ bốn thao tác.

Chẳng hạn, đơn đã thanh toán cần giữ lịch sử. “Hủy đơn” là thay đổi trạng thái theo quy tắc nghiệp vụ, không phải xóa bản ghi. Ai được hủy, hủy khi nào và dữ liệu được giữ lại ra sao vẫn phải viết trong đặc tả.

5. Ví dụ: ShopFlow — phạm vi thực hành v1

Trong ví dụ này, ứng dụng cho phép tìm và xem sản phẩm, tạo và tra cứu đơn, ghi nhận nhập kho và xem tồn. Sản phẩm đã được nạp sẵn, chỉ có một kho, người dùng đăng nhập bằng cơ chế hiện có.

Để bài tập gọn, chưa xét đăng ký tài khoản, thanh toán, vận chuyển, trả hàng và báo cáo doanh thu.

MãYêu cầu giả địnhXuất phát từ
R-01Khách hàng tìm và xem sản phẩm để chọn muaNhu cầu chọn sản phẩm
R-02Khách hàng tạo đơn; hệ thống từ chối nếu không đủ tồn khả dụngNhu cầu đặt hàng và quy tắc tồn kho
R-03Khách hàng tra cứu đơn của mìnhNhu cầu theo dõi đơn
R-04Nhân viên kho ghi nhận hàng nhậpCông việc nhập kho
R-05Nhân viên kho xem tồn của từng sản phẩmCông việc kiểm tra tồn

Cây chức năng

Sơ đồ dùng cây phân cấp tự do, vẽ bằng cú pháp WBS của PlantUML [2]. Mã F-… giúp đối chiếu chức năng trên hình với bảng bên dưới.

FDD ShopFlow — phạm vi thực hành v1

“Đủ tồn mới tạo đơn” là quy tắc của F-03, không cần tách thành một ô cho mỗi điều kiện kiểm tra. F-03 cần dữ liệu tồn kho, nhưng hình chưa cho biết lúc nào giữ tồn, lúc nào trừ tồn hoặc cách xử lý khi nhiều người cùng đặt. Những điểm đó cần được làm rõ trong đặc tả.

Mỗi chức năng đến từ yêu cầu nào?

Chức năngYêu cầuPhần cần viết tiếp
F-01, F-02R-01Use Case tìm/xem sản phẩm; điều kiện lọc và thông tin hiển thị
F-03R-02Use Case tạo đơn; AC đủ/thiếu tồn, quyền thao tác, lỗi và cách cập nhật tồn
F-04R-03Use Case tra cứu đơn; AC chỉ xem đơn của khách hàng hiện tại
F-05R-04Use Case nhập kho; kiểm tra số lượng và lưu lịch sử nhập
F-06R-05Use Case xem tồn; làm rõ tồn thực tế và tồn khả dụng

Bảng này chỉ ra việc cần làm tiếp, chưa phải đặc tả để dev/test triển khai. Khi viết chi tiết, xem Use Case cho BA và User Story & Acceptance Criteria.

Rà CRUD để xem có bỏ sót gì không

Đối tượngCreateReadUpdateDelete / lý do bỏ
Sản phẩmChưa làm: dữ liệu nạp sẵnF-01, F-02Chưa làmChưa làm; cần xác nhận lại nếu bổ sung quản trị danh mục
Đơn hàngF-03F-04Sửa/hủy đơn để sau v1Giả định không xóa cứng để giữ lịch sử; cần xác nhận
Tồn khoCó số dư ban đầu; F-05 tạo bản ghi nhậpF-06F-05 tăng tồn; F-03 còn cần chốt cách giữ/trừ tồnKhông cho xóa số dư/lịch sử qua giao diện trong v1

Còn phải hỏi gì trước khi chốt?

Các vai trò trong bảng cũng được giả định cho bài tập:

Câu hỏiCần hỏi ai?Nếu chưa có câu trả lời…
Tạo đơn giữ tồn hay trừ tồn ngay?PO và đại diện kho; dev xem tính khả thiChưa chốt được quy tắc F-03 và số tồn hiển thị ở F-06
Ai được phép nhập kho?Người phụ trách kho và người duyệt phân quyềnChưa chốt được quyền của F-05
Đơn chưa thanh toán bị bỏ dở thì xử lý thế nào?PO và đại diện vận hành bán hàngChưa rõ có cần thêm xử lý đơn hết hạn và hoàn lại tồn đã giữ không

BA ghi lại câu trả lời và lý do chọn phương án. Hình FDD giúp thấy chức năng cần có; các quyết định này vẫn cần trao đổi với người hiểu nghiệp vụ.

6. Chia đến đâu thì dừng?

Dừng khi stakeholder hiểu chức năng đó làm gì, BA nối được nó với yêu cầu và có thể bắt đầu viết kịch bản hoặc AC. Nếu đang chia tiếp thành “code API”, “viết unit test” hay từng nút trên màn hình, mình đã chuyển sang lập kế hoạch công việc hoặc thiết kế giao diện.

Khi yêu cầu thay đổi, cập nhật cây và bảng truy vết cùng nhau. Giữ mã chức năng khi chuyển nó sang nhánh khác để dễ theo dõi.

Vị trí trên cây không nói lên mức ưu tiên. Các nhánh chính thường chứa nhiều việc cần làm, nhưng việc nào là Must-have vẫn phải chốt riêng cho từng đợt bàn giao.

Anti-patterns

Cách làm dễ mắcVấn đềCách sửa
Chia theo phòng ban hoặc màn hìnhKhó thấy chức năng dùng chung; cây phụ thuộc vào tổ chức/giao diện hiện tạiNhóm theo chức năng, ghi người dùng và kênh sử dụng trong phần chi tiết
Chỉ ghi “Quản lý X” ở ô cuốiChưa rõ gồm những thao tác nàoSoát CRUD và quy trình, đặt tên cụ thể
Đưa mọi ý tưởng vào câyNgười đọc tưởng tất cả đã được duyệtTách việc đã chốt, việc để sau và câu hỏi còn mở
Dùng đường nối để chỉ thứ tự chạyNgười đọc nhầm cây chức năng với luồng xử lýVẽ thêm Activity hoặc Sequence
Cố chia đều ba cấp hoặc chia tới từng nútQuá sơ sài để review hoặc quá vụn để nhìn tổng thểChia theo mức cần trao đổi, nhánh phức tạp có thể sâu hơn
Mỗi ô là một story hoặc microserviceBỏ qua mục tiêu người dùng, cách chia story và thiết kế kỹ thuậtPhân tích các phần đó riêng; không ép quan hệ một–một
Soát CRUD/MECE xong là coi như đủVẫn có thể thiếu quyền, ngoại lệ, NFR và tích hợpĐối chiếu yêu cầu, quy tắc và các mô hình liên quan

Checklist nhanh

References

Đã đọc các nguồn trên ngày 07/10/2026. Cách đặt tên, các bước rà soát và ví dụ ShopFlow là cách thực hành được chọn cho handbook này.

Internal Sources

Mẫu 008 FDD-1.pdf trong library/04-specification/ của SecondBrain (SRC-COURSE-FDD) minh họa cây chức năng của hệ thống quản lý camera, chia theo nhóm người dùng và kênh web/mobile. Có thể xem mẫu để tham khảo cách trình bày; chọn cách chia phù hợp với hệ thống mình đang phân tích. PDF này chỉ có trong vault, không đính kèm trên blog.


Chia sẻ bài viết:

Bài sau
Activity Diagram cho BA