ARTICLE · 1068121
软件评估方法:从质量属性场景到架构权衡
哪些决策支撑了目标,哪些决策可能让目标落空,哪两个质量属性正在互相拉扯。
软件评估要交付的就是这张清单。它把"好不好"这种没法验证的判断,换成"哪里有风险、代价是多少"这种可以追踪、可以复核的表述。
一、先把边界划清楚
教材给出的定义是:在架构设计完成之后、系统实现之前,对架构满足质量属性需求的能力进行分析与验证。三个限定词决定了它的活动范围——输入是已经设计出来的架构方案,输出是对质量属性的判断,时间窗在编码之前。
四类输入
输入 | 回答的问题 | 以充电桩平台为例 |
业务目标 | 系统为什么建 | 支撑 8 家运营商桩位统一预约 |
质量属性目标 | 系统要做得多好 | 万级并发、1.5 秒响应、故障 30 秒恢复 |
质量属性场景 | 在什么条件下怎么验证 | 链路中断后 30 秒内切换备用通道 |
架构描述与决策 | 打算怎么实现 | 缓存、多副本、适配器、加密 |
时间窗为什么重要
评估放在架构评审通过之后、详细设计与编码之前,是因为这个位置同时满足两个条件:架构信息已经足够支撑分析,改动成本还没有高到无法承受。等到编码完成再发现问题,多半只能带着风险上线,评估也就变成了事后追认。
它不是这些事
评估不产出总分,不替代压力测试、故障演练、安全测试和代码审查,也不负责证明系统永远不出问题。它做的是在投入大量工程资源之前,用少量关键场景检查架构决策,把风险和冲突提前暴露出来。
谁来评
评估负责人(熟悉方法流程)、架构师(提供架构与决策依据)、项目决策者(提供业务目标与约束)、利益相关者代表(提供场景和优先级判断)。少了决策者,评估就失去商业锚点,不知道哪条质量属性更重要;少了业务侧的利益相关者,收集到的场景会明显偏向技术,缓存命中率、连接池大小这类指标挤满清单,而"结算高峰期降级运行"这种真正致命的情形反而没人提。
二、场景是评估用的尺子
只说"系统性能要高",没法评。因为还不知道谁在什么状态下发起什么请求、请求打到系统哪一部分、系统该怎么反应、达到什么数字才算合格。
质量属性场景(Quality Attribute Scenario)就是把这句空话变成一道具体试题的工具,由六个要素构成:
要素 | 含义 |
刺激源 | 产生刺激的实体:外部用户、外部系统或内部模块 |
刺激 | 到达系统的事件:请求、故障、变更请求 |
环境 | 刺激到达时系统所处的状态:正常运行、过载、降级 |
制品 | 被刺激作用的部分:整个系统或某个构件、接口 |
响应 | 系统对刺激做出的反应 |
响应度量 | 衡量响应是否达标的量化指标 |
套成一句话就是:当[刺激源]在[环境]下对[制品]施加[刺激]时,系统应[响应],且[响应度量]。
拿前面的例子填进去:当充电桩与平台之间的通信链路(刺激源)在系统正常运行状态下(环境)发生中断(刺激)时,通信与计费模块(制品)应切换到备用通道并保持已开始的计费不中断(响应),切换时间不超过 30 秒(响应度量)。
最容易踩的坑
环境指的是刺激到达时系统的内部状态,不是时间点,也不是机房、网络这类外部条件。教材原文用的是"刺激到达时制品所处的环境",这七个字被误读成"刺激什么时候发生"的概率相当高。
场景分三类
用例场景:描述系统日常运行时的预期行为,比如用户提交预约后 1.5 秒内返回桩位列表。
增长场景:描述负载增长时的表现,比如并发预约量从 2000 涨到 20000 时响应时间不超过 3 秒。
探索场景:描述极端情况下的表现,比如数据库主节点宕机后 20 秒内完成切换。
效用树
场景收集齐了,下一步是排序。真实系统的质量要求动辄几十条,评估时间有限,不可能平均投入。效用树把抽象目标逐层摊开:树根是效用,第二层是质量属性,第三层是属性细化,叶子节点是具体场景。每个叶子标注两个维度——对系统成功的重要程度(高/中/低)和实现难度(高/中/低)。
排序的主体是全部利益相关者集体投票,架构师只负责提供技术分析。评估的注意力应该压在"重要而且困难"的格子里,比如高重要度加大难度的那些场景。
三、评估方法分成三大类
市面上方法很多,按依赖什么来判断,可以归成三类:
类别 | 依据 | 代表方法 | 长处 | 局限 |
基于场景 | 具体使用情形 | SAAM、ATAM、CBAM、ARID | 贴近业务,能暴露质量属性之间的冲突 | 依赖人的判断,结论难以复现 |
基于度量 | 可计算的指标 | 耦合度、内聚度、圈复杂度、平均无故障时间、技术债 | 客观、可量化、便于横向比较 | 指标与业务价值之间隔着一段距离 |
基于模型 | 形式化或可执行的模型 | 模型检测、定理证明、性能仿真、架构原型 | 能在早期发现逻辑矛盾与性能瓶颈,安全关键系统适用 | 建模成本高,模型本身可能失真 |
三类不是互斥关系。实践中常见做法是以场景为主线组织评估过程,用度量数据给判断提供支撑,再对少数高风险部分建立模型或原型做验证。
四、基于场景的四条路线
这是考试和工程实践里最常遇到的一族,也是本篇的重点。
SAAM:最早的场景评估
Software Architecture Analysis Method,1994 年由 Kazman 等人提出,是架构评估方法的开山之作。五个步骤:开发场景,描述架构,对场景分类并排序,逐个评估间接场景,评估场景交互。
场景在这里被分成两类:当前架构已经支持的叫直接场景,需要修改架构才能支持的叫间接场景。分析的落脚点是间接场景:为了支持它,究竟得动哪些构件。
它的灵魂在第五步。如果两个间接场景都需要改同一个构件,说明这个构件同时承担了多项职责,单一职责原则很可能已经被破坏。只做单场景分析,拿不到这个结论。
SAAM 早期主要用于可修改性分析,也常用于比较多个候选方案。它不强调效用树,流程相对轻,容易被开发和非技术角色理解。
ATAM:从"支持不支持"走到"代价是什么"
Architecture Tradeoff Analysis Method,2001 年由 Kazman、Klein 等人在 SAAM 基础上发展而来,是当前工程实践和考试中的主流方法。
它要回答的问题变了。不再问"架构支不支持某个属性",而是问"为了支持属性 A,会在多大程度上损害属性 B"。这是 ATAM 相对 SAAM 最本质的改进,效用树只是它顺手引入的工具。
四个阶段、九个步骤:
阶段一 表述与收集
介绍 ATAM 的目的、流程与预期产出
描述业务驱动因素:商业目标、约束、各利益相关者的诉求
描述待评估的架构:组件、连接件、部署视图与关键设计决策
阶段二 分析与识别
识别架构方法:梳理架构中使用的风格、模式与关键策略
生成质量属性效用树:把高优先级场景整理成树并按重要度、难度标注
分析架构方法:把高优先级场景映射到架构决策,识别四类点
阶段三 场景挑战
头脑风暴并排序场景:扩大参与范围,补充架构团队没想到的场景
再次分析架构方法:用新增的高优先级场景重跑分析
阶段四 结果呈现
汇总风险、非风险、敏感点、权衡点,形成风险主题与改进建议
第 4 步和第 6 步决定评估质量。架构方法清单如果漏了,后面所有分析都建在不完整的地基上。有团队在第一次评估时只识别出 5 种架构方法,到第 8 步补充到 11 种,第 6 步的结论几乎全部推翻重来。
四类输出
类型 | 定义 | 判断句式 |
敏感点 | 某项质量属性对该架构决策高度敏感,参数一动,结果就明显变化 | 一动就变 |
权衡点 | 同一决策同时显著影响多个质量属性,彼此之间存在冲突 | 顾此失彼 |
风险点 | 该决策存在缺陷或不确定性,可能使某个质量目标无法达成 | 可能失败 |
非风险点 | 经分析确认能够支撑当前场景,后果已被理解 | 确认支持 |
三者之间有两层关系需要理清。权衡点一定是敏感点,因为它是多个质量属性的敏感点;敏感点不一定升级成权衡点,只影响一个属性的决策就够了。非风险点有边界,它只说明针对当前已分析的场景没有暴露风险,不等于这项决策永远安全,也不等于未来条件变化后仍然成立。
CBAM:在质量分析之后算经济账
Cost Benefit Analysis Method 依赖 ATAM 的产出,ATAM 找风险,CBAM 算代价。它把场景一路收敛,让利益相关者的时间集中在回报最高的部分:
整理场景:汇总 ATAM 阶段的场景并允许补充,按业务目标排序后取前三分之一
细化场景:针对刺激与响应度量,给出最差、当前、期望、最佳四档响应水平
排序场景:给每位利益相关者 100 票自由分配,汇总后取前 50%,最高票场景权重记为 1.0,其余按比例折算
分配效用:为每档质量属性响应水平确定效用值
确定架构策略的预期收益与成本
计算投资回报率并排序,给出决策建议
同样能提升可用性的两个方案,一个投入 20 万把停机时间减少 60%,另一个投入 80 万减少 70%,选哪个是 CBAM 回答的问题。它常与 ATAM 连着用:先用 ATAM 完成质量属性权衡,再用 CBAM 在预算约束下做取舍。
ARID:为做了一半的架构准备的评审
Architecture Reviews for Intermediate Designs,1997 年由 Clements 提出。它解决的是一类很现实的困境:微服务拆到一半、缓存策略还没定,外围模块根本没法用完整场景去评,但核心部分的设计已经成型,想提前发现问题怎么办。
ARID 的两点不同值得记牢。第一,评估对象是架构片段,不是完整架构。第二,场景由评估团队主动设计,而不是等利益相关者头脑风暴——因为半成品架构的使用者往往还没法提出完整场景。
它的关注点落在可复用性和组件接口设计的合理性上,目标是设计中途提前发现缺陷,避免错误被后续模块放大。
五、五种方法横向对比
方法 | 提出 | 评估对象 | 场景来源 | 核心输出 | 适用阶段 |
SAAM | 1994 | 完整架构 | 利益相关者提供 | 场景与构件的映射、场景交互分析 | 早期方案比较 |
ATAM | 2001 | 完整架构 | 效用树预设加利益相关者补充 | 敏感点、权衡点、风险、非风险 | 开发之前的权衡分析 |
CBAM | ATAM 之后 | 已通过 ATAM 的方案 | 复用 ATAM 场景并细化 | 成本、收益、投资回报率 | 预算约束下的方案选择 |
ARID | 1997 | 架构片段 | 评审团队主动设计 | 接口与复用性缺陷清单 | 设计中间阶段 |
度量法 | 各异 | 架构或代码 | 不依赖场景 | 耦合度、复杂度、可靠性指标 | 全过程,适合持续监控 |
选型可以记成四句话:场景改架构看 SAAM,属性做权衡看 ATAM,继续算经济账看 CBAM,架构只做了一半看 ARID。
六、最近三年,评估这件事变了什么
方法的主体框架十几年没大动,但评估的输入、对象和关注点都在变。
质量属性的清单更新了
ISO/IEC 25010 在 2023 年 11 月发布第二版,替代了用了十二年的 2011 版。这次修订对效用树的第二层影响直接:
新增 safety 作为顶层质量特性,下面细分出 operational constraint、risk identification、fail safe、hazard warning、safe integration
usability 更名为 interaction capability,portability 更名为 flexibility
interaction capability、security、flexibility 分别新增 inclusivity、self-descriptiveness、resistance、scalability 等子特性
user interface aesthetics 与 maturity 分别更名为 user engagement 与 faultlessness
accessibility 拆成 inclusivity 与 user assistance
含义很实际:沿用 2011 版清单画效用树,会把安全性和包容性这类诉求漏在外层。新版本还把适用对象从软件产品扩展到各类 ICT 产品与信息系统,云服务、边缘设备一并纳入。
架构描述有了更明确的合格线
ISO/IEC/IEEE 42010 第二版于 2022 年 11 月发布,把架构描述拆成利益相关者、关注点、视角、视图、架构决策与决策理由这一组概念,并要求视图之间存在一致性对应规则。相比早前的版本,2022 版强化了决策理由的记录、模型验证以及架构权衡分析的要求。
这条对评估的直接影响是:评估的输入质量第一次有了标准可依。架构描述如果不写决策理由,评估人员就只能猜设计意图,敏感点和权衡点也就无从谈起。
评估对象的重心转移了
CNCF 与 SlashData 在 2025 年 11 月发布的云原生开发现状报告给出了一组规模数据:全球云原生开发者达到 1560 万,77% 的后端开发者至少使用一项云原生技术,API 网关与微服务的采用率分别为 50% 和 46%,混合云升至 32%,多云为 26%。
数字背后是评估场景在换位置。单体时代最关心的是模块耦合和部署窗口,现在更常出现在清单上的是服务边界划分是否合理、分布式事务如何保证一致性、链路追踪能否覆盖全部调用、单点依赖藏在哪里。可用性场景的度量也从"系统宕机多久恢复"细化到"某个服务的实例故障后,流量多久完成转移"。
评估在变轻
两到三天走完 ATAM 九步,对很多迭代节奏以周计的团队来说成本偏高。轻量化做法因此流行:保留效用树和四类点的核心逻辑,把完整九步压缩成半天到一天的场景工作坊,把头脑风暴与排序环节合并,用在线投票代替现场会议。评估也从一次性活动变成随迭代周期反复进行的例行检查。
AI 能帮上什么,帮不上什么
用大模型把零散的需求文档整理成结构化场景、补全缺失的要素、生成候选场景清单,是目前比较务实的用法。它省下的是整理和归纳的时间。
但有几条界限需要守住:模型给出的场景排序不能替代利益相关者的投票,因为优先级本质上是业务取舍;模型识别出的"风险"必须回到具体场景和架构决策上验证,否则只是措辞猜测;压力测试、故障演练和安全测试仍然只能真做。评估的价值在于发现需要验证的地方,不在于宣称已经验证过。
七、几道例题
例题一:判断质量属性
某市拟建"城市充电桩预约与结算平台",需求方在评审前提交了下面一组要求,请指出每条对应的质量属性,并说明判断依据。
(a)用车高峰期,用户提交预约请求后,系统应在 1.5 秒内返回可用桩位列表。 (b)充电桩与平台的通信链路中断后,系统应在 30 秒内切换到备用通道,切换期间已开始的计费不中断。 (c)接入一家新运营商的工作量不超过 5 人日,且不修改既有结算模块。 (d)所有计费与退款操作需留有不可篡改的操作日志,可按用户和时间检索,供事后审计。 (e)平台需提供桩位状态与计费结果的查询接口,供测试团队编写自动化用例,接口覆盖率不低于 85%。 (f)新用户从打开小程序到完成首次预约,操作步骤不超过 4 步,并支持大字模式。 (g)用户名以字母开头,由数字和字母组成,长度不少于 6 位。
参考答案
(a)性能。刺激是提交预约请求,度量是响应时间 1.5 秒,属于典型的延迟指标。 (b)可用性。刺激是链路中断这一故障事件,响应是切换通道并保持计费连续,度量是 30 秒内完成。 (c)可修改性。度量单位是人日和工作影响范围,衡量的是变更成本,不是功能本身。 (d)安全性。关注的是操作的不可抵赖与可审计,属于安全属性中的审计与完整性要求。 (e)可测试性。要求系统暴露可观测的内部状态与接口,方便构建测试用例,度量是接口覆盖率。 (f)易用性。评价对象是使用者完成任务的难易程度,度量是操作步数与无障碍支持。 (g)设计约束。它规定的是形式规则,没有响应行为和度量指标,不属于质量属性,这一点在效用树里不应该出现在叶子节点上。
例题二:补全六要素
请用质量属性场景的六个要素描述上述要求(b)。
参考答案
要素 | 内容 |
刺激源 | 充电桩与平台之间的通信链路 |
刺激 | 链路中断 |
环境 | 系统正常运行状态 |
制品 | 通信与计费模块 |
响应 | 切换到备用通道,已开始的计费不中断 |
响应度量 | 切换时间不超过 30 秒 |
例题三:识别四类点
平台当前的架构决策是:使用 Redis 缓存热点桩位数据;所有应用实例共用同一套 Redis 主节点且未配置高可用;为满足合规要求,对桩位与计费数据全程启用国密算法加密;应用实例多副本部署,配合健康检查,故障演练显示 30 秒内可完成流量转移。
请各指出一处敏感点、权衡点和风险点,并说明理由。
参考答案
敏感点:热点桩位数据的缓存过期时间设置。它直接决定数据库的读压力与预约请求的响应时间,参数一动,性能结果就明显变化。
权衡点:全链路启用国密算法加密。这条决策同时作用于安全性和性能:安全性上升,加解密带来的计算开销让响应时间变长,属于两个质量属性之间的取舍,符合权衡点的"同时影响多个属性"。
风险点:所有应用实例共用单套无高可用的 Redis 主节点。Redis 一旦故障,全部实例无法读取热点数据,预约服务整体不可用,直接冲击"链路中断后 30 秒内恢复"的可用性目标。注意这里的关键不是"Redis 有风险"这种笼统表述,而是它可能让某个具体场景失败。
补充一点:多副本加健康检查、30 秒内完成流量转移这条,经故障演练验证后可以作为非风险点,但它只针对当前已验证的场景成立。
例题四:选方法
情形 | 选择 |
只完成核心结算模块的架构,外围尚未设计,需要在开发前先行评审 | ARID |
两套候选架构均已完成设计,需要比较哪一套在接入新运营商时改动更小 | SAAM |
需要系统性识别性能、可用性、安全性之间的冲突与风险点 | ATAM |
在满足质量要求的前提下,比较两个方案三年内的投入产出 | CBAM |
八、答题与落地的通用骨架
案例题问"请采用 ATAM 评估该系统的架构",可以按下面的顺序组织:
先收集业务目标、质量属性需求、利益相关者关注点和架构描述,把质量要求细化成可度量的场景,建立效用树并按重要度与难度排序。然后把高优先级场景映射到架构风格、构件、接口和关键决策上,分析系统在刺激下的响应是否达到度量目标,识别敏感点、权衡点、风险和非风险,并归纳风险主题。最后汇总结果,提出改进措施,并说明用压力测试、故障演练或安全测试来验证。
分析具体问题时用这个句式:针对【质量属性场景】,分析【架构决策】。由于【原因】,该决策会导致【质量属性后果】,因此属于【敏感点/权衡点/风险/非风险】。建议采用【改进措施】,并通过【度量或测试】验证。
把例题三的第一条填进去:针对链路中断后 30 秒内恢复的可用性场景,分析所有应用实例共用单套无高可用 Redis 的架构决策。由于 Redis 故障会使全部实例无法读取热点数据,该决策可能使服务连续性目标失败,因此属于可用性风险。建议为 Redis 配置高可用与故障转移机制,并通过故障注入验证恢复时间是否不超过 30 秒。
四条需要记住的边界
敏感点不等于风险。连接池大小对性能很敏感,但只有它可能让场景失败时才构成风险。
权衡点不等于缺陷。权衡点说明必须取舍,架构师能说明选择理由、控制副作用并完成验证,它就不是错误。
非风险不等于永久正确。它只针对当前场景和已知条件,业务规模、部署环境或质量目标一变,需要重新评估。
ATAM 不等于性能测试。它能发现需要验证的性能风险和敏感参数,替代不了真实的压力测试。
评估报告如果不转化成架构修改和验证任务,就只是纸面成果。