Trước đây, việc các nhà phát triển phần mềm bắt đầu viết mã nguồn cho một ứng dụng phần mềm mà không hoặc rất ít sử dụng bất kỳ kiến trúc phần mềm (software architecture) là điều rất phổ biến. Khi không có kiến trúc rõ ràng ngay từ đầu, các lập trình viên có xu hướng sử dụng kiến trúc phân lớp truyền thống (layered N-tier architecture), chia hệ thống thành nhiều layer khác nhau, nằm trong các package riêng biệt. Kết quả thường thấy của cách làm này là một tập hợp các module mã nguồn thiếu tổ chức, thiếu vai trò, thiếu trách nhiệm và thiếu mối quan hệ rõ ràng với nhau.
Khi ứng dụng trở nên phức tạp và yêu cầu nhiều tính năng thì các vấn đề cơ bản như hiệu năng, bảo mật, khả năng mở rộng, ... trở nên cấp thiết, đòi hỏi ứng dụng phải được tổ chức theo một hệ thống logic nhất định, từ đó các kiến trúc phần mềm ra đời và các mẫu kiến trúc phần mềm (software architecture pattern) trở nên quan trọng đối với bất kỳ một ứng dụng nào.
1. Kiến trúc phần mềm là gì?
Theo Wikipedia, kiến trúc phần mềm (Software architecture) đề cập đến cấu trúc cơ bản của một hệ thống phần mềm và quy tắc của việc tạo ra những cấu trúc và hệ thống như vậy. Mỗi cấu trúc bao gồm sự sắp xếp của các yếu tố phần mềm, mối quan hệ giữa các yếu tố, và tính chất của các yếu tố đó.
Software architecture is the set of structures needed to reason about a software system and the discipline of creating such structures and systems. Each structure comprises software elements, relations among them, and properties of both elements and relations.
Thiết kế kiến trúc phần mềm (software architecture design) ẩn dụ cho việc thiết kế một toà nhà. Nó được coi như bản thiết kế của hệ thống phần mềm. Từ đó có thể hình dung ra lượng công việc cụ thể phải làm, dẫn tới, việc quản lý dự án trở nên dễ dàng hơn.
Cho tới giờ vẫn chưa có một định nghĩa phản ánh đầy đủ nhất về kiến trúc phần mềm bởi hai lý do:
- Sự phát triển nhanh chóng của công nghệ, môi trường phát triển, các loại mô hình kiến trúc phần mềm khác nhau khiến cho các định nghĩa trước đó nhanh chóng trở nên lỗi thời.
- Sự khác biệt về quan điểm giữa các trường phái. Ví dụ: một số software architect coi kiến trúc phần mềm là bản thiết kế chi tiết của hệ thống, trong khi những người khác định nghĩa nó là lộ trình phát triển hệ thống.
2. Mẫu kiến trúc phần mềm là gì?
Theo Wikipedia, mẫu kiến trúc phần mềm (Software architecture pattern), gọi tắt là mẫu kiến trúc (architecture pattern hoặc architectural pattern) là một giải pháp chung, có thể tái sử dụng để giải quyết một vấn đề thường gặp trong một hoàn cảnh cụ thể trong kiến trúc phần mềm. Nó giống như một khuôn mẫu có thể được áp dụng để tạo ra kiến trúc của một hệ thống phần mềm.
An architectural pattern is a general, reusable resolution to a commonly occurring problem in software architecture within a given context.
3. Tại sao kiến trúc phần mềm lại quan trọng?
Kiến trúc phần mềm đóng vai trò quan trọng trong phát triển phần mềm vì nhiều lý do:
- Cung cấp khung làm việc rõ ràng: Kiến trúc phần mềm giúp định hình cấu trúc cơ bản của ứng dụng, bao gồm cách các thành phần kỹ thuật tương tác với nhau. Nó như bản đồ cho các nhà phát triển, giúp họ hiểu cách xây dựng các thành phần của phần mềm để đạt được mục tiêu cụ thể.
- Đảm bảo hiệu suất và khả năng mở rộng: Một kiến trúc tốt cho phép hệ thống xử lý tải lớn và mở rộng dễ dàng khi cần thiết. Nó xác định cách các yêu cầu về hiệu suất và khả năng mở rộng được đáp ứng.
- Tối ưu hóa ngân sách và tài nguyên: Kiến trúc hợp lý giúp tránh lãng phí nguồn lực và thời gian phát triển, do có kế hoạch và cấu trúc rõ ràng từ đầu. Điều này cũng giúp kiểm soát chi phí phát triển.
- Dễ dàng bảo trì và cập nhật: Kiến trúc rõ ràng và được tổ chức tốt giúp việc bảo trì và cập nhật phần mềm trở nên dễ dàng hơn. Nó cho phép sửa đổi hoặc thêm tính năng mới mà không làm ảnh hưởng đến toàn bộ hệ thống.
- Giảm thiểu rủi ro: Một kiến trúc được thiết kế tốt giúp nhận diện và giảm thiểu rủi ro từ sớm trong quá trình phát triển, bao gồm vấn đề về hiệu suất, bảo mật và sự phụ thuộc giữa các thành phần.
- Tăng cường bảo mật: Kiến trúc xác định cách bảo mật được tích hợp vào hệ thống, từ việc xác định các điểm truy cập quan trọng đến việc thiết lập các lớp bảo mật.
- Hỗ trợ quyết định kỹ thuật: Nó cung cấp một khung tham chiếu để đưa ra các quyết định kỹ thuật, từ việc chọn công nghệ đến việc quyết định cách triển khai các tính năng.
- Tăng khả năng hợp tác: Kiến trúc rõ ràng giúp các nhà phát triển và các bên liên quan khác làm việc cùng nhau một cách hiệu quả hơn, do mọi người đều hiểu cấu trúc tổng thể và mục tiêu của dự án.
Nhìn chung, kiến trúc phần mềm không chỉ ảnh hưởng đến chất lượng cuối cùng của sản phẩm phần mềm mà còn có tác động lớn đến hiệu quả của quá trình phát triển, khả năng bảo trì và mở rộng của phần mềm.
4. Đặc tính của kiến trúc phần mềm
Kiến trúc phần mềm bao gồm nhiều đặc tính. Để đánh giá và lựa chọn mẫu kiến trúc nào cho ứng dụng, các nhà phát triển thường dựa trên một số đặc tính quan trọng sau:
- Tính linh hoạt (Overall Agility): Có khả năng linh hoạt thích ứng với các yêu cầu và thay đổi trong quá trình phát triển và triển khai hệ thống.
- Khả năng triển khai (Deployment): Phải có khả năng triên khai dễ dàng và linh hoạt trên nhiều nền tảng khác nhau.
- Khả năng kiểm thử (Testability): Architecture Pattern phải cung cấp được khả năng kiểm thử linh hoạt với nhiều loại kiểm thử khác nhau một cách dễ dàng.
- Hiệu suất (Performance):Mô hình kiến trúc phải cân nhắc giữa tính hiệu quả và yêu cầu hiệu suất của hệ thống, đảm bảo rằng nó đáp ứng được các tiêu chí về hiệu suất.
- Mở rộng (Scalabillity): Có khả năng mở rộng để đáp ứng nhu cầu tăng cường và đảm bảo tính linh hoạt trong quá trình mở rộng
- Phát triển ứng dụng (Development): Sự phức tạp của từng mô hình kiến trúc có thể ảnh hưởng tới khả năng phát triển của ứng dụng.
5. Architecture pattern khác gì Design pattern?
Architecture pattern (mẫu kiến trúc) và Design pattern (mẫu thiết kế) đều được coi là giải pháp tái sử dụng cho các vấn đề thường gặp trong thiết kế phần mềm, nhưng chúng đề cập đến các cấp độ và phạm vi khác nhau của quá trình phát triển phần mềm.
Ta có bảng so sánh architecture pattern và design pattern như sau:
Architecture pattern | Design pattern | |
---|---|---|
Phạm vi | Mẫu kiến trúc tập trung vào cấu trúc tổng thể của hệ thống phần mềm. Chúng đề cập đến cách tổ chức và phân chia hệ thống thành các thành phần lớn, cũng như cách thức tương tác giữa các thành phần này. | Mẫu thiết kế thường tập trung vào giải quyết các vấn đề cụ thể trong mã lập trình. |
Mục đích | Cung cấp giải pháp tổng thể cho việc phát triển phần mềm, giúp định hình cách hệ thống sẽ làm việc, phản ứng với các yêu cầu, và phát triển theo thời gian. | Cung cấp các cách tiếp cận tiêu chuẩn để giải quyết các vấn đề chung trong lập trình, như cách quản lý các object, tương tác giữa các class, hoặc cấu trúc của mã nguồn. |
Ví dụ | Microservices, Monolithic, Layered (n-tier), Event-driven, ... | Singleton, Factory, Observer, Strategy, Decorator ... |
Sự khác biệt chính giữa hai loại mẫu này là ở mức độ và phạm vi của chúng. Mẫu thiết kế tập trung vào giải quyết các vấn đề ở cấp độ mã nguồn và cấu trúc nội bộ của các class hoặc component, trong khi mẫu kiến trúc tập trung vào cấu trúc tổng thể và sự sắp xếp của toàn bộ hệ thống. Cả hai loại mẫu đều quan trọng và thường được sử dụng kết hợp trong quá trình phát triển phần mềm để đảm bảo hiệu quả, dễ bảo trì và có thể mở rộng.
6. Kết luận
Kiến trúc phần mềm ra đời giúp giải quyết những vấn đề cốt lõi trong việc phát triển và triển khai ứng dụng, đặc biệt là các vấn đề về hiệu suất, mở rộng hay triển khai. Tuy nhiên không có mẫu kiến trúc phần mềm nào là hoàn toàn tối ưu mà tuỳ vào từng yêu cầu cụ thể của ứng dụng mà các nhà phát triển có thể cân nhắc lựa chọn cho phù hợp.
Mẫu thiết kế chủ yếu giải quyết vấn đề ở cấp độ mã nguồn và cấu trúc nội bộ của class hoặc component, trong khi mẫu kiến trúc tập trung vào cấu trúc và tổ chức tổng thể của hệ thống. Cả hai đều quan trọng và thường được sử dụng cùng nhau trong phát triển phần mềm để tạo ra sản phẩm hiệu quả, dễ bảo trì và có khả năng mở rộng.
7. Tài liệu tham khảo
- Fundamentals of Software Architecture - Mark Richards
- Software Architecture Patterns, 2nd Edition - Mark Richards
Mời bạn đọc thêm các bài viết về System Architecture tại blog 200Lab Web/System Architecture 101 – Kiến trúc web/hệ thống cơ bản cho người mới
Bài viết liên quan
AWS là gì? Top những services AWS được sử dụng nhiều nhất
Jul 04, 2024 • 14 min read
Giải thích các ký hiệu trong class diagram
May 02, 2024 • 7 min read
Giải thích các ký hiệu trong use case diagram
Apr 11, 2024 • 7 min read
UML là gì? Giới thiệu các loại UML hay dùng
Apr 11, 2024 • 14 min read
Phỏng vấn Software Engineer tại Google diễn ra như thế nào?
Mar 12, 2024 • 12 min read
Architecture Pattern - Phần 6: Kiến trúc hướng không gian (Space-based architecture)
Mar 05, 2024 • 11 min read