软件架构的意义:给一线开发和准架构师的一封信
架起需求到落地的桥梁,构建你的 IT 新蓝图。
这一整章原本是课程讲稿,下面用「一线开发 / 准架构师 + 轻松技术博客」的方式,帮你串成一篇更好读、但信息不打折的文章。
一、电商十年架构演进:业务增长,架构在补课
先从一个典型电商平台的十年故事说起。
1. 早期:意大利面大单体 + “赶火车”发布
十年前,这家电商的架构非常“传统”:
- 巨石应用 + 意大利面代码:
所有业务(交易、商品、用户、搜索……)混在一堆服务里,服务器之间也没有明确角色划分。 - 每月一发版,谁赶上谁上车:
公司采用“火车发版”模式:- 每月发一车,把所有人这个月的代码一起上生产;
- 功能只要提前在测试环境通过,能在 Git 上合到
master,就能“挤上车”; - 如果晚了几分钟,发版列车“呼啸而过”,那就对不起,下个月再见。
业务在涨,团队在扩,但架构几乎不动,所有问题都在用人肉和加班硬扛。
2. 五年前:微服务改造 + 前后端分离 + 缓存与读写分离
五年前,公司终于忍不住做了一波大改造:
-
前后端分离:
- 用户访问先到前端服务器;
- 前端通过 Ajax / 前端 API 编排(Orchestration)去调用后端 API;
- 形成「用户 – 前端 – 后端 API」三方互动。
-
后端微服务化:
- 原来一个大系统,拆成多个服务;
- 服务之间通过消息队列异步通信,降低耦合。
-
数据库读写分离 + 读库集群:
- 识别到「读远多于写」;
- 把读库独立出来做集群,写库专注写,缓解数据库压力。
-
前端加 CDN & 大缓存:
- 静态资源(CSS / JS / 图片等)分发到就近的 CDN 边缘节点;
- 用户在上海,就从上海的运营商机房读;在北京 / 深圳 / 长沙,也从本地节点读。
结果:性能上来了一大截,但发布节奏和演进方式还不够现代。
3. 蓝绿发布:不再等一辆“月度发版火车”
接下来,他们搭起了两套几乎对等的系统:蓝 / 绿环境。
- 任一环境都可以独立运行,也可以部署不同版本的服务;
- 通过负载均衡和 CDN 的路由配置:
- 某些服务指向「蓝」;
- 某些服务指向「绿」。
这样可以做到:
- 每天 / 每周多次发布;
- 切蓝切绿只是调整流量指向;
- 有问题随时回切,风险可控。
也就是说,不用再等一个月一趟火车,上线节奏跟得上业务节奏。
4. 大数据 & 搜索:数据库从“全能选手”到“其中一环”
业务越做越大,他们发现:
- 写库压力缓解后,分析型查询和复杂查询开始拖后腿。
解决方案是:
- 引入大数据平台:把大量分析型任务迁到大数据引擎;
- 引入搜索引擎:
- 首页推荐、目录查询、复杂搜索,都走搜索引擎;
- 利用分布式搜索的高并发能力,减轻数据库压力。
数据库从“全场 MVP”变成整个数据栈的一部分,读写、分析、搜索各自有主战场。
5. 上云与混合云:让云帮你抗压和节省成本
最近几年,这家电商又更进了一步:开始上云,并且云上云下混合部署。
-
云上安全入口:
先把流量导到云上的安全网关 / 安全入口,再转发到云上的应用引擎。 -
选择 PaaS 平台(例如 Google App Engine):
在云上选了一个 PaaS 平台,只需要配置:- 比如「CPU 利用率保持在 20%~80% 之间」;
- 超过 80% 自动扩容,低于 20% 自动缩容。
这样就实现了应用负载的自动伸缩,容量规划交给云来做。
-
拼装云服务:
- 云消息队列;
- 云缓存;
- NoSQL 数据库;
- 对象存储;
- 其他托管 PaaS 服务……
这些都可以按需组合,用来降低开发成本和自建机房成本。
-
云上的分析与智能:
- 在云上搭建批处理 / 流处理 / 任务调度 / 大数据分析平台;
- 在线分析 + 模型训练 + 预测一条龙;
- 为拉新、转化、留存提供更强的能力支撑。
随着这一轮又一轮演进,业务从几亿交易额增长到几十亿、几百亿,到最后上千亿。这背后真正支撑业务的,就是一个不断演进的架构。
一句话:业务是指数级增长的,旧技术会自然变成“技术债”,架构就是你在新需求和旧系统之间必须走的那条路。
二、架构首先是“落地手段”:跟着业务成长,而不是自嗨
从这个电商的故事可以看出几点:
- 业务天然在变强、变复杂:
新业务、新流量、新市场、新指标不断涌现。 - 旧技术不是“错”,只是“不再适用”:
曾经很好用的技术,随着业务上量,慢慢就演变成技术债。 - 架构必须演进,但要注意“向后兼容”:
- 你可能从单体走向分布式 / 微服务;
- 你可能引入 DDD、事件驱动、云原生;
但无论怎样,你都不能把老系统直接打死,新老系统往往要长期共存。
同时,技术本身也在换代:
- 单机算力、网络、存储都在提升;
- 新框架、新中间件、新云平台层出不穷;
- PaaS / SaaS / Serverless 让你“买”和“集成”的选择比“自己造”多了不少。
所以,架构的核心使命可以粗暴概括成一句话:
在业务疯涨、技术狂变的世界里,既要跟上潮流,又要不弄死现有系统。
三、架构是干系人沟通的“共同语言”
架构不仅是图和代码,更是沟通工具。不然,你很容易掉进“技术很好,但团队打成一团”的坑。
1. 互联网公司的“鄙视链”:沟通问题的缩影
典型互联网公司内部,可能会有这样一条“鄙视链”:
- 产品:
“我要改变世界,是你们技术实现不了。” - 技术经理:
“下面程序员一天到晚挖坑拖进度,我啥时能上岸?” - 研发:
“运维啥都不会,出问题就重启 / 重装。” - 运维:
“测试每天点点点,就会点 UI。” - 测试:
“你们写的 bug,我一运行就崩。”
虽然夸张,但说明两个现实问题:
- 语境不同(同一个词,各自理解不一样);
- 立场不同(屁股决定脑袋)。
2. 通用语言(Ubiquitous Language):统一“语境”
以电商系统里的“用户(User)”为例:
- 在交易子系统:核心是「买家 / 卖家」;
- 在客服 / IM 子系统:核心是「客服 / 商家员工」;
- 在认证子系统:可能是「租户 / 员工」。
如果大家口头都说“用户”,但脑子里各想各的,就注定吵架。
DDD 提出的通用语言(Ubiquitous Language),本质就是:
- 把关键概念落在纸面上:术语表、名词解释;
- 不同子系统,用清晰、统一的命名:
买家企业、卖家员工、租户等;
- 所有干系人(产品、业务、开发、测试、运维)围绕同一术语沟通。
架构在这里的作用:划清边界,统一词汇,让大家在同一张图上吵架。
3. 立场不同:用 SWOT 对事不对人
一个经典“误会”的故事:
产品经理想做一个“根据手机壳颜色自动换皮肤”的功能:
- 产品视角(机会 / 优势):
- “全球第一个这种交互,省掉大量广告费,自带传播点!”
- 研发视角(劣势 / 风险):
- “要识别手机壳颜色,软硬件加起来一年要花一千万。”
- “功能容易被竞品抄袭,投入巨大,壁垒不高。”
双方都没错,只是立场不同。
这时,架构师可以拉大家坐下来,用一页 SWOT 分析:
- Strength:品牌差异、用户吸引力;
- Weakness:研发成本高、技术风险大;
- Opportunity:会不会打开新用户群体;
- Threat:能否被迅速抄袭,回本周期多久。
写在纸上的决策依据,比“你不懂业务 / 你不懂技术”的吵架有效多了。
架构师的价值之一:通过结构化分析,把“情绪化冲突”收束到“理性权衡”上来。
4. 渠道失真:让决策“当场定”,而不是“传话游戏”
还有一个常见问题是传话走样:
- 你跟一个人说;
- 他再转述给另一个人;
- 转几手之后,需求完全变味。
类似用机器翻译反复翻:中文→韩文→法文→西班牙文→中文,最后“领域驱动设计”可能变成“学会开车了吗?”。
应对这个问题,架构更偏向**“多方参与、同步对齐”**:
- 开会时把产品、研发、测试、运维都拉进来;
- 用文档(SWOT、架构图、决策记录)作为共同“真相源”。
决策派的架构观认为:
架构不只是最后的结果图,而是决策过程本身 + 决策依据的完整记录。
四、架构是“渐进式演进”的设计:拆迁、绞杀、修缮三大模式
如何在不搞垮现有系统的前提下,上新架构?
可以用三个经典演进模式来思考:拆迁者 / 绞杀者 / 修缮者。
1. 拆迁者模式:推倒重来,一次性大迁移
思路很直接:
- 重新开发一整套新的子系统
A' B' C' D' E' F' G'; - 旧系统
A B C D E F G期间不动; - 到某个时间点,一次性:
- 把流量切到新系统;
- 把数据流也迁过去。
优点:
- 旧系统在迁移前几乎不受影响;
- 新系统可以完全按新架构设计,无历史包袱。
缺点:
- 动作太大,风险高;
- 试错成本巨大,不易快速迭代。
大公司极少在核心业务上这么玩,更多只会在局部 / 新产品线上试。
2. 绞杀者模式:像藤蔓一样,一点点“接管”老树
这个名字来自“绞杀榕”:藤蔓不断长大,最后把宿主树“吸干”。
在系统里,做法是:
- 挑一个子模块,比如
F,做出一个新版本f; - 把所有指向老
F的流量,转发到f(但对外接口保持兼容); - 再换掉
C→c,D→d……; - 渐进过程中:
- 内部模块之间可以逐步切到 V2 的新接口;
- 对外仍兼容旧接口,必要时用适配器。
当 A B C D E F G 全部替换为 a b c d e f g,外界再统一切流量到新系统,旧系统就可以“退休”了。
特点:
- 适合大型老系统,风险可控;
- 能边跑业务边演进架构。
3. 修缮者模式:修文物一样,尽量不破坏老系统
修缮模式更加“温柔”:
- 新代码直接部署在原来的服务器上;
- 不动老接口,不拆老模块,而是:
- 在
BCD等模块中增加新逻辑; - 新旧逻辑在内部慢慢切换;
- 内部之间先统一成新接口版本,再逐步废弃旧接口。
- 在
更像是对一个古董建筑“边使用边修护”。
优点:
- 对外影响最小;
- 特别适合“极难停机”的 legacy 系统。
现实中难点:
- 很容易“不小心影响原系统”;
- 对团队、测试、发布管控要求非常高。
实战里:绞杀者用得最多,拆迁者常用于次要系统或重构失败后全推倒,修缮者听起来完美,但真正安全实施并不容易。
五、演进要可验证:适应度函数(Fitness Function)
光有模式还不够,你还得知道:这次架构演进到底有没有把非功能性搞砸?
来自《Evolutionary Architecture(演进式架构)》里一个很重要的概念:适应度函数(Fitness Function)。
可以简单理解为:
用一组自动可执行的“测试”,持续评估你的架构在关键质量属性上的表现。
几个维度可以帮你理解:
-
原子 vs 整体:
- 原子适应度:针对某个微服务(比如前面的小
a)的性能、可靠性测试; - 整体适应度:针对整个系统端到端的非功能性测试。
- 原子适应度:针对某个微服务(比如前面的小
-
触发式 vs 持续式:
- 触发式:上线前专门跑一遍;
- 持续式:把这些测试长期跑在某个“适应度中心”(CI/CD 管线、独立监控平台)。
-
静态 vs 动态:
- 静态:固定几个输入参数做边界测试;
- 动态:随机选取范围内的输入做更广泛的探索性测试。
-
自动 vs 手动,预设 vs 临时:
- 自动 / 预设:放入 CI/CD 流水线,每次变更必跑;
- 手动 / 临时:遇到疑似风险时,人为触发专项测试。
关键点:别只设计“架构图”,要同时设计“怎么持续测它是否健康”的那套东西。
六、架构是“早期决策”的结果:用分析而不是拍脑袋
架构本质上是一堆早期、难以后退的决策的集合。
比如选容器编排平台,就不是一句“大家都在用 K8s”这么简单。
1. 用 SWOT 选容器编排:Mesos/Marathon vs Kubernetes
对比两个方案:
Mesos + Marathon 的 SWOT(示意)
-
优势(S):
- 把整个数据中心当“一台大机子”来统一调度;
- 不仅能管容器,还能管大数据、HPC 等任务;
- 支持多类框架,上手相对简单。
-
劣势(W):
- 混合云支持不完善;
- 生态和文档(尤其中文)相对弱。
-
机会(O):
- 如果未来“大数据 + 容器”整合,这是天然优势;
- 可以在上面跑多种调度框架,形成“田径场”。
-
威胁(T):
- 容器编排江湖“只容一个老大”;
- Kubernetes 已经事实一统江湖。
Kubernetes 的 SWOT(示意)
-
优势(S):
- 几乎所有主流公有云(BAT / 亚马逊 / 谷歌 / 微软等)都支持;
- 适合搭私有云 + 公有云,做混合云弹性伸缩;
- 文档、培训、生态极其丰富;
- 对存储、有状态服务、伸缩等支持成熟。
-
劣势(W):
- 定位偏“容器云”,很难与大数据等非容器任务统一调度;
- 集群本身组件复杂,新手学习和运维门槛高。
-
机会(O):
- 在容器编排垂直领域“标准化”的机会极大。
-
威胁(T):
- 新一代技术(例如更高级的 Serverless / FaaS)可能把容器层进一步抽象掉。
最后决策不能只看“谁更潮”,而要综合:
- 业务是否真的需要混合云;
- 团队对各自方案的掌握情况;
- 运维 / 测试的能力边界;
- 未来三到五年的路线。
2. RACI 决策矩阵:谁说了算,谁干活,谁被通知
光有分析还不够,很多团队还有一个问题:到底谁说了算?谁负责执行?谁只是提意见?
这时可以用一个非常实用的工具:RACI(或 RASCI)矩阵。
- R – Responsible:执行人,干活的;
- A – Accountable:最终负责拍板的人(一般是技术负责人 / 架构 Owner);
- S – Support:执行支持者,可能同意也可能反对,但落地时需要依赖他;
- C – Consulted:顾问,通常是资深架构师 / 项目经理,负责提专业意见;
- I – Informed:需要被告知的人(测试、运维、业务代表等)。
每一个重要决策(比如“选哪个容器平台”、“选哪个网关”、“选哪套日志方案”)都可以用一张 RACI 表记录清楚。
对架构师来说,一个很重要的能力是:让决策有结构、有记录、有负责人,而不是“群聊里说了一句算数”。
七、架构帮助“看清约束”:约束矩阵 & 风险矩阵 & 质量属性
除了功能以外,架构最重要的输入是:各种约束 + 质量要求(非功能性需求)。
1. 把“需求 – 质量 – 约束”放在一张表里
可以用一个类似 ADMEMS 的矩阵来梳理:
- 每一行是一个需求(功能也好,业务目标也好);
- 后面几列写:
- 要达到哪些质量目标(比如性能、扩展性、安全性……);
- 满足这些目标时,会受到哪些约束(团队能力、法规、行业规范、客户特点、遗留系统等)。
实际中,约束可能来自:
- 公司层面的技术规范:必须开源 / 禁止某类闭源组件;
- 行业监管:安全合规、审计要求;
- 团队能力:会不会某种技术栈,交付节奏能不能撑住;
- 客户侧:目标用户群体的设备、网络、语言、隐私等。
2. RAID 矩阵:Risk / Assumption / Issue / Dependency
另一个常用工具是 RAID:
- R(Risk)风险:还没发生,但有可能发生的问题;
- A(Assumption)假设:已经确认的前提,比如“企业架构强制要求开源方案”;
- I(Issue)问题:已经发生的障碍,比如“Jenkins 与现有 Docker 环境有兼容问题”;
- D(Dependency)依赖:仍未确定,但会影响决策的外部前提,比如“架构办尚未决定是否必须开源”。
RAID 和约束矩阵通常交叉使用:
- 约束矩阵偏“整体盘点”:我们拥有哪些需求、质量目标、约束;
- RAID 偏“项目执行过程”:这些约束在实施中不断被验证、缓解、暴露。
3. 质量属性:架构师必须能聊“非功能性”
在面试和实战中,真正区分“架构师”和“高级程序员”的,很大一块就在对非功能性的理解和落地。
常见核心质量属性包括:
- 扩展性(Scalability):能增长到多大的规模;
- 性能(Performance):吞吐量、延迟、资源利用情况;
- 高可用(Availability):容错能力、故障转移、能撑几个“9”;
- 安全性(Security):防攻击、防数据泄露、防破坏,合规性;
- 耦合度(Coupling):系统内部和系统之间的解耦程度。
还有一些“第二圈”的质量:
- 伸缩性(Elasticity):扩到 1 万节点 / 收缩到 10 节点的速度和成本;
- 可用性 vs 易用性:服务能不能被访问(Availability),好不好用(Usability);
- 可维护性(Maintainability):改动成本、排障效率;
- 一致性 / 可移植性(Portability):在不同环境下跑得有多稳(容器化是典型手段);
- 可操作性 / 可运维性(Operability);
- 可重用性(Reusability)。
作为准架构师,你回答“架构重点关注什么”的时候,优先从这些质量属性讲起,再辅以具体的业务例子,通常比分散讲很多“功能点”更抓人。
八、组织与架构:康威定律 + 凤凰项目(DevOps 视角)
1. 康威定律:组织长什么样,系统就长什么样
随着微服务和“业务小组”模式流行,康威定律已经变成一个你绕不开的词:
组织的沟通结构,会反射到它的系统结构上。
举个“打车平台”的例子:
-
老模式:
- IT 组织按“技术职能”划分:DBA、网络、运维、测试、开发;
- 系统是一个大中台,所有 API / UI / 数据库接口都揉在一块;
- 适合变化不大的传统业务。
-
新模式:
- 围绕“业务域”划分小团队:乘客域、司机域、地图域、通知域、支付域、对账域……;
- 每个团队里都有:业务、产品、开发、测试、运维、架构;
- 对外暴露清晰 API / 协议 / UI,把内部复杂度封装在团队内。
这也是为什么 微服务 + 小团队 + 业务导向 往往是绑定在一起出现的。
2. “两个披萨原则”:团队不要大到需要三份披萨
亚马逊创始人贝索斯的“两块披萨团队”原则也很有名:
- 一个团队的人数不应该多到超过两块披萨能喂饱的人数;
- 大约 6~12 人:
- 小于 6,人太少,角色不齐;
- 超过 12,沟通链路会爆炸。
对系统拆分的启发是:
- 服务的规模最好刚好适合一个 6~12 人的团队负责;
- 不需要额外跨很多团队协调,就能闭环开发、上线、运维。
3. 凤凰项目:从传统企业看 DevOps 和架构
《凤凰项目》是一本被很多架构师和 DevOps 从业者推荐的小说。
故事大致背景是:
- 一家传统零售公司面对新型互联网对手,被迫启动一个“凤凰项目”;
- 期望通过这个项目完成 IT 转型和业务自救;
- 项目负责人比尔 + 研发 VP + 安全总监之间发生了一系列冲突与转变。
书中总结的 DevOps 三大方法(简化版):
- 顺畅的工作流:减少关键人物“单点故障”,释放瓶颈角色;
- 快速反馈:不要半年开发、一周上线,不知道客户喜不喜欢;
- 持续学习与实验:不断通过小变更和反馈去迭代体系。
从架构师视角,这本书暴露出的问题包括:
- 开发 / 测试 / 生产环境严重不一致;
- 新旧项目共用相同的瓶颈资源(关键运维工程师),高度耦合;
- 新项目依旧沿用老的发布和变更流程,完全“翻新不彻底”;
- 无法快速搭建性能测试环境来验证促销高峰的承载能力;
- 安全审计的要求长期压着团队,成本极高。
书中给出的一个关键思路是:利用云的弹性扩缩容来承载峰值压力和测试需求,以及通过组织、流程、架构多方面调整,真正实现 DevOps。
对你这个阶段的启发是:不要只从“技术栈”看架构,要习惯从“组织 + 流程 + 工具 + 架构”一起看。
九、架构复用与成长:30% 原则 & 职业路径
1. 架构可以复用什么?
可复用的不只是一段段代码,更多的是方法和模型:
- 方法论:
- 比如 ABSD、DSSA、AT;
- 各类企业架构框架(如 TOGAF / EA);
- 模型和图:
- UML、组件图、部署图;
- SOA、组件化、领域建模等;
- 工件与资产:
- 设计文档、模板、表格、图表;
- 公共模块、类库、打包产物;
- 图片素材、知识库、Wiki。
复用的关键问题只有一个:在新的业务场景中,是否真的适用。
2. 30% 原则:你能复用 30%,就已经很厉害了
现实里,很少有项目能“完全照搬”某个方法论或框架。
经验是:
- 如果你在一个新项目里,能真正有效复用一个方法论的 30%,就已经相当不错;
- 典型情况:
- 用两套方法论的部分内容,凑出 60~70% 的通用方法;
- 剩下 30~40% 是项目特有的定制化。
换句话说:
- 一个框架要求“出 50 份文档”,
- 你项目里好好写 15 份、写对写精,通常就足够支撑落地。
更重要的是:
- 项目结束后,要记得把成功的工件和经验回填到公司的知识库 / Wiki / 文档库;
- 如果条件允许,也可以对外分享(社区、GitHub、讲座),形成个人品牌。
架构是一个“越复用越值钱”的职业。
你复用的是方法,也是你自己作为架构师的“资产”。
十、面试视角:把方法论“讲得出来”
原课程最后用 5 道面试题做了总结,你可以把这几道题当成检验自己是否“真的理解这一章”的工具。
-
如何用架构解决部门冲突?
- 回答里要出现:通用语言(解决语境问题)、SWOT(解决立场问题)、RACI / RAID(解决决策和记录问题),别只讲“多沟通、多喝茶”这种软技巧。
-
架构设计主要关注什么?
- 先讲非功能性质量(扩展性、性能、可用性、安全性、耦合度等),再用真实项目说明你是如何在设计中体现这些质量目标的。
-
如何处理新旧架构冲突?
- 一方面说明:为什么旧架构已经不够用(技术债 & 新的非功能性要求);
- 一方面说明:你会选择拆迁 / 绞杀 / 修缮中的哪一种或几种组合,并配一个真实迁移案例。
如果你能围绕这些题,讲出带有案例、带有方法论、带有反思的回答,那你不只是“听过这一章”,而是真的把它变成了自己的东西。
结语
软件架构的意义,不在于画了多少漂亮的图,而在于:
- 能不能在业务指数级增长中稳住系统;
- 能不能让一群角色立场不同的人坐在一张桌子上做出理性的决策;
- 能不能在技术快速演进时,找到一条既不保守躺平、又不过度激进的演进路线。
把这些想清楚、做出来,你就不只是一个“写代码的”,而是在架起需求到落地的桥梁,构建自己的 IT 新蓝图。