软件架构的意义:给一线开发和准架构师的一封信

55 阅读21分钟

软件架构的意义:给一线开发和准架构师的一封信

架起需求到落地的桥梁,构建你的 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. 绞杀者模式:像藤蔓一样,一点点“接管”老树

这个名字来自“绞杀榕”:藤蔓不断长大,最后把宿主树“吸干”。

在系统里,做法是:

  1. 挑一个子模块,比如 F,做出一个新版本 f
  2. 把所有指向老 F 的流量,转发到 f(但对外接口保持兼容);
  3. 再换掉 CcDd ……;
  4. 渐进过程中:
    • 内部模块之间可以逐步切到 V2 的新接口
    • 对外仍兼容旧接口,必要时用适配器。

A B C D E F G 全部替换为 a b c d e f g,外界再统一切流量到新系统,旧系统就可以“退休”了。

特点

  • 适合大型老系统,风险可控;
  • 能边跑业务边演进架构。

3. 修缮者模式:修文物一样,尽量不破坏老系统

修缮模式更加“温柔”:

  • 新代码直接部署在原来的服务器上;
  • 不动老接口,不拆老模块,而是:
    • B C D 等模块中增加新逻辑
    • 新旧逻辑在内部慢慢切换;
    • 内部之间先统一成新接口版本,再逐步废弃旧接口。

更像是对一个古董建筑“边使用边修护”。

优点

  • 对外影响最小;
  • 特别适合“极难停机”的 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 三大方法(简化版):

  1. 顺畅的工作流:减少关键人物“单点故障”,释放瓶颈角色;
  2. 快速反馈:不要半年开发、一周上线,不知道客户喜不喜欢;
  3. 持续学习与实验:不断通过小变更和反馈去迭代体系。

从架构师视角,这本书暴露出的问题包括:

  • 开发 / 测试 / 生产环境严重不一致;
  • 新旧项目共用相同的瓶颈资源(关键运维工程师),高度耦合;
  • 新项目依旧沿用老的发布和变更流程,完全“翻新不彻底”;
  • 无法快速搭建性能测试环境来验证促销高峰的承载能力;
  • 安全审计的要求长期压着团队,成本极高。

书中给出的一个关键思路是:利用云的弹性扩缩容来承载峰值压力和测试需求,以及通过组织、流程、架构多方面调整,真正实现 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 新蓝图。