Hướng dẫn đọc và sử dụng sách
Một hệ thống hiếm khi trở nên khó bảo trì vì thiếu một annotation hay một design pattern. Vấn đề thường bắt đầu khi một thay đổi nghiệp vụ nhỏ buộc đội phát triển sửa nhiều nơi không liên quan, khi test phải khởi động cả ứng dụng để kiểm tra một quy tắc, hoặc khi một interface mới chỉ chuyển dependency sang một tên khác mà không thay đổi hướng phụ thuộc. Cuốn sách này dùng SOLID để phân tích và xử lý những tình huống ấy trong một codebase Spring Boot có cấu trúc, lịch sử thay đổi và các boundary thực tế.
Mục tiêu không phải biến năm chữ cái thành checklist. Người đọc sẽ học cách quan sát cost of change, nhận diện evidence trong code và change history, chọn mức abstraction tương xứng với rủi ro, rồi kiểm chứng quyết định bằng test và dependency rules. Mỗi nguyên lý được trình bày cùng giới hạn của nó: phần nào có thể áp dụng linh hoạt theo bối cảnh và phần correctness nào không thể thỏa hiệp khi một contract đã được công bố.
Đối tượng và kiến thức tiên quyết
Sách dành cho sinh viên và lập trình viên đã biết Java cùng OOP cơ bản nhưng chưa có nhiều kinh nghiệm thiết kế Spring Boot trong codebase dài hạn. Bạn cần đọc được class, interface, inheritance, exception, generic cơ bản và biết chạy một project Maven. Sách không yêu cầu kinh nghiệm Spring Boot trước đó; Chương 2 cung cấp phần nền về bean, IoC, Dependency Injection và layered structure cần cho các chương sau.
Một domain, một hệ thống tiến hóa
Các ví dụ cùng thuộc một nền tảng học trực tuyến: catalog khóa học, enrollment, học phí, thanh toán, nhắc hạn, tiến độ và chứng chỉ. Domain không được dùng như phông nền thay tên cho ví dụ sách giáo khoa. Mỗi chương tiếp tục xử lý một pressure đã xuất hiện ở chương trước, để người đọc quan sát cùng một hệ thống tiến hóa từ EnrollmentManager nhiều concern tới application module có port, adapter, contract test và architecture test.
Cách đọc sách
Chương 1–2 xây vocabulary và cơ chế Spring. Chương 3–7 đi lần lượt qua SRP, OCP, LSP, ISP và DIP. Chương 8 biến testability thành evidence của thiết kế. Chương 9 đưa năm nguyên lý lên cấp package, module và Bounded Context, rồi kết thúc bằng capstone. Người mới nên đọc tuần tự; người đã làm Spring có thể tra cứu một nguyên lý riêng, nhưng nên đọc Chương 1 trước để giữ chung tiêu chí cost of change.
Khi gặp một đoạn before, đừng chỉ tìm code smell theo tên. Hãy xác định thay đổi nào đang gây áp lực, client nào chịu ảnh hưởng, contract nào bị phá và test nào tạo confidence. Sau đó mới đọc bản refactor. Cách học này chuyển trọng tâm từ ghi nhớ cấu trúc sang năng lực ra quyết định.
Baseline kỹ thuật và code chạy được
Mã nguồn mẫu đi kèm sách dùng Java 21 LTS, Spring Boot 4.1.0 và Maven, bao gồm plain unit test, contract test, MVC/JPA test slice, context smoke test cùng architecture test. Một số đoạn before cố ý không compile hoặc cố ý ném UnsupportedOperationException để minh họa vi phạm; chúng luôn được đánh dấu rõ và không thuộc phần mã nguồn có thể chạy.
Ghi chú
Cách sách sử dụng nguồn
Nội dung được tổng hợp từ tác phẩm gốc về SOLID, Refactoring, Domain-Driven Design, Hexagonal Architecture, tài liệu chính thức của Spring/Java và kinh nghiệm thiết kế được ghi trong bộ tài liệu tham khảo của dự án. Sách không dịch tuần tự một nguồn và không dùng lại các ví dụ Shape, Rectangle–Square hoặc Animal quen thuộc. Lập luận được tái cấu trúc quanh domain LMS, Spring runtime và những quyết định có thể kiểm chứng trong code.
Các nguồn quan trọng được tổng hợp trong phần Tài liệu tham khảo ở cuối sách để bạn có thể đọc sâu hơn sau mỗi chủ đề.
Cam kết của cuốn sách
Sau khi hoàn thành sách và capstone, bạn không chỉ có thể phát biểu năm nguyên lý. Bạn sẽ có một quy trình thực hành: bắt đầu từ change/risk evidence, chọn boundary, làm rõ contract, hướng dependency về policy, viết đúng loại test và biết dừng trước khi abstraction trở thành chi phí không có căn cứ.