一个成熟的软件是一个复杂的系统,当我是一个新手的时候,我以为它像一座建筑,按照既定的图纸开发出来。现在我更深的体会是,它更像一棵树,是逐渐成长起来的。事实上,世界上最复杂的软件,它的复杂度都远远不如一棵树。
- 层次结构(分离关注)
从宏观意义上来说,一棵树有花朵、叶子、树干、树根等结构,而具体到花朵又有花冠、花萼、花蕾等结构,更微观上,每个植物细胞都有细胞壁、细胞核、细胞液、叶绿体等结构。任何复杂的系统都有可分解的层次结构,我们要考察这个系统的某个特性的时候,要在合适的层次上进行研究——这也就是“分离关注”。例如我们要解释植物是如何合成植物蛋白的,可以这样解释:
树根从土壤中吸取水分和微量元素,经过树干输送到树冠的叶子,叶子吸收二氧化碳,通过光合作用合成植物蛋白。
接着如果要考察叶子如何进行光合作用,就要从叶子的植物细胞的叶绿体,细胞液,细胞核等不同组成部分的功能和相互之间的交互来解释。
同样的从宏观上考察软件作为一个系统,完成某个功能的时候,可以从不同层次(树根、树干、叶子)之间不同形式的数据(水、微量元素、二氧化碳)是如何传递转化的来解释。之后就要深入到了解某一个层次的组件是如何完成交互来完成某一子功能。
- 自律性个体
仅仅拿一个植物细胞来考察,就会发现你很难不把它认为是一个自律性的生命个体。作为细胞群中的一员,它和其他细胞不断的交换物质,同时它有自己的化学趋向(趋水、趋光)。根部向水生长,树冠朝向阳处生长,这些宏观的行为,并不是给每一个细胞发送指令,而是它们自发性行为的整体表现。而所谓的自律性,首先要定义个体对哪些刺激敏感而会有哪些产物,例如叶绿体在光线刺激下会通过光合作用合成相应的化学物质,而这种化学物质又作为植物细胞的刺激输入而有新的化学物质产生。这些简单的规则定义之后,就会在整体上表现出统一的规律。这也是软件开发从面向过程到面向对象转变的本质,也就是消息驱动的设计模式。
- 共同模式
在植物结构层次的各个部分之中,有着大量相同的特点。树根或者树叶,基本的组成单元是细胞,它们的结构是类似的,虽然存在是否含有叶绿体这个显著区别,而且其细胞液的化学成分不同。这是因为细胞的基础结构提供了一系列基础功能,例如细胞壁提供了支撑和保护功能,细胞液提供了物质交互的场所,诸如此类,大自然遵守着软件开发的“DRY”原则,用组合(加一个叶绿体提供光合作用)或者继承(细胞壁有不透水的也有半透膜)的方式,做了一个复杂系统的经济表述。
理论物理学家认为,宇宙只存在四种基本的作用力:重力、电磁力、强相互作用力和弱相互作用力。宇宙通过这四种基本力又组成了恒星、行星、卫星等在宏观层次上大量复用的共同模式。在面向对象的软件系统中,对象与对象只存在三种基本的关系:组合、继承和相关。通过这三种基本关系,又可以识别出多种设计模式。
- 稳定的中间形式
复杂系统毫无例外都是从能工作的简单系统演变而来的......从头设计的复杂系统根本不能工作,也不能通过打补丁的方式使其工作,必须从头开始,从能工作的简单系统开始。
一颗种子成长为一棵树,要经过几个稳定的中间形式。种子的胚胎已经简单却分明的层次,其中有一些会发育成熟为其他的姿态,有一些会完成历史使命而消失,还有一些模块,例如花朵,是旧系统上全新产生的,但也是依赖于现有的稳定的层次。生长环境会影响树木发育的最终形态,这就像一个软件系统开始成熟起来,而开发人员对其真实行为了解的越来越多。