软件架构方法论:ABSD、DSSA、SAAM、ATAM、CBAM 与 Architectural Thinking

软件架构并不是画出一张组件关系图就结束了。从领域共性提炼、架构设计,到质量属性评估、风险与权衡分析,再到成本收益决策,不同阶段需要解决完全不同的问题。本文系统整理 ABSD、DSSA、SAAM、ATAM、CBAM 与 Architectural Thinking,重点说明它们各自解决什么问题、核心流程是什么、彼此如何衔接,以及如何在真实软件项目中组合使用。

软件架构方法论解决的并不是同一个问题

第一次接触 ABSD、DSSA、SAAM、ATAM、CBAM 时,很容易产生一种错觉:它们似乎都是“设计软件架构的方法”,只是名字不同。

实际上并不是这样。

这些方法处于软件架构工作的不同位置:有的方法负责设计架构,有的方法负责从整个领域中提炼可复用参考架构,有的方法负责评估架构,还有的方法进一步把架构决策转换为经济决策。

SEI 在长期的软件架构研究中形成了从 Architecture-Based Development、SAAM、ATAM 到 CBAM 等一系列架构中心方法;DSSA 则来自领域工程与系统化软件复用方向。IBM 的 Architectural Thinking 又提供了另一种偏向“统一架构思考过程和架构制品”的企业实践视角。

先建立一个整体认识:

方法 全称 核心问题 主要产物
ABSD Architecture-Based Software Design / Development 语境 一个具体系统如何围绕架构进行设计和开发 架构需求、概念架构、构件、视图、架构文档
DSSA Domain-Specific Software Architecture 一个领域中的一类系统如何形成可复用架构 领域模型、共性/可变性模型、领域参考架构、可复用资产
SAAM Software Architecture Analysis Method 架构面对具体变化场景时是否容易修改 场景、变化影响、构件交互影响、架构评价
ATAM Architecture Tradeoff Analysis Method 多个质量属性之间如何分析风险与权衡 Utility Tree、风险、非风险、敏感点、权衡点
CBAM Cost Benefit Analysis Method 多个架构策略都可行时,哪一个更值得投资 收益、成本、进度、风险、架构投资优先级
AT Architectural Thinking 架构师如何稳定、系统地思考并表达架构 需求、架构决策、组件模型、运行模型、架构视图等

它们可以形成一个很有用的认知框架:

flowchart LR
    DOMAIN[领域知识与既有系统] --> DSSA[DSSA<br/>领域工程与参考架构]
    DSSA --> REUSE[领域模型<br/>参考架构<br/>可复用资产]

    REQ[业务目标<br/>功能需求<br/>质量属性<br/>约束] --> AT[Architectural Thinking<br/>组织架构思考]
    REUSE --> DESIGN[ABSD / ABD<br/>架构设计]
    AT --> DESIGN

    DESIGN --> ARCH[候选软件架构]

    ARCH --> SAAM[SAAM<br/>场景分析]
    ARCH --> ATAM[ATAM<br/>质量属性权衡]

    SAAM --> IMPROVE[架构改进]
    ATAM --> IMPROVE
    IMPROVE --> ARCH

    ATAM --> CBAM[CBAM<br/>经济分析]
    CBAM --> ROADMAP[架构投资与演进路线]

这张图不是任何标准规定的强制流程,而是把这些方法放到实际项目生命周期中的一种组合方式。最关键的是理解它们各自承担的职责,而不是试图选一个方法包打天下。


先解决两个很容易混淆的名称问题

ABSD、ABD 与 Architecture-Based Development

国内的软件架构教材和系统架构设计师考试资料通常使用 ABSD(Architecture-Based Software Design / Development) 来描述“基于架构的软件开发”,并经常总结为:

架构需求 → 架构设计 → 架构文档化 → 架构复审 → 架构实现 → 架构演化。

同时强调三个基础:功能分解、通过架构风格满足质量与商业需求、使用软件模板。

但回到 SEI 的原始文献,会看到两个更准确的名称。

1999 年 Bass 和 Kazman 发布了 Architecture-Based Development,讨论以软件架构为中心进行系统开发,包括架构需求、设计、文档、评价、实现和维护。

2000 年 Bachmann、Bass 等人又正式提出 Architecture Based Design(ABD)。ABD 关注产品线或长生命周期系统的高层软件架构设计,并以功能需求、质量需求和商业需求为输入,输出概念架构以及约束构件实现方式的软件模板。

因此本文会沿用国内更常见的 ABSD 说法,但需要知道:

国内教材中的 ABSD 是一种经过课程体系重新组织后的“基于架构的软件开发方法”表述;SEI 原始资料中的 Architecture-Based Development 和 ABD 与它高度相关,但名称和过程边界并非完全相同。

理解这个差异,遇到英文原始资料时就不会产生“为什么搜不到 ABSD 官方标准”的困惑。

AT 与 ATAM 完全不是一回事

ATAM 是 SEI 正式提出的 Architecture Tradeoff Analysis Method,有明确的方法、步骤和评价产物。

而本文所说的 AT 指 Architectural Thinking。

IBM 确实存在名为 Architectural Thinking 的课程和能力体系,其目标是通过共同的思考过程以及共同的架构制品,让架构师能够以可重复、一致的方式开发和交流 IT Architecture。IBM 列出的能力包括 Architecture Requirements、Non-functional Requirements、Architecture Decisions、Component Models、Operational Models、Architecture Principles、Technical Reviews 等。

不过,“AT”并不是像 SAAM、ATAM、CBAM 那样由 SEI 定义并具有统一国际标准流程的缩写。国内一些架构课程和技术文章会把 Architectural Thinking 简称为 AT,并进一步归纳为“需求驱动 + 多视角”的架构思维框架。

因此后面谈 AT 时,更准确的理解应该是:

Architectural Thinking 是一种组织架构思考、决策、建模和沟通的方法框架,而不是一套与 ATAM 同性质的标准化架构评价算法。


ABSD:让架构真正驱动软件开发

从“写功能”转向“先确定系统骨架”

传统软件开发容易形成这样的路径:

1
2
3
4
5
6
7
8
9
10
11
12
13
需求
↓
功能模块
↓
详细设计
↓
编码
↓
集成
↓
发现性能、可用性、扩展性问题
↓
重新调整架构

问题在于,性能、安全、可靠性、可修改性等质量属性往往不是某一个类、某一个方法能够在开发后期补上的,它们大量取决于早期的架构决策。

Architecture-Based Development 的思想正好相反:除了普通功能需求,还需要识别架构需求(Architectural Requirements),让这些需求参与架构设计,并让架构继续指导文档、评价、实现和演化。

例如一个结算系统不仅有:

1
2
3
4
5
生成结算单
执行结算
对账
审核
付款

还可能有:

1
2
3
4
5
6
大规模批量处理能力
数据一致性
失败恢复
审计追踪
安全隔离
未来新增结算类型时的可修改性

后一组要求往往比“有没有一个 SettlementController”更能决定系统最终应该长成什么样。

ABSD 的三个重要基础

国内 ABSD 教材通常将其概括为三个基础。

功能分解

架构仍然需要首先回答:

系统到底由哪些职责组成?

例如:

1
2
3
4
5
6
7
结算平台
├── 结算管理
├── 结算计算
├── 对账
├── 费用处理
├── 审核
└── 收付款

然后继续递归细化:

1
2
3
4
5
6
7
结算计算
├── 获取结算范围
├── 汇总业务单据
├── 费用计算
├── 应收应付计算
├── 生成结算明细
└── 生成结算结果

功能分解仍然遵循高内聚、低耦合、职责清晰等基本设计原则。

但仅仅做功能分解是不够的。

通过架构风格满足质量属性与商业要求

假设系统存在:

1
2
3
4
长时间任务
大量批处理
需要失败重试
服务之间需要解耦

那么就可能进一步得到:

1
2
3
4
5
异步任务
事件驱动
消息队列
任务状态机
幂等机制

其因果链应该是:

1
2
3
4
5
6
7
8
9
业务目标
↓
质量属性
↓
架构问题
↓
架构策略 / 架构风格
↓
技术方案

而不是:

1
2
3
听说 Kafka 很厉害
↓
项目里放一个 Kafka

SEI 的 ABD 明确强调,设计需要同时满足 functional、quality 和 business requirements,并理解实现这些要求所依赖的 architecture mechanisms。

软件模板

ABD 的另一个重要输出是 Software Template。模板并不仅仅意味着“代码模板”,而是规定某一类构件应该如何实现、如何使用共享服务、需要承担哪些公共责任。

放到现代 Java 企业应用中,可以理解成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
所有 Application Service
↓
统一事务边界

所有 REST API
↓
统一鉴权、异常、响应规范

所有领域事件
↓
统一 Outbox / 消息发送机制

所有数据实体
↓
统一审计字段、租户字段

所有服务
↓
统一日志、Trace、Metrics、Health Check

它的价值在于:

架构不只告诉你“有哪些组件”,还告诉开发者“这种组件应该怎样正确地活在整个系统里”。

ABSD 的六个过程

在国内常见的 ABSD 模型中,整个过程被组织为六个阶段。

flowchart LR
    A[架构需求] --> B[架构设计]
    B --> C[架构文档化]
    C --> D[架构复审]
    D --> E[架构实现]
    E --> F[架构演化]

    D -.发现问题.-> B
    F -.新需求.-> A

架构需求

这一阶段不是把全部需求重新做一遍,而是找出真正能够影响架构的需求。

通常包括:

  • 业务目标;
  • 核心功能;
  • 质量属性;
  • 技术和组织约束;
  • 外部系统;
  • 系统边界;
  • 关键场景。

例如“用户可以查询结算单”通常不会单独决定架构,但“结算历史必须可长期审计”“核心任务失败后必须可以恢复”“多个业务线具有不同结算规则”就很可能属于 Architecturally Significant Requirements。

架构设计

把架构需求映射为:

1
2
3
4
5
6
7
8
9
子系统
构件
接口
连接关系
数据流
控制流
架构风格
架构机制
部署结构

这一阶段真正需要回答的是:

为什么这样分?
为什么这里使用异步?
为什么这里必须隔离?
为什么这里允许共享数据库,而那里不允许?

架构图只是结果,决策逻辑才是架构设计的核心。

架构文档化

好的架构不应该只存在于架构师的大脑里。

需要把它表达成多个视图,例如:

1
2
3
4
5
6
System Context
Application View
Component View
Data View
Runtime View
Deployment View

并记录重要的 Architecture Decision。

否则半年之后很容易出现经典场面:

“这个 Kafka 为什么存在?”

团队面面相觑,最后只能回答:“听说以前架构师要求的。”

架构复审

复审的目的不是看图画得漂不漂亮,而是提前发现架构风险。

典型问题包括:

1
2
3
4
5
6
7
质量属性是否真正得到支持?
有没有明显单点?
构件职责是否混乱?
重要依赖是否反向?
部署方案能否实现预期可用性?
数据一致性方案是否闭环?
某些架构决策是否只有假设,没有证据?

SAAM 和 ATAM 等评价方法可以在这一阶段进一步发挥作用。

架构实现

架构开始从概念变成真实系统:

1
2
3
4
5
6
7
8
9
10
11
Architecture
↓
Module
↓
Component
↓
Interface
↓
Class
↓
Process / Container

架构实现还存在一个很容易被忽略的问题:

实际代码是否仍然符合架构?

如果架构规定:

1
2
3
4
5
Domain
↑
Application
↑
Adapter

但开发三个月以后变成:

1
2
3
4
5
6
7
Controller
↓
Mapper
↓
Database
↑
Domain Service

那么文档里的架构已经不再是系统的真实架构。

架构演化

软件架构不是一次性制品。

需求改变、基础设施改变、流量模型改变、组织边界改变,都可能推动架构演化。Architecture-Based Development 本身也把架构维护视为架构中心开发过程的一部分。

所以真正的过程应该是:

1
2
3
4
5
6
7
8
9
10
11
12
13
需求变化
↓
影响分析
↓
架构决策变化
↓
更新架构
↓
修改实现
↓
验证
↓
更新文档

而不是只改代码,不改架构。


DSSA:从“做一个系统”提升到“做一个领域”

ABSD 面对的通常是具体系统,而 DSSA(Domain-Specific Software Architecture) 把视野放得更大:

如果公司反复开发同一领域中的相似系统,能不能先研究这一族系统的共同规律,再建立一套领域参考架构?

SEI 在 1993 年发布的 DSSA Process Life Cycle 报告描述了早期 DARPA/GTE DSSA 项目形成的领域特定软件架构生命周期。DSSA 背后的重要目标正是通过领域知识和架构资产实现更系统的软件复用。

DSSA 关注的是“一族系统”

例如公司存在:

1
2
3
4
5
联营结算
供应商结算
加盟商结算
渠道结算
佣金结算

传统开发容易变成:

1
2
3
4
5
6
7
8
联营结算项目
└── 自己实现一套账期、对账、审核、付款

供应商结算项目
└── 再实现一套账期、对账、审核、付款

渠道结算项目
└── 又实现一套账期、对账、审核、付款

DSSA 会换一个问题:

这些系统到底哪些东西是共同的,哪些东西真正不同?

于是可以得到:

类型 示例
共性 结算主体、结算周期、结算单、结算明细、应收应付、费用、对账、审核
可变性 结算规则、费用规则、结算对象、审批流程、数据来源、付款策略

这一步非常重要。

DSSA 的核心并不是“把公共代码抽成 common.jar”,而是寻找:

Commonality(共性) + Variability(可变性)。

领域工程同样强调通过已有系统、领域知识和各种需求资料发现领域中的 commonality、variability 和 dependency,并据此建立领域模型。

领域分析:这个领域到底是什么

Domain Analysis 主要研究问题空间。

输入可能来自:

1
2
3
4
5
6
7
已有系统
需求文档
行业标准
领域专家
用户手册
业务流程
历史架构

分析的重点包括:

1
2
3
4
5
6
7
8
9
领域边界
领域术语
核心概念
业务能力
共性
可变性
依赖关系
质量属性
未来可能的变化

例如结算领域可能形成:

1
2
3
4
5
6
7
8
9
10
SettlementSubject
SettlementPeriod
SettlementBill
SettlementItem
SettlementRule
Reconciliation
Fee
Receivable
Payable
Payment

这时候还不能急着说:

1
SettlementBill 就是一张 MySQL 表

因为领域分析是在研究问题空间,还没有必要过早绑定具体技术实现。

领域设计:把领域知识转化为参考架构

Domain Design 开始进入解决方案空间。

研究需要哪些模块:

1
2
3
4
5
6
结算核心
规则计算
费用
对账
审核
资金

然后识别模块之间的依赖和交互机制。

例如:

flowchart LR
    SOURCE[业务数据源] --> COLLECT[数据归集]
    COLLECT --> CORE[结算核心]

    RULE[规则引擎] --> CORE
    FEE[费用模块] --> CORE

    CORE --> BILL[结算单]
    BILL --> RECON[对账]
    RECON --> APPROVAL[审核]
    APPROVAL --> PAYMENT[收付款]

    EXT[业务扩展点] -.策略扩展.-> RULE

领域设计的目标不是得到某一个系统的唯一结构,而是形成能够容纳多个领域变体的参考架构。

相关领域工程研究通常把这一阶段的目标描述为设计一个或一组 DSSA,并规定它们的选择、应用方式以及公共/可变构件。

领域实现:把参考架构变成可复用资产

只有参考架构图,还不能产生真正的复用价值。

领域实现还需要把架构落成:

1
2
3
4
5
6
7
8
9
10
Framework
SDK
Starter
公共服务
共享组件
扩展接口
领域 DSL
模板工程
代码生成器
测试套件

例如:

1
2
3
4
5
6
settlement-core
settlement-rule-api
settlement-reconciliation
settlement-fee
settlement-payment
settlement-audit

并明确变化点:

1
2
3
4
public interface SettlementRule {

SettlementResult calculate(SettlementContext context);
}

具体业务实现自己的策略:

1
2
3
JointOperationSettlementRule
SupplierSettlementRule
ChannelSettlementRule

于是:

1
2
3
4
5
6
7
8
9
领域能力
↓
参考架构
↓
稳定内核 + 显式扩展点
↓
不同业务配置/扩展
↓
形成多个具体系统

这才是 DSSA 所追求的架构级复用。

DSSA 和 DDD 并不是一回事

DSSA 和 Domain-Driven Design 很容易放到一起理解,因为二者都强调“领域”。

但关注点不同。

DDD 更关注:

1
2
3
4
5
6
7
8
9
复杂业务知识
↓
领域模型
↓
Bounded Context
↓
Entity / Value Object / Aggregate
↓
业务模型与代码保持一致

DSSA 更关注:

1
2
3
4
5
6
7
8
9
10
11
一族相似系统
↓
分析共性与可变性
↓
领域模型
↓
领域参考架构
↓
可复用架构资产
↓
多个具体产品

可以粗略记成:

DDD 主要解决复杂业务怎样建模;DSSA 主要解决同一领域的一族系统怎样进行系统化架构复用。

实际工程完全可以使用 DDD 建模领域,再通过 DSSA/Product Line 思想沉淀跨产品的参考架构,两者并不冲突。


SAAM:不要问“架构好不好”,要拿场景来试

设计完架构之后,一个非常麻烦的问题出现了:

怎么证明这个架构是好的?

“结构清晰”“高内聚低耦合”“扩展性不错”都非常主观。

SAAM(Software Architecture Analysis Method)解决这个问题的突破口是:

使用具体场景去测试架构。

SEI 将 SAAM 视为其最早的软件架构分析方法之一,并指出 SAAM 引入了 Quality Attribute Scenario,通过具体变化测试架构对于可修改性及其他质量属性的支持能力;它也直接推动了后来的 ATAM。

把抽象质量属性变成具体场景

例如说:

系统必须具有良好的可修改性。

几乎没有分析价值。

改成:

新增一种结算业务时,不修改结算核心,只增加一个新的规则实现即可接入。

这就可以分析。

再比如:

1
2
3
4
5
6
新增一种支付渠道
替换数据库
修改认证方式
增加一种报表
部署到新的平台
新增一个协议适配器

它们都是可以真正“打到架构上”的场景。

Direct Scenario 与 Indirect Scenario

在演进后的 SAAM 场景分析中,场景可以进一步区分为:

Direct Scenario

现有架构能够直接支持,不要求结构性修改。

例如:

1
2
3
4
5
增加一种已经预留 Strategy SPI 的结算规则

SettlementRule
↑
新增实现

这种变化已经被架构设计预见。

Indirect Scenario

为了支持这个场景,需要修改现有架构元素。

例如:

1
2
3
4
5
6
7
8
9
10
新结算业务要求每种规则拥有完全不同的数据存储模型

当前:
Rule → 共享数据模型

变化:
Rule → 独立数据模型

结果:
需要修改 Core、Repository、Schema、接口

SEI 的场景化架构分析文献明确使用了 direct / indirect 的区分:如果场景需要改变现有构件或连接,就属于 indirect scenario,并应进一步描述变化范围和成本。

Scenario Interaction:比“改了几个类”更重要

假设存在三个变化:

1
2
3
场景 A:新增结算类型
场景 B:修改费用规则
场景 C:新增对账方式

结果发现它们都需要修改:

1
SettlementService

这就是值得警惕的架构信号。

因为原本看起来完全不同的业务变化,全部集中打到一个构件上,意味着这个构件可能承担了过多职责。

因此 SAAM 不只关心:

一个场景需要修改多少地方?

还关心:

多个不同场景是不是总在修改同一个地方?

这就是 Scenario Interaction 的价值。

SAAM 的步骤为什么有“五步”和其他版本

早期 SAAM 文献给出的五项主要活动是:

  1. 描述领域典型的功能划分;
  2. 将功能划分映射到架构结构;
  3. 选择需要评价的质量属性;
  4. 选择能够测试这些质量属性的具体任务;
  5. 评价架构对各任务的支持程度。

随着实践发展,SEI 后来的 scenario-based analysis 又逐渐形成更加场景化的执行方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
描述候选架构
↓
开发场景
↓
逐个评价场景
↓
识别 Direct / Indirect
↓
分析修改影响
↓
分析 Scenario Interaction
↓
形成整体评价

SEI 自己也明确说明,随着实际架构分析经验增加,SAAM 的 prescribed steps 发生过演进,所以不同教材看到的流程数量不完全一致并不奇怪。

真正应该记住的不是“五还是六”,而是:

场景 → 映射到架构 → 分析变化影响 → 分析场景之间的交互 → 判断架构对质量属性的支持。

SAAM 的优势和边界

SAAM 特别适合:

1
2
3
4
5
6
架构方案比较
遗留系统重构
插件化设计评价
框架扩展性分析
可修改性分析
产品线变化影响分析

它最大的优点是非常具体。

但它也有明显边界:当系统同时存在性能、安全、可用性、可修改性等大量质量属性,而且这些属性之间还存在冲突时,仅仅分析“某个变化要修改多少构件”已经不够。

这正是 ATAM 要解决的问题。


ATAM:真正困难的是质量属性之间的 Tradeoff

软件架构不存在无代价的“全都要”。

例如:

1
2
3
增加缓存
→ 性能提高
→ 一致性复杂度增加
1
2
3
增加冗余
→ 可用性提高
→ 成本和运维复杂度提高
1
2
3
大量服务拆分
→ 独立演进能力提高
→ 分布式调用和数据一致性复杂度增加
1
2
3
严格安全检查
→ 安全性提高
→ 延迟和使用复杂度可能增加

因此真正的软件架构问题通常不是:

能不能实现?

而是:

为了获得某项质量属性,需要牺牲什么?

这就是 ATAM(Architecture Tradeoff Analysis Method)的核心。

SEI 将 ATAM 定义为一种根据 Quality Attribute Goals 评价软件架构的方法,它不仅寻找单个质量属性是否满足要求,还分析不同质量属性之间如何相互影响,从而暴露可能威胁业务目标的架构风险。

ATAM 从 Business Driver 开始

ATAM 有一个很重要的特点:

不从技术开始,而从 Business Driver 开始。

例如:

1
2
3
4
5
业务目标
├── 关键业务不中断
├── 支持后续业务快速变化
├── 控制基础设施成本
└── 满足安全合规

然后映射:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
关键业务不中断
↓
Availability

快速变化
↓
Modifiability

控制资源成本
↓
Performance / Scalability / Cost Constraint

安全合规
↓
Security

于是建立:

1
2
3
4
5
6
7
Business Goal
↓
Quality Attribute
↓
Scenario
↓
Architecture Decision

架构评价终于不再是:

“我感觉 Redis + Kafka + Kubernetes 很先进。”

而变成:

“这个架构决策到底支持了哪个业务目标?”

Utility Tree:给质量属性建立层次

ATAM 中很有代表性的制品是 Utility Tree(效用树)。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Utility
├── Availability
│ ├── 单实例故障时服务继续工作
│ └── 依赖服务短暂不可用时可以恢复
│
├── Performance
│ ├── 核心查询满足目标响应要求
│ └── 批处理不会拖垮在线请求
│
├── Modifiability
│ ├── 新增结算类型
│ └── 替换规则实现
│
└── Security
├── 越权访问必须被拒绝
└── 敏感操作具有审计记录

这里最重要的变化是:

1
Performance

不再只是一个抽象单词,而是继续落到:

1
2
3
4
5
刺激
环境
目标对象
响应
响应度量

形成可以分析的具体场景。

SEI 的 ATAM 流程要求将性能、可用性、安全、可修改性、可用性等系统 utility 一直细化到场景级,并进行优先级排序。

ATAM 的九个步骤

SEI 当前公开的 ATAM 方法包含九个步骤。

1. Present the ATAM

说明:

1
2
3
4
为什么做评价
怎么评价
谁参与
输出什么

这一步看起来像会议开场,其实非常重要。

如果业务方认为这是“架构师技术评审会”,业务目标很可能根本进不了评价过程。

2. Present Business Drivers

由项目负责人、客户或业务代表说明:

1
2
3
4
5
业务目标
商业约束
关键成功因素
主要风险
时间压力

这里确定的是整个评价过程的方向。

3. Present Architecture

架构师描述当前候选架构,并重点解释:

架构如何支持这些 Business Drivers?

而不是从第一页开始念组件名称。

4. Identify Architectural Approaches

识别重要架构策略,例如:

1
2
3
4
5
6
7
8
事件驱动
分层架构
缓存
数据分片
冗余部署
Failover
异步处理
插件化

此时先找出来,不急着立刻下结论。

5. Generate Quality Attribute Utility Tree

把业务目标转化为质量属性,再转换为场景并排序。

flowchart TD
    U[Utility]
    U --> A[Availability]
    U --> P[Performance]
    U --> M[Modifiability]
    U --> S[Security]

    A --> A1[故障恢复场景]
    P --> P1[高负载场景]
    M --> M1[新增业务类型场景]
    S --> S1[越权访问场景]

6. Analyze Architectural Approaches

使用高优先级场景分析架构策略,识别:

1
2
3
4
Risk
Non-Risk
Sensitivity Point
Tradeoff Point

7. Brainstorm and Prioritize Scenarios

让更多干系人参与场景生成。

因为架构师自己写出来的场景,很可能天然偏向自己的设计。

运维、安全、开发、产品、业务负责人看到的风险往往完全不同。

8. Analyze Architectural Approaches Again

使用干系人共同产生并排序后的高优先级场景,再次评价架构。

这一轮通常会暴露之前没有看到的问题。

9. Present Results

最终产出不是:

1
通过 / 不通过

而是一套结构化知识:

1
2
3
4
5
6
7
8
架构策略
Utility Tree
场景
风险
非风险
敏感点
权衡点
风险主题

SEI 对 ATAM 输出的描述正包括这些内容,并特别强调评价的价值在于尽早识别风险、澄清质量属性需求、改善架构文档以及形成架构决策依据。

Risk 与 Non-Risk

假设:

1
2
3
Availability Scenario
↓
数据库节点故障后系统仍应继续提供核心服务

当前设计:

1
2
3
Application × N
↓
Single Database

那么:

1
Single Database

就可能成为一个 Risk。

反过来,如果已经有:

1
2
3
4
健康检查
故障检测
主备切换
恢复演练

并且这些设计能够支持对应场景,就可能被记录为 Non-Risk。

Non-Risk 并不是说:

永远不会出问题。

它的意思更接近:

在当前需求和假设条件下,这项架构决策有充分理由被认为能够支持目标质量属性。

Sensitivity Point

Sensitivity Point(敏感点)表示:

某个架构参数或架构决策发生变化时,会显著影响某个质量属性。

例如:

1
2
3
4
缓存 TTL
↓
Performance
Consistency

或者:

1
2
3
4
5
线程池大小
↓
Throughput
Latency
Resource Consumption

这些地方通常值得重点测试和监控。

Tradeoff Point

Tradeoff Point 更进一步:

某个架构决策同时影响多个质量属性,而且这些影响之间可能相互冲突。

例如缓存:

1
2
3
4
5
缓存
├── + Performance
├── + Availability(某些读取场景)
├── - Consistency Complexity
└── - Operational Complexity

又比如拆微服务:

1
2
3
4
5
6
7
服务拆分
├── + Independent Deployability
├── + Team Autonomy
├── + Scalability
├── - Distributed Transaction Complexity
├── - Observability Complexity
└── - Network Failure Risk

这才是 ATAM 中“Tradeoff”真正有价值的地方。


SAAM 和 ATAM 到底是什么关系

SEI 对自身架构评价方法的历史总结非常明确:SAAM 是较早的场景化软件架构分析方法,并直接推动了 ATAM;ATAM 则进一步面向一组质量属性进行架构评价。

因此可以这样理解:

1
2
3
4
5
6
7
SAAM
↓
拿场景测试架构
↓
这个变化会影响哪些构件?
↓
架构是否容易修改?

而 ATAM:

1
2
3
4
5
6
7
8
9
10
11
ATAM
↓
业务目标
↓
多个质量属性
↓
场景
↓
架构策略
↓
Risk / Sensitivity / Tradeoff

二者并不是:

1
旧方法 vs 新方法

这么简单。

SAAM 的思维依然非常有用,尤其是在可修改性、演化影响和架构方案比较方面;ATAM 更适合复杂系统中的多质量属性权衡和系统性风险识别。

可以粗略记成:

SAAM 重点问“这个场景来了要改哪里”;ATAM 进一步问“这些架构决策对不同质量属性分别有什么影响,彼此又有什么冲突”。


CBAM:技术上都能做,钱应该投在哪里

ATAM 可以告诉你:

1
2
3
4
5
6
7
8
9
10
11
方案 A:
可用性高
成本高

方案 B:
性能好
可修改性一般

方案 C:
扩展性好
开发复杂

但管理层最后还是要问一句:

所以到底选哪个?

这时候仅仅讨论技术 Tradeoff 已经不够了。

因为企业的软件架构永远受制于:

1
2
3
4
5
6
预算
时间
人力
机会成本
实施风险
维护成本

这就是 CBAM(Cost Benefit Analysis Method) 的问题空间。

SEI 对 CBAM 的定义非常明确:它通过分析架构决策带来的收益、真实开发成本、风险和进度影响,帮助组织在有限资源下比较多个架构选项。

ATAM 解决技术权衡,CBAM 增加经济权衡

SEI 在研究 ATAM 与 CBAM 集成时指出:

  • ATAM 提供技术 Tradeoff 和 Risk 的分析框架;
  • 但 ATAM 本身不负责经济权衡;
  • CBAM 将优先级、成本和收益加入架构决策;
  • 最终可以把架构决策纳入更长期的软件设计和演进路线。

关系可以表示为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Business Goal
↓
Quality Attribute
↓
ATAM
↓
Architecture Strategy
↓
技术收益 / 风险 / Tradeoff
↓
CBAM
↓
Benefit + Cost + Schedule + Risk
↓
Architecture Investment Decision

为什么只比较 Cost 不够

假设有三个方案:

1
2
3
方案 A:异地多活
方案 B:同城多 AZ
方案 C:主备 + 强化备份恢复

单纯问:

1
哪个最便宜?

没有意义。

应该问:

1
2
3
4
5
6
7
8
9
成本是多少?
+
能改善哪些质量属性?
+
业务从中获得多少收益?
+
实施需要多久?
+
存在多大不确定性?

CBAM 强调的正是:

不能只分析 Architecture Cost,还要分析 Architecture Benefit。

SEI 甚至特别指出,企业往往只计算“建设系统的成本”,却忽略维护和升级成本,而架构选择真正需要面对的是整个生命周期中的资源竞争。

CBAM 的六个步骤

SEI 当前介绍的 CBAM Process 包含六步。

1. Choose Scenarios and Architectural Strategies

选出重要质量属性场景,再提出能够改善这些场景的架构策略。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Scenario
↓
结算计算任务失败后需要可靠恢复

Strategy A
↓
任务表 + 重试机制

Strategy B
↓
事件驱动 + 持久化消息

Strategy C
↓
工作流引擎

2. Assess Quality Attribute Benefits

评价不同策略对质量属性的改善程度。

关注:

1
2
3
4
5
Availability
Performance
Modifiability
Security
Reliability

而不是简单问:

谁用了更新的技术?

3. Quantify Benefits

进一步将策略带来的收益结构化、量化。

这里的“量化”并不意味着一定能得到绝对精确的金额,而是为了让不同方案能够在统一标准下比较。

4. Quantify Cost and Schedule Implications

评估:

1
2
3
4
5
6
开发成本
基础设施成本
迁移成本
运维成本
培训成本
交付周期

这是很多“纯技术架构设计”最容易漏掉的地方。

5. Calculate Desirability

把:

1
2
3
4
5
收益
成本
进度
风险
不确定性

综合起来,比较不同 Architecture Strategy 的相对吸引力。

可以使用类似:

[
Desirability_i \propto \frac{Benefit_i}{Cost_i}
]

这样的思路帮助理解,但实际 CBAM 并不是简单地“收益除以成本就结束”,还需要考虑进度、风险、不确定性以及不同干系人的效用判断。

6. Make Architectural Design Decisions

最终确定:

1
2
3
优先做什么
延后做什么
暂时不做什么

并形成:

1
Architecture Roadmap

需要特别强调:

CBAM 并不是替管理者做决定。

它的价值是让成本、收益和不确定性显性化,让架构投资从“谁声音大听谁的”变成一个更理性的决策过程。SEI 对 CBAM 的描述同样强调,它帮助组织形成 informed decision,而不是自动产生唯一正确答案。


Architectural Thinking:让架构设计成为一种可重复的思考过程

前面的几个方法都有非常明确的问题:

1
2
3
4
5
ABSD → 架构怎么设计和演进?
DSSA → 领域架构怎么复用?
SAAM → 场景变化怎么影响架构?
ATAM → 质量属性怎么权衡?
CBAM → 架构投资怎么选择?

Architectural Thinking 更像站在它们上面问:

架构师到底应该如何系统地收集信息、组织问题、形成决策并表达架构?

IBM 对 Architectural Thinking 的描述强调:

使用共同的思考过程和共同的架构制品,让 IT Architecture 的开发具备 repeatable 和 consistent 的特点,并让架构师能够有效协作。

架构不是“一张图”,而是一组相互关联的制品

IBM 的相关 Architect Assistant 文档列出的架构制品非常具有代表性,包括:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Business Challenge
System Context
Use Cases
Functional Requirements
Non-Functional Requirements
Logical Data Model
Architecture Overview
Architectural Decisions
Component Model - Static View
Component Model - Dynamic View
Component Model - Collaboration View
Logical Operational Model
Physical Operational Model
Risks
Assumptions
Issues
Dependencies
Architectural Principles
Sizing

从这里可以发现一个非常重要的变化:

1
2
3
Architecture
≠
一张部署图

而应该是:

1
2
3
4
5
6
7
8
9
10
11
Architecture
=
Scope
+ Requirements
+ Decisions
+ Models
+ Views
+ Runtime
+ Deployment
+ Risks
+ Principles

先定义 Scope

Architectural Thinking 的第一个实际问题通常不是:

用 Spring Boot 还是 Go?

而是:

我们到底正在设计什么?

可以通过:

1
2
3
Business Challenge
+
System Context

明确系统目标和边界。

例如:

flowchart LR
    USER[财务人员] --> SETTLEMENT[结算平台]
    ERP[ERP] --> SETTLEMENT
    ORDER[订单系统] --> SETTLEMENT
    SETTLEMENT --> PAYMENT[资金系统]
    SETTLEMENT --> BI[数据分析平台]

System Context 的意义在于先确定:

1
2
3
4
5
系统内部是什么?
系统外部是什么?
谁调用它?
它调用谁?
边界在哪里?

IBM 的架构制品体系同样把 Business Challenge 和 System Context 用于表达 solution scope。

再整理 Requirement

需求至少需要区分:

1
2
3
Functional Requirements
Non-Functional Requirements
Constraints

其中真正决定架构形状的,往往是 Non-Functional Requirements。

例如:

1
2
3
4
5
Function:
生成结算单

NFR:
结算过程必须可恢复

第二条可能会推动:

1
2
3
4
5
状态持久化
Checkpoint
幂等
重试
任务状态机

再比如:

1
2
3
4
5
Function:
用户查看结算结果

NFR:
敏感数据必须按照组织范围隔离

它可能推动:

1
2
3
4
RBAC
Data Permission
Tenant Isolation
Audit

同样一个功能,不同质量要求完全可能产生不同架构。

从 Logical Model 到 Physical Model

架构思考中非常重要的一项能力,就是不要过早跳到产品名称。

逻辑层先考虑:

1
2
3
4
5
需要缓存
需要消息队列
需要服务发现
需要统一入口
需要事件处理

然后物理层才决定:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Cache
↓
Redis

Message Broker
↓
Kafka

Service Registry
↓
Nacos

Runtime
↓
Kubernetes

这样,架构决策的逻辑是:

1
2
3
4
5
6
7
需求
↓
技术职责
↓
Architecture Pattern / Mechanism
↓
具体产品

而不是:

1
2
3
4
5
6
7
Redis
Kafka
K8s
MySQL
Nacos
↓
拼成所谓“技术架构”

国内一些 Architectural Thinking 教学资料会进一步使用“业务/应用、逻辑技术、物理技术、功能、运行”等多视角帮助组织这一思考过程。这个“架构立方体”更适合作为教学模型理解,而不应该误认为是 IBM 或 SEI 统一规定的标准模型。

Architectural Decision 才是架构最值得保留的部分

真正值得记录的不是:

1
Kafka

而是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Decision:
长时间结算任务采用异步事件驱动模式。

Context:
同步调用会让客户端长时间等待,
并使任务生命周期依赖 HTTP 请求生命周期。

Alternatives:
同步 HTTP
异步任务表
Kafka
工作流引擎

Decision:
使用消息驱动的异步任务模型。

Consequences:
+ 解耦任务执行
+ 支持削峰
+ 支持失败重试
- 引入最终一致性
- 增加消息重复处理问题
- 增加运维复杂度

这就是 Architecture Decision Record 背后的思维。

几年之后,技术名称可能变化:

1
2
3
Kafka
↓
Pulsar

但:

1
2
3
为什么需要异步
为什么允许最终一致
为什么接受消息重复风险

才是真正能够被复用的架构知识。

IBM 的 Architectural Thinking 能力体系也把 Architecture Decision、Architecture Principles、Architecture Life Cycle 和 Technical Reviews 列为核心能力。

从多个 View 表达同一个 Architecture

不同干系人关心的根本不是同一件事。

业务人员关心:

1
业务能力和流程

开发人员关心:

1
模块、接口和依赖

DBA 关心:

1
数据模型和访问模式

运维人员关心:

1
实例、网络、资源、部署

安全人员关心:

1
2
3
4
Trust Boundary
身份
权限
数据流

所以不应该试图用一张“大杂烩图”服务所有人。

正确方式是:

1
2
3
4
5
6
7
8
同一个 Architecture
│
├── Context View
├── Application View
├── Component View
├── Data View
├── Runtime View
└── Deployment View

IBM Research 对 Architectural Thinking 与 Modeling 的研究同样关注如何收集、组织架构信息,将这些信息转换成可行的模型,并保持各个架构工作制品之间的一致性。


把六种方法放进同一个真实架构问题

假设一个企业已经存在:

1
2
3
联营结算
供应商结算
渠道结算

现在计划逐步形成统一的结算平台。

系统同时面对:

1
2
3
4
5
6
不同业务具有不同结算规则
结算过程需要审计
计算任务需要可靠恢复
业务类型未来还会继续增加
部分核心能力需要统一
不同业务又必须保留自己的变化空间

不用某一个方法硬套整个问题,而是可以分层使用。

第一步:使用 DSSA 看整个“结算领域”

先不要讨论服务怎么拆。

先分析多个系统:

1
2
3
联营结算
供应商结算
渠道结算

找出共同部分:

1
2
3
4
5
6
7
8
SettlementSubject
SettlementPeriod
SettlementBill
SettlementItem
Fee
Reconciliation
Approval
Payment

以及变化部分:

1
2
3
4
5
6
结算规则
费用规则
对账方式
审批方式
结算对象
业务数据来源

得到:

1
2
3
4
5
6
7
8
9
领域模型
+
领域能力地图
+
共性 / 可变性模型
+
领域参考架构
+
扩展点

这一步解决:

哪些东西应该做成平台能力,哪些东西必须留给具体业务扩展?

第二步:使用 Architectural Thinking 整理具体项目

确定新平台:

1
2
3
Business Challenge
↓
统一结算能力,减少重复建设,同时允许不同业务保持差异化规则

再画:

1
System Context

识别:

1
2
3
4
5
6
订单系统
费用系统
组织系统
资金系统
财务人员
结算平台

然后整理:

1
2
3
4
Functional Requirements
NFR
Constraints
Architecture Decisions

建立:

1
2
3
4
5
Application View
Component View
Data View
Operational View
Deployment View

解决:

我们到底在设计什么,以及如何让不同干系人理解同一套架构?

第三步:使用 ABSD 将需求落成架构

根据:

1
2
3
4
业务需求
质量属性
技术约束
DSSA 参考架构

开始设计:

1
2
3
4
5
6
Settlement Core
Rule Engine
Fee
Reconciliation
Approval
Payment Adapter

并确定:

1
2
3
4
5
6
哪些同步?
哪些异步?
事务边界在哪里?
哪些模块允许依赖?
规则怎么扩展?
失败怎么恢复?

之后完成:

1
2
3
4
架构文档
复审
实现
演化

解决:

这个具体系统应该如何从需求走向实现?

第四步:使用 SAAM 检查变化能力

设计场景:

1
2
3
4
新增一个结算类型
新增一种费用规则
替换支付系统
增加一种对账算法

映射到架构:

1
2
3
4
新增结算类型
↓
只新增 SettlementRule?
还是要修改 Core + DB + API + Reconciliation?

如果所有场景都修改:

1
SettlementCoreService

就需要重新检查模块职责。

解决:

未来真实变化发生时,这个架构到底要改多少?

第五步:使用 ATAM 做质量属性 Tradeoff

把高优先级质量属性放进 Utility Tree:

1
2
3
4
5
Availability
Performance
Modifiability
Security
Auditability

然后分析:

1
2
3
4
5
6
事件驱动
缓存
数据库结构
任务模型
模块拆分
冗余

找到:

1
2
3
Risk
Sensitivity Point
Tradeoff Point

例如:

1
2
3
4
5
共享结算核心
↓
统一性提高
↓
但可能形成修改热点

或者:

1
2
3
4
5
完全独立微服务
↓
独立演进能力提高
↓
但分布式一致性和运维复杂度增加

解决:

这个架构在哪些地方存在真正的质量属性风险?

第六步:使用 CBAM 决定架构投资顺序

假设识别出三个潜在改进:

1
2
3
A:重构规则体系
B:提升容灾能力
C:改造为异步任务模型

三个都可能有价值,但资源有限。

于是分析:

1
2
3
4
5
6
7
质量属性收益
开发成本
基础设施成本
实施周期
维护成本
风险
不确定性

最终形成:

1
2
3
现在做 A
下一阶段做 B
C 暂时保留现状

解决:

哪些架构改造值得现在花钱做?

这时候整个流程就连起来了:

flowchart TD
    A[DSSA<br/>发现领域共性与可变性]
    B[Architectural Thinking<br/>整理需求、边界、决策与视图]
    C[ABSD<br/>设计具体软件架构]
    D[SAAM<br/>使用变化场景测试架构]
    E[ATAM<br/>分析质量属性风险与权衡]
    F[CBAM<br/>分析成本收益并确定投资顺序]
    G[架构实现与持续演化]

    A --> B
    B --> C
    C --> D
    C --> E
    D --> C
    E --> C
    E --> F
    F --> G
    G --> B

再次强调:这是一种工程组合方式,不是规定必须依次执行的官方流程。


六种方法应该怎么选

真正做项目时,不需要把六套方法全部完整跑一遍。

判断当前问题是什么即可。

当前问题 更适合的方法
正在从需求设计一个具体系统 ABSD / Architecture-Based Development
公司反复建设同一领域中的相似产品 DSSA
想知道未来某个变化会修改哪些架构元素 SAAM
系统存在多个重要质量属性,需要系统评价 ATAM
性能、可用性、安全、可修改性存在冲突 ATAM
已经有多个技术可行方案,不知道哪个更值得投入 CBAM
需要形成统一的架构分析、建模和文档方式 Architectural Thinking
希望建立领域级平台或产品线 DSSA + ABSD
重构大型遗留系统 Architectural Thinking + SAAM/ATAM
制定长期架构演进路线 ATAM + CBAM

还可以按问题范围来记:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
领域级
│
├── DSSA
│ 一类系统应该怎样复用架构?
│
系统设计级
│
├── ABSD
│ 一个系统应该怎样设计?
│
分析评价级
│
├── SAAM
│ 一个变化来了会怎样?
│
├── ATAM
│ 多个质量属性之间怎样权衡?
│
经济决策级
│
├── CBAM
│ 哪个架构改造最值得投入?
│
贯穿整个过程
│
└── Architectural Thinking
架构师应该怎样系统地想、记录和沟通?

几个特别容易出现的误区

把 ABSD 理解成“先设计完所有架构再写代码”

Architecture-Based Development 强调 Architecture-Centric,并不等于 Big Design Up Front。

架构设计和架构评价完全可以随着迭代持续进行:

1
2
3
4
5
6
7
8
9
ASR
↓
候选架构
↓
实现
↓
反馈
↓
更新架构

关键不是“一开始设计多少”,而是:

影响全局的关键决策不能一直拖到编码过程中随机产生。

把 DSSA 理解成公共组件库

如果做完 DSSA 最终只有:

1
common-utils

那基本没有触及它真正的价值。

DSSA 应该沉淀的是:

1
2
3
4
5
6
7
领域知识
共性
可变性
参考需求
参考架构
扩展机制
可复用构件

公共代码只是最后可能产生的资产之一。

把 SAAM 理解成代码影响分析

SAAM 分析的是 Architecture Impact。

它关心:

1
2
3
4
Component
Connector
Responsibility
Dependency

而不是:

1
Git diff 变了 37 个 Java 文件

一个架构组件可能对应几百个类,也可能只有几个类。

把 ATAM 做成技术方案评审会

如果 ATAM 会议从:

1
2
Redis 还是 Caffeine?
Kafka 还是 RabbitMQ?

开始,那么方向基本已经跑偏。

正确链路应该是:

1
2
3
4
5
6
7
8
9
Business Goal
↓
Quality Attribute
↓
Scenario
↓
Architectural Approach
↓
Analysis

技术产品只是 Architecture Approach 的实现选择之一。

把 CBAM 当成一个精确的财务公式

架构收益往往无法做到像证券交易一样精确估值。

CBAM 的意义不是制造“精确到小数点后两位”的假确定性,而是:

1
2
3
4
5
把隐含假设显式化
把成本显式化
把收益显式化
把不确定性显式化
让多个方案可以比较

不确定性本来就是架构决策的一部分。SEI 的 CBAM 材料同样明确将 uncertainty 和 risk 纳入架构经济分析。

把 Architectural Thinking 当成统一国际标准

IBM 确实存在 Architectural Thinking 的正式学习和能力体系,也有长期的架构建模实践。

但如果在考试、论文或正式架构文档中出现:

1
AT Methodology

最好进一步说明:

1
Architectural Thinking

以及具体采用的是哪一个组织或课程体系中的定义。

不能默认:

1
AT

像:

1
2
3
ATAM
SAAM
CBAM

一样拥有唯一、统一的方法定义。


从历史演进看这些方法为什么会出现

把时间线放在一起,也能帮助理解它们各自解决的问题。

timeline
    title 软件架构方法演进中的几个重要节点
    1993 : SEI 发布 DSSA Process Life Cycle 报告
    1994 : SAAM 成为 SEI 早期场景化架构分析方法
    1998 : ATAM 相关方法形成
    1999 : SEI 发布 Architecture-Based Development
    2000 : SEI 发布 Architecture Based Design Method
    2001-2003 : CBAM 逐步形成并与 ATAM 集成
    2006 : IBM Research 发表 Architectural Thinking 与建模相关研究

DSSA 代表的是一个早期而重要的问题:

软件能不能从“代码复用”进一步走向“领域架构复用”?

SAAM 解决的是:

架构还没有完全实现时,怎样提前判断它面对变化会不会很痛苦?

ATAM 将问题扩大为:

怎样同时分析性能、可用性、安全、可修改性等质量属性,以及它们之间的 Tradeoff?

Architecture-Based Development 和 ABD 则进一步关注:

怎样让架构真正成为开发生命周期的中心,而不只是项目启动时的一张图?

CBAM 又把架构向业务决策推进了一步:

技术上可以做很多事情,但有限的钱和时间到底应该投在哪里?

Architectural Thinking 关注的则是组织能力:

如何让不同架构师使用相对稳定的思考过程、模型和制品进行架构工作?

这些方法并不是互相替代,而是在不断填补软件架构工程中的不同空白。DSSA、SAAM、ATAM、Architecture-Based Development/ABD 和 CBAM 的历史资料均能够看到这种从复用、设计、评价到经济决策的演进轨迹。


最终应该掌握的不是流程,而是六种不同的架构思维

把所有方法背成步骤,很容易考试结束之后一起忘掉。

真正有用的是保留六个问题。

ABSD

面对具体系统时问:

哪些业务、质量和约束需求真正决定架构?应该如何把它们逐步转化成构件、连接、视图和实现约束?

核心:

1
2
3
4
5
6
7
8
9
10
11
需求
↓
架构
↓
文档
↓
评价
↓
实现
↓
演化

DSSA

面对多个相似系统时问:

这里面哪些是领域稳定共性,哪些是变化点,能否形成一套长期可复用的领域架构?

核心:

1
2
3
4
5
6
7
8
9
多个系统
↓
领域分析
↓
Commonality / Variability
↓
参考架构
↓
可复用资产

SAAM

面对一个候选架构时问:

如果这个变化明天真的来了,要修改哪些地方?

核心:

1
2
3
4
5
6
7
Scenario
↓
Architecture
↓
Impact
↓
Interaction

ATAM

面对复杂质量属性时问:

为了性能、可用性、安全、可修改性分别做了什么,这些决策之间又会产生哪些 Risk 和 Tradeoff?

核心:

1
2
3
4
5
6
7
8
9
10
11
Business Goal
↓
Quality Attribute
↓
Scenario
↓
Architecture Approach
↓
Risk
Sensitivity
Tradeoff

CBAM

面对多个候选改造时问:

技术上都能做,但哪一项架构投资能够在有限资源下产生更高价值?

核心:

1
2
3
4
5
6
7
8
Architecture Strategy
↓
Benefit
Cost
Schedule
Risk
↓
Priority

Architectural Thinking

面对整个架构工作时问:

有没有一套稳定方式,把业务问题、需求、模型、决策、运行环境和风险组织起来,让其他人真正理解这套架构?

核心:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Scope
↓
Requirements
↓
Models
↓
Decisions
↓
Views
↓
Operational Model
↓
Review
↓
Evolution

总结

ABSD、DSSA、SAAM、ATAM、CBAM 和 Architectural Thinking 看起来是一堆缩写,实际上代表的是软件架构中六种不同层次的问题。

DSSA 把视野提升到整个领域,通过分析共性和可变性形成领域参考架构;ABSD 把业务、功能和质量需求逐渐转化为具体系统架构,并让架构贯穿设计、实现和演化;SAAM 使用场景检验架构面对变化时的可修改能力;ATAM 将业务目标、质量属性、架构策略以及 Risk、Sensitivity Point、Tradeoff Point 联系起来;CBAM 再把成本、收益、进度和风险引入决策,使架构设计进入经济层面;Architectural Thinking 则贯穿整个过程,帮助架构师建立稳定的需求、决策、建模、视图和沟通体系。

如果把它们压缩成一条最容易记住的主线,就是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DSSA
一类系统应该怎样复用?
↓
Architectural Thinking
架构问题应该怎样系统地想和表达?
↓
ABSD
这个具体系统应该怎样设计?
↓
SAAM
面对变化,这个架构扛不扛得住?
↓
ATAM
面对多个质量属性,风险和权衡在哪里?
↓
CBAM
有限资源下,哪个架构决策最值得投资?

软件架构真正困难的地方,从来不是知道多少中间件,也不是能画多复杂的图。

真正的架构能力是能够建立完整的因果链:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
为什么有这个业务目标?
↓
它产生了什么架构需求?
↓
为什么做出这个架构决策?
↓
这个决策改善了什么质量属性?
↓
它牺牲了什么?
↓
风险在哪里?
↓
还有哪些候选方案?
↓
为什么当前方案更值得投入?
↓
未来需求改变时,这套架构应该如何演化?

当这些问题能够被持续回答、记录、验证和修正时,架构才从“技术栈组合图”真正变成了工程方法。


软件架构方法论:ABSD、DSSA、SAAM、ATAM、CBAM 与 Architectural Thinking
https://allendericdalexander.github.io/2026/08/20/archtect/arch/Software-Archetecture-Method/
作者
AtLuoFu
发布于
2026年8月20日
许可协议