5 điểm bởi GN⁺ 2025-03-29 | 2 bình luận | Chia sẻ qua WhatsApp
  • Cuốn sách trong đó tác giả Harry của "TDD with Python" và kiến trúc sư phần mềm Bob giải thích cách hiểu và quản lý các kiến trúc phần mềm phức tạp
  • Chia sẻ tổng hợp các kỹ thuật kiến trúc đã được sử dụng thực tế tại một công ty thương mại điện tử
  • MADE.com là một công ty bán đồ nội thất trực tuyến có trụ sở tại châu Âu, vận hành chuỗi cung ứng toàn cầu
    • Mục tiêu là giảm thiểu tồn kho thông qua tối ưu hóa logistics và điều phối để hàng hóa logistics đến cùng lúc với đơn đặt hàng của người tiêu dùng
  • Nhưng thế giới thực rất phức tạp và khó dự đoán, vì vậy họ đang tự động hóa bằng cách xây dựng phần mềm thông minh phản ánh điều đó
  • Cuốn sách này đề cập đến các mẫu kiến trúc được thiết kế để giải quyết những vấn đề thực chiến như vậy

Vì sao là Python

  • Python là một ngôn ngữ đang tăng trưởng nhanh trên toàn cầu và ngày càng thách thức những bài toán enterprise phức tạp
  • Phần lớn các sách kiến trúc hiện có dùng ví dụ dựa trên Java hoặc C#, nên người dùng Python khó tiếp cận hơn
  • Cuốn sách này giới thiệu các mẫu kiến trúc kinh điển theo cách phù hợp với cộng đồng Python

Giới thiệu TDD, DDD và kiến trúc hướng sự kiện

  • TDD (Test-Driven Development):
    • Phát triển hướng kiểm thử giúp có thể refactor ổn định và bổ sung tính năng
    • Nên ưu tiên unit test nhanh và không phụ thuộc, đồng thời giảm thiểu các bài kiểm thử end-to-end chậm và kém ổn định
  • DDD (Domain-Driven Design):
    • Tập trung vào mô hình domain nghiệp vụ, nhưng điều quan trọng là giảm phụ thuộc vào hạ tầng và framework
  • Kiến trúc hướng sự kiện:
    • Quản lý độ phức tạp bằng giao tiếp dựa trên message giữa các microservice
    • Cần cân nhắc cách tích hợp với các công cụ Python sẵn có như Flask, Django, Celery

Tham khảo: phần lớn các mẫu được đề cập trong cuốn sách này cũng có thể áp dụng cho kiến trúc monolithic

  • Mục tiêu của cuốn sách là giới thiệu các mẫu kiến trúc hỗ trợ TDD, DDD và dịch vụ hướng sự kiện trong Python, đồng thời đưa ra cách áp dụng chúng

Độc giả mục tiêu của cuốn sách

  • Các lập trình viên đã có kinh nghiệm xử lý ứng dụng Python phức tạp
  • Không cần có kiến thức nền về mẫu kiến trúc hay DDD
  • Nội dung được tổ chức để người chưa quen phong cách TDD, tức viết test trước rồi mới triển khai, vẫn có thể theo được
  • Có sử dụng Flask, SQLAlchemy, pytest, Docker, Redis, nhưng không phải là kiến thức bắt buộc
  • Mục tiêu là thiết kế kiến trúc độc lập với công nghệ, chứ không gắn với một công nghệ cụ thể

Tổng quan nội dung học

Part 1

  • Mô hình hóa domain và DDD (chương 1, 2, 7)
    • Giới thiệu cách xây dựng mô hình domain mà không có phụ thuộc bên ngoài
    • Xem xét cách viết unit test nhanh và mối liên hệ của chúng với tính toàn vẹn dữ liệu
    • Giải thích cách chọn Aggregate phù hợp
  • Các mẫu Repository, Service Layer, Unit of Work (chương 2, 4, 5)
    • Trừu tượng hóa tầng persistence để tách mô hình khỏi các phụ thuộc bên ngoài
    • Thiết kế service layer như điểm vào của hệ thống
    • Phù hợp để xây dựng các điểm vào mỏng như Flask API hoặc CLI
  • Suy ngẫm về kiểm thử và trừu tượng hóa (chương 3, 5)
    • Tìm hiểu tiêu chí và vai trò của việc chọn tầng trừu tượng phù hợp
    • Viết unit test ở mức trừu tượng cao để đạt được test pyramid

Part 2

  • Kiến trúc hướng sự kiện (chương 8–11)
    • Giới thiệu các mẫu Domain Events, Message Bus, Handler
    • Kích hoạt các tương tác trong hệ thống thông qua sự kiện
    • Giải thích cách tích hợp giữa các microservice bằng sự kiện
    • Phân biệt sự khác nhau giữa command và event
    • Toàn bộ ứng dụng được chuyển thành một hệ thống xử lý message
  • CQRS (Command-Query Responsibility Segregation) (chương 12)
    • Giới thiệu hiệu quả về mặt cấu trúc thông qua việc tách biệt trách nhiệm command và query
    • Bao gồm ví dụ triển khai có và không dùng sự kiện
  • Dependency Injection (chương 13)
    • Sắp xếp lại các phụ thuộc tường minh/ngầm định
    • Tự triển khai một framework dependency injection đơn giản

Phụ lục và hướng dẫn thực hành

  • Cách áp dụng vào dự án hiện có (epilogue)
    • Việc áp dụng các mẫu vào hệ thống hiện có khó hơn nhiều so với ví dụ đơn giản
    • Cung cấp chiến lược áp dụng và tài liệu tham khảo cho việc này
  • Thực hành code và ví dụ trên GitHub
    • Toàn bộ nội dung của sách được tổ chức thành một dự án ví dụ duy nhất
    • Mỗi chương đều cung cấp code qua các branch GitHub
    • Cách thực hành:
      • Tự mình triển khai theo ứng dụng ví dụ
      • Thử áp dụng các mẫu vào chính dự án của mình
      • Sử dụng "Exercise for the Reader" của từng chương để viết code luyện tập

Mẹo: Nên checkout branch tương ứng trên GitHub ở phần đầu mỗi chương để học cùng với đoạn code thực sự đang chạy

2 bình luận

 
xguru 2025-03-29

Đã có bản tiếng Hàn: Mẫu kiến trúc qua Python

 
GN⁺ 2025-03-29
Ý kiến trên Hacker News
  • Cuốn sách này giống như một mỏ vàng về các mẫu kiến trúc. Tôi thích cách nó giúp chủ đề trở nên dễ hiểu

    • Tuy nhiên, trong thực tế những mẫu này có thể gây ra vấn đề về độ phức tạp và hiệu năng. Đặc biệt khi dùng các framework vốn đã rất áp đặt quan điểm như Django
    • Tôi đã dùng Python ở cả công ty lớn lẫn công ty nhỏ. Những công ty lớn dùng các mẫu kiến trúc nghiêm ngặt có mã "sạch" nhưng quá phức tạp và chậm
    • Ngược lại, những công ty lớn bỏ qua các mẫu thì mã thực sự rất bừa bộn nhưng năng suất cao. Dù mã lộn xộn, tôi vẫn có thể đọc, hiểu và sửa nó
    • Có thể đây chỉ là câu chuyện của riêng tôi, nhưng tôi làm việc hiệu quả hơn ở những công ty có mã không quá khuôn mẫu. Tôi có thể tránh được các cuộc tranh cãi về mã sạch
  • Một số phần của cuốn sách này rất hữu ích. Đặc biệt là khi nói về các khái niệm không bị giới hạn ở Python hay một ngôn ngữ cụ thể

    • Nhưng ở những phần khác thì có vấn đề. Nó có thể nguy hiểm khi các lập trình viên ít kinh nghiệm cố gắng triển khai mọi thứ cùng một lúc
    • Ví dụ, mẫu repository nhìn chung là hữu ích, nhưng trong nhiều trường hợp, kể cả ví dụ trong sách, nó chỉ làm tăng thêm độ phức tạp
    • Service layer và unit of work hữu ích cho các ứng dụng phức tạp, nhưng trong các hệ thống gồm những dịch vụ nhỏ, chúng có thể trở nên cồng kềnh quá mức
    • Cũng như các công cụ khác, điều quan trọng là phải hiểu khi nào nên dùng và khi nào không nên dùng các mẫu thiết kế. Cuốn sách có đưa ra lời khuyên về điều này, nhưng đáng lẽ cần nhấn mạnh hơn
  • Tôi xem Python là một ngôn ngữ glue rất tốt

    • Nó là liều thuốc giải cho lối tư duy OOP bị áp đặt. Là liều thuốc giải cho việc ép buộc đóng gói và kế thừa vào mọi thứ
    • Là liều thuốc giải cho SOLID, clean coding, clean architecture, các mẫu GoF và Uncle Bob
    • Tôi theo luồng mệnh lệnh hoặc hàm và dùng càng ít OOP càng tốt
    • Khi dùng Python, tôi muốn có trải nghiệm không bị ám bởi object và pattern
    • Điều đó không có nghĩa là cuốn sách này không có giá trị. Nó hữu ích để học các pattern. Nhưng không nên ép mọi thứ vào lập trình thực tế
  • Tôi là lập trình viên TypeScript, nhưng đây là một trong những cuốn sách về kiến trúc tôi yêu thích nhất. Tôi luôn tham khảo nó

    • Tôi gần như dùng một cách tuyệt đối mẫu fake unit of work/service để kiểm thử. Nó giúp giả lập các dịch vụ bên thứ ba
    • Tôi khuyên nên đặt tên các event theo cách đặc thù cho domain. Điều này giải quyết phần vốn rất phiền khi phải giải thích cho đồng đội
    • Cosmic Python được công khai hoàn toàn trên mạng nên rất dễ dẫn link. Nhìn chung đây là một tài nguyên tuyệt vời và có tính định hình cao
  • Tôi bắt đầu viết Python chuyên nghiệp từ vài năm trước. Tôi đến từ Kotlin và TypeScript, và dù ngôn ngữ này dễ tiếp cận, tôi đã gặp khó khăn trong việc đạt được tính kết dính lỏng và khả năng kiểm thử

    • Theo gợi ý của một đồng nghiệp, tôi mua cuốn sách này và đọc từ đầu đến cuối. Nó giúp tôi hiểu cách quản lý độ phức tạp trong các codebase Python phức tạp
    • Tôi không làm theo mọi pattern, nhưng giờ tôi đã biết những khả năng có thể có và cách áp dụng kinh nghiệm từ các paradigm khác vào Python
    • Rất đáng khuyến nghị. Xứng đáng với giá trị của nó
  • Đây thực sự là một trong những cuốn sách lập trình Python xuất sắc. Tôi hơi tiếc vì mã không có static typing, nhưng đó là quyết định có chủ ý của tác giả

  • Cảm ơn vì đã chia sẻ tài liệu tuyệt vời này

  • Tôi đã đọc bản paperback của cuốn sách này cách đây khoảng 2 năm rưỡi hoặc 3 năm. Rất thú vị. Nó giữ testing là một chủ đề hạng nhất và liên tục cập nhật theo từng phần bổ sung

    • Việc có sẵn các bài test, dễ viết và dễ cập nhật khiến quá trình phát triển thú vị hơn nhiều. Ít cần phải chạy mã thủ công để xác minh vấn đề hơn
    • Phần hướng sự kiện khá thú vị, nhưng không thực tế để triển khai trong công việc hiện tại của tôi
  • Không thấy nhắc đến Polylith. Tôi tự hỏi liệu nó có liên quan không

  • Cuốn sách này là một bài đọc tuyệt vời. Ba năm trước tôi làm trong môi trường DDD của C#/.NET, và giờ khi xem lại những khái niệm này trong Python, tôi thấy chúng được chưng cất về phần cốt lõi

    • Nếu bạn quan tâm đến các chủ đề như thế này thì tôi rất khuyến nghị nó