← C4 Model: vẽ kiến trúc phần mềm

Bài 2 · Cơ bản · 18 phút

Mô hình vs sơ đồ: 4 khái niệm

Biên soạn bởi Nguyễn Anh Tuấn

Bốn khái niệm nền của C4: Person, Software System, Container, Component (và Code); phân biệt MÔ HÌNH (model) với SƠ ĐỒ (diagram) - một mô hình, nhiều view.

bài trước, ta thấy C4 là "bản đồ nhiều mức zoom". Trước khi vẽ bản đồ, cần phân biệt hai thứ rất hay bị lẫn: mô hình (model)sơ đồ (diagram).

  • Mô hình (model): tập hợp các phần tử (người, hệ thống, container...) và quan hệ giữa chúng - nguồn sự thật duy nhất.
  • Sơ đồ (diagram): một bức tranh vẽ ra một phần của mô hình, ở một mức zoom, cho một khán giả.
  • Một mô hình → nhiều sơ đồ: giống một toà nhà thật chụp được nhiều tấm ảnh từ nhiều góc.

Hiểu lầm "sơ đồ chính là mô hình" là gốc của cảnh mỗi người vẽ một kiểu. Khi đã có một mô hình rõ ràng trong đầu, các sơ đồ chỉ là cách trình bày nó - và chúng sẽ tự nhất quán với nhau.

Ví dụ, đây là một SƠ ĐỒ - một bức vẽ ra từ mô hình, ở mức xa nhất (Context):

System Context - Lớp Học Trực Tuyến

[Người dùng]

Học viên

Mèo con học bài, làm quiz, xem tiến độ.

[Người dùng]

Giảng viên

Soạn bài giảng, chấm bài.

[Hệ thống phần mềm]

Lớp Học Trực Tuyến

Cho học viên học và giảng viên dạy.

[Hệ thống ngoài]

Cổng thanh toán

Thu học phí.

[Hệ thống ngoài]

Dịch vụ Email

Gửi email thông báo.

Học & làm bài [HTTPS]Soạn bài & chấm [HTTPS]Thu học phí [API]Gửi email [SMTP]

Để dựng mô hình, C4 chỉ cần năm loại phần tử. Chúng xếp lồng nhau từ ngoài vào trong, như những con búp bê Nga:

PersonCon người dùng hệ thống (một vai trò/persona). Vd: học viên, tài xế.
Software SystemCả một hệ thống mang lại giá trị. Có thể là hệ thống của bạn, hoặc hệ thống ngoài.
ContainerMột đơn vị chạy/triển khai được bên trong hệ thống: web app, API, cơ sở dữ liệu...
ComponentMột nhóm chức năng bên trong một container, sau một interface. Không chạy riêng được.
Code elementLớp/class, hàm cụ thể bên trong một component. Mức trong cùng.

Quan hệ "lồng nhau" rất quan trọng: một Person dùng một Software System; hệ thống gồm các Container; mỗi container gồm các Component; mỗi component gồm Code element.

Hai khái niệm ngoài cùng là thứ ai cũng hình dung được, kể cả người không rành kỹ thuật:

  • Person là một VAI TRÒ, không phải một người cụ thể: "Học viên", "Giảng viên" - không phải "bạn Miu".
  • Software System của bạn là cái bạn đang xây; nó là tâm điểm của sơ đồ Context.
  • Software System ngoài (external) là dịch vụ bạn nối tới nhưng không sở hữu: cổng thanh toán, dịch vụ email, bản đồ.
  • Ở mức này KHÔNG nói về công nghệ - chưa cần biết viết bằng gì, lưu ở đâu.

Trung thực

Ranh giới "trong/ngoài" là một quyết định bạn tự đặt ra, không có sẵn. Cùng một cổng thanh toán có thể là "hệ thống ngoài" với đội này, nhưng là "hệ thống của bạn" với đội khác. C4 chỉ yêu cầu bạn nói rõ ranh giới đó, không quy định nó nằm đâu.

Ba khái niệm bên trong là phần kỹ thuật, dành cho người sẽ xây và vận hành hệ thống:

  • Container = đơn vị CHẠY/TRIỂN KHAI được: một app, một API, một cơ sở dữ liệu, một file system. Đây là chỗ công nghệ bắt đầu xuất hiện.
  • Component = một nhóm chức năng bên trong một container (vd Order Controller, Dispatch Service). Nó không tự chạy riêng.
  • Code element = lớp/class, hàm - mức trong cùng, thường được bỏ qua hoặc để IDE tự sinh khi cần.

Bẫy quen thuộc: container ≠ Docker

"Container" trong C4 có trước Docker rất lâu và nghĩa khác hẳn. Một cơ sở dữ liệu PostgreSQL là một container trong C4 dù bạn không đóng gói nó bằng Docker. Bài Level 2: Container sẽ mổ kỹ chỗ này.

Cách nhanh nhất để "ngấm" năm khái niệm là tự phân loại. Đọc từng "thứ" và chọn xem nó là Person, Software System, Container, Component hay Code element - đoán sai cũng tốt, đó là cách học nhanh:

🧩 Đây là khái niệm C4 nào?

1/9

Một học viên đang dùng app để học bài

  • Mẹo: cứ hỏi "thứ này có CHẠY/TRIỂN KHAI riêng được không?" - có thì là container.
  • Người (vai trò) luôn là Person; cả một sản phẩm là Software System.
  • Một class trong code là Code element - đừng nhầm với Component (nhóm nhiều class).

Giờ ráp lại: khi đã có mô hình (các phần tử + quan hệ), mỗi mức zoom chỉ là một sơ đồ vẽ ra từ cùng mô hình ấy. Widget dưới đây minh hoạ - cùng một hệ thống, ba sơ đồ ở ba mức:

🗺️ Bản đồ kiến trúc:

Nền tảng học online: học viên xem bài, làm quiz, theo dõi tiến độ.

Mức 1 Mức 2 Mức 3

Mức 1 - System Context

System Context - Lớp Học Trực Tuyến

Học viên
Mèo con học bài, làm quiz, xem tiến độ.
Giảng viên
Soạn bài giảng, chấm bài.
Cổng thanh toán ngoài
Thu học phí.
Dịch vụ Email ngoài
Gửi email thông báo.

Quan hệ (có nhãn & hướng)

  • Học viên Lớp Học Trực Tuyến : Học & làm bài [HTTPS]
  • Giảng viên Lớp Học Trực Tuyến : Soạn bài & chấm [HTTPS]
  • Lớp Học Trực Tuyến Cổng thanh toán : Thu học phí [API]
  • Lớp Học Trực Tuyến Dịch vụ Email : Gửi email [SMTP]

Để ý: bạn không dựng ba mô hình khác nhau, mà dựng một mô hình rồi nhìn nó ở ba độ zoom. Đây chính là cách giúp các sơ đồ luôn khớp nhau.

Bước tiếp theo

Đã nắm phần tử và phân biệt được mô hình với sơ đồ, ta sẵn sàng vẽ sơ đồ ĐẦU TIÊN và quan trọng nhất - bức cho mọi người, kể cả người ngoài kỹ thuật: Level 1: System Context.

Câu hỏi thường gặp

Mô hình là TẬP phần tử (người, hệ thống, container...) và quan hệ giữa chúng - một nguồn sự thật duy nhất. Sơ đồ là một BỨC TRANH vẽ ra một phần của mô hình ở một mức zoom. Một mô hình có thể sinh ra nhiều sơ đồ khác nhau, giống một toà nhà thật chụp được nhiều tấm ảnh từ nhiều góc.

C4 = bốn loại SƠ ĐỒ: Context, Containers, Components, Code. Còn số khái niệm PHẦN TỬ để dựng mô hình thì có năm: Person, Software System, Container, Component, Code element (Person không có sơ đồ riêng, nó xuất hiện quanh rìa các sơ đồ). Đừng để con số làm rối: cứ nhớ "phần tử để dựng" và "sơ đồ để nhìn" là hai chuyện.

Không. Trong C4, container nghĩa là một đơn vị chạy/triển khai được: một web app, một API, một cơ sở dữ liệu, một file system... Khái niệm này có trước Docker. Bài Level 2 sẽ làm rõ; tạm thời nhớ hai chữ "container" này khác nghĩa nhau.

Đón đọc: Level 2 - Container →

Theo C4, không nên lồng component trong component. Giữ mỗi sơ đồ "phẳng" giúp người đọc nắm nhanh. Nếu một container quá phức tạp, đó thường là dấu hiệu nên tách nó thành nhiều container, chứ không phải lồng thêm tầng component.

Không bắt buộc - mô hình có thể nằm trên giấy hay trong đầu cả đội. Nhưng khi viết mô hình bằng code (như Structurizr), một mô hình duy nhất tự sinh ra nhiều sơ đồ đồng bộ, đỡ công vẽ lại. Đó là nội dung bài "Diagrams as code".

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Khác biệt cốt lõi giữa "mô hình" (model) và "sơ đồ" (diagram) trong C4 là gì?

  1. 1

    Mô hình hay sơ đồ?

    Cho các thứ sau, phân loại đâu là "mô hình", đâu là "sơ đồ": (a) một file ảnh PNG trong slide, (b) một danh sách phần tử + quan hệ viết trong file text, (c) một bức vẽ trên bảng trắng.

    Hoàn thành khi: Phân loại đủ 3 thứ; giải thích ngắn vì sao (b) gần với "mô hình" còn (a), (c) là "sơ đồ".

  2. 2

    Phân loại 5 khái niệm

    Làm hết các thứ trong widget "Đây là khái niệm C4 nào?" ở Bước 5; ghi lại thứ nào mèo con đoán sai.

    Hoàn thành khi: Trả lời hết; giải thích được vì sao đáp án đúng cho 2 thứ mèo con từng nhầm.

  3. 3

    Liệt kê phần tử của một hệ thống

    Chọn một app mèo con đang dùng. Liệt kê: những Person nào dùng nó, những Software System ngoài nào nó nối tới, và đoán những Container nào nó có.

    Hoàn thành khi: Có ≥2 Person, ≥1 hệ thống ngoài, ≥3 container; mỗi mục một dòng ngắn.

  4. 4

    "Container" của mèo con

    Viết hai câu: một câu giải thích vì sao một cơ sở dữ liệu cũng là Container trong C4, và một câu nói nó khác Docker container ở đâu.

    Hoàn thành khi: Hai câu rõ ý; nêu được "đơn vị chạy/triển khai được" và phân biệt với Docker.

  5. 5

    Một mô hình → mấy sơ đồ

    Với hệ thống ở bài tập 3, kể ra mèo con sẽ vẽ những sơ đồ (mức zoom) nào, và mỗi sơ đồ dành cho ai.

    Hoàn thành khi: Liệt kê ≥2 sơ đồ; mỗi sơ đồ ghi rõ mức và khán giả.

  6. 6

    Vẽ "cây" khái niệm

    Vẽ một sơ đồ cây thể hiện thứ tự lồng nhau: Person dùng Software System → Container → Component → Code element, với một ví dụ tự chọn.

    Hoàn thành khi: Cây có đủ 5 tầng; mỗi tầng có ít nhất một ví dụ cụ thể của mèo con.