结构比组成更重要
世间的万事万物,不管它们之间的差异有多大,分解到一定的层次,其组成都是相同的。
美女与野兽,在器官层面的组成基本相同(都是由五官、心、肺、肠胃、皮肤等组成,当然形状等方面有一些差异),在细胞层面差异更小,到分子层面差异已经微不足道,到原子层面已经完全相同。
金刚石与氢气,在分子和原子的层面仍有差别,而到了亚原子的层面,其组成已经完全相同,都是由质子、中子和电子组成。
技艺高超的黑客写的代码和实习生写的代码,遵循的开发范式、采用的编程语言等等,看起来有巨大的不同,但是分解到字节的层面则别无二致,位的层面则都是0和1。
具有相同组成的两种事物,由于结构不同,在形态和行为上可能表现出巨大的差异。
金刚石和石墨,都是由碳原子组成的,由于碳原子之间的结合方式即结构方面的不同,两者的硬度不啻天壤之别——石墨非常软,可以制成铅笔笔芯来使用;而金刚石是世界上最硬的物质,比钢铁都要坚硬的多。
植物和人类的遗传物质DNA,都是由相同的四种脱氧核糖核苷酸核苷酸(腺嘌呤、鸟嘌呤、胞嘧啶、胸腺嘧啶脱氧核糖核苷酸)组成的。差别只在于这四种脱氧核糖核苷酸核苷酸的排列顺序和数量。不同的核苷酸顺序决定了植物成为植物,人成为人;决定了奥巴马成为黑人,而布兰妮成为白人;决定了苏东坡的随缘自适,也决定了曹操的心狠手辣(这一点没有定论)。
孙武的女兵通过阵法战胜男兵,全明星足球队往往输给俱乐部队,在在说明一个真理:与组成相比,结构更重要。
计算机程序也一样。采用哪种语言,选用哪种类库和框架,其重要性是有限的。决定你的程序的质量(适用性、扩展性、灵活性、可维护性、性能等等)和生命力的根本因素是它的组织结构的方式。有没有分隔业务代码和技术代码?有没有分离意图和实现?有没有把可变部分隔离于主体代码之外?有没有通过逐层分解识别出可重用组件,有没有通过泛化识别出共同概念与模式?模块之内是否足够高内聚,模块之间是否足够低耦合?对这些问题的回答不同,会造成软件结构上的巨大差异,从而在软件质量上也形成巨大的差异。
软件架构师最主要的工作就是定义软件的结构(在多个维度上分解系统,定义组件间的依赖关系和通信方式等),而技术选型(即软件的组成方面)相对没那么重要。
想起以往面试架构师,问起他们以往的软件架构是怎样的,居然有不少人回答是SSH(Spring + Struts + Hibernate),这些人真是捉错用神了。