图5 为“软件架构”找准位置
毋庸置疑,今天的软件系统一般都比较复杂,是分而治之和团队开发的产物,因此它是一种由许多软件单元组成的“复合组件”。软件架构包含了关于软件系统的重要决策,这些决策涉及到如何将软件系统分解成不同的部分、各部分之间的静态结构关系和动态交互关系。
上图可以用一句话概括:“作为复合整体的软件系统才有架构,架构规定了系统如何设计的重要决策。”张友生博士就曾指出:“自从软件系统首次被分成许多模块,模块之间有相互作用,组合起来有整体的属性,就具有了体系结构。”非常精辟。
从图中还看出,软件架构并不是所有的组件内部的设计都不关心,而是仅仅不关心“在架构设计阶段没有必要进一步分解”的软件单元的内部细节;另外也不是要将所有设计决策事无巨细地落实,而是重点关注“重要决策”。
软件架构设计的决策范围,应该着重放在“影响全局”的设计上,而不是关注所有设计细节。对此,Len Bass等人在《软件架构实践》一书中已经明确指出过:
架构中包含了关于各元素应如何彼此相关的信息。也就是说,架构必须省略各元素中与交互无关的某些信息。因此,架构首先是对系统的抽象,该抽象去除了不影响它们如何使用、其他元素如何使用、以及如何与其他元素关联或交互的细节。在几乎所有的现代系统中,各元素是通过接口实现交互的,而这些接口又将各元素的细节划分为公有和私有两大类。根据这种划分,架构属于公有部分,而私有部分——即仅与内部具体实现有关的细节——是不属于架构的。
由此可见,软件系统架构关注的是涉及元素之间如何交互的大局,而必须将局部性的细节忽略。其实,关注大局、把握整体,不仅仅是软件系统架构学科的主题,还是所有系统科学所研究的对象,钱学森就说过:“什么叫系统,系统就是有许多部分组成的整体,所以系统的概念就是要强调整体,强调整体是由相互关联、相互制约的各个部分所组成的。” 补充:任何复杂整体都有架构?
其实,任何作为复合整体的复杂事物都可能有架构,比如一本书、一栋建筑物。那本“永不褪色的经典”《如何阅读一本书》中就说:“每一本书的封面之下都有一套自己的骨架(Every book has a skeleton hidden between its boards.)。”
软件也不例外,任何作为复合整体的软件单元都可以有架构,如图6所示。这听起来似乎有些理论化,所以仅作为“为软件架构找准位置”的补充,但在有些时候,这一观点对我们的软件实践非常有帮助。