Tầm quan trọng của việc định nghĩa vấn đề trong Mô hình hóa Kinh doanh
Mô hình hóa kinh doanh (Business Modeling) trước hết là một phương pháp để định nghĩa vấn đề, sau đó mới là công cụ để giải quyết vấn đề đó. Chúng ta thường dễ dàng đánh giá cao việc giải quyết vấn đề nhưng lại bỏ qua sức mạnh của việc định nghĩa nó. Nếu vấn đề được xác định chính xác, việc hiện thực hóa giải pháp sẽ trở nên đơn giản hơn rất nhiều. Ngược lại, nếu không nắm rõ bản chất vấn đề cần giải quyết, chúng ta có thể sẽ phải sử dụng các kỹ thuật phức tạp để vá lỗi do sự thiếu sót trong khâu định nghĩa gây ra.
Để định nghĩa vấn đề hiệu quả, cần xuất phát từ thực tế nghiệp vụ. Trước tiên, hãy tìm cách tối giản hóa vấn đề trong bối cảnh kinh doanh, sau đó mới tìm giải pháp kỹ thuật tương ứng. Bước quan trọng là làm rõ các vấn đề cốt lõi của nghiệp vụ và sử dụng các mô hình dễ hiện thực hóa để biểu diễn chúng.
Thách thức trong Mô hình hóa Kinh doanh
Điểm cốt lõi và khó nhất trong phát triển phần mềm là xử lý độ phức tạp ẩn sâu trong kiến thức nghiệp vụ. Để làm được điều này, ngoài việc hiểu rõ yêu cầu nghiệp vụ, chúng ta còn cần thông qua mô hình hóa để tinh giản và cô đọng độ phức tạp đó. Có rất nhiều phương pháp như mô hình thực thể quan hệ (E-R), phân tích và thiết kế hướng đối tượng (OOAD), hay thiết kế hướng miền (DDD). Tuy nhiên, khó khăn thực sự không nằm ở kỹ thuật mô hình hóa, mà ở:
- Định nghĩa vấn đề rõ ràng và đạt được sự đồng thuận của tất cả các bên liên quan (stakeholders).
- Hiện thực hóa mô hình dưới các ràng buộc của kiến trúc hệ thống cụ thể.
Việc định nghĩa vấn đề đòi hỏi phải chắt lọc và tóm tắt nghiệp vụ, sau đó kiểm chứng lại bằng logic khung của phương pháp mô hình hóa đã chọn. Thách thức ở đây không phải là bản thân việc vẽ mô hình, mà là làm sao để có được sự tin tưởng từ phía nghiệp vụ và mở rộng các cuộc thảo luận hiệu quả. Về phần hiện thực hóa, các phương pháp mô hình hóa thường có tuổi thọ dài, trong khi kiến trúc kỹ thuật thì luôn thay đổi. Nếu bỏ qua ảnh hưởng của kiến trúc lên mô hình, việc áp dụng mô hình vào thực tế sẽ thất bại do không biết cách xử lý các ràng buộc kiến trúc.
Thiết kế Hướng miền (DDD) và Mô hình Miền
Đối với mô hình hóa kinh doanh, Thiết kế Hướng miền (Domain-Driven Design - DDD) là một chủ đề không thể bỏ qua. Mô hình là sự tinh giản của độ phức tạp trong nghiệp vụ. DDD là phương pháp thiết kế hướng mô hình, sử dụng Mô hình Miền (Domain Model) để nắm bắt kiến thức lĩnh vực và xây dựng phần mềm dễ bảo trì hơn.
Mô hình trong DDD có ba công dụng chính:
- Phản ánh cấu trúc của phần mềm.
- Là nền tảng để hình thành Ngôn ngữ Chung (Ubiquitous Language) của nhóm.
- Là nơi chứa đựng tri thức tinh túy để truyền tải.
Lợi ích mang lại là rất lớn: Hiểu được mô hình là hiểu được cấu trúc mã nguồn; khi thảo luận yêu cầu, lập trình viên dễ dàng hình dung mã nguồn cần sửa và ước lượng rủi ro cũng như tiến độ. Hơn nữa, mô hình trừu tượng và ngắn gọn hơn mã nguồn, giúp giảm chi phí truyền tải kiến thức.
Tại sao Mô hình Miền phù hợp với hệ thống nghiệp vụ?
Trước đây, công thức "Chương trình = Thuật toán + Cấu trúc dữ liệu" thống trị. Thói quen cũ là chuyển đổi bài toán thành các cấu trúc dữ liệu tổng quát, không liên quan gì đến miền cụ thể. Tuy nhiên, DDD thách thức thói quen này. Đối với phần mềm nghiệp vụ, việc xây dựng mô hình gắn liền chặt chẽ với nghiệp vụ là lựa chọn tốt hơn.
Trong các hệ thống nghiệp vụ, luôn có sự tham gia của các bên không có nền tảng kỹ thuật (như khách hàng, quản lý sản phẩm). Các cấu trúc dữ liệu thuần túy khó hiểu với họ, gây ra khoảng cách nhận thức và cản trở giao tiếp. Do đó, việc xây dựng một mô hình chuyên biệt (Mô hình Miền), trong đó các quy trình nghiệp vụ được chuyển hóa thành hành vi của đối tượng, sẽ giúp xóa nhòa khoảng cách giữa kỹ thuật và nghiệp vụ.
Quá trình Chắt lọc Kiến thức (Knowledge Crunching)
Không có công thức có sẵn cho việc nên dùng mô hình miền nào cho từng lĩnh vực cụ thể. Eric Evans đã đề xuất phương pháp "Chắt lọc kiến thức" để tinh luyện mô hình miền. Về tổng quát, phương pháp này tuân theo 5 bước:
- Gắn kết mô hình với hiện thực (code).
- Trích xuất Ngôn ngữ chung từ mô hình.
- Phát triển mô hình giàu kiến thức.
- Tinh lọc mô hình.
- Động não và thử nghiệm.
Quy trình này có thể tóm gọn là "Hai liên kết, một vòng lặp": liên kết mô hình với phần mềm, liên kết ngôn ngữ chung với mô hình, và vòng lặp tinh lọc kiến thức.
Từ Mô hình Thiếu Máu đến Mô hình Giàu Hành vi
Để liên kết mô hình với hiện thực, chúng ta cần sử dụng phong cách lập trình hướng đối tượng đích thực, còn gọi là "Mô hình giàu kiến thức" (Knowledge Rich Model). Trái ngược với nó là phong cách thủ tục, thường tạo ra "Mô hình thiếu máu" (Anemic Domain Model), nơi đối tượng chỉ đóng gói dữ liệu đơn giản còn các quan hệ và tính toán nghiệp vụ nằm rải rác bên ngoài.
Ví dụ về Mô hình thiếu máu:
class CustomerDataAccess {
public CustomerInfo retrieveClient(long id) {
var dbConnection = DatabaseConnector.connect();
var dataRow = dbConnection.executeQuery("SELECT * FROM clients WHERE id = " + id);
return new CustomerInfo(dataRow.getLong("id"), dataRow.getString("name"));
}
}
class MembershipService {
public List<Membership> fetchByClientId(long clientId) {
// Logic truy vấn nằm tách biệt
return Database.queryMemberships(clientId);
}
}
Kiểu này vẫn mang nặng phong cách thủ tục. Ngược lại, "Mô hình máu đầy" (Rich Model) đóng gói hành vi và logic vào trong đối tượng miền:
class Client {
private List<Membership> activeMemberships;
public List<Membership> getMemberships() {
return Collections.unmodifiableList(this.activeMemberships);
}
}
class ClientRepository {
public Client findIdentity(long id) {
// Logic khôi phục trạng thái hoàn chỉnh của Client
}
}
Trong ví dụ trên, Client đóng vai trò là Aggregation Root (Gốc kết hợp), và Membership được kết hợp bên trong nó.
Quan hệ kết hợp (Aggregation) và Tư duy Mô hình
Trong mô hình, quan hệ kết hợp thể hiện các đối tượng liên kết chặt chẽ thành một tổng thể về mặt khái niệm. Ví dụ, Client và Membership: tách rời nhau, chúng chỉ là thông tin rời rạc. Nhưng khi ghép lại, chúng tạo thành nghĩa vụ: "Các gói thành viên mà Client đã đăng ký". Mô hình máu đầy ánh xạ hoàn hảo khái niệm nghiệp vụ với cấu trúc và hành vi mã nguồn, giúp việc đọc code trở nên dễ dàng hơn bao giờ hết.
Mục đích cuối cùng là: Sửa đổi mô hình đồng nghĩa với sửa đổi code. Nếu sự thay đổi trong mô hình không phản ánh ngay lập tức lên code (như trong mô hình thiếu máu), vòng lặp tinh lọc kiến thức sẽ bị đứt gãy, dẫn đến sự tách biệt giữa mô hình phân tích và mô hình thiết kế.
Vai trò của Ngôn ngữ Chung (Ubiquitous Language)
Tại sao cần Ngôn ngữ chung thay vì để nghiệp vụ dùng trực tiếp mô hình?
Ngôn ngữ chung là phương tiện giao tiếp dựa trên mô hình miền, giúp các bên kỹ thuật và nghiệp vụ cùng mô tả quy tắc và thay đổi. Mô hình thiên về dữ liệu và tính toán, có thể quá trừu tượng đối với nghiệp vụ. Ngôn ngữ chung đóng vai trò là lớp đệm, đủ trực quan để giao tiếp nhưng vẫn gắn liền với mô hình. Nó cung cấp sự linh hoạt cho các ngữ cảnh chưa được định nghĩa rõ ràng và là "bãi thử" để phát hiện những thiếu sót của mô hình.
Thay đổi code cũng đồng nghĩa với thay đổi Ngôn ngữ chung. Điều này trao cho phía kỹ thuật quyền định hình nghiệp vụ, nhưng cũng đi kèm nghĩa vụ phải chịu sự giám sát và phản hồi từ phía nghiệp vụ trong vòng lặp tinh lọc. Ngôn ngữ chung đưa mọi người đến một "vùng trung gian", cân bằng quyền lực và trách nhiệm giữa hai phía.
Thực thi DDD như một Quy trình Phát triển
Vòng lặp tinh lọc kiến thức có thể được xem là quy trình phát triển phần mềm có đầu ra là mô hình. Quy trình này diễn ra như sau:
- Thảo luận yêu cầu bằng Ngôn ngữ chung.
- Phát hiện các khái niệm còn thiếu hoặc không phù hợp trong mô hình, sau đó tinh lọc mô hình.
- Sự thay đổi mô hình dẫn đến thay đổi Ngôn ngữ chung. Sử dụng ngôn ngữ mới để kiểm chứng độ chính xác của mô hình.
Điều này tương tự như quá trình TDD (Test-Driven Development) hay Refactoring. Nếu coi DDD là một quy trình, thì mô hình chính là sản phẩm cuối cùng. Sự cộng tác giữa nghiệp vụ và kỹ thuật thông qua DDD tạo ra hiệu ứng cộng hưởng:
- Phía kỹ thuật: Có quyền định hình nghiệp vụ qua mô hình, nhưng phải chấp nhận sự ảnh hưởng từ nghiệp vụ vào hiện thực.
- Phía nghiệp vụ: Có quyền ảnh hưởng đến phần mềm, nhưng phải chấp nhận các khái niệm kỹ thuật định hình nghiệp vụ.
DDD thực chất là sự pha trộn giữa một phương pháp mô hình hóa, một cách thức làm việc cộng tác và một hệ thống giá trị. Nó đòi hỏi sự tin tưởng và khả năng quản lý sự thay đổi từ phía đội ngũ phát triển. DDD phù hợp nhất với các nhóm Agile, nơi sự cộng tác đa chức năng và cải tiến tiến dần được đề cao.