在日常的编码活动中,“设计”是一个很容易被忽视的词。因此,作者在此强调了“设计”的重要性,即程序员需要意识到,“设计”是一种软件开发中很明确的活动。
设计中的挑战
设计活动中面临着以下的挑战。
- 设计是一个“险恶”的问题
- 设计是一个“了无章法”的过程
- 设计就是确定取舍和调整顺序的过程
- 设计收到诸多限制
- 设计是不确定的
- 设计是一个启发式的过程
- 设计是自然而然的
总的来说,设计本身是一个需要“经验”的过程,这个经验可以来自于犯过的错误,或者来自于“设计名家”总结的法则。设计没有一个固定的章法,但是有一些已知的最佳实践。因此,要学会设计就得多多实践和阅读,见识越多,设计起来才是更加专业。
设计的关键概念
- 软件的首要技术使命:管理复杂度
这里的复杂度指的是软件所解决问题的复杂度。作者从以下三个方面阐述了复杂度对于开发的影响以及如何应对复杂度。- 偶然的难题和本质的难题
- 管理复杂度的重要性
- 如何应对复杂度
- 设计的理想特征
设计本身虽然是“了无章法”的,但是一个设计却有一系列理想的特征。- 最小的复杂度
- 易于维护
- 松散耦合
- 可拓展性
- 可重入性
- 高扇入
- 底扇出
- 可移植性
- 精简性
- 层次性
- 标准技术
- 设计的层次
设计的时候,有时候需要一种自顶向下的思维。在微服务的结构中,假设要设计一个新的模块。
首先应该把这个模块当作一个软件系统,思考这个模块的作用是什么。
然后开始思考系统中每个模块(子系统包)的作用,比如消费数据的模块(子系统包),处理数据的模块(子系统包),接口模块(子系统包),数据库访问模块(子系统包)等等。在这个层级的时候,就可以考虑各个模块(子系统包)之间的通信问题了。
接下来的更细粒度的设计并非完全必须,常常是在编码的过程中由编码人员自己设计的。- 软件系统
- 分解为子系统包
- 分解为类
- 分解为子程序
- 子程序内部的设计