Thiết Kế Chiến Lược (Strategic Design)
"Sẽ chẳng có ý nghĩa gì khi bàn về giải pháp trước khi chúng ta đồng thuận về vấn đề, và cũng chẳng có ý nghĩa gì khi nói về các bước triển khai trước khi chúng ta đồng thuận về giải pháp."— Efrat Goldratt-Ashlag [1]
Phương pháp luận Thiết kế Hướng Miền (Domain-Driven Design - DDD) có thể được chia làm hai phần chính: thiết kế chiến lược (strategic design) và thiết kế chiến thuật (tactical design). Khía cạnh chiến lược của DDD tập trung trả lời các câu hỏi "Cái gì?" (what) và "Tại sao?" (why) — chúng ta đang xây dựng phần mềm gì và vì sao chúng ta lại xây dựng nó. Trong khi đó, phần chiến thuật hoàn toàn xoay quanh câu hỏi "Như thế nào?" (how) — từng thành phần được lập trình và triển khai ra sao.
Chúng ta sẽ bắt đầu hành trình khám phá thông qua các mẫu hình (patterns) và nguyên lý của thiết kế chiến lược:
- Chương 1: Bạn sẽ học cách phân tích chiến lược kinh doanh của một công ty: công ty đó mang lại giá trị gì cho khách hàng và cạnh tranh với các đối thủ cùng ngành ra sao. Chúng ta sẽ nhận diện các khối thành phần nghiệp vụ chi tiết hơn (subdomains), đánh giá giá trị chiến lược của chúng, và phân tích xem chúng tác động như thế nào đến các quyết định thiết kế phần mềm khác nhau.
- Chương 2: Giới thiệu phương pháp thực hành cốt lõi của DDD nhằm thấu hiểu miền nghiệp vụ: Ngôn ngữ chung phổ quát (Ubiquitous Language). Bạn sẽ học cách xây dựng một ngôn ngữ chung và sử dụng nó để thúc đẩy sự hiểu biết đồng thuận giữa tất cả các bên liên quan trong dự án.
- Chương 3: Thảo luận về một công cụ cốt lõi khác của DDD: mẫu hình Ngữ cảnh Giới hạn (Bounded Context). Bạn sẽ hiểu vì sao công cụ này lại tối quan trọng đối với việc vun đắp ngôn ngữ chung, và cách áp dụng nó để chuyển hóa tri thức thu thập được thành một mô hình của miền nghiệp vụ. Sau cùng, chúng ta sẽ tận dụng bounded context để thiết kế các thành phần ở mức độ tổng quan (coarse-grained) của hệ thống phần mềm.
- Chương 4: Bạn sẽ tìm hiểu về các ràng buộc kỹ thuật và mặt xã hội/tổ chức ảnh hưởng đến cách tích hợp các thành phần hệ thống, cùng các mẫu hình tích hợp (integration patterns) giải quyết các tình huống và hạn chế khác nhau. Chúng ta sẽ thảo luận cách mỗi mẫu hình tác động đến sự hợp tác giữa các nhóm phát triển phần mềm và việc thiết kế giao diện lập trình (API) của từng thành phần. Chương này khép lại bằng việc giới thiệu Bản đồ Ngữ cảnh (Context Map): một sơ đồ trực quan thể hiện mối liên lạc giữa các bounded context trong hệ thống, cung cấp cái nhìn toàn cảnh về bức tranh tích hợp và hợp tác của toàn dự án.
[1] Goldratt-Ashlag, E. (2010). “The Layers of Resistance—The Buy-In Process According to TOC.”
Phân Tích Miền Nghiệp Vụ
(Analyzing Business Domains)
Nếu bạn cũng giống như tôi, chắc hẳn bạn rất yêu thích việc viết code: giải quyết các bài toán hóc búa, đưa ra những giải pháp thanh lịch, và xây dựng nên cả những thế giới hoàn toàn mới bằng cách kiến tạo tỉ mỉ các quy tắc, cấu trúc cùng hành vi của chúng.
Tôi tin rằng đó chính là điều đã thôi thúc bạn tìm đến Thiết kế Hướng Miền (Domain-Driven Design - DDD): bạn khao khát trở nên giỏi hơn, thành thục hơn trong nghề nghiệp của mình. Tuy nhiên, chương này sẽ hoàn toàn không đề cập đến việc viết mã nguồn. Trong chương này, bạn sẽ học cách các công ty vận hành: vì sao họ tồn tại, họ đang theo đuổi những mục tiêu gì, và chiến lược của họ để đạt được các mục tiêu đó là gì.
Khi tôi giảng dạy nội dung này trong các lớp học Thiết kế Hướng Miền của mình, nhiều học viên đã thẳng thắn đặt câu hỏi: "Liệu chúng em có thực sự cần phải biết những kiến thức kinh doanh này không? Chúng em là người viết phần mềm, chứ đâu có đi điều hành doanh nghiệp?" Câu trả lời cho thắc mắc của họ là một từ "CÓ" đầy dứt khoát.
Để thiết kế và xây dựng nên một giải pháp hiệu quả, trước hết bạn bắt buộc phải thấu hiểu bản chất của vấn đề. Vấn đề, trong ngữ cảnh của chúng ta, chính là hệ thống phần mềm mà chúng ta phải kiến tạo. Và để hiểu được vấn đề, bạn phải hiểu được ngữ cảnh mà nó đang tồn tại bên trong — tức chiến lược kinh doanh của tổ chức, cùng giá trị mà tổ chức đó mong muốn gặt hái được khi đầu tư xây dựng phần mềm.
Trong chương này, bạn sẽ nắm vững các công cụ của Thiết kế Hướng Miền dùng để phân tích miền nghiệp vụ của một công ty và cấu trúc nội tại của nó: bao gồm các miền con cốt lõi (core subdomains), miền con hỗ trợ (supporting subdomains), và miền con dùng chung (generic subdomains). Nội dung này chính là nền móng cốt lõi cho mọi quyết định thiết kế phần mềm. Trong những chương tiếp theo, bạn sẽ thấy rõ các khái niệm này định hình thiết kế phần mềm theo nhiều cách thức sâu sắc như thế nào.
Miền Nghiệp Vụ Là Gì? (What Is a Business Domain?)
Một miền nghiệp vụ (business domain) xác định lĩnh vực hoạt động chính của một công ty. Nói một cách tổng quát, đó chính là loại dịch vụ hoặc giá trị mà công ty đó cung cấp cho các khách hàng của mình. Ví dụ:
- FedEx: Cung cấp dịch vụ chuyển phát thư từ, hàng hóa (courier delivery).
- Starbucks: Được biết đến nhiều nhất với sản phẩm cà phê và không gian thưởng thức cà phê.
- Walmart: Là một trong những chuỗi bán lẻ (retail) được công nhận rộng rãi nhất trên thế giới.
Một công ty có thể đồng thời hoạt động trong nhiều miền nghiệp vụ khác nhau. Điển hình như Amazon: họ cung cấp cả dịch vụ bán lẻ trực tuyến lẫn dịch vụ điện toán đám mây (Amazon Web Services - AWS). Uber là một công ty gọi xe công nghệ (rideshare), nhưng đồng thời họ cũng cung cấp dịch vụ giao đồ ăn (Uber Eats) và dịch vụ chia sẻ xe đạp/xe điện.
Một điểm cực kỳ quan trọng cần lưu ý là các công ty có thể thay đổi miền nghiệp vụ của mình theo thời gian. Một ví dụ kinh điển mang tính biểu tượng cho điều này là Nokia: trong suốt chiều dài lịch sử của mình, Nokia từng hoạt động trong các lĩnh vực vô cùng đa dạng từ chế biến gỗ xẻ, sản xuất sản phẩm cao su (như ủng cao su, lốp xe), cho đến hạ tầng viễn thông và sản xuất thiết bị liên lạc di động.
Miền Con Là Gì? (What Is a Subdomain?)
Để hiện thực hóa các mục tiêu và kế hoạch đề ra trong miền nghiệp vụ của mình, một công ty bắt buộc phải vận hành trong nhiều miền con (subdomains). Một miền con là một mảng hoạt động kinh doanh ở mức độ chi tiết hơn (fine-grained area of business activity). Tập hợp tất cả các miền con của một công ty hợp thành miền nghiệp vụ tổng thể của công ty đó: tức toàn bộ dịch vụ mà nó cung cấp ra thị trường cho khách hàng.
Việc triển khai duy nhất một miền con đơn lẻ không bao giờ là đủ để một công ty thành công; mỗi miền con chỉ là một khối thành phần (building block) trong một hệ thống lớn hơn. Các miền con phải tương tác nhịp nhàng với nhau để đạt được mục tiêu chung của công ty trong miền nghiệp vụ.
Ví dụ, Starbucks có thể nổi tiếng nhất nhờ hương vị cà phê hảo hạng, nhưng để xây dựng nên một chuỗi cửa hàng cà phê thành công trên quy mô toàn cầu đòi hỏi nhiều thứ hơn là chỉ biết cách pha chế cà phê ngon. Bạn còn phải biết cách tìm kiếm và thuê/mua bất động sản tại các vị trí đắc địa nhất, tuyển dụng và đào tạo nhân sự, quản lý dòng tiền và tài chính, cùng hàng loạt các hoạt động phụ trợ khác. Nếu đứng tách biệt một mình, không một miền con nào kể trên có thể tạo ra một doanh nghiệp sinh lời. Chỉ khi tất cả các miền con cùng phối hợp ăn khớp, công ty mới có thể cạnh tranh vững vàng trong miền nghiệp vụ của mình.
Các Loại Miền Con (Types of Subdomains)
Cũng giống như một hệ thống phần mềm được cấu thành từ nhiều thành phần kiến trúc khác nhau — cơ sở dữ liệu (databases), ứng dụng giao diện (frontend), dịch vụ nền tảng (backend services), và các hệ thống phụ trợ khác — các miền con cũng mang những giá trị kinh doanh và ý nghĩa chiến lược hoàn toàn khác nhau.
Thiết kế Hướng Miền phân biệt rõ ràng ba loại miền con:
- Miền con cốt lõi (Core Subdomains)
- Miền con dùng chung / phổ quát (Generic Subdomains)
- Miền con hỗ trợ (Supporting Subdomains)
Hãy cùng xem xét ba loại miền con này khác nhau như thế nào dưới góc nhìn chiến lược kinh doanh của một công ty.
1. Miền Con Cốt Lõi (Core Subdomains)
Miền con cốt lõi (core subdomain) là những hoạt động mà công ty thực hiện khác biệt hoàn toàn so với các đối thủ cạnh tranh. Điều này có thể bao gồm việc sáng tạo ra các sản phẩm hoặc dịch vụ hoàn toàn mới, hoặc giảm thiểu chi phí thông qua việc tối ưu hóa vượt bậc các quy trình hiện có.
Hãy lấy Uber làm ví dụ. Ban đầu, công ty này mang đến một hình thức vận tải hoàn toàn mới mẻ: đi chung xe (ridesharing). Khi các đối thủ cạnh tranh bắt đầu bắt kịp mô hình này, Uber tiếp tục tìm ra những phương thức mới để tối ưu hóa và phát triển hoạt động kinh doanh cốt lõi: chẳng hạn như giảm chi phí chuyến đi bằng thuật toán ghép nối những hành khách có cùng lộ trình di chuyển (UberPool).
Các miền con cốt lõi của Uber tác động trực tiếp đến kết quả kinh doanh sống còn của họ (bottom line). Đây chính là cách công ty tạo ra sự khác biệt rõ rệt so với đối thủ. Đây là chiến lược để công ty cung cấp dịch vụ tốt hơn cho khách hàng và/hoặc tối đa hóa lợi nhuận. Để duy trì được lợi thế cạnh tranh bền vững, các miền con cốt lõi thường gắn liền với những phát minh sáng chế, sự tối ưu hóa thông minh, bí quyết kinh doanh độc quyền (know-how), hoặc các tài sản trí tuệ khác.
Hãy xem xét một ví dụ khác: Thuật toán xếp hạng của Google Search (PageRank và các thuật toán mở rộng). Tại thời điểm viết cuốn sách này, nền tảng quảng cáo (Google Ads) đóng góp phần lớn lợi nhuận cho Google. Tuy nhiên, Google Ads không phải là một miền con đơn lẻ, mà là cả một miền nghiệp vụ riêng biệt gồm nhiều miền con cấu thành, bên cạnh dịch vụ điện toán đám mây (Google Cloud Platform), bộ công cụ làm việc và cộng tác (Google Workspace), cùng nhiều lĩnh vực khác mà tập đoàn mẹ Alphabet đang vận hành.
Vậy còn công cụ tìm kiếm Google Search và thuật toán xếp hạng của nó thì sao? Mặc dù dịch vụ tìm kiếm không thu phí trực tiếp từ người dùng, nhưng nó lại đóng vai trò là nền tảng hiển thị khổng lồ nhất cho Google Ads. Khả năng cung cấp kết quả tìm kiếm xuất sắc, chính xác vượt trội chính là yếu tố thu hút và giữ chân lưu lượng người dùng (traffic), và do đó, nó là một thành phần trọng yếu của cỗ máy quảng cáo. Nếu kết quả tìm kiếm trở nên kém cỏi do lỗi trong thuật toán, hoặc nếu một đối thủ nào đó tạo ra một dịch vụ tìm kiếm vượt trội hơn, doanh thu từ mảng quảng cáo sẽ lập tức bị tổn hại nặng nề. Vì vậy, đối với Google, thuật toán xếp hạng tìm kiếm chính là một miền con cốt lõi.
Độ Phức Tạp (Complexity)
Một miền con cốt lõi mà lại đơn giản, dễ dàng triển khai thì chỉ có thể mang lại lợi thế cạnh tranh ngắn ngủi. Do đó, các miền con cốt lõi về bản chất luôn có độ phức tạp cao. Tiếp tục với ví dụ về Uber: công ty này không chỉ kiến tạo ra một phân khúc thị trường mới với dịch vụ đi xe chung, mà họ còn phá vỡ cấu trúc nguyên khối tồn tại hàng thập kỷ của ngành taxi truyền thống thông qua việc ứng dụng công nghệ một cách có định hướng. Bằng cách thấu hiểu sâu sắc miền nghiệp vụ của mình, Uber đã thiết kế nên một phương thức vận tải minh bạch và đáng tin cậy hơn rất nhiều. Một mảng kinh doanh cốt lõi của công ty phải có rào cản gia nhập thị trường cao (high entry barriers); nó phải đủ khó để các đối thủ cạnh tranh không thể dễ dàng sao chép hoặc bắt chước giải pháp của công ty.
Các Nguồn Tạo Ra Lợi Thế Cạnh Tranh (Sources of Competitive Advantage)
Cần đặc biệt lưu ý rằng: miền con cốt lõi không nhất thiết phải luôn luôn là một giải pháp thuần kỹ thuật. Không phải mọi bài toán kinh doanh đều được giải quyết thông qua thuật toán hay phần mềm máy tính tinh vi. Lợi thế cạnh tranh của một công ty có thể bắt nguồn từ rất nhiều phương diện khác nhau.
Hãy tưởng tượng một người thợ chế tác trang sức thủ công bán sản phẩm của mình qua mạng. Cửa hàng trực tuyến (online shop) là rất quan trọng, nhưng đó không phải là miền con cốt lõi. Thiết kế kiểu dáng trang sức mới chính là miền con cốt lõi. Công ty có thể thuê hoặc sử dụng một nền tảng thương mại điện tử có sẵn trên thị trường, nhưng họ tuyệt đối không thể thuê ngoài (outsource) việc thiết kế các mẫu trang sức của mình. Chính thiết kế độc bản, tinh tế mới là lý do khách hàng chọn mua sản phẩm và ghi nhớ thương hiệu của họ.
Một ví dụ tinh tế hơn: hãy hình dung một công ty chuyên về phát hiện gian lận thủ công (manual fraud detection). Công ty đào tạo các chuyên viên phân tích nghiệp vụ kỳ cựu để rà soát các chứng từ nghi vấn và đánh dấu các trường hợp gian lận tiềm ẩn. Bạn được thuê để lập trình hệ thống phần mềm mà các chuyên viên phân tích đó sử dụng hàng ngày. Liệu hệ thống đó có phải là miền con cốt lõi không? Không. Miền con cốt lõi ở đây chính là quy trình nghiệp vụ và kỹ năng chuyên môn mà các chuyên viên phân tích đang thực hiện. Hệ thống bạn xây dựng chẳng liên quan gì đến logic phân tích gian lận cả, nó chỉ đơn thuần hiển thị tài liệu lên màn hình và lưu vết các ghi chú của chuyên viên mà thôi.
2. Miền Con Dùng Chung (Generic Subdomains)
Miền con dùng chung (generic subdomain) là những hoạt động nghiệp vụ mà hầu như tất cả các công ty đều thực hiện theo cùng một cách thức chuẩn mực như nhau. Cũng giống như miền con cốt lõi, các miền con dùng chung nhìn chung có độ phức tạp cao và rất khó để tự lập trình chuẩn xác từ đầu. Tuy nhiên, các miền con dùng chung hoàn toàn không tạo ra bất kỳ lợi thế cạnh tranh nào cho công ty. Ở mảng này, không có nhu cầu đổi mới sáng tạo hay tối ưu khác biệt: các giải pháp đã được kiểm nghiệm qua thực tế (battle-tested) đã có sẵn rộng rãi trên thị trường, và mọi doanh nghiệp đều áp dụng chúng.
Ví dụ điển hình: hầu hết mọi hệ thống phần mềm đều cần chức năng xác thực danh tính (authentication) và phân quyền người dùng (authorization). Thay vì tự phát minh ra một cơ chế xác thực độc quyền chứa đầy rủi ro, việc sử dụng các giải pháp/thư viện đã có sẵn (như OAuth2, OpenID Connect, Auth0, Keycloak...) là phương án hợp lý và sáng suốt hơn rất nhiều. Một giải pháp như vậy gần như chắc chắn sẽ ổn định, an toàn và bảo mật hơn, bởi nó đã được hàng ngàn công ty có cùng nhu cầu thử nghiệm và vá lỗi qua nhiều năm tháng.
Quay trở lại ví dụ về người thợ kim hoàn bán trang sức trực tuyến: thiết kế trang sức là miền con cốt lõi, nhưng cửa hàng trực tuyến lại là một miền con dùng chung. Việc sử dụng chung một nền tảng bán hàng trực tuyến (như Shopify, WooCommerce) — tức cùng một giải pháp dùng chung như các đối thủ cạnh tranh — sẽ hoàn toàn không làm suy giảm đi chút nào lợi thế cạnh tranh của người thợ chế tác trang sức.
3. Miền Con Hỗ Trợ (Supporting Subdomains)
Đúng như tên gọi của mình, miền con hỗ trợ (supporting subdomain) đóng vai trò hỗ trợ đắc lực cho hoạt động kinh doanh của công ty. Tuy nhiên, trái ngược với miền con cốt lõi, các miền con hỗ trợ không mang lại bất kỳ lợi thế cạnh tranh nào.
Ví dụ, hãy xem xét một công ty quảng cáo trực tuyến. Các miền con cốt lõi của họ bao gồm: thuật toán khớp quảng cáo phù hợp với khách truy cập, tối ưu hóa tỷ lệ chuyển đổi hiệu quả của quảng cáo, và tối thiểu hóa chi phí đấu thầu không gian hiển thị. Tuy nhiên, để gặt hái thành công ở những mảng đó, công ty bắt buộc phải quản lý và phân loại danh mục các tài nguyên quảng cáo (creative materials). Cách công ty lưu trữ, đánh chỉ mục các hình ảnh banner hay trang đích (landing pages) không hề tạo ra thêm lợi nhuận hay sự khác biệt nào trước mắt khách hàng. Chẳng có gì để sáng tạo hay tối ưu đột phá ở khu vực này cả. Nhưng mặt khác, danh mục lưu trữ tài nguyên này lại là thành phần không thể thiếu để hệ thống quản trị và phân phối quảng cáo hoạt động được. Điều đó khiến hệ thống quản lý danh mục tài nguyên trở thành một miền con hỗ trợ tiêu biểu của công ty.
Đặc điểm phân biệt nổi bật nhất của miền con hỗ trợ nằm ở độ phức tạp của logic nghiệp vụ: logic nghiệp vụ của miền con hỗ trợ rất đơn giản. Chúng chủ yếu xoay quanh các màn hình nhập liệu dữ liệu và các tác vụ trích xuất, biến đổi, nạp dữ liệu (ETL - Extract, Transform, Load) — hay nói cách khác là các giao diện thao tác CRUD (Create, Read, Update, Delete) cơ bản. Những mảng hoạt động này không tạo ra lợi thế cạnh tranh, do đó cũng không đòi hỏi rào cản kỹ thuật hay gia nhập khắt khe.
So Sánh Các Miền Con (Comparing Subdomains)
Để có cái nhìn sâu sắc hơn, chúng ta hãy đặt ba loại miền con lên bàn cân so sánh dựa trên các khía cạnh then chốt: lợi thế cạnh tranh, độ phức tạp, độ biến động và chiến lược hiện thực hóa.
Lợi Thế Cạnh Tranh (Competitive Advantage)
Chỉ duy nhất miền con cốt lõi mới mang lại lợi thế cạnh tranh cho công ty. Miền con cốt lõi chính là lý do vì sao khách hàng chọn sử dụng dịch vụ của công ty bạn thay vì tìm đến đối thủ cạnh tranh. Càng giải quyết được những bài toán hóc búa, doanh nghiệp càng tạo ra được nhiều giá trị kinh doanh to lớn.
Những bài toán phức tạp này không chỉ gói gọn trong việc cung cấp dịch vụ trực tiếp cho người tiêu dùng. Một bài toán phức tạp cũng có thể là việc giúp doanh nghiệp vận hành tối ưu và tinh gọn hơn. Chẳng hạn, cung cấp cùng một chất lượng dịch vụ như các đối thủ nhưng với chi phí vận hành thấp hơn đáng kể cũng là một lợi thế cạnh tranh vô cùng mạnh mẽ.
Độ Phức Tạp (Complexity)
Dưới góc độ kỹ thuật, việc xác định chính xác các miền con của tổ chức có ý nghĩa sống còn, bởi mỗi loại miền con sở hữu một mức độ phức tạp rất khác nhau. Khi thiết kế phần mềm, chúng ta phải lựa chọn các công cụ và kỹ thuật tương xứng với độ phức tạp của các yêu cầu nghiệp vụ. Do đó, phân loại miền con là bước tiền đề không thể thiếu để tạo nên một giải pháp phần mềm vững chắc.
- Miền con hỗ trợ: Có logic nghiệp vụ rất đơn giản. Đây là những thao tác ETL cơ bản và giao diện CRUD; logic nghiệp vụ hết sức hiển nhiên và trực quan. Thông thường, nó không vượt quá việc xác thực dữ liệu đầu vào (input validation) hoặc chuyển đổi dữ liệu từ định dạng này sang định dạng khác.
- Miền con dùng chung: Phức tạp hơn rất nhiều. Phải có một lý do đủ lớn thì cộng đồng công nghệ hoặc các nhà cung cấp bên thứ ba mới đầu tư thời gian, công sức và tiền bạc để giải quyết trọn vẹn những bài toán này. Những giải pháp đó không hề đơn giản hay tầm thường. Hãy nghĩ đến các thuật toán mã hóa (encryption algorithms) hay cơ chế xác thực phân quyền chuẩn ngành. Dưới góc nhìn tri thức, miền con dùng chung thuộc nhóm "những điều bạn biết là mình không biết" (known unknowns). Tri thức này có sẵn rộng rãi trên thị trường: bạn có thể áp dụng các best practices đã được chuẩn hóa hoặc thuê chuyên gia tư vấn để thiết kế giải pháp.
- Miền con cốt lõi: Vừa phức tạp vừa độc nhất. Chúng phải đủ khó để đối thủ không thể sao chép — bởi sự sống còn và lợi nhuận của doanh nghiệp phụ thuộc trực tiếp vào đó. Về mặt chiến lược, các công ty luôn tìm kiếm và dồn lực giải quyết các bài toán phức tạp nhất để biến chúng thành miền con cốt lõi của mình.
Đôi khi việc phân biệt giữa miền con cốt lõi và miền con hỗ trợ có thể gây bối rối. Hãy lấy độ phức tạp làm kim chỉ nam: Hãy tự hỏi liệu miền con đang xem xét có thể tách riêng ra thành một công ty khởi nghiệp hay dịch vụ độc lập không? Liệu có ai ngoài thị trường sẵn sàng trả tiền để mua riêng tính năng đó không? Nếu câu trả lời là có, đó chính là một miền con cốt lõi.
Lập luận tương tự khi phân biệt giữa miền con hỗ trợ và miền con dùng chung: Liệu việc tự viết mã nguồn nhanh một giải pháp nội bộ đơn giản có dễ dàng và rẻ hơn việc tích hợp một giải pháp cồng kềnh từ bên ngoài hay không? Nếu việc tự code dễ dàng và nhanh hơn, đó đích thị là một miền con hỗ trợ.
Dưới góc nhìn lập trình, một nguyên tắc hữu ích khác để nhận diện các miền con cốt lõi liên quan đến phần mềm là đánh giá độ phức tạp của logic nghiệp vụ mà bạn phải mô hình hóa trong code: Logic nghiệp vụ đó giống như các giao diện CRUD nhập liệu thông thường, hay bạn phải lập trình những thuật toán phức tạp, các quy trình nghiệp vụ được phối hợp bởi hàng loạt quy tắc kinh doanh (business rules) và bất biến (invariants) chặt chẽ? Trường hợp đầu là dấu hiệu của miền con hỗ trợ, còn trường hợp sau chính là một miền con cốt lõi điển hình.
Biểu đồ trong Hình 1-1 thể hiện sự tương tác giữa ba loại miền con xét theo khía cạnh tạo sự khác biệt kinh doanh và độ phức tạp của logic nghiệp vụ. Điểm giao thoa giữa miền con hỗ trợ và miền con dùng chung là một vùng xám (gray area): nó có thể ngả về bên nào tùy tình huống. Nếu đã có sẵn một giải pháp dùng chung cho chức năng của miền con hỗ trợ, thì việc phân loại cuối cùng sẽ phụ thuộc vào việc: liệu tích hợp giải pháp dùng chung đó có đơn giản hơn và/hoặc tiết kiệm chi phí hơn so với việc tự viết mã nguồn từ đầu hay không.
Độ Biến Động (Volatility)
Như đã đề cập trước đó, các miền con cốt lõi có xu hướng thay đổi rất thường xuyên. Nếu một bài toán có thể được giải quyết triệt để ngay từ lần thử đầu tiên, thì nó khó có thể tạo thành một lợi thế cạnh tranh bền vững — các đối thủ sẽ nhanh chóng bắt kịp.
Hệ quả là các giải pháp cho miền con cốt lõi mang tính chất tiến hóa dần (emergent). Các cách hiện thực hóa khác nhau phải liên tục được thử nghiệm, tinh chỉnh, đo lường và tối ưu hóa. Hơn nữa, công việc đối với miền con cốt lõi không bao giờ có hồi kết. Các doanh nghiệp liên tục đổi mới sáng tạo và nâng cấp miền con cốt lõi, dù là dưới hình thức bổ sung tính năng mới hay tối ưu hóa các quy trình hiện tại. Sự tiến hóa liên tục này là điều kiện tiên quyết để công ty giữ vững vị thế dẫn đầu trước các đối thủ.
Trái ngược với miền con cốt lõi, các miền con hỗ trợ hiếm khi thay đổi. Chúng không tạo ra bất kỳ lợi thế cạnh tranh nào, do đó việc đầu tư nguồn lực để cải tiến một miền con hỗ trợ chỉ mang lại giá trị kinh doanh nhỏ giọt so với việc đổ cùng lượng tài nguyên đó vào việc phát triển miền con cốt lõi.
Mặc dù đã có sẵn các giải pháp ngoài thị trường, các miền con dùng chung vẫn có thể thay đổi theo thời gian. Những sự thay đổi này thường đến từ các bản vá bảo mật, sửa lỗi hệ thống, hoặc sự ra đời của những công nghệ giải pháp hoàn toàn mới thay thế cho giải pháp cũ.
Chiến Lược Giải Pháp & Triển Khai (Solution Strategy)
Miền con cốt lõi mang lại năng lực cạnh tranh cho công ty trước các đối thủ trong ngành. Đó là một trọng trách mang tính sống còn đối với doanh nghiệp, nhưng liệu điều đó có đồng nghĩa với việc các miền con hỗ trợ và dùng chung là không quan trọng? Tuyệt đối không! Mọi miền con đều là những viên gạch nền móng bắt buộc phải có để công ty hoạt động được trong miền nghiệp vụ của mình. Rút đi một viên gạch, cả tòa nhà hệ thống có thể sụp đổ.
Tuy nhiên, chúng ta có thể tận dụng các đặc tính cố hữu của từng loại miền con để đưa ra chiến lược triển khai hiệu quả và tối ưu chi phí nhất cho từng loại:
- Miền con cốt lõi bắt buộc phải tự phát triển nội bộ (In-house): Chúng không thể đi mua hay sao chép từ bên ngoài; làm như vậy sẽ phá hủy hoàn toàn khái niệm lợi thế cạnh tranh, vì đối thủ cũng có thể mua giải pháp tương tự. Thuê ngoài (outsource) việc xây dựng miền con cốt lõi cũng là một nước đi hết sức thiếu khôn ngoan. Đây là khoản đầu tư chiến lược dài hạn. Cắt xén, làm ẩu ở miền con cốt lõi không chỉ rủi ro trước mắt mà còn để lại những hậu quả chí mạng về lâu dài: ví dụ tạo ra những codebase hỗn loạn, không thể bảo trì và không thể thích ứng với các mục tiêu kinh doanh tương lai. Những kỹ sư tài năng, giàu kinh nghiệm nhất trong đội ngũ của bạn bắt buộc phải được bố trí vào các miền con cốt lõi. Việc tự làm chủ mã nguồn nội bộ cũng giúp công ty thích ứng và xoay chuyển nhanh hơn khi thị trường biến động.
- Miền con cốt lõi đòi hỏi các kỹ thuật kỹ nghệ tiên tiến nhất: Vì các yêu cầu của miền con cốt lõi liên tục biến đổi, giải pháp phần mềm bắt buộc phải có khả năng mở rộng, dễ bảo trì và dễ dàng tiến hóa. Do đó, đây là nơi cần áp dụng các mẫu thiết kế và nguyên lý kiến trúc tinh vi nhất của DDD.
- Miền con dùng chung nên mua sẵn hoặc dùng mã nguồn mở (Buy/Adopt): Vì các bài toán dùng chung là những vấn đề khó nhưng đã được cộng đồng giải quyết trọn vẹn, việc mua một sản phẩm thương mại hoàn chỉnh hoặc tích hợp một thư viện mã nguồn mở uy tín sẽ tiết kiệm chi phí và thời gian hơn rất nhiều so với việc tự code trong nhà.
- Miền con hỗ trợ không cần kỹ thuật phức tạp, là ứng viên sáng giá cho gia công ngoài (Outsource) hoặc nhân sự mới: Sự thiếu vắng lợi thế cạnh tranh khiến doanh nghiệp không nên lãng phí nguồn lực kỹ thuật cao cấp vào miền con hỗ trợ. Tuy nhiên, khác với miền con dùng chung, thường không có giải pháp đóng gói sẵn đáp ứng trọn vẹn đặc thù riêng của công ty. Do đó, doanh nghiệp thường vẫn phải tự xây dựng, nhưng sự đơn giản của logic nghiệp vụ cho phép chúng ta đơn giản hóa quy trình: sử dụng các framework phát triển nhanh (Rapid Application Development - RAD), giao diện CRUD tự động. Dưới góc độ nhân sự, các miền con hỗ trợ không đòi hỏi trình độ kỹ thuật quá cao, tạo cơ hội tuyệt vời để đào tạo và rèn luyện các kỹ sư trẻ (junior/fresher), dành nguồn lực kỹ sư tinh nhuệ cho miền cốt lõi. Cuối cùng, logic nghiệp vụ đơn giản khiến miền con hỗ trợ trở thành ứng viên hoàn hảo để thuê ngoài (outsource).
Bảng 1-1: Tóm Tắt So Sánh 3 Loại Miền Con
| Loại miền con (Subdomain type) | Lợi thế cạnh tranh (Competitive advantage) | Độ phức tạp (Complexity) | Độ biến động (Volatility) | Chiến lược triển khai (Implementation) |
|---|---|---|---|---|
| Cốt lõi (Core) | Có (Yes) | Cao (High) | Cao (High) | Tự phát triển nội bộ (In-house) với kỹ thuật cao cấp nhất |
| Dùng chung (Generic) | Không (No) | Cao (High) | Thấp (Low) | Mua giải pháp có sẵn hoặc Dùng mã nguồn mở (Buy/Adopt) |
| Hỗ trợ (Supporting) | Không (No) | Thấp (Low) | Thấp (Low) | Tự viết nhanh nội bộ hoặc Thuê ngoài gia công (In-house / Outsource) |
Xác Định Ranh Giới Miền Con (Identifying Subdomain Boundaries)
Như bạn đã thấy, việc xác định các miền con và phân loại chính xác bản chất của chúng hỗ trợ đắc lực cho việc đưa ra những quyết định kiến trúc phần mềm đúng đắn. Nhưng làm thế nào để chúng ta thực sự nhận diện được các miền con và vạch ra ranh giới chính xác cho chúng?
Các miền con và chủng loại của chúng được định hình bởi chính chiến lược kinh doanh của công ty: miền nghiệp vụ mà công ty theo đuổi và cách thức công ty tạo ra sự khác biệt để cạnh tranh trên thương trường. Trong đại đa số các dự án phần mềm, bằng cách này hay cách khác, các miền con vốn dĩ đã "nằm sẵn ở đó". Tuy nhiên, điều đó không có nghĩa là việc nhận diện ranh giới của chúng lúc nào cũng dễ dàng và hiển nhiên. Nếu bạn hỏi một vị Tổng giám đốc (CEO) danh sách các miền con của công ty họ, rất có thể bạn sẽ chỉ nhận lại một ánh nhìn ngơ ngác. Họ không hề quen thuộc với thuật ngữ này. Vì vậy, chính bạn — người kỹ sư phần mềm — sẽ phải tự mình thực hiện công việc phân tích miền (domain analysis) để định danh và phân loại các miền con đang cùng vận hành.
Một điểm xuất phát thuận lợi là nhìn vào các phòng ban và các đơn vị tổ chức của công ty. Ví dụ, một sàn thương mại bán lẻ trực tuyến có thể bao gồm các bộ phận: kho vận (warehouse), dịch vụ khách hàng (customer service), bốc dỡ hàng (picking), giao vận (shipping), kiểm định chất lượng (quality control), và quản lý kênh bán hàng (channel management). Tuy nhiên, đây mới chỉ là những mảng hoạt động ở mức độ khá vĩ mô, thô sơ (coarse-grained).
Hãy lấy bộ phận Dịch vụ khách hàng (Customer Service) làm ví dụ. Thoạt nhìn, hoàn toàn hợp lý khi giả định rằng đây chỉ là một miền con hỗ trợ, hoặc thậm chí là miền con dùng chung, bởi chức năng này thường xuyên được các doanh nghiệp thuê ngoài cho các bên thứ ba đảm nhận. Nhưng liệu thông tin chung chung này đã đủ để chúng ta đưa ra những quyết định thiết kế phần mềm đúng đắn chưa? Câu trả lời là chưa.
Chắt Lọc Miền Con (Distilling Subdomains)
Các miền con ở mức độ tổng quan là điểm khởi đầu tốt, nhưng "con quỷ thường nằm ở chi tiết" (the devil is in the details). Chúng ta phải đảm bảo rằng mình không bỏ sót các thông tin chiến lược quan trọng ẩn sâu bên trong các quy trình nghiệp vụ phức tạp.
Quay trở lại ví dụ về bộ phận dịch vụ khách hàng: Nếu đào sâu nghiên cứu cơ chế vận hành bên trong, chúng ta sẽ thấy một bộ phận dịch vụ khách hàng điển hình thực chất được cấu thành từ nhiều thành phần nhỏ hơn, chi tiết hơn, chẳng hạn như: hệ thống tiếp nhận khiếu nại (help desk system), hệ thống quản lý ca trực và lịch làm việc (shift management and scheduling), hệ thống tổng đài thoại (telephone system), v.v.
Khi được soi xét như những miền con riêng biệt, các hoạt động này có thể thuộc về những loại miền con hoàn toàn khác nhau:
- Hệ thống help desk và tổng đài điện thoại: Là các miền con dùng chung (generic subdomains), vì thị trường đã có đầy đủ các giải pháp SaaS hoàn thiện như Zendesk, Freshdesk, Cisco Contact Center...
- Hệ thống phân ca trực nhân viên: Là một miền con hỗ trợ (supporting subdomain) với logic CRUD đơn giản để xếp lịch.
- Thuật toán điều phối sự cố thông minh: Giả sử công ty tự nghiên cứu và phát triển một thuật toán độc quyền để tự động phân luồng sự cố đến đúng nhân viên hỗ trợ từng xử lý thành công các trường hợp tương tự trong quá khứ. Thuật toán này đòi hỏi phải phân tích ngữ nghĩa các khiếu nại gửi đến và so khớp với dữ liệu lịch sử — cả hai đều là những tác vụ phi tầm thường (nontrivial). Vì thuật toán điều phối thông minh này giúp công ty đem lại trải nghiệm khách hàng vượt trội so với các đối thủ trên thị trường, nên thuật toán điều phối này chính là một miền con cốt lõi (core subdomain)!
Miền Con Dưới Dạng Các Trường Hợp Sử Dụng Gắn Kết (Subdomains as Coherent Use Cases)
Tuy nhiên, chúng ta không thể cứ phân rã mãi không ngừng nghỉ xuống những tầng chi tiết vô tận. Khi nào thì chúng ta nên dừng lại?
Dưới góc nhìn kỹ thuật, miền con tương tự như một tập hợp các trường hợp sử dụng (use cases) gắn kết và có mối liên hệ mật thiết với nhau. Một tập hợp use cases như vậy thường có sự tham gia của cùng một tác nhân (actor), thao tác trên cùng các thực thể kinh doanh (business entities), và cùng tác động lên một tập dữ liệu có quan hệ chặt chẽ.
Hãy quan sát sơ đồ use case của một cổng thanh toán thẻ tín dụng trong Hình 1-3. Các use case này gắn kết chặt chẽ với nhau thông qua dữ liệu mà chúng xử lý và các tác nhân tham gia. Do đó, tất cả các use case này cấu thành nên miền con thanh toán thẻ tín dụng (credit card payment subdomain).
Chúng ta có thể sử dụng định nghĩa "miền con là một tập hợp các trường hợp sử dụng gắn kết" làm kim chỉ nam để biết khi nào nên dừng việc bóc tách. Đây chính là ranh giới chuẩn xác và sắc nét nhất của các miền con.
Khi Nào Nên Dừng Việc Chắt Lọc?
Liệu chúng ta có luôn luôn phải cố gắng bóc tách ranh giới miền con đến mức độ siêu chi tiết như vậy không? Điều này là hoàn toàn bắt buộc đối với các miền con cốt lõi. Các miền con cốt lõi là mảng quan trọng nhất, biến động nhiều nhất và phức tạp nhất. Việc chắt lọc chúng tối đa là cực kỳ thiết yếu, bởi nó cho phép chúng ta bóc tách toàn bộ các tính năng dùng chung và tính năng hỗ trợ ra ngoài, để tập trung toàn lực kỹ thuật vào phần tính năng cốt lõi mang tính khác biệt hóa.
Ngược lại, quá trình chắt lọc có thể nới lỏng hơn đối với các miền con hỗ trợ và miền con dùng chung. Nếu việc đào sâu chi tiết hơn không mang lại thêm bất kỳ hiểu biết chiến lược mới nào giúp ích cho quyết định thiết kế phần mềm, đó chính là điểm dừng hợp lý. Điều này thường xảy ra khi tất cả các thành phần con bên trong đều có cùng một loại với miền con ban đầu.
Hãy xem xét ví dụ trong Hình 1-4. Việc cố gắng chắt lọc sâu hơn nữa hệ thống help desk (thành các thành phần như quản lý nhãn, mẫu câu trả lời, phân quyền ticket...) là không cần thiết, vì nó không mang lại thông tin chiến lược mới mẻ nào: giải pháp sau cùng vẫn sẽ là mua và sử dụng một công cụ thương mại có sẵn trên thị trường.
Tập Trung Vào Những Điều Thiết Yếu (Focus on the Essentials)
Một câu hỏi quan trọng khác cần cân nhắc khi xác định miền con là: Liệu chúng ta có cần phải quan tâm đến tất cả các miền con của doanh nghiệp hay không?
Miền con là một công cụ giúp tối ưu hóa quá trình đưa ra các quyết định thiết kế phần mềm. Mọi tổ chức gần như chắc chắn đều có một số chức năng kinh doanh mang lại lợi thế cạnh tranh sống còn nhưng lại hoàn toàn không liên quan gì đến phần mềm. Người thợ chế tác trang sức thủ công mà chúng ta thảo luận ở phần trước là một ví dụ điển hình.
Khi tìm kiếm các miền con, điều quan trọng là phải nhận diện được những chức năng kinh doanh không dính dáng đến phần mềm, ghi nhận chúng đúng bản chất, và tập trung nguồn lực vào những khía cạnh kinh doanh có liên quan trực tiếp đến hệ thống phần mềm mà bạn đang xây dựng.
Ví Dụ Phân Tích Miền Nghiệp Vụ Trong Thực Tế (Domain Analysis Examples)
Bây giờ, hãy cùng xem cách chúng ta áp dụng khái niệm miền con vào thực tiễn để đưa ra các quyết định thiết kế chiến lược. Tác giả đưa ra hai công ty giả định: Gigmaster và BusVNext. Khi đọc qua mô tả của hai công ty này, bạn hãy thử tự phân tích miền nghiệp vụ và nhận diện ba loại miền con tương ứng. Hãy nhớ rằng, cũng như ngoài đời thực, một số yêu cầu nghiệp vụ sẽ mang tính ngầm định (implicit) chứ không được nói toạc ra.
Dĩ nhiên, chúng ta không thể xác định hết mọi miền con của một doanh nghiệp chỉ qua vài dòng mô tả ngắn ngủi. Tuy nhiên, nó là bài tập huấn luyện tuyệt vời giúp bạn rèn luyện tư duy nhận diện và phân loại miền con một cách bài bản.
Ví Dụ 1: Công Ty Gigmaster
Mô tả: Gigmaster là một công ty chuyên phân phối và bán vé cho các buổi biểu diễn âm nhạc/sự kiện. Ứng dụng di động của họ tự động phân tích thư viện âm nhạc của người dùng, tài khoản dịch vụ phát nhạc trực tuyến (như Spotify, Apple Music) và hồ sơ mạng xã hội của họ để gợi ý những buổi diễn gần đó mà người dùng có thể muốn tham gia.
Người dùng của Gigmaster rất coi trọng quyền riêng tư cá nhân. Vì vậy, mọi thông tin cá nhân của người dùng đều được mã hóa nghiêm ngặt. Hơn thế nữa, để đảm bảo những sở thích âm nhạc thầm kín ("gu nghe nhạc tội lỗi" - guilty pleasures) của người dùng không bao giờ bị rò rỉ dưới bất kỳ tình huống nào, thuật toán gợi ý của công ty chỉ hoạt động hoàn toàn trên dữ liệu đã được ẩn danh hóa (anonymized data).
Để nâng cao độ chính xác của các đề xuất, công ty đã triển khai một module mới: cho phép người dùng tự ghi lại danh sách các buổi biểu diễn mà họ từng tham gia trong quá khứ, ngay cả khi vé của những buổi diễn đó không hề được mua qua nền tảng Gigmaster.
Phân tích Miền Nghiệp vụ & Các Miền Con:
- Miền nghiệp vụ (Business Domain): Bán vé sự kiện (Ticket sales). Đó chính là dịch vụ cốt lõi mà công ty cung cấp cho khách hàng.
-
Các miền con cốt lõi (Core Subdomains): Lợi thế cạnh tranh lớn nhất của Gigmaster là Cỗ máy gợi ý buổi diễn (Recommendation engine). Tiếp theo, công ty cam kết bảo vệ quyền riêng tư người dùng và thuật toán bắt buộc phải xử lý trên dữ liệu ẩn danh, nên Module ẩn danh hóa dữ liệu (Data anonymization) là miền cốt lõi thứ hai. Cuối cùng, dù không nói rõ bằng lời, trải nghiệm người dùng trên Ứng dụng di động (Mobile app UX) là yếu tố sống còn giữ chân người dùng. Do đó, các miền con cốt lõi là:
- Cỗ máy gợi ý (Recommendation engine)
- Ẩn danh hóa dữ liệu (Data anonymization)
- Trải nghiệm ứng dụng di động (Mobile app UX)
-
Các miền con dùng chung (Generic Subdomains):
- Mã hóa dữ liệu (Encryption) để bảo vệ toàn bộ thông tin nhạy cảm.
- Kế toán (Accounting), vì công ty hoạt động trong lĩnh vực bán lẻ vé.
- Thanh toán / Quyết toán (Clearing), để trừ tiền thẻ của khách hàng.
- Xác thực và phân quyền (Authentication & Authorization), để định danh người dùng.
-
Các miền con hỗ trợ (Supporting Subdomains): Đây là những nơi logic nghiệp vụ rất đơn giản, tương tự các tác vụ ETL hoặc giao diện CRUD:
- Tích hợp với các dịch vụ stream nhạc (Integration with music streaming services).
- Tích hợp với các mạng xã hội (Integration with social networks).
- Module ghi nhận các buổi diễn từng tham gia (Attended-gigs module) — đơn thuần là màn hình CRUD nhập liệu.
Các Quyết Định Thiết Kế Chiến Lược (Design Decisions):
- Cỗ máy gợi ý, module ẩn danh hóa dữ liệu và ứng dụng di động bắt buộc phải được tự phát triển nội bộ (in-house) bằng những công cụ, kỹ thuật kỹ nghệ phần mềm tiên tiến nhất. Đây là những module sẽ thay đổi thường xuyên nhất theo thời gian.
- Mã hóa dữ liệu, kế toán, cổng thanh toán và xác thực nên sử dụng hoàn toàn các giải pháp đóng gói sẵn (off-the-shelf) hoặc thư viện mã nguồn mở có uy tín trên thị trường.
- Việc tích hợp mạng xã hội, dịch vụ stream nhạc và module ghi nhận buổi diễn có thể giao cho các đối tác thuê ngoài (outsource) triển khai để tiết kiệm thời gian và nhân lực.
Ví Dụ 2: Công Ty BusVNext
Mô tả: BusVNext là một công ty vận tải hành khách công cộng. Mục tiêu của họ là mang lại cho hành khách những chuyến xe buýt thoải mái và tiện lợi như thể bắt taxi. Công ty trực tiếp quản lý các đội xe buýt tại các thành phố lớn.
Khách hàng của BusVNext đặt chuyến thông qua ứng dụng di động. Vào giờ khởi hành đã lên lịch, lộ trình của một chiếc xe buýt gần đó sẽ được tự động điều chỉnh linh hoạt ngay trong thời gian thực (on the fly) để đón hành khách đúng thời gian yêu cầu.
Thách thức kỹ thuật lớn nhất của công ty là lập trình thuật toán điều phối lộ trình (routing algorithm). Các yêu cầu của nó là một biến thể phức tạp của "Bài toán người du hành" (Travelling Salesman Problem). Logic định tuyến này liên tục được tinh chỉnh và tối ưu hóa. Ví dụ, số liệu thống kê cho thấy lý do hàng đầu khiến khách hủy chuyến là thời gian chờ xe buýt đến đón quá lâu. Vì vậy, công ty đã điều chỉnh thuật toán để ưu tiên việc đón khách nhanh nhất, chấp nhận việc trả khách tại điểm đến có thể bị kéo dài thêm chút ít. Để tối ưu hóa việc điều phối hơn nữa, BusVNext tích hợp dữ liệu với các nhà cung cấp bên thứ ba để cập nhật tình trạng giao thông và các cảnh báo tắc đường trong thời gian thực.
Thi thoảng, BusVNext phát hành các chương trình giảm giá đặc biệt, vừa để thu hút khách hàng mới, vừa để điều tiết nhu cầu đi lại giữa giờ cao điểm và giờ thấp điểm.
Phân tích Miền Nghiệp vụ & Các Miền Con:
- Miền nghiệp vụ (Business Domain): Vận tải hành khách công cộng (Public transportation). Cung cấp các chuyến đi xe buýt được tối ưu hóa cho khách hàng.
-
Các miền con cốt lõi (Core Subdomains):
- Thuật toán định tuyến (Routing algorithm): Lợi thế cạnh tranh số một, giải quyết bài toán người du hành với nhiều mục tiêu kinh doanh biến thiên linh hoạt.
- Phân tích dữ liệu chuyến đi (Data analysis): Liên tục phân tích hành vi của khách hàng để tạo ra các hiểu biết mới giúp tối ưu thuật toán định tuyến và tăng lợi nhuận.
- Trải nghiệm ứng dụng di động (Mobile app UX): Giao diện dành cho hành khách và tài xế phải cực kỳ thuận tiện, trực quan và dễ sử dụng.
- Quản lý đội xe (Fleet management): Quản lý một đội xe buýt quy mô lớn không hề đơn giản; việc phát hiện trục trặc kỹ thuật hay lên lịch bảo dưỡng xe ảnh hưởng trực tiếp đến an toàn, chất lượng dịch vụ và tài chính của công ty.
-
Các miền con dùng chung (Generic Subdomains):
- Dữ liệu tình trạng giao thông thời gian thực (Traffic conditions) — lấy từ nhà cung cấp bản đồ thứ ba.
- Kế toán tài chính (Accounting).
- Hệ thống thanh toán / Lập hóa đơn (Billing / Clearing).
- Xác thực và phân quyền (Authorization).
-
Các miền con hỗ trợ (Supporting Subdomains):
- Quản lý khuyến mại và mã giảm giá (Promos and discounts): Hỗ trợ kích cầu, nhưng bản thân nó chỉ là một giao diện CRUD quản lý danh sách mã coupon đơn giản.
Các Quyết Định Thiết Kế Chiến Lược (Design Decisions):
- Thuật toán định tuyến, phân tích dữ liệu, quản lý đội xe và giao diện ứng dụng phải được phát triển in-house bởi những kỹ sư xuất sắc nhất với các mẫu kiến trúc công phu nhất.
- Module quản trị khuyến mại giảm giá có thể thuê ngoài gia công (outsource).
- Dữ liệu giao thông, xác thực người dùng và giao dịch thanh toán tài chính được ủy thác hoàn toàn cho các nhà cung cấp dịch vụ bên ngoài (SaaS / API chuyên dụng).
Chuyên Gia Miền Là Ai? (Who Are the Domain Experts?)
Giờ đây, khi bạn đã có một sự thấu hiểu rõ ràng về miền nghiệp vụ và các loại miền con, chúng ta hãy cùng xem xét một thuật ngữ DDD then chốt khác mà bạn sẽ bắt gặp liên tục trong suốt cuốn sách này: Chuyên gia miền (Domain Experts).
Chuyên gia miền (hay chuyên gia nghiệp vụ) là những chuyên gia chuyên sâu về một lĩnh vực (subject matter experts), những người nắm rõ từng đường đi nước bước, từng ngóc ngách tinh vi của hoạt động kinh doanh mà chúng ta chuẩn bị mô hình hóa và hiện thực hóa thành mã nguồn. Nói cách khác, chuyên gia miền chính là những người nắm giữ thẩm quyền tri thức cao nhất trong miền nghiệp vụ của phần mềm.
Chuyên gia miền không phải là những chuyên viên phân tích nghiệp vụ (Business Analysts - BA) đi thu thập yêu cầu, và họ cũng càng không phải là các kỹ sư phần mềm thiết kế hệ thống.
Chuyên gia miền là những người đại diện cho mảng kinh doanh. Họ là những người đầu tiên nhận diện ra vấn đề nghiệp vụ cần giải quyết, và là cội nguồn của toàn bộ tri thức kinh doanh. Chuyên viên phân tích hệ thống và kỹ sư phần mềm thực chất chỉ là những người làm nhiệm vụ chuyển hóa mô hình tư duy (mental models) của chuyên gia miền thành các yêu cầu phần mềm và các dòng mã nguồn.
Theo kinh nghiệm thực tiễn (rule of thumb), chuyên gia miền thường là những người trực tiếp đề xuất yêu cầu nghiệp vụ hoặc chính là những người dùng cuối (end users) của phần mềm. Phần mềm sinh ra là để giải quyết bài toán và nỗi đau của chính họ.
Phạm vi chuyên môn của các chuyên gia miền có thể khác nhau:
- Một số chuyên gia có tầm nhìn bao quát toàn bộ cách thức vận hành của cả miền nghiệp vụ tổng thể.
- Một số chuyên gia khác lại am hiểu sâu sắc đến mức tường tận về một miền con cụ thể nào đó.
Ví dụ: Trong một công ty quảng cáo trực tuyến, các chuyên gia miền chính là các nhà quản lý chiến dịch (campaign managers), các nhà môi giới quảng cáo (media buyers), các chuyên gia phân tích dữ liệu thị trường (analysts), và các bên liên quan kinh doanh khác.
Kết Luận (Conclusion)
Trong chương này, chúng ta đã cùng nhau khám phá các công cụ của Thiết kế Hướng Miền (DDD) để bóc tách và thấu hiểu các hoạt động kinh doanh của một công ty. Như bạn đã thấy, mọi thứ đều bắt nguồn từ miền nghiệp vụ (business domain): lĩnh vực mà công ty đang vận hành và các dịch vụ mà nó mang lại cho khách hàng.
Bạn cũng đã nắm vững các khối thành phần nền tảng cấu thành nên thành công của doanh nghiệp và tạo sự khác biệt trước các đối thủ cạnh tranh:
- Miền con cốt lõi (Core Subdomains) — Những bài toán thú vị: Đây là những hoạt động mà công ty thực hiện hoàn toàn khác biệt so với đối thủ và là nơi bắt nguồn của lợi thế cạnh tranh. Chúng phức tạp, biến động thường xuyên, và bắt buộc phải được tự phát triển nội bộ bằng các kỹ thuật kỹ nghệ đỉnh cao nhất.
- Miền con dùng chung (Generic Subdomains) — Những bài toán đã có lời giải: Đây là những việc mà mọi công ty đều làm như nhau. Không có chỗ cho sự phát minh hay đổi mới ở đây; thay vì tự code trong nhà, việc mua giải pháp thương mại hoặc áp dụng mã nguồn mở là phương án kinh tế và an toàn nhất.
- Miền con hỗ trợ (Supporting Subdomains) — Những bài toán với giải pháp hiển nhiên: Đây là những hoạt động công ty thường phải tự triển khai, nhưng chúng không đem lại bất kỳ lợi thế cạnh tranh nào. Logic của chúng đơn giản (chủ yếu là CRUD/ETL), hiếm khi thay đổi, và có thể giao cho kỹ sư mới hoặc thuê ngoài gia công (outsource).
Cuối cùng, bạn đã hiểu rằng chuyên gia miền (domain experts) là những chuyên gia thẩm quyền về nghiệp vụ kinh doanh. Họ nắm giữ tri thức sâu sắc về miền nghiệp vụ hoặc các miền con cụ thể, và sự hợp tác chặt chẽ với họ chính là chìa khóa quyết định sự thành bại của bất kỳ dự án phần mềm nào.
Bài Tập Thực Hành & Trắc Nghiệm Tương Tác
Hãy kiểm tra mức độ thấu hiểu của bạn về các khái niệm trong Chương 1. Nhấp chọn đáp án để xem ngay phản hồi tức thì và phần giải thích chi tiết trích xuất từ Phụ lục B (Appendix B) của cuốn sách.
Giải thích từ tác giả: Chỉ duy nhất miền con cốt lõi (core subdomains) mới mang lại lợi thế cạnh tranh giúp công ty tạo ra sự khác biệt trước các đối thủ khác trong cùng ngành. Cả generic và supporting subdomains đều không mang lại lợi thế cạnh tranh.
Giải thích từ tác giả: Các miền con dùng chung có độ phức tạp cao nhưng không đem lại bất kỳ lợi thế cạnh tranh nào. Do đó, việc các công ty đối thủ cùng sử dụng chung một giải pháp đã được chứng minh hiệu quả ngoài thị trường (như cùng dùng OAuth2, AWS S3, Stripe...) là điều tối ưu và hoàn toàn bình thường.
Giải thích từ tác giả: Các miền con cốt lõi được dự báo là sẽ biến động nhiều nhất, bởi vì đây là những mảng mà công ty liên tục tìm cách đưa ra các giải pháp đột phá mới mẻ, và thông thường phải mất rất nhiều lần thử nghiệm và tối ưu hóa liên tục để tìm ra giải pháp xuất sắc nhất.
- Thuật toán quản lý vòng đời ticket (Ticket lifecycle management algorithm): Có mục đích tự động đóng các ticket không hoạt động để thúc đẩy người dùng mở ticket mới.
- Hệ thống phát hiện gian lận (Fraud detection system): Ngăn ngừa việc lạm dụng mô hình kinh doanh (phát hiện nhiều chủ đề khác nhau bị gộp chung vào một ticket).
- Tính năng hỗ trợ lái tự động (Support autopilot): Vừa giúp giảm tải công việc cho nhân viên hỗ trợ, vừa rút ngắn tuổi thọ ticket, khuyến khích mở ticket mới cho các câu hỏi phát sinh.
- Giao diện quản trị danh mục (Administration interface): Dùng để cấu hình các danh mục phân loại ticket và danh sách sản phẩm được hỗ trợ.
- Quản lý ca trực nhân viên (Shift schedule management): Cho phép nhập lịch làm việc của nhân viên hỗ trợ để điều phối ticket trong giờ hành chính.
- Xác thực và phân quyền (Authentication and authorization): Quản lý danh tính người dùng và hỗ trợ đăng nhập một lần (Single Sign-On - SSO).
- Hệ thống thanh toán / Tính cước (Billing / Invoicing): Tính tiền số lượng ticket mở trong kỳ theo các hạn mức chiết khấu tự động.