Sau quá trình phỏng vấn nội bộ các bạn Senior Developer nhiều năm kinh nghiệm trong ngành, thật bất ngờ khi tất cả các bạn ấy đều đồng ý System Design chính là kĩ năng quan trọng mà mọi Kỹ sư phần mềm nên học. Các bạn ấy ước gì biết đến nó sớm hơn, vậy System Design - Thiết kế hệ thống là gì hãy cùng mình tìm hiểu trong bài viết sau đây nhé.
1. System Design là gì?
System Design - Thiết kế hệ thống là quá trình thiết kế kiến trúc và các thành phần của hệ thống phần mềm để đáp ứng các yêu cầu nghiệp vụ cụ thể. Quá trình này bao gồm việc xác định kiến trúc tổng thể (system's architecture), các thành phần (component), các mô-đun và giao diện của hệ thống (interface), cũng như xác định các công nghệ và công cụ sẽ được sử dụng để triển khai hệ thống.
2. Các khái niệm quan trọng trong Thiết kế hệ thống
Khi chuẩn bị cho các cuộc phỏng vấn thiết kế hệ thống, nhằm mục đích tìm hiểu yêu cầu từ người dùng, xác định xem họ muốn thiết kế hệ thống như thế nào. Đứng ở vai trò người thiết kế bạn cần nằm rõ các khái niệm sau: yêu cầu chức năng, yêu cầu phi chức năng, quy mô hệ thống, thiết kế cấp cao (HLD) và thiết kế cấp thấp (LLD).
2.1 Yêu cầu tính năng (Functional Requirements)
Yêu cầu tính năng (FR) xác định những gì mà hệ thống sẽ làm. Các yêu cầu này sẽ cho chúng ta bức tranh toàn cảnh về các tính năng và chức năng mà hệ thống phải cung cấp để đáp ứng nhu cầu của người dùng cuối. Bên dưới đây là một ví dụ về yêu cầu tính năng cho hệ thống mua sắm trực tuyến:
- Cho phép người dùng thêm sản phẩm vào giỏ hàng: Hệ thống được xây dựng phải có chức năng cho phép người dùng chọn và thêm các mặt hàng vào giỏ hàng ảo của họ.
- Cho phép người dùng đăng kí và đăng nhập: Hệ thống cho phép người dùng có thể đăng ký tài khoản mới, có thể đăng nhập bằng email và mật khẩu, hỗ trợ đăng nhập qua các mạng xã hội (Google, Facebook, etc.), hỗ trợ chức năng quên mật khẩu và khôi phục mật khẩu qua email.
2.2 Yêu cầu phi tính năng (Non-Functional Requirements)
Yêu cầu phi tính năng (NFR) tập trung vào các yếu tố giúp nâng cao hiệu suất của hệ thống hơn là các chức năng cụ thể của nó. Những yêu cầu này hướng tới khả năng mở rộng, độ tin cậy và bảo mật. Ví dụ như:
- Đảm bảo hệ thống có thể xử lý 10.000 người dùng đồng thời mà không làm giảm hiệu suất.
- Thời gian phản hồi của trang web phải dưới 2 giây cho các thao tác thông thường.
- Hệ thống phải đảm bảo thời gian hoạt động (uptime) ít nhất 99.9%.
- Tất cả các giao dịch phải được mã hóa bằng SSL/TLS.
- Hệ thống phải tuân thủ các tiêu chuẩn bảo mật như PCI-DSS cho các giao dịch thẻ tín dụng.
Bạn cũng có thể sử dụng Template như phần Yêu cầu tính năng để ghi chép lại các yêu cầu này.
2.3 Quy mô của hệ thống (Scale of the System)
Quy mô đề cập đến khả năng của hệ thống trong việc xử lý lượng dữ liệu, lưu lượng truy cập hoặc hoạt động của người dùng ngày càng tăng. Hiểu được quy mô hệ thống giúp bạn có thể thiết kế các giải pháp có thể đáp ứng sự phát triển trong tương lai.Ví dụ:
- Thiết kế hệ thống để xử lý lưu lượng người dùng tăng 50% trong năm tới.
- Thiết kế hệ thống để xử lý số lượng sản phẩm tăng từ 200-300% mỗi năm.
2.4 Thiết kế cấp cao (High-Level Design)
Thiết kế cấp cao (HLD) tập trung vào việc xác định kiến trúc tổng thể và các thành phần chính của hệ thống. HLD cung cấp một cái nhìn toàn cảnh về hệ thống, tập trung vào các khía cạnh quan trọng như cấu trúc, luồng dữ liệu và tương tác giữa các thành phần lớn. Đây là bước đầu tiên sau khi bước xác định các yêu cầu hệ thống hoàn thành. Dưới đây là các sơ đồ mà kiến trúc sư hệ thống có thể sẽ vẽ trong giai đoạn này:
- Architecture Diagram: Các thành phần chính như máy chủ web, máy chủ ứng dụng, cơ sở dữ liệu, các dịch vụ bên ngoài, và cách chúng tương tác với nhau.
- Data Flow Diagram: Các luồng dữ liệu giữa các thành phần chính, điểm đầu vào và đầu ra của dữ liệu.
- Component Diagram: Các phần mềm như mô-đun, thư viện, và các dịch vụ, cùng với các giao diện và kết nối giữa chúng.
- Deployment Diagram: Minh họa cách phần mềm được triển khai trên phần cứng.
- Use Case Diagram: Minh họa các trường hợp sử dụng của hệ thống và mối quan hệ giữa các tác nhân (actors) và các trường hợp sử dụng (use cases).
Trong bài viết này mình sẽ tập trung về việc giới thiệu khái niệm chung nên sẽ không đi chi tiết về quá trình thực hiện của từng phần, các nội dung chi tiết này mình sẽ đề cập đến trong các bài viết tiếp theo.
2.5 Thiết kế cấp thấp (Low-Level Design)
Thiết kế cấp thấp (LLD) tập trung vào việc thiết kế và định nghĩa chi tiết các thành phần cụ thể của hệ thống. LLD mô tả chi tiết cách các phần mềm sẽ được thực hiện và triển khai, bao gồm các chi tiết về cấu trúc dữ liệu, thuật toán, giao diện và các thành phần cụ thể.Dưới đây là các sơ đồ mà kiến trúc sư hệ thống có thể sẽ vẽ trong giai đoạn này:
- Class Diagram: Các class, thuộc tính của chúng, các phương thức và mối quan hệ (kế thừa, liên kết, phụ thuộc) giữa các class.
- Sequence Diagram: Các đối tượng tham gia, thứ tự các tin nhắn trao đổi giữa chúng, và thời gian diễn ra các hoạt động.
- Activity Diagram: Mô tả luồng công việc hoặc hoạt động trong một quy trình nghiệp vụ hoặc một phần của hệ thống
- State Diagram: Các trạng thái của đối tượng, các sự kiện kích hoạt chuyển đổi trạng thái và các hành động liên quan.
- Entity-Relationship Diagram: Cấu trúc dữ liệu và mối quan hệ giữa các thực thể dữ liệu.
3. Như thế nào là một hệ thống được thiết kế tốt?
- Scalability: Hệ thống phải có khả năng xử lý số lượng người dùng và yêu cầu ngày càng tăng mà không làm giảm hiệu suất đáng kể.
- Modularity: Hệ thống nên được chia thành các Module nhỏ, độc lập, có thể dễ dàng thay thế hoặc cập nhật.
- Flexibility: Hệ thống phải có khả năng thích ứng với các yêu cầu thay đổi và các tính năng mới.
- Maintainability: Hệ thống phải dễ hiểu, dễ khắc phục sự cố.
- Security: Hệ thống phải được thiết kế để bảo vệ chống lại các cuộc tấn công độc hại và truy cập trái phép.
- Reliability: Hệ thống phải được thiết kế để giảm thiểu thời gian ngừng hoạt động và mất mác dữ liệu.
- Performance: Hệ thống phải được thiết kế để đáp ứng các yêu cầu về hiệu suất, chẳng hạn như thời gian phản hồi nhanh.
- Testability: Hệ thống phải được thiết kế để tạo điều kiện thuận lợi cho việc kiểm tra, debug và giám sát.
- Cost-effectiveness: Hệ thống cần được thiết kế để giảm thiểu chi phí phát triển và bảo trì.
- Usability: Hệ thống phải được thiết kế thân thiện và dễ sử dụng.
4.Tại sao System Design lại quan trọng?
Đây là những lời chia sẽ thật lòng của các bạn Developer chia sẽ về lý do mà các bạn nên học System Design ngay khi có thể.
4.1 Thị trường tuyển dụng khắc nghiệt
Xã hội ngày càng phát triển nhất là công nghệ AI đang mọc lên như nấm, và bản thân các bạn lập trình viên cũng thế, những kiến thức được chia sẽ ngày càng nhiều, thật không khó để tìm thấy các lập trình viên giỏi code, giỏi giải quyết các câu hỏi trên LeetCode.
Vì thế càng nhiều doanh nghiệp đưa ra các câu hỏi thiết kế hệ thống vào quy trình tuyển dụng của họ, những câu hỏi này đã trở thành yếu tố quyết định liệu bạn có nhận được công việc hay không. Nó cũng được dùng để xác định mức mức độ thâm niên của bạn trong ngành mà không phải là số năm kinh nghiệm. Nhưng điều này không có nghĩa là kĩ năng lập trình khác không quan trọng mà ý mình muốn nói ở đây là biết thiết kế hệ thống sẽ thúc đẩy sự nghiệp của bạn, giúp bạn có lợi thế cạnh tranh hơn, được giao nhiều trọng trách hơn, học hỏi được nhiều kinh nghiệm hơn, từ đó nhanh chóng trở thành Senior Devloper/System Architect với mức lương cao hơn.
4.2 Nâng cao kiến thức & Cải thiện mức lương
Gần đây tụi mình nhận được rất nhiều câu hỏi của các bạn học viên về việc hệ thống ở công ty của họ có vấn đề, rất chậm và đôi khi còn bị lag hay đơ, khiến người cùng cảm thấy khó chịu. Nguyên nhân chủ yếu dẫn đến vấn đề trên là vì công ty phát triển khá nhanh, đơn đặt hàng ngày càng nhiều, dẫn đến số lượng dữ liệu lưu trữ càng lớn, tần suất lưu trữ nhiều, làm cho các hoạt động ghi phải chờ đợi rất lâu. Chắc bạn cũng đoán ra được hệ thống đang không được thiết kế tốt để đáp ứng tính Scalability đã kể đến trong mục 3.
Vậy thì còn chần chờ gì nữa mà không học ngay cho mình kĩ năng System Design, vừa có thể giải quyết được các vấn đề về thiết kế hệ thống, vừa có thể nâng cao mức lương trong tương lai.
5. Kết luận
Học System Design không chỉ giúp developer nâng cao kỹ năng kỹ thuật mà còn cải thiện khả năng giải quyết vấn đề, tăng cường giao tiếp và hợp tác trong nhóm, chuẩn bị cho các vị trí cao hơn và đáp ứng nhu cầu thị trường. Đây là một kỹ năng quan trọng mà mọi developer nên nắm vững để phát triển sự nghiệp của mình một cách bền vững và thành công.
Các bài viết liên quan:
- Architecture Pattern - Phần 1: Các cách phân loại kiến trúc phần mềm
- Architecture Pattern - Phần 2: Kiến trúc phân lớp (Layered architecture)
- Architecture Pattern - Phần 3: Kiến trúc hướng sự kiện (Event-driven architecture)
- Architecture Pattern - Phần 4: Kiến trúc vi nhân (Microkernel architecture)
- Architecture Pattern - Phần 5: Giới thiệu kiến trúc Microservice
Bài viết liên quan
Giới thiệu Kiến trúc Backend for Frontend (BFF)
Nov 16, 2024 • 10 min read
Flask là gì? Hướng dẫn tạo Ứng dụng Web với Flask
Nov 15, 2024 • 7 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read
Spring Boot là gì? Hướng dẫn Khởi tạo Project Spring Boot với Docker
Nov 14, 2024 • 6 min read
Two-Factor Authentication (2FA) là gì? Vì sao chỉ Mật khẩu thôi là chưa đủ?
Nov 13, 2024 • 7 min read
Test-Driven Development (TDD) là gì? Hướng dẫn thực hành TDD
Nov 13, 2024 • 6 min read