软件体系结构与设计实用教程/卓越工程师计划软件工程专业系列丛书
作者简介
内容简介
第1章 软件体系结构的基本概念
1.1 软件体系结构
1.1.1 软件体系结构的概念
软件体系结构一词从字面上理解为软件的体系结构,因此要了解软件体系结构,就需要分别了解什么是“软件”,什么是“体系结构”,以及这两者之间的联系。软件在狭义上指的是计算机程序,而广义上则是指计算机程序和相关的文档(如需求规格说明书、软件设计说明书、使用手册)的集合体。传统意义上计算机程序的设计往往意味着“算法+数据结构”的设计。随着软件系统规模和复杂性的增长,现代软件设计已经远远超出了算法和数据结构这一范畴,如何设计和说明整个系统的结构成了一个巨大的挑战,涉及总的控制结构、通信协议、约束和性能、设计元素功能分配、物理部署、设计元素的组合、设计策略选择等一系列问题。
其实“体系结构”的概念起源于建筑学,在建筑学中是指如何使用基本的建筑模块构造一座完整的建筑,其中包括两个基本元素:基本的建筑模块和建筑模块之间的黏结关系。同样,软件也总是具有体系结构的,它包括构件、连接件两个基本元素以及物理分布、约束、性能等因素,其中构件即各种基本的软件构造模块,如函数、对象、模式;连接件用于将构件组合起来形成完整的软件系统。从细节上来看,每一个程序也是有结构的,早期的结构化程序就是以语句组成模块,模块的聚集和嵌套形成层层调用的程序结构就是体系结构。因此,我们说不存在没有体系结构的软件。
在软件体系结构发展过程中,人们曾从不同角度给出了有关软件体系结构的多种不同定义。截至2005年末,有大概24个国家向卡内基梅隆大学SEI提交有关“软件体系结构”的定义多达156个。1994年,Garlan和Shaw定义:软件体系结构是设计过程的一个层次,它处理那些超越算法和数据结构的设计,研究整体结构设计和描述方法。他们认为软件体系结构由构件(component)、连接件(connector)和约束(constraint)三大要素构成。构件可以是一组代码,如程序的模块,也可以是一个独立的程序,如数据库的SQL服务器;连接件表示构件之间的相互作用,它可以是过程调用、管道和消息等;约束一般为构件连接时的条件。该模型的视角是程序设计语言,构件主要是代码模块。同样是1994年,CFRP模型定义:软件系统由一组元素(elements)构成,这组元素分成处理元素和数据元素,每个元素有一个接口(interface),一组元素的互连(connection)构成系统的拓扑,互连的语义(connection semantics)包括静态的互连语义(如数据元素的互连)和描述动态连接的信息转换的协议(如过程调用、管道等)。1995年,Boehm模型定义:软件体系结构是系统构件、连接件和约束的集合,也是反映了不同利益相关者需求的集合,同时是能够展示由构件、连接件和约束所定义的系统在实现时如何满足系统不同人员需求的原理的集合。1998年,IEEE 610.12—1990标准定义:体系结构是以构件、构件之间的关系、构件与环境之间的关系为内容的某一系统的基本组织结构,以及指导上述内容涉及与演化的原理。近年来,SEI从另外的角度给出了软件体系结构的定义:所谓系统的软件体系结构就是一种可用来帮助人们理解系统如何执行的系统描述。软件体系结构服务于系统本身以及开发项目,用来定义设计和实现工作组必须完成的工作任务。同时,它也是诸如性能、可修改性、安全性等系统质量的主要载体。假如没有一致的体系结构,就很难确保这些质量能被实现。软件体系结构还可看作一种早期分析的制品,它确保所使用的设计方法能创建出可接受的系统。通过构建有效的体系结构,人们可以识别出早期风险并在开发过程中加以防范。
尽管人们从不同角度所给出的众多软件体系结构概念不尽一致,但通过对已有软件体系结构定义和论述进行分析,不难看出有关软件体系结构的共性。
(1) 软件体系结构提供了一个结构、行为和属性的高级抽象,从一个较高的层次来考虑组成系统的构件、构件之间的连接,以及由构件与构件交互形成的拓扑结构,这些要素应该满足一定的限制,遵循一定的设计规则,能够在一定的环境下进行演化。
(2) 软件体系结构反映的是系统开发中具有重要影响的设计决策,反映多种关注,便于涉众之间的交流,据此开发的系统能完成系统既定的功能和质量需求。
(3) 软件体系结构的有关工作围绕以下几方面展开。
架构设计:怎样创建一个架构。
分析:最终产品质量属性与架构之间的关系。
实现:怎样基于架构描述建立一个实际的系统。
表达:创建怎样的架构制品来解决人与人、人与机器之间的交流问题。
经济:架构问题和商业决策怎样关联。
1.1.2 软件体系结构发展史
作为软件工程学科的一个分支,软件体系结构主要是针对大型软件系统结构的原理性研究。伴随着软件系统规模和复杂性的迅速增加,软件工程和软件开发方法经历了一系列的变革。在此过程中,软件体系结构研究也从最开始对系统的定性描述,发展成了对一些符号、工具、分析技术和构建方法的研究。也就是说,软件体系结构领域最初的研究领域是解释软件实践,而现在它能够为复杂的软件设计和开发提供具体的指导。如今,软件体系结构已经从基础的研究转变为软件系统设计和开发过程中的一个重要元素,已经进入到一个创新和概念形成的黄金时代,并开始进入一个技术更加成熟、应用更加广泛的阶段。按照Redwine和Riddle定义的技术成熟度模型,从实践的角度看可将软件体系结构的发展大致划分为如下6个基本阶段。
1. 萌芽阶段:1985~1994
20世纪80年代中期至90年代中期可看作软件体系结构的基础研究阶段,这一阶段随着软件危机的出现,人们愈发认识到从整体而非单一模块考虑软件系统设计的重要性,软件体系结构的萌芽开始出现。这个时期的开发活动中,设计者往往会通过线框图和一些非正式的表述来描述复杂软件系统的结构。其中一些设计者意识到这些结构中存在一定的共性,并总结出一些风格,这些结构有时又被称为架构,但有关通用风格的知识却没有得到系统组织和研究。20世纪80年代中期,伴随着面向对象开发方法的兴起与成熟,信息隐藏、抽象数据类型以及其他将软件元素看作黑盒的概念逐渐形成并得到普及,人们意识到计算机程序仅提供一个正确的输出往往是不够的。同时认识到诸如可靠性、可维护性等其他软件质量属性也是十分重要的,并且能够通过设计良好的软件结构实现这些质量属性。20世纪80年代晚期,人们又开始探索为特定问题提出的特殊的软件结构,形成了一些如航空、示波器、导弹控制等特定产品线或者应用领域的软件系统结构方案。另一些工作则主要关注软件结构的共性部分即架构风格,这些架构风格可被用于更加普遍的问题领域。通过将已有系统进行编排分类,人们定义了一些通用的架构风格,如管道、过滤器、仓库、隐式调用以及协作进程等。
2. 概念形成阶段:1992~1996
这一阶段人们开始研究和探索通过ADL(架构描述语言)、形式化及分类来描述通用的软件结构,重点放在对实践中发现的系统结构的描述。通过ADL这种类编程语言来解释系统的组织思想,可以描述架构各方面的具体细节。这时期出现了Aesop(探索风格的特殊属性)、C2(探索基于事件的风格)、Darwin(动态分布式系统的设计和规约)、MetaH(实时航空电子设备控制)、Rapide(动态行为仿真和分析)、UniCon(连接件和风格的扩展集,与代码兼容),以及Wright(组件交互)等特定架构的ADL。
早期叙事性的风格分类方法被逐渐扩展为风格分类和支持这种风格的元素分类。一些通用的体系结构形式被描述为模式。由Buschmann、Meunier等合著的《面向模式的软件体系结构:模式系统》一书是这方面的开篇之作。
这一阶段,人们开始系统研究架构决策和系统质量属性之间的关系,并将软件架构验证作为一种有效的减少风险策略加以研究。软件互连的度量、架构师检查清单,以及特定属性的架构分析技术促进了架构评估方法的发展,形成了诸如SAAM的评估方法。
在这一阶段最重要的当属架构视图概念的出现。早在1974年,Parnas就基于其观察给出了这样的结论:一个软件系统有着多种不同的结构,这些不同的结构着重于不同的工程目标,并且单独描述任何一个视图意义不大。Kruchten 1995年提出的“4+1”视图模型,引起了业界的极大关注,并最终被 RUP 采纳,现在已经成为事实上的架构设计结构标准。
3. 发展和探索阶段:1996~2003
在这一阶段,人们开始全面探索软件体系结构理论方法的实践问题,架构模式作为一种非正式的设计指导受到普遍关注并被广泛采用。
有关实时系统设计的形式化分析方法也已经出现。例如,分布式仿真的高层次架构的架构说明书能够在实现之前识别不一致性,因而减少了重新设计的开销。
架构分析和评估方法也逐渐发展。在SEI,软件架构分析方法(SAAM)被架构权衡分析方法(ATAM)代替,该方法不仅支持质量属性的分析还支持质量属性之间的交互。有关应用研究到实践的书籍为外部探索打下了基础。这一时期包括架构评估以及架构编档等有关软件架构实践的书籍开始出现,表明整个领域逐渐成熟。
另一方面,人们也展开了对架构设计策略的进一步探索,这些设计策略作为一些细粒度的架构设计决策,能够形成特定的架构模式。在这个阶段,质量属性的重要性逐渐增大,同样也伴随着达到这些质量属性的架构角色。2000年初有许多将质量属性和架构设计决策相关联的工作,使得研发自动化的架构设计工具成为可能。
面向对象软件框架的发展为面向对象风格架构提供了一套丰富的开发环境,同时也增强了公众对面向对象开发的热情。面向对象软件框架具有良好的内在组织结构及良好的可用性、可交互性,这些优点使得人们很乐意接受这样的架构,这些都满足了架构的需求。因此,人们不再一味追求通用架构描述语言,转而考虑如何更好地解决特定架构的问题。与此同时,这一架构为基于构件的软件工程提供了一个足够稳固的基础。
从1997年发布UML 1.1起,在Rational的推动下,UML已经集成了一系列的设计符号并开发了一套系统应用它们的方法,包括用来进行分析、一致性检查,或者将UML表达信息与系统代码相互转换的方法。UML与面向对象技术天然融合并支持模型驱动开发。与UML紧密相关的是Rational的统一过程(RUP),这是将Kruchten的“4+1”视图模型进程产业化的工具。UML与面向对象技术紧密融合、支持架构设计等特性,使得UML在支持实践方面具备了其他ADL无法比拟的优势,已经成为事实上的产业标准ADL。
4. 普及阶段:2003~现在
在实用化架构描述语言方面,随着Rational公司推出Rose软件以及IBM并购Rational公司后推出Rational Software Architect(RSA)这一产品,UML作为产业标准ADL的地位得到了进一步增强,也有力地推动了软件体系结构技术的普及。RSA是一个基于UML 2.1的可视化建模和架构设计工具,允许架构设计师和分析师创建系统的不同视图。RSA构建在Eclipse开源框架之上,兼具优秀的可视化建模和模型驱动开发能力。无论是普通的分布式应用还是Web Services,这个工具都是适用的。需要指出的是作为产业标准ADL的UML,尽管最新版本UML 2.1和之前版本相比有所改善,但它仍然缺乏基本的软件体系结构概念,如“层”或“连接器”的准确概念;它也缺乏分析视图之间交互作用的能力。这些都需要借助其他方法和工具加以弥补。这也说明,即便今天,在构建功能足够强大且实用化的ADL及其配套方法、工具方面还有很长的路要走。
架构模式方面,随着WWW和基于Web的电子商务等应用的爆炸性增长,且正在引领商业化的浪潮。多层客户服务器架构、基于代理的架构