Chapter 5. Design in Construction
5.1. Design Challenges
Có một vài thách thức sống còn cho công việc thiết kế phần mềm (software design):
- Design Is a Wicked Problem: “Wicked Problem” là những vấn đề đòi hỏi chúng ta phải xử lý nó ít nhất hai lần, lần thứ nhất để có thể hiểu sâu sắc vấn đề và lần thứ hai để có thể tạo ra giải pháp cho vấn đề. Các vấn đề trong thực tế rất đa dạng và sẽ không bao giờ có sẵn một hồ sơ giải pháp hay kinh nghiệm để có thể tham khảo. Chỉ có lao mình vào xử lý nó mới có thể hiểu nó.
- Design Is a Sloppy Process: Thoạt nhìn thiết kế một phần mềm có vẻ là một quá trình trật tự, có tổ chức cao nhưng thực tế, quá trình thiết kế rất bừa bộn vì nó bao gồm nhiều bước thực hiện sai lầm, hủy bỏ và làm lại từ đầu. Tạo thật nhiều sai lầm trong quá trình thiết kế sẽ giúp chúng ta hiểu rõ vấn đề hơn và giảm rất nhiều chi phí (thời gian, tiền bạc) hơn là hoàn thành thiết kế một cách trật tự, đúng kế hoạch nhưng phát sinh các sai soát sau khi bắt đầu viết mã chương trình.
- Design Is About Tradeoffs and Priorities: Thiết kế là sự đánh đổi và ưu tiên. Đôi khi phải chấp nhận mất thêm kinh phí và thời gian để đổi lấy chất lượng của sản phẩm. Các hãng Apple hay Microsoft thường xuyên hoãn thời điểm ra mắt sản phẩm của mình như IPhone hay Windows để đảm bảo sản phẩm ra mắt người dùng một cách tốt nhất.
- Design Involves Restrictions: Nguồn tài nguyên hỗ trợ thiết kế như con người, thời gian, tiền bạc, v.v. luôn là giới hạn. Người thiết kế phải hiểu về nguồn lực mình đang có để có những quyết định phù hợp.
- Design Is a Heuristic Process: Thiết kế là quá trình bừa bộn (sloppy) với nhiều phiên bản thất bại. Đó là quá trình thử và sai liên tục cho đến khi tìm được một phiên bản tốt nhất.
- Design Is Nondeterministic: Cái đích của thiết kế là tìm ra phiên bản thiết kế ngày càng tốt hơn. Sẽ luôn tồn tại nhiều phiên bản có chất lượng ngang nhau để chúng ta cân nhắc lựa chọn.
- Design Is Emergent: Các phiên bản thiết kế tốt không tồn tại sẵn trong đầu óc con người. Chúng được đúc kết từ quá trình học hỏi từ các sai lầm, các thảo luận của các thành viên nhóm, hay kinh nghiệm thiết kế các phiên bản trước đó. Thiết kế là quá trình tiến hóa, cải thiện liên tục.
5.2. Key Design Concepts
Quản lý độ phức tạp (Managing Complexity)
Trong phát triển phần mềm, có hai dạng khó khăn mà chúng ta phải đối mặt: Accident và Essence. Hai thuật ngữ này bắt nguồn từ tư tưởng triết học của Aristotle. Tham khảo từ cách dịch của học giả Bùi Văn Nam Sơn, Essence có nghĩa là bản thể và Accident có nghĩa là tùy thể. Essence là những thuộc tính thuộc về bản chất của sự vật và nếu thiếu cái Essence này thì sự vật không còn là sự vật nữa, còn các Accident là các thuộc tính ngẫu nhiên góp phần tô điểm cho sự vật.
Trong phát triển phần mềm, các khó khăn Accident liên quan đến cú pháp ngôn ngữ lập trình, sự thay đổi các phương thức hoạt động của hệ điều hành, hay các hình thức làm việc và sử dụng công cụ không hiệu quả.
Những khó khăn Essence phát sinh từ việc đối mặt với sự phức tạp và hỗn độn trong thế giới thực, phải xác định chính xác và đầy đủ các trường hợp ràng buộc hay ngoại lệ, các giải pháp thiết kế phải tuyệt đối chính xác, v.v.
Nguồn gốc của những khó khăn, bao gồm cả Essence và Accident, là độ phức tạp (complexity). Quản lý độ phức tạp là cực kỳ quan trọng.
Bộ não người không thể xử lý quá nhiều công việc một cách hiệu quả tại cùng một thời điểm. Do đó, mục tiêu của quản lý độ phức tạp là tối thiểu hóa số lượng khó khăn Essence đến một mức bộ não có thể xử lý hiệu quả tại một thời điểm. Xét mức kiến trúc phần mềm, quản lý độ phức tạp nghĩa là chia hệ thống (system) thành những hệ thống con (subsystems) để có thể xử lý dễ dàng hơn tại một thời điểm. Đồng thời, hạn chế tối đa việc phát sinh những khó khăn Accident.
Những đặc điểm của một thiết kế tốt (Desirable Characteristics of a Design)
- Minimal complexity: Mục tiêu của thiết kết chính là giảm độ phức tạp đến mức tối thiểu.
- Ease of maintenance: Dễ dàng bảo trì ở mức lập trình.
- Loose coupling: Các thành phần có quan hệ với nhau ở mức tối thiểu để thuận tiện hơn cho quá trình kiểm thử, bảo trì.
- Extensibility: Là đặc điểm cho phép cải thiện hệ thống mà không ảnh hưởng quá nhiều đến các thành phần khác. Đặc điểm này có quan hệ mật thiết với đặc điểm Loose coupling.
- Reusability: Có thể được sử dụng trong nhiều hệ thống khác nhau.
- High fan-in: Uu tiên sử dụng các lớp tiện ích.
- Low-to-medium fan-out: Cho phép một lớp sử dụng một số giới hạn các lớp khác (<= 7).
- Leanness: Hệ thống được thiết kế một cách tinh gọn nhất có thể – tức là tối thiểu hóa các thành phần phụ.
- Portability: Dễ dàng di chuyển đến các môi trường khác nhau.
- Stratification: Hệ thống đạt mức phân cấp cho phép chúng ta xem xét nó tại bất kỳ mức nào mà không cần thâm nhập quá sâu vào các mức khác.
Các mức thiết kế (Levels of Design)
Mức 1 (Level 1): Mức hệ thống (Software System)
Mức 2 (Level 2): Mức hệ thống con và gói (Division into subsystems/packages)
Mức 3 (Level 3): Mức các lớp (Division into classes within packages)
Mức 4 (Level 4): Mức các thành phần của lớp (Division into data and routines within classes)
Mức 5 (Level 5): Mức hàm hay phương thức (Internal routines design)
Ý kiến bài viết