Skip to content

Commit a9eec25

Browse files
committed
docs(architecture): 更新架构定义和4+1视图说明并添加架构反模式章节
更新架构定义,将"长期可复用的设计决策"改为"重要且难以逆转的设计决策", 修正4+1视图中实现视图为开发视图,部署视图为物理视图,并完善各视图的说明表格。 新增架构反模式与误区章节,涵盖决策类、复用类、时间维度、范围维度、架构图绘制、 认知类反模式,以及架构原则应用误区和避免反模式的核心原则。
1 parent cd1f7e3 commit a9eec25

1 file changed

Lines changed: 116 additions & 15 deletions

File tree

doc/软件工程/架构/架构.md

Lines changed: 116 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ books: [
1212

1313
软件架构(Software Architecture)是一种用来管理复杂性的工程学科,其目标是在软件系统漫长生命周期中,在有限条件下做最优权衡,构建、演进、运行并维护系统。它不仅满足非功能性需求(可维护性、可扩展性、可靠性、可测试性、可部署性),更承担沟通、决策、治理等组织层面的职能。
1414

15-
架构本质上是一组**长期可复用的设计决策**,这些决策定义了系统的组织结构、组件及联系、行为协作、限制与约束,并指导系统的持续演化。架构作为团队协作的契约,约束不同模块/服务间的交互方式,使团队在系统演进过程保持一致性与可替换性。
15+
架构本质上是一组**重要且难以逆转的设计决策**,这些决策定义了系统的组织结构、组件及联系、行为协作、限制与约束,并指导系统的持续演化。架构作为团队协作的契约,约束不同模块/服务间的交互方式,使团队在系统演进过程保持一致性与可替换性。
1616

1717
## 架构的本质
1818

@@ -232,6 +232,7 @@ books: [
232232
* **Rule**:基于关键场景绘制协作方式
233233

234234
### 4+1 视图
235+
235236
```
236237
┌─────────────────────────────────────────────────────────┐
237238
│ 场景 (Scenarios) │
@@ -243,29 +244,32 @@ books: [
243244
└─────────────────────────────────────────────────────────┘
244245
↑ ↑ ↑
245246
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
246-
│ 逻辑视图 │ │ 实现视图 │ │ 进程视图 │
247-
│ Logical │ │Impl View│ │ Process │
247+
│ 逻辑视图 │ │ 开发视图 │ │ 进程视图 │
248+
│ Logical │ │ Dev View│ │ Process │
248249
└────┬────┘ └────┬────┘ └────┬────┘
249250
↑ ↑ ↑
250-
开发人员创建 构建系统创建 运行组件描述
251-
类/包 + 关系 模块(JAR/WAR) 进程 + IPC
252-
+ 依赖关系
251+
最终用户/业务人员 开发人员/配置管理员 系统集成人员
252+
领域模型、职责 代码组织、分层依赖 线程、并发、同步
253+
接口契约 进程 + IPC
253254
┌────┴────┐
254-
部署视图
255+
物理视图
255256
│Physical │
256257
└────┬────┘
257258
258-
机器 + 进程
259-
网络连接
259+
系统工程师/运维
260+
机器、容器部署
261+
网络拓扑
260262
```
261263

262-
包含
264+
**各视图说明**
263265

264-
* 逻辑视图:领域、职责、接口
265-
* 实现视图:代码结构、构建依赖
266-
* 进程视图:运行时交互
267-
* 部署视图:机器、容器部署关系
268-
* 场景视图:用户视角的用例与时序
266+
| 视图 | 别名 | 关注点 | 主要受众 |
267+
|------|------|--------|----------|
268+
| 逻辑视图 | Logical View | 功能需求、领域模型、接口契约 | 最终用户、业务人员 |
269+
| 开发视图 | Development View | 代码组织、分层结构、模块依赖、构建配置 | 开发人员、配置管理员 |
270+
| 进程视图 | Process View | 运行时行为、并发同步、通信机制 | 系统集成人员 |
271+
| 物理视图 | Physical View | 硬件映射、分布式部署、网络拓扑 | 系统工程师、运维 |
272+
| 场景视图 | Scenarios View | 用例、业务流程、视图串联验证 | 测试人员、分析师 |
269273

270274
### 各类常见架构图
271275

@@ -338,6 +342,16 @@ books: [
338342

339343
架构并非单一视角,而是多种思想共同构成的认知框架。不同流派从不同角度解释"什么是架构",它们并非互斥,而是互补关系。理解这些流派有助于在复杂系统中选择更合适的架构方式。
340344

345+
> | 层次 | 回答的问题 | 包括 |
346+
> |------|------------|------|
347+
> | **架构定义流派** | "架构是什么"的本体论 | 结构派、决策派 |
348+
> | **架构设计方法论** | "如何做架构设计"的方法论 | 模式派、领域驱动派、进化派、系统论派、工程派 |
349+
>
350+
> - **定义流派**是元问题的分歧:当给架构下定义时,选择从哪个角度描述它?结构派说"架构是组件+连接",决策派说"架构是重要决策的集合"
351+
> - **设计方法论**建立在定义之上:当知道架构是什么,用哪些视角来指导设计?可以用模式、可以用领域边界、可以用演化思维、可以用系统动力学、可以用工程治理——这些是不同切入角度,不影响架构"是什么"的本质。
352+
>
353+
> 类比:定义流派像"哲学基本问题",设计方法论像"解决问题的方法"。
354+
341355
### 结构派
342356

343357
关注系统由哪些模块组成,以及模块如何连接。
@@ -408,6 +422,93 @@ books: [
408422

409423
适用:中大型组织、要求高可靠性的行业。
410424

425+
## 架构反模式与误区
426+
427+
架构反模式是那些看似合理但会导致架构失败的常见错误。与架构模式相对,反模式揭示"如何不做"而非"如何做"。理解反模式是避免失败的前提。
428+
429+
### 决策类反模式
430+
431+
| 反模式 | 特征 | 危害 |
432+
|-------|------|-----|
433+
| **HiPPO 主导** | 个人(收入最高者)决定所有架构决策 | 决策反映个人偏见,团队不支持执行困难 |
434+
| **功能驱动** | 架构由功能需求而非质量属性需求驱动 | 系统性能、扩展性、弹性不足 |
435+
| **外包决策** | 将架构决策外包给供应商或顾问 | 丧失控制,不理解自身 QAR |
436+
437+
**核心问题:** 架构决策必须由团队基于数据和论证做出,必须由 QAR(质量属性需求)驱动,必须理解每个决策的上下文和权衡。
438+
439+
### 复用类反模式
440+
441+
| 反模式 | 特征 | 危害 |
442+
|-------|------|-----|
443+
| **为复用牺牲质量** | 强行复用不匹配当前 QAR 的架构 | 被遗留技术限制,维护成本超过重新开发 |
444+
| **复制成功架构** | 不理解上下文就复制大公司/文章的成功架构 | 忽略权衡差异,走上失败道路 |
445+
| **框架控制架构** | 让框架的隐式决策接管应用 | 丧失底层理解,升级/替换困难 |
446+
447+
**核心问题:** 复用必须基于 QAR 匹配。复制架构必须理解其上下文和权衡。框架是工具,不是架构本身。
448+
449+
### 时间维度反模式
450+
451+
| 反模式 | 特征 | 危害 |
452+
|-------|------|-----|
453+
| **超前大架构** | 试图一次设计完美架构,预判所有变化 | 资源巨大,周期漫长,无法适应实际反馈 |
454+
| **牺牲质量换速度** | 专注 MVP 忽视 MVA,"以后重构" | 技术债务指数积累,重构成本远超预期 |
455+
| **过度延迟交付** | 为完善架构不断推迟发布 | 缺乏实际反馈,延误业务价值 |
456+
457+
**核心问题:** 架构是持续过程,不是一次性事件。MVP 与 MVA 需要平衡。没有完美架构,只有基于当前信息的合理选择。
458+
459+
### 范围维度反模式
460+
461+
| 反模式 | 特征 | 危害 |
462+
|-------|------|-----|
463+
| **过度泛化** | 设计通用架构适配所有场景 | 臃肿无用,满足不了任何场景的真实 QAR |
464+
| **过度设计** | 用复杂性换想象中的灵活性 | 增加维护负担,延长开发周期 |
465+
| **忽视边界** | 不考虑未来变化,"先用再说" | 技术债务快速积累,变化成本指数增长 |
466+
467+
**核心问题:** 过度设计常比不足设计更糟糕。猜错边界的代价远大于慢慢改的代价。代码可以删掉,概念和抽象删不掉。
468+
469+
### 架构图绘制反模式
470+
471+
| 错误类型 | 问题 |
472+
|---------|-----|
473+
| 语义不清 | 形状/线条/颜色含义不明,无图例说明 |
474+
| 层级混杂 | 运行时元素与静态元素混在同一图 |
475+
| 信息过载 | 一张图试图表达所有内容 |
476+
| 图文分离 | 依赖口头说明,图本身不自治 |
477+
478+
**核心问题:** 架构图必须自解释、一致、准确,与代码保持语义同步。自动生成与手动创建结合优于纯手动维护。
479+
480+
### 认知类反模式
481+
482+
| 反模式 | 问题 |
483+
|-------|-----|
484+
| **重结构轻决策** | 只关注组件和连接,忽视决策过程 | 导致知识失传,无法复制决策逻辑 |
485+
| **架构即委员会** | 架构脱离开发,由委员会设计 | 设计与实现脱节,无法落地 |
486+
| **文档至上** | 认为文档详细=架构好 | 文档可能过时,代替不了实际验证 |
487+
488+
**核心原则:** 架构是一系列重要且难以逆转的**决策**。文档和图不是架构,它们只是决策的载体。决策的**质量****可见性**才是核心。
489+
490+
### 架构原则应用误区
491+
492+
| 原则 | 常见误用 | 正确理解 |
493+
|-----|---------|---------|
494+
| **KISS** | 简单优于一切 | 简单是手段;过度简单可能导致复杂性转移 |
495+
| **DRY** | 绝对不能重复 | 有意重复 vs 无意重复;错误的抽象比重复更贵 |
496+
| **演化** | 不做初始设计 | 初始设计必要;演化是持续改进,不是拒绝设计 |
497+
| **合适** | 用成熟技术就好 | 匹配团队能力和 QAR;新技术需验证成本 |
498+
499+
### 避免反模式的核心原则
500+
501+
1. **QAR 驱动** — 质量属性需求决定架构,非功能需求或业务压力
502+
2. **决策可见** — 隐式决策变显式,记录原因、权衡、替代方案
503+
3. **平衡权衡** — 无完美架构,只有特定上下文的最优选择
504+
4. **渐进演化** — 架构是持续活动,基于实际反馈迭代改进
505+
5. **团队共识** — 多元视角挑战假设,避免 HiPPO 和委员会两极
506+
6. **上下文匹配** — 复制必须理解上下文和权衡
507+
7. **验证优先** — 实际运行反馈优于理论评审
508+
8. **保持简单** — 在满足 QAR 前提下尽量简单
509+
510+
> "好的判断来自经验,而经验大多来自糟糕的判断。" — 反模式的价值在于让人们不必亲自犯所有错误就能获得判断力。
511+
411512
## 架构治理
412513

413514
架构不仅是技术问题,更是治理问题。治理的目标是让架构在组织规模扩张过程保持一致性与可控性。

0 commit comments

Comments
 (0)