本文探讨什么是「软件架构」,并对其下个定义!

决策or组成?

如果你去google一下「什么是软件架构」,你会看到各种各样的定义!不过大致可分为「决策」论和「组成」论!

其中一个比较著名的「决策」论的定义是Booch,Rumbaugh和Jacobson于1999年提出的:

而「组成」论中最受推崇的是SEI(Software Engineering Institute)的Len Bass等人提出的定义:

Fielding博士在他的博士论文《Architectural Styles and the Design of Network-based Software Architectures》中对软件架构的定义是这样的:

这其实也是「组成论」!不过这里说的是系统运行时的快照

为什么会出现这样的分歧呢?我觉得主要问题在每个人对「架构」这个词的理解!

我先来问你一个问题,你觉得「架构」这个词是名词还是动词?或者说「架构」是一个过程,还是一个结果

「架构」对应英文单词「Architecture」,在英文里Architecture是个名词,表示结构。但实际上结构只是架构的产物,如何得到这个结构呢?是通过架构师的一个个决策得到的。所以,「架构」包含了过程结果

如果你去搜一下「架构」这个词的解释,你就会发现,在中文里,「架构」这个词有两层含义(来自百度词典):

  • 一是间架结构
  • 二是构筑,建造

那么,「架构」是决策还是组成呢?

Wiki上对Architecture给出了一个比较好的定义:

翻译过来就是:

但是我觉得这个定义还不够,还缺少了一个关键内容,就是「约束」!

下个定义

我个人对架构的理解是:架构是特定约束决策结果,并且这是一个循环递进的过程。

这句话包含了三个关键词:特定约束决策结果。这三个词都是中性词。特别是第三个词,由于决策的不同,得到的结果也就不同,可能是「成果」,也可能是「后果」!下面来一个个具体解释。

  • 特定约束

我们都学过阅读理解,老师在教阅读理解的时候,会提到一个词,叫「语境」!比如下面这个段子!

这里的「意思」在不同的语境下有不同的含义。语境就是上下文,也就是我们软件行业常说的Context!Context不同,得到的结果也就不同!

其实任何行为、言语、结论都有一个Context为前提!只是在不同的情况下我们对这个Context的叫法不同!比如:

这句话在欧几里得几何这个Context下是成立的!但是在非欧几何这个Context下就是不成立的!在数学里,这个Context可以称为是「限定条件」!

同样的牛顿力学定律,在普通场景下是成立的!但是在量子力学下是不成立的!在物理里,这个Context可以称为「环境」!

在架构里也一样,淘宝的架构可能在其它情况下并不适用,因为Context不同!这里的Context就称为「约束」!

而且这个「约束」必须是「特定约束」,不能是「泛约束」!比如说,「我要造个房子」,这个约束就是个「泛约束」!是没办法执行的!(下节通过例子来详细说明)

  • 决策

决策是一个过程!实际上就是选择!选择技术、结构、通信方式等内容,去符合「特定约束」!

在决策时,实际上无形中又加入了一个约束:人的约束!做决策的人的认知又约束了决策本身!比如某个架构师只知道分层架构,那么他无论在哪种Context下都只有分层架构这一个选择!

  • 结果

是决策的最终产物:可能是运行良好、满足需求的系统。也可能是一堆文档。或者是满嘴的跑火车!

如果这个结果是五视图、组件、接口、子系统、及其之间的关系,那么这个架构就是软件架构

如果这个结果是建筑图纸、钢筋水泥、高楼大厦,那么这个架构就是建筑架构

如果这个结果是事业成功、家庭美满,那么这个架构就是人生架构,也叫人生规划

举个例子

以上面「我要造个房子」为例,来详细解释「架构是特定约束决策结果」!

上面已经说了「我要造个房子」是个泛约束,是无法满足的!因为它有很多可能性选择,且很多选择是互斥的!例如:

  • 房子造在哪里?城市、乡村、山顶、海边、南北极......
  • 要造成什么样子?大平层、楼房、草房、城堡......
  • 要使用什么材料?水泥、玻璃、木头、竹子......
  • ......

这里实际就是需求收集阶段,需要和客户沟通,挖出具体的客户需求!

假设客户最终决定:想在海边建个房子,适合两个人住,每半年过来度假一周左右,希望能方便的看到海、还有日出,预计支出不超过XX元!这就是功能性需求!

通过上面的功能性需求,你需要挖出非功能性需求:

  • 海边风大、潮湿。如何防风?防潮?
  • 海潮声音大,是否需要做好隔音?避免影响睡眠?
  • 希望能看到海和日出,使用玻璃是否合适?需要什么样的玻璃?
  • 价格是否超出预算?
  • .....

完善的需求(功能性、非功能性),实际就是架构的「特定约束」!而对上面这些问题的选择,就是「决策」!

  • 为了防风,地基要打深一点;要使用防潮材料
  • 墙壁需要加厚,使用隔音门和窗户
  • 面朝大海的墙使用强化加厚玻璃墙
  • 选择价格内的材料
  • ......

这些决策确定后,需要告诉工人如何建造!需要相关的设计图,对不同的人需要不同的图!比如,对建造工人就是整体结构说明图,水电工就是水电线路图!这些图纸就是你决策的部分结果

整个过程是个循环递进的过程!比如:你为了解决客户方便看海的问题,先选择了开一个较大的窗户的方案!但是客户觉得不够大!你决定直接把整面墙都使用玻璃来建造,客户很满意,但是承重、防风等问题如何解决?你最终决定通过使用强化的加厚玻璃来解决这个问题!

最终交付给客户的房子才是你架构的最终成果

免责申明:我不懂造房子,以上言论都是胡诌的,你理解意思就行了!

纵向深入

最近订阅了李运华的《从0开始学架构》,他对架构的理解是:软件架构指软件系统的顶层结构!我觉得这个定义太过宽泛了,且只是定义了「结构」而没有说明「过程」!不过,这间接说明了架构和设计的关系!架构是顶层设计

从操作层面做决策:用户从哪里进入、页面应该跳转到哪里、应该输入哪些信息.....这就是流程设计!

从代码层面决策,代码该怎么写:模块如何组织、包如何组织、类如何组织、方法如何组织......这就是代码设计!

从系统整体层面决策:子系统如何组织、组件如何组织、接口如何设计......这就是架构设计!

横向扩展

好像架构思维是个比较通用的思维方式!读书,演讲,写作.....都是这样!

读书,你需要先了解这本书是讲关于什么的?计算机、哲学、心理学.....以及具体是讲的哪个方面?这是约束!然后你需要问自己,自己是否需要了解这些内容?是否需要读这本书?这就是决策!如果需要读,那么再进一步,这本书的整体结构是什么样子的?我该怎么读?这个章节是讲什么的?我是否需要读?我是否同意作者的结论?如果同意,我为什么同意?如果不同意,我为什么不同意?我有什么自己的观点?最终的成果就是我对这本书的个人理解

演讲,你需要先了解你是对谁进行演讲的?要讲什么?听众的水平如何?听众的水平以及演讲的内容就是你演讲的约束!然后你需要考虑如何进行演讲?演讲的整体结构该怎么组织?该用什么样的语言?是否该讲个笑话?各个小节里的内功如何组织?这里是否需要设置问题?这里是否可能会有人提出问题?会提出什么样的问题?我该如何回答?这些是决策!最终,做出来的演讲,就是我这次演讲的成果

写作和演讲比较类似,少了一些互动。就不再赘述了!

做个小结

本文梳理了我对架构的理解:架构是特定约束决策结果,并且这是一个循环递进的过程。并通过例子来解释我为什么这么理解!

参考资料

  • 《IBM架构思维介绍》
  • 《恰如其分的软件架构》
  • 《Java应用架构设计》
  • 《软件架构设计》
  • 《程序员必读之软件架构》
  • 维基百科
  • 百度词典
10-08 08:54