Review tác phẩm Clean Architecture

Tai Vong
7 min readSep 11, 2021

~ Đăng lại bài viết của mình ở ba năm trước ở blog công ty lúc mình vừa bước chân vào ngành phần mềm.

Cuối tuần trước mình vừa hoàn thành cuốn sách Clean Architecture. Trước tiên hết, chân thành cảm ơn sự tài trợ của team SGB R&D đã mang đến cho mọi người những cuốn sách thật bổ ích. Sau 1 tuần, mình quay lại review cuốn sách này theo những gì còn sót lại được 😀

Lúc mới cầm trên tay, mình không biết cuốn sách này muốn nói gì. Ừ thì, Clean Architecture, chắc là hướng dẫn cho mình cách code sạch code đẹp. Trong thời điểm ấy, sau một vài dự án vật vã, mình cũng đương băn khoăn về cái đẹp, cái chân thiện mỹ của ngành lập trình. Thế là cầm về thôi.

Về tổng thể thì, tác phẩm có thể nói là một trước tác hướng con người ta về những điều tốt đẹp. Sách không rặt những giáo điều suông, mà tác giả đưa ra các trải nghiệm từng gặp trong cuộc sống, từ đó đúc kết lại những gì nên và không nên để khuyên răn giới trẻ. Phương pháp kể chuyện của bậc lão thành dạy trẻ nhỏ và kiến thức của tác giả phải nói là đáng nể, ông có kinh nghiệm từ thời điểm Assembly còn thống trị mọi thứ đến lúc các Web Framework lên ngôi. Tác giả không chỉ cho chúng ta những điều nên làm, mà trình bày cho chúng ta thấy những điều không nên vướng phải.

Tranh minh họa với phong cách cổ điển, trào phúng là một điển cộng lớn

Ngay từ đầu tác giả đã khẳng định, architecture sinh ra không phải để cho software chạy nhanh, mà là để cho chúng ta, những lập trình viên — những người nghệ sĩ có thể tham gia làm nên tác phẩm một cách hiệu quả nhất. Những chương đầu tiên, cuốn sách đưa chúng ta theo luồng lịch sử để khám phá 3 phát minh vĩ đại nhất của lịch sử loài lập trình viên: những programming paradigms — structural programming, object-oriented programming và functional programming.

  1. Structural programming
  2. Object-oriented programming
  3. Functional programming

Thông qua ba phát minh trên, tác giả chứng minh rằng: những nỗ lực của lập trình viên không phải là tối ưu tốc độ của hệ thống mà biến mã nguồn thành một khối thống nhất, được thiết kế rõ ràng, có mục đích để dễ phát triển là ưu tiên hơn cả.

S.O.L.I.D — Thứ mà mọi lập trình viên đều nên biết

Sau khi làm rõ luận điểm trên, tác giả cho rằng object-oriented programming mang tính ảnh hưởng hơn cả trong thời gian hiện tại. Thông qua việc phân tích các tính chất của OOP, tác giả khẳng định tính đa hình (Polymorphism) chính là tính chất mang lại sự cải tiến to lớn nhất cho lịch sử. Theo đó, tác giả giới thiệu những nguyên lý S.O.L.I.D, thứ có thể tận dụng để phát huy tối đa tính chất trên. Không chỉ vậy, nguyên lý trên đã được nhiều developer chứng minh là hiệu quả qua xương máu đổ vào hàng ngàn dự án phần mềm.

  1. Single responsibility principle
  2. Open/closed principle
  3. Liskov substitution principle
  4. Interface segregation principle
  5. Dependency inversion principle

Đây chỉ là những nguyên tắc trong việc thiết kế source code sao cho hiệu quả. Chúng chỉ dừng lại ở việc giữ cho các class của chúng ta không va chạm lẫn nhau, giúp cho chúng được vận hành và bảo trì một cách tốt nhất. Ở những chương tiếp theo chúng ta sẽ được theo dõi phương pháp thiết kế chuyên sâu hơn ở phương diện component: các module/package tương tác như thế nào, từ lúc còn nằm trong từng địa chỉ ô nhớ cụ thể, đến kỹ thuật dynamic link — cho ra đời những deployable component và phân tách thành các service.

Phân tích phần mềm ở phương diện component cho ta những cái nhìn mới mẻ về mặt kiến trúc, nơi không chỉ những class ngự trị mà chúng ta phải có một cái nhìn tổng quan hơn về mặt quản lý và vận hành source code cũng như một team. Một số phương pháp đánh giá định lượng được đưa ra cùng các luận điểm khoa học được trình bày rõ ràng. Các nguyên lý cơ bản nhất được phân tích bao gồm:

Với tính Cohesion

  1. The Reuse/Release Equivalence Principle
  2. The Common Closure Principle
  3. The Common Reuse Principle

Tính Coupling

  1. The Acyclic Dependencies Principle
  2. The Stable Dependencies Principle
  3. The Stable Abstractions Principle

Sau khi đã tổng hợp được quan điểm từ những components, tác giả nói đến Architecture với nhiều tính chất và phương pháp decoupling các component trong hệ thống. Chủ đề xuyên suốt cuốn sách lúc này rất rõ ràng, đó chính là phương pháp định hình mục tiêu và phương pháp luận về mặt thiết kế một hệ thống hoàn chỉnh. Một định nghĩa hoàn chỉnh và thú vị đã được đưa ra để các lập trình viên phân định được rõ ràng phương hướng nghiên cứu của mình: Các Boundary. Nếu không kẻ được boundary giữa các thành phần trong thiết kế của mình, mọi công việc thi hành đều có khả năng gặp nhiều trở ngại lớn, trong cả việc vận hành lẫn phát triển, đó đồng thời cũng là nguyên lý lớn nhất ẩn sau Single responsibility principle và Common Closure Principle được trình bày ở hai phương diện trên.

Boundary không chỉ phải tồn tại rõ ràng trong code, mà cả trong business logic của ứng dụng, chúng thể hiện rõ ràng qua các policy, level và business rules của ứng dụng. Để dễ dàng trên việc quan sát business logic, tác giả đề xuất các khái niệm như: Entity, Use Cases và Request/Response Models hiện thực hóa phương thức tương tác của business logic và các technical solution.

Sau khi trình bày các nguyên lý cơ bản để tổ chức ứng dụng sạch đẹp, ta bắt đầu đi tìm về khởi nguồn của cái đẹp. Một Architecture đẹp là như thế nào? Nó phải có khả năng gào thét. Một Architecture đẹp phải gào thét lên những Business Logic đẹp đẽ của nó. Mọi thứ bên trong đều phải định hình cho các lập trình viên biết về thứ mà họ đang xây dựng. Đó không phải là framework, database hay các technical tools. Kiến trúc đẹp bao gồm thuần về Business Logic và phải có khả năng kiểm thử các logic bên trong đó.

Thông qua các yếu tố trên, tác giả đề xuất về mô hình Clean Architecture, một mô hình đẹp đẽ và đầy sự hoàn mĩ với tất cả layer trong ngành phần mềm hiện tại được về xuất, nhưng tinh thần chủ yếu là tách ứng dụng ra làm nhiều layer (4) và phương pháp tương tác giữa các layer. Tinh thần thể hiện rất rõ ràng: Hãy bỏ ngoài sự hào nhoáng của các technical tools, mà quan tâm hơn đến hạt nhân — Business Core của ứng dụng.

The Clean Architecture

Kiến trúc trên không quá giáo điều và dễ dàng thực hiện. Nếu so sánh với một Architecture hoàn chỉnh gồm cực nhiều layer thì Clean Architecture thu gom những tinh hoa nhất và phân lớp chúng ra. Việc áp dụng các kiến trúc một cách máy móc được đưa ra phân tích suốt phần còn lại của cuốn sách: không có cái nhìn hoàn thiện về ứng dụng trước khi đặt tay xuống thiết kế, over-architect, … Công việc của một kỹ sư phần mềm là phải biết lúc nào là đủ, phải dự đoán được độ lớn của phần mềm và đưa ra kiến trúc phù hợp nhất.

Phương diện phân tích rất rộng, bao gồm cả kiến trúc monolithic, micro-services, tests, và embedded system cho ta thấy tác giả là một người giàu kinh nghiệm, và có tinh thần adapt cái mới rất mạnh. Dù làm việc trong thời kỳ hưng thịnh của assembler đến thời kỳ hiện đại của các web framework, nhưng ông đều có kinh nghiệm thiết kế và cài đặt các hệ thống lớn, thật khiến cho chúng ta có nhiều suy ngẫm.

Phần cuối của cuốn sách một lần nữa nhấn mạnh về các chi tiết chúng ta nên và không nên quá tập trung: Database, UI, Framework, … và phương pháp chia package cho phù hợp. Khép lại cuốn sách, chúng ta học được nhiều điều mới và thu được nhiều chiêm nghiệm trong cả code và cuộc đời. Clean Architecture xứng đáng là một trong những cuốn sách kim chỉ nam của một software engineer trong thời kỳ hiện tại.

--

--