工业级软件的特征是,单个开发者要理解其设计的所有方面非常困难,几乎是不可能的

从根本上来说,复杂性是所有大型软件系统的基本特征,我们无法消除这种复杂性

造成这种固有的复杂性的原因有:

  1. 问题域的复杂性
  2. 管理开发过程的复杂性
  3. 软件中随处可能出现的灵活性
  4. 描述离散系统行为的问题

复杂系统的五个属性

  • 层次性: 正是这一属性让我们能够理解,描述复杂系统.我们似乎也只能理解那些有层次结构的系统.一个系统所提供的价值来自各个组成部分之间的相互关系,而非单个的组成部分
  • 相对性: 对于一个观察者很基础的东西,对另一个观察者可能具有很高的抽象层次.大概意思,就是没有绝对的复杂,也没有绝对的简单.
  • 耦合性: 组件内的联系通常比组件间的相互作用密集得多,这也是划分不同组件的原则
  • 共同性: 复杂系统之间是可以有着共同的特征.例如动物和植物之间都是由细胞构成的,再例如一名有经验的飞行员能够进入一架以前从未飞过的多引擎飞机并安全地驾驶它
  • 中间层: 这里的意思大概是复杂系统不可能一次就构建成功,需要构建中间层.

一般来说,我们都只认为对象是类的成员,但是实际上类的观点和对象的观点对于复杂系统是不同维度的看法,理由大致如下

  • 如果没有类结构,对于重复的对象结构的属性会造成冗余
  • 如果没有对象结构,复杂系统的形式是不确定的

这里作者表明,最成功的复杂系统都是在设计中包含了深思熟虑的类结构和对象结构,并很好的平衡了前面的五个属性.

话是如上图那么说,然而现实依旧不如人意,为什么呢?一方面是因为设计的方法学还不够完善,另一方面是因为在处理复杂性这方面,人的能力是有限的

这里面对的是一个根本性难题:

软件系统的复杂性在不断增加,而人处理复杂性的能力却是有限的,如何才能解决这个困境呢?

解决方法很简单,就是分解.

接下来提了两种分解,一是过程式分解(中文版翻译为算法分解,感觉不大合适),另一种是面向对象分解

在这里作者吹了一下面向对象的观点,个人也的确觉得有点道理,面向对象分解感觉比过程式分解更"自然"

分解,其实是一种逆向的思维,然而更具价值的显然是设计

就类似,很多时候,阅读别人写好的源代码比自己写出源代码都简单得多

复杂系统的设计,这无疑是一种带有艺术性的一项科学工作

接下来,作者提了下软件设计方法学的几个要素

  • 表示(表达这个复杂系统)
  • 过程(可以有序地构建起这个复杂系统)
  • 工具(实现过程)

一个好的设计方法学基于牢固的理论基础,同时又提供艺术创新的自由


我很好奇