【软件架构设计-综合题(4)】软件架构设计知识点
软件架构设计这一章,表面上看知识点很多:风格、视图、评估、复用、SOA、REST、DSSA、MVP、XML、WSDL,好像东一块西一块。其实把这些题目放在一起看,这一章真正想考的是一件事:面对复杂软件系统,架构师如何从整体层面组织系统、表达系统、复用经验,并验证这个系统是否真的能支撑目标。
顺着这个主线去学,第四章就不会碎。它大致可以分成五层:先理解软件架构到底是什么;再理解常见架构风格和中间件;接着看架构如何被描述、开发和评估;然后看架构复用与特定领域架构;最后补上面向服务、Web 服务和一些典型架构模式。下面按这个逻辑整理。
一、先把软件架构的底层认识立住:架构是系统级决策,不是局部设计
软件架构最核心的含义,不是“画一张大图”,而是对系统进行高层组织。它描述系统由哪些主要部分构成、这些部分之间如何协作、受什么约束,以及这些决策为什么成立。它关心的是整体,不是单个类或单个函数。
所以题目里常出现两个容易混淆的点。第一,软件架构很重要,但它不是必须机械套用某种固定风格。架构风格是经验,不是枷锁。真正正确的理解是:架构设计要根据业务目标、质量目标和现实约束去选结构,而不是先选风格再硬往里塞。第二,体系结构风格描述的是某一类系统反复出现的组织模式。它定义了一个系统家族的词汇表和一组约束,并反映这个领域中很多系统共有的结构和语义特征。这里“词汇表”讲的是有哪些构件和连接件,“约束”讲的是这些构件和连接件该怎么组合。
再进一步,软件架构需求也不是简单等于“功能需求”。体系结构需求一般来自三个方面:系统的质量目标、系统的商业目标、系统开发人员的商业目标。这里很容易误选成“功能需求 + 质量目标 + 商业目标”,但出题人想强调的是:架构首先响应的是系统层面的质量与商业诉求,比如性能、可扩展性、成本、交付效率、团队协作,而不是把功能清单直接搬成架构。
因此,这一层要记住两句话:架构关注整体组织方式;架构需求首先由质量目标和商业目标驱动。
二、架构风格与构件中间件:系统究竟按什么方式组织和协作
理解了架构是什么,下一步就要看“系统通常怎么组织”。这就是架构风格。风格本质上是成熟系统反复验证过的组织经验,不同风格适合不同问题场景。
1. 常见架构风格:重点不在背名字,而在抓住“组织方式”
批处理风格的特点是,系统由多个顺序处理步骤组成,每个步骤通常是独立程序,前一步完成后后一步才能开始,数据在步骤之间以整体方式传递。它适合一次性、大批量、流程稳定的处理任务。这里最容易错的地方,是把它理解成边处理边传输的数据流;那已经不是批处理强调的重点了。
基于规则的系统则是另一种思路。它的核心不在“顺序执行”,而在“条件满足时触发规则”。典型组成包括规则集、规则解释器、规则/数据选择器和工作内存。做题时只要看到“规则集、解释器、工作内存”这一套,基本就能判断是在考规则系统。
事件驱动架构 EDA 强调事件在独立、非耦合模块之间传递。发布方不需要知道订阅方是谁,只负责发布事件;订阅方按需响应。这种结构的重点是松耦合、异步和可扩展。与它相近的隐式调用风格,也是通过间接机制实现协作。比如用户在图形编辑界面点一个动作,底层处理逻辑会被自动触发,但界面本身并不需要显式知道全部调用链。它的关键是“通过中介机制间接协作”,而不是组件直接点对点调用。
后半部分又补进来两个高频考点。一个是REST 架构风格。REST 的核心是资源,每个资源通过 URI 唯一标识,资源通过 HTTP 标准方法如 GET、POST、PUT、DELETE 进行操作。REST 中状态通常分为应用状态和资源状态。题目里最容易错的是“RESTful API 必须使用 JSON 交换数据”,这是错的。REST 强调的是资源和统一接口,不强制规定一定是 JSON,XML、HTML 或其他表示形式都可以。
另一个是微服务与 SOA 的管理方式。微服务架构通常采用去中心化管理,每个服务独立部署、独立运行、独立管理、常常也有自己的数据存储;而面向服务架构 SOA 更偏整体协调和统一治理,通常体现为集中式管理。这组题目就是在考二者的边界,不是说它们都“服务化”就完全一样。
2. 调用返回风格中的 MVP:别把 View 和 Model 直接绑在一起
调用返回风格下面,题目还考到了 MVP(Model-View-Presenter)。这个模式里,Model 负责数据,View 负责显示,Presenter 负责业务逻辑和交互协调。它的价值在于把界面和业务逻辑拆开,使逻辑更容易复用和测试。
最容易错的是“View 可以直接从 Model 中读取数据”。在 MVP 中,View 通常不应该直接依赖 Model,而是通过 Presenter 与 Model 交互,这样才能降低耦合。也正因为如此,一个 Presenter 可以服务多个 View,MVP 也常用于移动端开发场景。
3. 构件与中间件:中间件不替代业务,它负责连接和集成
构件与中间件技术是软件架构落地的重要支撑。中间件最本质的角色,是连接不同的软件组件或系统,提供通信和集成服务。它不是直接去处理最终业务,也不是去管理 CPU 和内存那类硬件资源,而是处在操作系统和应用软件之间,负责把原本分散的部分接起来。
CORBA 是这一类题的典型代表。其中一个高频点是对象适配器(Object Adapter):它负责屏蔽 ORB 内核实现细节,并给服务器对象实现者提供抽象接口。简单说,就是把底层中间件的复杂性包起来,让上层对象更稳定地接入。
这一整层的学习重点可以压成一句话:架构风格解决“系统怎么组织”,中间件解决“这些部分怎么接起来”。
三、架构如何被表达、开发和评估:真正的架构能力不只会设计,还要会说明和验证
很多同学学到这里会卡住,因为这部分既有视图、又有 ADL、又有 ABSDM、又有 SAAM/ATAM。其实它们都在回答同一个问题:架构设计出来以后,怎么表达、怎么推进开发、怎么判断它靠不靠谱。
1. 架构描述:视图、视角和 ADL 都是在回答“怎么把系统说清楚”
基于架构的软件开发 ABSD 强调由商业需求、质量需求和功能需求共同驱动架构设计。它强调采用视角与视图来描述软件架构,采用用例和质量场景来描述质量需求。这里很容易误选成“构件和类图”或“类图和序列图”,但 ABSD 真正强调的是多视图表达和场景化需求。
ADL(架构描述语言)则是更正式的表达手段。它是一种基于模型的描述语言,主要用于描述软件系统的构件、连接件和架构配置。因此,题目里“ADL 三要素不包括什么”时,中间件不属于这三要素。要把 ADL 和 ABSD 区分开:ADL 是“描述架构的语言”,ABSD 是“基于架构的软件开发方法”,前者是表达工具,后者是开发方法。
2. 多视图模型:不是记名字,而是理解每个视图各管什么
Kruchten 的4+1 视图模型是第四章最稳定的高频考点。它包括逻辑视图、进程视图、开发视图、物理视图,再加上统一的场景。
逻辑视图主要面向功能需求,关注系统提供什么服务;开发视图关注模块的组织与管理,也常被理解成模块视图或实现视图;物理视图关注如何把软件映射到硬件和网络节点上,所以题目里“主要考虑如何把软件映射到硬件上”的就是物理视图;进程视图则侧重系统的运行特性,关注并发、性能、可用性等运行期问题,所以“侧重系统运行特性”的是进程视图;而“+1”中的场景,是把前面四个视图串起来的统一入口。
你后面给的题里还出现了 Hofmeister 的4 视图模型。它由概念视图、模块视图、执行视图和代码视图组成。这里最容易和 Kruchten 混淆。Hofmeister 模型里没有场景,也没有物理视图,重点是从概念、模块、执行和代码四个层面去说明系统。
所以多视图题的记忆方法最好不是死背,而是按职责记:
- 逻辑/概念:系统做什么
- 开发/模块:模块怎么组织
- 进程/执行:系统怎么运行
- 物理/部署:系统落在哪些节点
- 场景:用具体使用情境把视图串起来
3. 架构评估:场景是入口,ATAM 和 SAAM 是方法
架构评估方法里,SAAM 和 ATAM 都属于基于场景的方法。也就是说,它们不是抽象地谈“好不好”,而是分析软件架构对特定场景的支持程度,再判断它对这类质量需求的满足程度。
ATAM 是在 SAAM 基础上发展起来的,更强调质量属性之间的权衡分析。一个高频点是 ATAM 的四个主要活动领域:场景和需求收集、架构视图和场景实现、属性模型构造和分析、折中。这几步你不用死背成术语串,理解成“先收场景,再看架构怎么支持这些场景,再分析质量属性模型,最后做权衡”就行。
前半部分我们已经整理过场景、效用树、增长场景、非风险点这些内容。这里把逻辑再收紧一下:场景是评估的入口,效用树是场景排序工具,ATAM 是做权衡分析的方法,最后产出会落到风险点、敏感点、权衡点和非风险点这些判断上。
4. ABSDM:架构驱动开发,需求不只是功能需求
基于架构的软件开发方法 ABSDM 强调,架构不是画完就结束,而是贯穿需求、设计、文档化、复审、实现和演化全过程。前半部分已经提到它的六个主要活动,以及设计、文档化、复审是迭代过程。后半部分又补了两点很重要的认识。
第一,ABSD 采用视图/视角描述架构,用用例和质量场景描述质量需求,这说明它天然适合处理“功能 + 质量”一起驱动的复杂系统。第二,体系结构需求的来源不是简单功能罗列,而是质量目标、商业目标和开发相关目标的组合。所以 ABSD 的难点不在于画图,而在于把这些目标转化为真正能支撑开发和演化的架构。
这一层总结一下:架构描述是在说清楚,架构评估是在证明靠谱,ABSDM 是让架构真正驱动开发。
四、架构复用与特定领域架构:成熟架构不是每次重来,而是不断沉淀和复用
第四章另一条很强的主线,就是复用。架构的价值不只是做成一个系统,更重要的是形成一套可以反复利用的经验、资产和模式。
1. 架构复用:复用不是复制粘贴,而是系统化利用成熟资产
前半部分已经讲过机会复用、系统复用,以及获取、管理、使用可复用资产三个阶段。后半部分又补上了几个很容易考错的边界。
首先,横向重用指重用不同应用领域中的软件元素,比如数据结构、分类算法、人机界面构件等;纵向重用则更多发生在同类或相近业务领域中。题目里只要出现“不同应用领域中的共性软件元素”,答案一般就是横向重用。
其次,好的复用实践不是复制现有代码,而是利用已经验证的开源类库或框架来开发新系统。复制粘贴虽然表面也叫“复用”,但那是一种低水平复用,会造成冗余和维护困难;真正高质量的复用,是复用经过验证、可管理、可维护的模块和框架。
所以复用题的关键边界是:复用强调资产化和可持续,不强调临时复制。
2. DSSA:把复用从“构件级”推到“领域级”
如果说一般架构复用还是在系统之间借鉴构件和模式,那么 DSSA(特定领域软件架构)就是把复用再往上提一层,直接面向一个领域建立可重复使用的架构方案。
DSSA 的基本活动可以理解为三步:领域分析、领域设计、领域实现。领域分析阶段的主要目标是获得领域模型,也就是把该领域里一类系统的共性需求抽出来;领域设计阶段则基于领域模型形成 DSSA;领域实现阶段再依据领域模型和 DSSA 去组织可复用信息和可复用构件。
围绕 DSSA,题目还经常考四类角色:
- 领域专家:提供领域中的需求、规则和实现知识
- 领域分析人员:负责控制整个领域分析过程,做知识获取,并把知识组织到领域模型中
- 领域设计人员:负责控制整个软件设计过程,根据领域模型和现有系统开发出 DSSA,并验证 DSSA 的准确性和一致性
- 领域实现人员:负责根据领域模型和 DSSA 提取、开发和验证可复用构件
这里尤其容易错的是领域分析人员和领域设计人员。前者的关键词是“分析过程、知识获取、形成领域模型”,后者的关键词是“设计过程、形成 DSSA、建立领域模型和 DSSA 的联系”。
这一层学明白之后,你会发现 DSSA 本质上就是一句话:把一个领域里反复出现的系统经验,上升为可复用的领域模型和领域架构。
五、SOA、Web 服务与相关技术:服务化架构的考点重在边界和配套语言
第四章后半部分有一块内容会让人觉得像“杂项”:SOA、WSDL、XML、REST、微服务。其实这些都属于服务化架构及其相关技术,只是考法比较碎。把它们放在一起看,逻辑就清楚了。
1. SOA、微服务与 Web 服务:它们有关联,但不是一个层次
SOA 是一种以服务为中心的整体架构思想,强调服务封装、复用、组合与统一治理;微服务则更强调服务拆分后的独立部署、独立运维和去中心化管理。二者都是服务化思路,但粒度、治理方式和组织方式并不完全一样。
Web 服务则更像 SOA 的一种实现形式或技术载体,它关注的是服务如何被描述、发现和调用。前半部分我们已经整理过 UDDI 和 WSDL 的作用:UDDI解决“服务在哪儿找”,WSDL解决“服务能做什么、怎么访问、地址在哪儿”。
2. WSDL:重点记住三件事,而不是记一堆 XML 标签
WSDL 描述 Web 服务的三个基本属性:
- 服务做什么:服务提供哪些操作
- 如何访问服务:交互的数据格式和协议是什么
- 服务位于何处:服务地址在哪里
题目里最常见的错误干扰项,是把“谁要访问服务”塞进来。WSDL 关心的是服务能力、访问方式和访问地址,不负责规定“谁来访问”。
3. XML:它负责描述和交换数据,不负责决定怎么显示
与 Web 服务配套的另一个常考点是 XML。XML 的几个稳定认识是:结构与内容分离;可以通过命名空间解决多义性和名字冲突;XML Schema 是 XML 的一种具体应用,用来定义合法结构和约束。
最容易错的是“XML 允许各种各样的文档显示类型”。这是错的,因为 XML 本身是数据描述格式,关注的是数据及其结构,不负责展示控制。显示通常要靠 CSS、XSLT、前端程序等其他机制完成。
4. REST:要抓资源、URI、统一接口,不要把它误缩成 JSON
REST 作为一种架构风格,核心就是资源、URI 和统一接口。它充分利用 HTTP 协议已有能力,通过标准方法和状态码来操作资源。很多同学会把 REST 和 JSON 绑死,这是高频误区。JSON 很常见,但 REST 不以 JSON 为必要条件,这一点要牢牢记住。
这一大块如果压缩记忆,可以抓住这样一条链:SOA/微服务是架构思想,Web 服务是服务交互方式,WSDL 是服务说明书,XML/JSON 是可能的数据表示形式,REST 是另一种以资源为中心的架构风格。
最后把这一章压缩成一条适合考前复习的主线,可以这样理解:软件架构先回答“系统整体怎么组织”,所以会考架构概念、体系结构风格、构件和中间件;然后回答“架构怎么表达和验证”,所以会考视图、ADL、ABSDM、场景、ATAM 和 4+1 视图;接着回答“架构经验怎么沉淀和复用”,所以会考机会复用、系统复用、横向重用、DSSA 和领域角色;最后回答“服务化系统怎么落地”,所以会考 SOA、微服务、WSDL、XML 和 REST。
考前速记
如果考前速记,这一章最值得抓住的是这些点:体系结构风格定义系统家族的词汇表和约束;架构需求主要来自质量目标、商业目标和开发相关目标;批处理的数据按整体传递,规则系统包括规则集、解释器和工作内存;EDA 强调事件在独立非耦合模块间传递;微服务偏去中心化管理,SOA 偏集中式治理;中间件的作用是连接不同软件组件或系统,提供通信与集成服务;MVP 中 View 不应直接依赖 Model,Presenter 负责逻辑;ADL 三要素是构件、连接件和架构配置;ABSD 采用视图和视角描述架构,采用用例和质量场景描述需求;ATAM 和 SAAM 都是基于场景的评估方法,ATAM 包括场景收集、视图与场景实现、属性分析和折中;4+1 视图中物理视图考虑软件到硬件的映射,进程视图侧重运行特性;Hofmeister 四视图包括概念、模块、执行和代码;横向重用面向不同应用领域中的通用元素;好的复用实践是使用成熟类库和框架,不是复制粘贴;DSSA 的领域分析阶段产出领域模型,领域分析人员管分析过程,领域设计人员管 DSSA 设计;WSDL 说明服务做什么、如何访问、位于何处;XML 负责描述数据结构,不负责显示;REST 的核心是资源和 URI,不强制要求 JSON。