架构设计

架构设计的第一性原理

软件架构为何存在:建筑没有的困境

软件架构与建筑架构、城市规划等物理世界的架构有一个根本性差异

领域完成后状态变化特征
建筑架构竣工后基本不变以"永恒"为主题
城市架构演进缓慢,有实体约束以"规划"调控变化
软件架构交付即意味着需求变化以"变化"为主题

建筑架构完成时,所有需求已知、约束固定。软件架构交付时,需求往往才开始涌现。这一现象的根源在于软件系统的本质:软件是对现实世界问题域的符号化映射,而现实问题域本身在持续演化

因此,软件架构存在的原因不是为了描述一个"正确的结构",而是为了在持续的变化压力下,维持系统的可控性可演化性

架构要解决的核心问题:有限理性下的适应性

架构设计的根本驱动力来自人类面临的一个基本约束:有限理性(Bounded Rationality)。——我们无法在设计之初穷尽所有未来变化。

决策者无法在设计之初穷尽未来所有可能的:

然而,软件系统必须在这些未知中持续运行。这产生了架构设计的核心张力:

系统必须现在就工作 ←→ 系统未来必须能变化

架构设计就是管理这种张力的机制。它不是预测未来,而是构建应对未来的能力

架构存在的三个逻辑推论

基于以上第一性原理,可以推导出架构设计必须满足的三个逻辑约束:

推论一:大规模系统架构必须先于实现存在,但永远无法一步到位

推论二:架构的价值不在于找到全局最优解,而在于"可改变且不崩溃"

推论三:架构必须与组织能力匹配,否则反受其害

架构设计的本质

架构设计的核心任务不是选择技术,而是组织复杂性。其本质可归纳为三件事:

  1. **抽象复杂性**:识别系统"难以改变的部分",形成稳定结构。
  2. **约束系统边界**:通过模型、原则、接口与契约保持系统可控。
  3. **降低长期成本**:让系统能在不推翻原有结构的情况下持续演进。

因此,架构是一种 约束 + 构造 + 演化 的综合能力,而非对代码结构的静态描述。

架构设计要素体系

架构规划:战略层

目标:做正确的系统,而不是把系统做正确。

架构规划解决的问题:

输出是可落地、可迭代的架构蓝图,同时明确约束、边界和演进路线。

架构分解:结构层

通过"分而治之"将需求与复杂性拆解为可实现的模块。设计分解遵循三个原则:

  1. **分解粒度**:粒度越细成本越高,粒度越粗耦合越强,需要寻找"认知分界"。
  2. **稳定性中心化**:优先将不易改变的部分抽象出来(领域对象、契约、平台层)。
  3. **变化边界对齐**:分解边界应与需求变化频率对齐,频繁变化的部分应与稳定部分解耦。

模块定义与系统边界

高内聚、低耦合:永恒原则。

模块边界定义的是:

粗粒度模块 ≠ 简单细粒度模块 ≠ 高质量边界的关键是是否对"变化"敏感。

系统上下文图用于定义:外部参与者、外部系统、交互方式、数据与事件的方向。它是"架构边界"的最底层事实。

五层架构分解:从业务到技术的路径

将模糊需求转化为清晰结构的五层分解路径:

业务架构 → 确定"做什么"的能力边界    ↓产品架构 → 确定"做什么功能"及分层    ↓应用架构 → 确定"由哪些应用承担"    ↓数据架构 → 确定"如何存储"数据模型    ↓技术架构 → 确定"用什么技术"实现

各层分解要点:

层级目的输入输出关键决策
业务架构业务能力边界业务愿景、战略目标问题域、业务能力图系统边界、核心能力
产品架构功能模块划分业务架构输出功能模块、分层模块粒度、复用策略
应用架构应用边界与服务产品架构输出应用划分、接口契约康威定律、平台下沉
数据架构数据组织存储业务+应用架构ER图、存储策略领域模型、分布策略
技术架构技术实现方案应用+数据架构技术选型、部署架构合适优于先进

层间关系:单向依赖,上层驱动下层;协同演进,保持一致性。

常见陷阱:层间倒置(技术驱动业务)、层间越位(上层规定下层细节)、层内过度设计、层间不一致。

架构输入:系统之"约束空间"

架构的设计空间由以下四类输入共同定义:

输入类型内容架构意义
功能性需求系统做什么确定功能性模型、边界
非功能需求性能、可用性、弹性、扩展性驱动架构风格选择
限制条件团队、预算、法规、安全决定可行空间
现有资产与技术存量系统、技术栈决定系统兼容性与迁移成本

架构的可行性由这些因素共同决定,而非单一技术选择。

架构输出:系统蓝图体系

结构化后的架构输出通常包含五类蓝图:

  1. **架构规划蓝图**:目标、范围、愿景、阶段路线图
  2. **研发设计蓝图**:架构模型、组件关系、契约、边界
  3. **测试蓝图**:验证策略、质量属性验证体系
  4. **部署蓝图**:物理拓扑、管控体系、发布策略
  5. **采购蓝图**:RFP、POC、技术决策依据

架构设计原则

合适优于先进

过度追求先进技术会增加复杂性与不可控性。架构应追求稳态、可解释性、与组织能力匹配

简单优于复杂

软件复杂度会自然增长,架构必须主动控制复杂性。KISS、YAGNI、最小可行结构(MVS)是核心方法。

演化优于一步到位

系统必然演化,提前构建"可演化能力"比提前构建"未来能力"更重要。变与不变应清晰分离。

架构设计的反模式与误区

认知锁定类

症状:以手段替代目标

将某种架构方法、技术选型、或组织模式本身当作目的,忘记其原本要解决的问题。

典型表现:

本质:手段与目标混淆,在"如何做"上形成路径依赖,丧失对"为什么做"的追问能力。


症状:以模仿替代判断

复制成功案例的架构形式,而不评估自身约束条件的差异。

典型表现:

本质:脱离上下文的形式模仿,忽视了架构的情境依赖性。任何架构都是特定约束条件下的"最优解",脱离约束谈架构没有意义。


局部最优类

症状:局部决策的全局锁定

单次决策在当时合理,但积累后形成难以打破的结构刚性。

典型表现:

本质:局部利益与全局利益的短期背离,在时间维度上形成技术债累积。


症状:熵增失控

复杂度增长速度超出业务需求所需,系统可维护性持续下降。

典型表现:

本质:主动放弃对复杂度的控制权,让熵增成为系统演化的主导力量。


认知偏差类

症状:过度设计

架构服务于"技术的自我实现"而非业务价值交付。

典型表现:

本质:将"架构复杂度"等同于"架构价值",忽略了架构本身也是成本。


症状:零设计

与过度设计相对的另一个极端。

典型表现:

本质:将架构设计视为负担而非能力投资。短期看是速度,长期看是技术债。


反模式的根因

上述反模式有一个共同根源:架构认知与架构实践的脱节

具体表现为三种形式:

脱节形式表现
时序脱节用过去的假设设计现在的系统
视角脱节以技术人员视角替代业务价值视角
粒度脱节以宏观架构原则解决微观问题,或反之

架构原则的逆向对应

每个架构设计原则都有其对应的反模式,理解这种对应关系有助于识别误区:

原则对应误区
合适优于先进货物崇拜:以先进替代合适
简单优于复杂过度设计:为复杂性而复杂性
演化优于一步到位零设计:拒绝任何预先思考
约束优于自由局部最优:各局部"最优"导致全局锁定

架构设计方法论

问题分类:架构设计的起点

架构设计的第一个问题是"问题是什么"。不同复杂度的问题需要不同程度的架构投入

四类问题与架构映射

问题类型特征可预测性架构投入策略
简单问题有已知最佳实践最小投入复用模式
繁杂问题多种解,需分析比较标准投入多方案比较
复杂问题不确定,需验证假设演化投入MVP验证+迭代
混沌问题失稳,因果不明极低敏捷试错先止血后建模式

识别信号

问题类型典型信号
简单问题需求明确有参照、团队有经验、技术栈成熟
繁杂问题边界清晰但路径不唯一、多质量属性权衡、多种选型
复杂问题无先例、假设未验证、需求在演进、需在实践中发现模式
混沌问题系统失稳、高压快节奏、因果关系不明

架构方法选择

简单问题 → 复用最佳实践繁杂问题 → 分析比较(建模→多方案→评估→决策)复杂问题 → 假设验证(MVP→反馈→演进)混沌问题 → 止血优先(稳定→找模式→建结构)

认知检验清单

识别复杂性:问题域的深挖

在问题类型判断之后,进一步识别具体复杂性来源:

复杂性来源四类因素

复杂性维度示例架构任务
业务复杂性高耦合业务规则领域建模、聚合设计
技术复杂性分布式、并发技术风格、基础设施能力
操作复杂性监控、部署、容量可观测性、运维架构
组织复杂性人员能力、协作方式治理体系、边界划分

"倒找法":发现隐性复杂度的有效方式从已知问题 → 找到系统对应问题 → 反推复杂性来源

多方案设计:避免认知锁定

架构师必须规避"单点思维陷阱"。因此:

归根结底,备选方案的价值不在于选择,而在于扩展设计空间

认知锁定的后果

认知锁定一旦发生,架构决策将面临:

后果具体表现
路径依赖后续决策围绕初始方案累积,形成结构刚性
风险盲区初始方案的缺陷在迭代中被忽视,直到暴露时已难修复
团队失焦架构讨论变成"捍卫已有方案",而非"寻找最优解"
创新抑制团队停止探索新方案,架构能力停止演进

质量属性驱动的架构评估

步骤:

  1. 列出关键质量属性(性能、可用性、扩展性、安全性…)
  2. 按业务阶段排序
  3. 对每个架构方案逐项评估其满足度
  4. 找到风险点、敏感点、折衷点

架构评估本质上就是找到"系统折衷面"与"长期成本曲线"。

详细方案设计:模型到工程的桥梁

进入详细设计说明方案是"可构建的系统",而非理念。

需要特别关注:

架构视图体系

架构立方体

这是对系统的六个本质维度的抽象:

维度描述解决的问题
应用视图系统提供的核心能力我们提供什么?
技术视图数据库、中间件、基础设施系统运行在什么上?
功能视图业务逻辑分解业务如何组织?
运行视图部署、运行时状态系统如何运行?
逻辑视图抽象的系统结构系统如何分解?
物理视图物理节点、拓扑系统如何落地?

这是一个从抽象到现实的分层模型。

运行时模型

运行视图关注系统在真实世界中的状态:

运行视图的重点不是图,而是:

需求分析体系

需求贯穿系统全生命周期

需求是架构的约束来源,包括:

V-模型

V模型的核心原理:开发阶段与验证阶段存在镜像对称关系

定义系统(左侧)←→ 验证系统(右侧)

核心原理

原理说明
对称性开发与验证一一对应,左侧定义什么,右侧验证什么
顺序性验证方案在设计阶段确定,而非事后补救
架构纽带架构向上承接需求,向下指导实现,同时定义验证边界

适用边界

V模型揭示的是确定性开发场景的规律:需求越明确、结构越稳定,对称性约束越有价值。

在需求频繁变化的场景下,严格的对称性约束反而成为限制——这是V模型的局限,不是原理的局限。

架构模型体系

以下模型是架构师的基础建模工具:

模型目的适用阶段
用例模型描述用户价值和系统能力分析
领域模型识别业务不变性架构
鲁棒图用例到对象模型的桥梁分析→设计
时序图描述行为流程设计
ER 图数据建模数据架构
整体架构草图快速表达结构架构

架构治理与演进

真正的架构价值不在于设计,而在于让系统可持续演进

关键治理能力:

  1. **统一的模型语言**
  2. **标准化边界定义**
  3. **技术雷达与演进策略**
  4. **质量属性监控与反馈**
  5. **架构决策记录(ADR)**
  6. **组合式能力的可演化性**

架构的终局不是完美,而是 "可改变且不崩溃"

架构设计的边界:何时不需要架构

在某些场景下过度架构设计反而是伤害

判断标准:架构的隐性成本

架构设计存在两种隐性成本,若这些成本超过收益,架构就是浪费:

成本一:设计时延完整的架构设计需要时间。在快速验证假设的场景中,这段时间可能错失市场窗口。

成本二:认知负荷架构增加了系统的概念复杂度。团队必须理解架构约束与边界,才能有效工作。

成本三:灵活性损失架构一旦建立,改变它需要成本。过度僵化的架构会成为演化的阻力。

当以上成本超过架构带来的收益时,应减少架构投入。

四类不需要架构设计的场景

架构投入的必要性取决于两个维度:系统预期存续时长需求确定性

场景一:系统存续价值低于架构成本

系统价值是一次性的,架构成本无法在生命周期内摊销。

判断标准:系统完成后无需维护、迭代或扩展。

注意:若一次性系统可能演化,需预留最小架构接口。

场景二:需求完全稳定,无变更预期

所有约束条件、边界、数据模型在设计时已知且不会变化。

判断标准:系统的生命周期中,需求文档完全有效。

场景三:目的为验证假设而非交付系统

系统用于"获得认知",而非"承载业务"。

判断标准:系统价值在于回答问题,而非持续解决问题。

场景四:团队认知容量足以覆盖系统复杂度

系统复杂度在团队的心智模型容量内,无需外部结构辅助协调。

两类常见的"不需要架构"是陷阱

以下两种情况表面上看似"不需要架构",实则是架构债务的积累起点:

陷阱一:临时方案被固化为生产系统

一次性方案在上线后持续迭代,架构债在无人察觉时累积。

陷阱二:低复杂度假设与业务增长不匹配

系统边界随业务扩张突破原有假设,架构债在临界点集中爆发。

判断框架:架构投入参考矩阵

系统特征预期生命周期短预期生命周期长
需求稳定低架构投入标准架构流程
需求不确定最小可行架构 + 迭代验证敏捷架构 + 持续演进
团队小轻量文档架构可视化
多团队协作强接口契约 + 治理完整架构流程 + ADR

架构不足的信号

以下任一信号出现,说明架构投入与系统复杂度不匹配:

关联内容(自动生成)