软件架构认知:从“少林 vs 武当”到你自己的定义
目标读者:一线开发工程师 & 准架构师。
这一章想解决的问题只有一个:到底什么是软件架构?
你会发现,不同大师给的定义都不一样,但最后会收敛到两个关键词:组成 和 决策。
一、两派之争:少林的“组成派”,武当的“决策派”
一个很有画面感的比喻:
-
少林派 = 组成派:
- 天下武功出少林:一招一式、一层一层堆出来;
- 对应到架构:模块、组件、服务、系统,一层一层拆分和组合。
-
武当派 = 决策派:
- 卜算天机、定人生走向:重在“怎么选”;
- 对应到架构:选云还是机房、选开源还是自研、选单体还是微服务、选 K8s 还是 Mesos……
现实中的你,大概率也会偏某一派:
- 如果你整天在画类图、模块图、部署图,拆边界、做接口,你偏组成派;
- 如果你更多时间在评审会上“拍板选型”,写决策记录,你偏决策派。
二、站在大师肩膀上:各种定义都在讲“结构 + 决策理由”
几大致可以看成两类:
-
偏组成派的大师:
- 强调:系统结构、组件、连接件、模块边界;
- 觉得架构的核心是:我把系统拆成什么块,这些块之间怎么连。
-
偏决策派的大师:
- 强调:架构是“高层决策”的集合;
- 关注:方向、原则、取舍(选 A 不选 B 的原因和影响)。
甚至 IEEE 那样的“官方定义”,一开始也在说“结构和组件”,最后还是会补一句:
架构要持续演化来响应新需求 —— 而演化背后,必然是连续的决策。
可以把各种定义粗暴归纳成一句话:
软件架构 = 重要的结构 + 背后的重要决策及其理由。
三、决策 vs 组成:你的日常工作其实一直在“两条线”上走
如果把你日常做的事拆开看,大致有两条主线:
-
组成线(少林线):
- 画用例图、类图、组件图、部署图;
- 做“高内聚、低耦合”的模块划分;
- 按领域划分子域、聚合、实体、值对象;
- 按层次拆服务:接口层、应用层、领域层、基础设施层……
-
决策线(武当线):
- 选技术栈、选中间件、选云厂商;
- 评估不同方案的成本、风险、可扩展性、维护成本;
- 写下“选 A 不选 B 的原因”和“接受了哪些 trade-off”;
- 在评审会上说服产品 / 研发 / 运维,让大家对同一方案点头。
如果你只做组成,不做决策,你容易变成“高级画图工程师”;
如果你只做决策,不懂组成细节,你容易变成“嘴上架构师”。
真正靠谱的架构师,往往是“中间派”:一手能落图,一手能拍板。
四、从定义走向目的:莫扎特给架构师的六个隐喻
书里用“莫扎特作曲”来类比“架构设计”,提出了架构的六个目标(这里只保留易落地的版本):
-
桥梁:
- 莫扎特的音乐是自己和听众之间的桥梁;
- 架构是业务诉求和技术落地之间的桥梁。
-
指引 / 蓝图:
- 乐谱指导乐队演奏;
- 架构蓝图指导开发和运维协作,实现“按图施工”。
-
合理地“分乐章”:
- 大乐章拆成可记忆的小乐章,每段都有主题和高潮;
- 架构要把系统拆成“既不太碎也不太大”的模块 / 子域,每块都有明确职责。
-
多声部交互:
- 钢琴、弦乐、管乐互相配合、呼应;
- 系统中的模块 / 服务要通过合适的交互方式(同步调用、异步消息、事件驱动等)协作。
-
持续打磨细节:
- 莫扎特会在已足够优秀的乐谱上反复改动;
- 架构师要在大方向定好后,不断优化小的设计细节(接口、表结构、缓存逻辑等)。
-
演进而不是重来:
- 莫扎特早期到晚期风格在变,但主基调还在;
- 架构要在满足新业务、新技术的前提下,保留系统的稳定“基调”,通过演进而不是每次推倒重做。
如果你面试被问“架构的作用是什么”,直接从这六个目标里挑三四个结合项目来讲,非常有说服力。
五、软件架构的发展三阶段:从“跟着语言走”到“多视角 +方法论”
作者把软件架构的发展粗分成三代,你可以用来“定位”自己目前的思维在哪一代。
1. 第一代:跟着语言和数据结构走
- 架构 = 语言能写出来的东西:C / Java / Python / Go……
- 关注点:
- 控制流程、函数划分;
- 常见数据结构(链表、树、图、哈希表);
- 常见算法(排序、搜索、路径规划……)。
这阶段“架构感”还很弱,更多是“程序设计”的层面。
2. 第二代:设计模式和抽象
- 出现了 GoF 23 种设计模式、Martin Fowler 的模式集、DDD 的战术模式等。
- 强调:
- 用模式解决常见结构问题(工厂、适配器、装饰器、观察者等);
- 在复杂场景引入合适模式组合,提升可维护性和可扩展性。
这时“架构”开始有点轮廓,但常常还停留在“代码级设计”。
3. 第三代:真正的架构视角 + 方法论
- UML、组件模型(CBM)、SOA 等出现后,开始强调:
- 如何拆系统(组件 / 服务 / 子域);
- 如何画多种架构视图(逻辑、部署、运行时);
- 如何用方法论组织整个设计过程。
再往后,作者提到几种典型方法:
- ABSD:基于架构的软件开发,强调需求驱动 + 四大基石(功能分解、架构风格、模板、递归);
- DSSA:特定领域软件架构,强调在一个垂直行业里做通用架构资产;
- AT(Architecture Thinking):架构思维,多视角、多模型驱动的主流企业级方法论。
你可以粗略对照一下自己:
- 还主要停在“写好代码 + 会用几个设计模式” → 在第二代;
- 能系统地拆模块 / 画多视图 / 用方法论串起设计流程 → 开始迈向第三代架构思维。
六、把这一章变成你的“面试武器”和“实践 checklist”
这一章的知识,最直接的用法有两个:
-
面试 / 晋升答题素材:
- “你怎么理解软件架构?”
- “架构的职责 / 价值是什么?”
- “你更偏哪种风格的架构师?”
你都可以用「组成派 vs 决策派 + 莫扎特六目的 + 三代发展」来组织答案。
-
日常实践的自查表:
- 最近这个系统的设计里,我只是在“拆模块”,还是也有在“记录关键决策”?
- 我是不是能说清楚:这个系统的“桥梁作用”、“指引作用”、“分割与交互设计”、“演进路线”?
- 我现在做的,是“第二代的模式级设计”,还是已经在用“第三代的方法论和多视角”?
当你能用这一套语言稳定地描述自己做的系统设计时,你对“软件架构”的认知,基本就从“模糊感觉”进化到了“可解释、可传递”的层级。