01 Đặc tính kiến trúc là gì?
Sách dùng thuật ngữ architecture characteristics (thay cho "yêu cầu phi chức năng" / "thuộc tính chất lượng" nghe như đánh giá sau khi làm). Giới kiến trúc quen gọi chúng là "-ilities" vì hầu hết tên tiếng Anh kết thúc bằng hậu tố đó: scalability, availability, maintainability…
Ba tiêu chí — đủ cả ba mới là "đặc tính kiến trúc"
Ngoài nghiệp vụ
Không tả "ứng dụng làm gì" mà tả tiêu chí vận hành & thiết kế để thành công. Vd: không yêu cầu nào ghi "chống nợ kỹ thuật", nhưng đó là cân nhắc thường trực.
Ảnh hưởng cấu trúc
Đòi cấu trúc đặc biệt mới đạt được. Vd bảo mật: chỉ "mã hoá/băm" thì là vệ sinh thường; nhưng tự xử lý thanh toán → cần module/service riêng để cô lập → mới là đặc tính kiến trúc.
Quan trọng
Hệ thống có thể đỡ vô số đặc tính — nhưng mỗi đặc tính thêm vào là thêm độ phức tạp. Chỉ chọn cái thật sự quan trọng.
Tường minh vs Ngầm định
Tường minh (explicit)
- Ghi thẳng trong tài liệu yêu cầu / chỉ dẫn cụ thể.
- Vd: "phải đỡ 1 triệu người dùng đồng thời".
Ngầm định (implicit)
- Hiếm khi viết ra, nhưng thiếu là chết — dựa vào kiến thức domain của KTS.
- Vd: tính khả dụng, tin cậy, bảo mật nền tảng của gần như mọi hệ thống.
02 Ba nhóm đặc tính
Không có chuẩn phổ quát — mỗi tổ chức tự diễn giải. Nhưng sách gom thành ba nhóm lớn để dễ nhớ:
Vận hành
Khả năng lúc hệ thống chạy thật — giao thoa mạnh với Ops/DevOps.
Availability · Performance · Scalability · Elasticity · Reliability · Recoverability · RobustnessCấu trúc
Chất lượng bên trong mã & cách tổ chức code.
Modularity · Extensibility · Maintainability · Configurability · Portability · Reuse · SupportabilityCắt ngang
Khó xếp loại nhưng tạo ràng buộc thiết kế quan trọng.
Accessibility · Authentication · Authorization · Privacy · Usability · ArchivabilityMột đặc tính có thể nằm ở nhiều nhóm hoặc đẻ ra "đặc tính riêng" của domain — danh sách luôn không đầy đủ. Sách còn đùa có cả Italy-ility (đặc tính chỉ đúng cho một dự án ở Ý).
03 Nguyên tắc "kiến trúc ít tệ nhất"
Đừng bao giờ nhắm tới kiến trúc tốt nhất — hãy nhắm tới kiến trúc ít tệ nhất.
Richards & Ford · Least worst architectureMỗi đặc tính được "đỡ" là một lần thêm độ phức tạp. Nhồi quá nhiều "-ility" → giải pháp chung chung, cồng kềnh, cố giải mọi bài toán nên chẳng giải nổi bài nào. Việc quan trọng của KTS là chọn số đặc tính ÍT nhất, không phải NHIỀU nhất.
Bài học con tàu Vasa (1628). Vua Thụy Điển muốn một chiến hạm "nhất mọi mặt": hai tầng pháo, pháo to gấp đôi, vừa chở quân vừa chiến đấu. Quá nặng phần trên (over-specified) → vừa rời cảng bắn loạt chào liền lật & chìm. Over-specify đặc tính tai hại ngang under-specify.
RAG Cho MVP "Hỏi–đáp tài liệu nội bộ", đừng vội nhồi elasticity co giãn cực hạn, đa vùng, đa ngôn ngữ. Cái thật sự sống còn lúc đầu thường chỉ là độ chính xác truy hồi + khả dụng + độ trễ chấp nhận được. Thiết kế dễ lặp (iterative) để bổ sung sau, thay vì đoán đúng hết ngay lần đầu.
04 Dịch lo ngại nghiệp vụ → đặc tính
Stakeholder nói bằng ngôn ngữ nghiệp vụ; KTS phải dịch sang ngôn ngữ kỹ thuật. Bảng dịch kinh điển của sách:
| Lo ngại nghiệp vụ (domain concern) | Đặc tính kiến trúc tương ứng |
|---|---|
| Mua bán & sáp nhập mergers & acquisitions | Interoperability, Scalability, Adaptability, Extensibility |
| Thời gian ra thị trường time to market | Agility = Testability + Deployability (không chỉ "nhanh") |
| Hài lòng người dùng user satisfaction | Performance, Availability, Fault tolerance, Testability, Security |
| Lợi thế cạnh tranh competitive advantage | Agility, Testability, Deployability, Scalability, Availability |
| Thời gian & ngân sách time and budget | Simplicity, Feasibility |
Cái bẫy "một thành phần". "Agility" không bằng "time to market" — nó là agility + testability + deployability. Chỉ chăm một nguyên liệu thì như quên bỏ bột vào bánh. Nghe "phải tính giá quỹ cuối ngày đúng giờ" mà chỉ lo performance là hỏng: còn cần availability, scalability, reliability, recoverability, auditability.
RAG Dịch một câu nói nghiệp vụ về RAG sang đặc tính:
| "Sếp" nói… | KTS nghe ra… |
|---|---|
| "Trả lời phải đúng, có dẫn nguồn" | Accuracy / Auditability (truy vết chunk nguồn) |
| "Tài liệu nội bộ, đừng rò rỉ" | Security, Privacy, Authorization |
| "Cả công ty dùng, lúc cao điểm vẫn mượt" | Scalability (embedding), Performance (độ trễ truy hồi), Availability |
| "Tháng sau đổi sang model LLM khác" | Extensibility, Adaptability (tách lớp vendor) |
05 Đo lường & quản trị (Chương 6)
Đặc tính chỉ hữu ích khi đo được khách quan — nếu không, "khả dụng cao" mỗi người hiểu một kiểu. Ba dạng thước đo:
Vận hành
Thống kê. Đừng chỉ đo trung bình — phải đo percentile (p95/p99) & max để bắt outlier (1% request chậm gấp 10).
Cấu trúc
Vd Cyclomatic Complexity đo độ phức tạp hàm. Ngưỡng ngành < 10; sách thích < 5 (code kết dính tốt).
Quy trình
Giao với quy trình phát triển: testability (đo bằng code coverage), deployability (tỉ lệ deploy thành công, thời gian deploy).
public void decision(int c1, int c2) {
if (c1 < 100) return 0;
else if (c1 + c2 > 500) return 1;
else return -1;
}
// E (cạnh/quyết định)=3, N (nút)=2 → CC = 3 − 2 + 2 = 3
GOTO).Quản trị bằng Fitness Function
Architecture fitness function = bất kỳ cơ chế nào đánh giá khách quan tính toàn vẹn của một/nhiều đặc tính: metric, unit test, monitor, chaos engineering. Gắn vào CI để KTS luôn biết trạng thái phần quan trọng — biến cái "quan trọng nhưng không khẩn" thành tự động.
RAG Fitness function giữ độ trễ truy hồi không trượt — chạy mỗi lần CI:
def test_retrieval_p95_under_budget():
lat = [measure(retriever.search(q)) for q in SAMPLE_QUERIES]
p95 = percentile(lat, 95)
assert p95 < 200, f"p95={p95}ms vượt ngân sách 200ms" # performance
RAG Ở ranh giới service, PHP quản trị availability của pipeline Python (đặc tính vận hành) — không để một sự cố làm sập cả web:
// Giám sát khả dụng của Python RAG service ở ranh giới HTTP
if (!$breaker->isAvailable('rag-py')) {
return response()->json(['answer' => null, 'degraded' => true], 503);
}
$res = $http->timeout(2)->get('/health'); // SLA: phản hồi < 2s
06 Ghi nhớ nhanh
Đủ ba tiêu chí mới tính là đặc tính kiến trúc — ngoài nghiệp vụ + ảnh hưởng cấu trúc + quan trọng cho thành công.
Chọn ít, không chọn nhiều — "least worst architecture". Nhớ con tàu Vasa: over-specify cũng chìm.
Dịch lo ngại nghiệp vụ sang "-ility" — và coi chừng bẫy "một thành phần" (agility ≠ chỉ nhanh).
Đo được mới quản trị được — định nghĩa khách quan; đo percentile chứ đừng chỉ trung bình.
Fitness function = quản trị tự động — đưa đặc tính quan trọng vào CI để không âm thầm thoái hoá.