Trên bảng trắng, sơ đồ trông rất gọn: một API layer, một domain layer, một integration layer và ô nhỏ mang tên policy. Trong vài phút, ai cũng tưởng mình đang hiểu cùng một thứ. Rồi ca sử dụng thật đầu tiên xuất hiện, và cả đội mới lộ ra rằng mỗi người muốn đặt phần validation ở một nơi khác.
Đây là chỗ kiến trúc rất dễ tạo ra cảm giác yên tâm giả. Một ranh giới có tên không có nghĩa là nó đã rõ. Repository, service, usecase, adapter, policy hay gateway đều mang theo cách hiểu riêng của từng đội. Hai kỹ sư có thể nói cùng một từ nhưng hình dung hai phạm vi trách nhiệm khác hẳn nhau.
Ví dụ khiến ta khó giả vờ rằng ranh giới đã rõ. Thay vì nói policy layer quyết định điều kiện áp dụng, hãy viết một đầu vào cụ thể và kết quả mong đợi. Thay vì nói adapter che giấu provider, hãy đưa ra một lỗi từ provider rồi chỉ rõ domain phải nhìn thấy lỗi ấy dưới dạng nào. Thay vì nói usecase điều phối, hãy lần theo một request từ handler đến repository rồi quay về.
Một ví dụ tốt buộc quyền sở hữu phải lộ diện. Nếu số điện thoại cần được chuẩn hóa, đội ngũ phải chọn rõ việc đó thuộc handler, usecase, domain hay repository. Đáp án có thể đơn giản; giá trị nằm ở chỗ quyết định không còn là kinh nghiệm truyền miệng. Người đến sau có thể lần theo hành vi thay vì đoán từ tên thư mục.
Ví dụ còn bóc ra những ranh giới tham quá rộng. Sơ đồ có thể rất đẹp trong khi mọi ca quan trọng cứ phải băng qua đường kẻ. Nếu domain luôn phải biết chi tiết của provider, có lẽ contract của adapter đang quá mỏng. Nếu usecase nào cũng lặp lại cùng một logic điều kiện, có lẽ policy cần một chỗ đứng rõ ràng hơn.
Điều đó không làm sơ đồ mất giá trị. Sơ đồ giúp người đọc nhìn hình dáng hệ thống thật nhanh. Nhưng sơ đồ thiếu ví dụ giống một tấm bản đồ không ghi khoảng cách: biết các điểm nằm đâu mà không biết đoạn đường giữa chúng ra sao. Một vài luồng cụ thể làm tấm bản đồ trung thực hơn.
Khi đội ngũ lớn lên, những ví dụ ấy còn là một cách đối xử tử tế với người mới. Họ không cần thừa hưởng toàn bộ cuộc tranh luận đã sinh ra kiến trúc. Họ cần thấy đủ hành vi để hiểu ranh giới tồn tại vì điều gì và hành động nào sẽ phá nó. Một ví dụ nhỏ hôm nay có thể tránh cả chuỗi comment review về sau.
Trước khi đặt thêm một cái tên lên sơ đồ, hãy thử viết ba ví dụ nên đi qua ranh giới và ba ví dụ không nên đi qua. Nếu vẫn không đặt được chúng về đúng phía, vấn đề chưa nằm ở tên gọi; bản thân ranh giới vẫn chưa đủ rõ để đội ngũ cùng bảo vệ.