Sổ tay Kiến trúc Phần mềm
03 Phần I · Nền tảng Chương 4 → 6

Đặc tính kiến trúc

Architecture Characteristics — the "-ilities"

Yêu cầu nghiệp vụ nói hệ thống làm gì; đặc tính kiến trúc nói nó phải chạy tốt ra sao — khả dụng, mở rộng, bảo trì… Mẹo của KTS giỏi không phải gom nhiều đặc tính, mà chọn đúng ít đặc tính rồi đo được chúng.

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"

Đặc tính kiến trúc Ngoài phạm vi nghiệp vụ nondomain Ảnh hưởng cấu trúc structural Quan trọng/sống còn critical to success
Ba cạnh nâng đỡ lẫn nhau — nên KTS hay nói "đánh đổi" (trade-off): đẩy mạnh một đặc tính thường kéo các đặc tính khác đi.

Ngoài nghiệp vụ

nondomain consideration

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

structural impact

Đò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

critical to success

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

operational

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 · Robustness

Cấu trúc

structural

Chất lượng bên trong mã & cách tổ chức code.

Modularity · Extensibility · Maintainability · Configurability · Portability · Reuse · Supportability

Cắt ngang

cross-cutting

Khó xếp loại nhưng tạo ràng buộc thiết kế quan trọng.

Accessibility · Authentication · Authorization · Privacy · Usability · Archivability

Mộ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 architecture

Mỗ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 & acquisitionsInteroperability, Scalability, Adaptability, Extensibility
Thời gian ra thị trường time to marketAgility = Testability + Deployability (không chỉ "nhanh")
Hài lòng người dùng user satisfactionPerformance, Availability, Fault tolerance, Testability, Security
Lợi thế cạnh tranh competitive advantageAgility, Testability, Deployability, Scalability, Availability
Thời gian & ngân sách time and budgetSimplicity, 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

operational measures

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

structural measures

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

process measures

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).

Cyclomatic Complexity · CC = E − N + 2
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
CC càng cao càng khó test & bảo trì. Một hàm C huyền thoại tác giả từng gặp có CC > 800 (4.000 dòng, đầy 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:

Python · fitness function đo p95 truy hồi
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
Đo p95, không phải trung bình — để bắt câu hỏi "xương xẩu" làm chậm đuôi phân phối.

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:

PHP · health-check + ngắt mạch (circuit breaker)
// 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á.

NguồnChương 4 (Defining Architecture Characteristics), Chương 5 (Identifying Architecture Characteristics) & Chương 6 (Measuring & Governing), Fundamentals of Software Architecture — Mark Richards & Neal Ford, O'Reilly 2020.