第二十五章 架构师之路
一
年度考核后的第二周,赵北辰给王志远发了一条消息:
"公司有一个架构师培养计划,我推荐了你。下周一去参加面试。"
王志远看到消息的时候,正在吃午饭,差点被饭噎住。
架构师培养计划是云智科技的内部人才培养项目,每年选拔 5-8 个有潜力的开发者,进行为期半年的系统性培训。培训内容包括系统设计、分布式架构、高可用方案、技术管理等。
通过培训并考核合格的人,会被授予"高级工程师"的职级,有机会在项目中担任架构师角色。
"赵哥,我才入职一年多,够资格吗?"
"资格不是看工龄,是看能力和潜力。你的年度考核是'优秀',独立负责过核心模块,做过紧急项目的技术负责人。这些经历足够了。"
"但我对系统设计和分布式架构了解不多……"
"所以才要去学。培养计划就是让你从'写好代码'提升到'设计好系统'。"
二
面试比他想象的难。
面试官是公司的首席架构师老陈——一个头发稀疏但眼神锐利的中年人。
老陈没有问他具体的技术细节,而是给了他一个开放性的问题:
"设计一个短链接服务。用户输入一个长 URL,系统返回一个短 URL。当用户访问短 URL 时,系统重定向到原始的长 URL。日活用户 100 万,每天生成 10 万个短链接。"
王志远想了想,开始在白板上画。
他先画了整体架构:
用户 → 负载均衡 → Web 服务(无状态)→ 缓存(Redis)→ 数据库(MySQL)
然后他分析了几个关键问题:
- 短链接生成算法:用 Base62 编码(a-z, A-Z, 0-9),6 位字符可以表示 62^6 ≈ 568 亿个短链接,足够用。
- 唯一性保证:用自增 ID + Base62 编码,或者用哈希 + 冲突检测。
- 读写比:读远大于写(用户访问短链接的频率远高于创建短链接的频率),所以要重点优化读性能。
- 缓存策略:热门短链接放在 Redis 里,缓存命中率预计 > 90%。
- 数据库设计:一张表,字段有
id、short_code、long_url、created_at、expires_at。
老陈听完,追问了几个问题:
"如果两个用户同时提交同一个长 URL,应该返回同一个短链接还是不同的?"
"如果数据库挂了怎么办?"
"如果 Redis 挂了怎么办?"
"如果日活从 100 万增长到 1000 万,架构需要怎么调整?"
王志远回答了前两个问题,第三个问题答得不太好,第四个问题只给出了一个大致的方向。
面试结束后,老陈说了一句:"基础不错,但系统设计的思维还需要训练。你被录取了。"
三
培养计划的第一课,老陈讲了一个概念:CAP 理论。
"分布式系统有三个基本属性:一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)。CAP 理论说,这三个属性你最多只能同时满足两个。"
他在白板上画了一个三角形:
C(一致性)
/ \
/ \
/ \
A ───── P
(可用性)(分区容错性)
"在分布式系统中,网络分区(P)是不可避免的——网络总会出问题。所以实际上你只能在 C 和 A 之间选择:
- CP 系统:保证一致性,牺牲可用性。比如 ZooKeeper——当网络分区发生时,少数派节点会拒绝服务,保证数据一致。
- AP 系统:保证可用性,牺牲一致性。比如 Cassandra——当网络分区发生时,所有节点继续服务,但数据可能不一致。"
"那我们的短链接服务应该选 CP 还是 AP?"王志远问。
"你觉得呢?"
王志远想了想:"短链接服务的核心需求是'用户访问短链接时能正常跳转'。如果因为一致性问题导致服务不可用,用户体验会很差。所以应该选 AP——保证可用性,允许短暂的数据不一致。"
"对。"老陈点头。"但'短暂的数据不一致'需要有一个兜底机制——比如最终一致性。数据最终会一致,只是可能有几秒钟的延迟。"
这就是BASE 理论——Basically Available(基本可用)、Soft State(软状态)、Eventually Consistent(最终一致性)。它是 CAP 理论在实践中的应用。
四
培养计划持续了三个月(后续还有三个月的实践阶段)。
每周两次课,每次两小时。内容涵盖了:
- 分布式系统基础(CAP、BASE、一致性协议)
- 高可用架构(主从复制、故障转移、限流熔断)
- 微服务架构(服务拆分、服务治理、API 网关)
- 数据库架构(分库分表、读写分离、分布式事务)
- 缓存架构(缓存策略、缓存一致性、多级缓存)
- 消息队列(Kafka、RabbitMQ、消息可靠性)
- 系统设计方法论(需求分析、容量估算、架构演进)
王志远每次课后都会花两个小时整理笔记,把学到的知识跟自己的实际项目经验对照。
他发现,很多他在项目中"凭直觉"做的决策,其实背后都有理论支撑。比如他在消息通知中心里用事件驱动架构,本质上就是一种"异步解耦"的模式;他在拆单功能里用乐观锁,本质上就是一种"乐观并发控制"策略。
以前他是"知其然不知其所以然",现在他开始"知其所以然"了。
五
有一天课后,老陈跟他聊了一个话题:架构师的能力模型。
"好多人以为架构师就是画架构图的。"老陈说。"其实画图谁不会?架构师真正吃饭的本事是做决策。"
他在白板上画了一个能力模型:
架构师能力模型:
├── 技术深度:至少在一个领域有深入的理解
├── 技术广度:了解多种技术方案的优缺点
├── 系统思维:能从全局视角看问题,理解各部分的关系
├── 权衡能力:能在多个约束条件下做出最优决策
├── 沟通能力:能把技术方案讲给非技术人员听
└── 前瞻性:能预见系统的演进方向,提前做好准备
"其中最重要的是权衡能力。架构设计没有完美的方案,只有在各种约束条件下的最优方案。你要在性能和成本之间权衡,在一致性和可用性之间权衡,在简单和灵活之间权衡。"
"这跟技术选型很像。"王志远说。
"对。技术选型就是架构决策的一种。你之前做的 Spring Boot vs Quarkus 的对比分析,就是一个很好的架构决策过程——有数据、有实验、有权衡、有结论。"
王志远想了想:"那架构师和高级开发的区别是什么?"
"高级开发关注的是'怎么实现'——用什么技术、怎么写代码、怎么优化性能。架构师关注的是'怎么设计'——系统怎么拆分、模块怎么交互、数据怎么流动、故障怎么处理。"
"简单说,高级开发是'把事情做对',架构师是'做对的事情'。"
六
那天晚上,王志远坐在书桌前,面前摊着赵北辰留给他的架构师培养计划。
CAP、BASE、分布式一致性……这些词他以前在面试八股文里背过,但从来没有真正理解过。现在他开始明白了——架构师的核心能力不是画图,是做决策。在各种约束条件下,找到那个"没那么完美但最合适"的方案。
高级开发是"把事情做对",架构师是"做对的事情"。一字之差,天壤之别。
他忽然有点理解赵北辰为什么总是在白板前站那么久了。不是在画图,是在做取舍。
:::{admonition} 小胖的笔记 :class: tip
本章知识卡片:系统设计基础
1. CAP 理论
| 属性 | 含义 | 示例 |
|---|---|---|
| C(一致性) | 所有节点看到的数据一致 | 银行转账 |
| A(可用性) | 每个请求都能得到响应 | 电商网站 |
| P(分区容错) | 网络分区时系统仍能运行 | 分布式系统必须满足 |
实际选择:P 是必须的,所以在 C 和 A 之间选择。 - CP:ZooKeeper、HBase(强一致,可能不可用) - AP:Cassandra、DynamoDB(高可用,最终一致)
2. 系统设计面试框架
1. 需求澄清(5 分钟)
- 功能需求:系统要做什么?
- 非功能需求:QPS、延迟、可用性、数据量
2. 容量估算(5 分钟)
- 日活用户、QPS、存储量、带宽
3. 高层设计(10 分钟)
- 画架构图:客户端 → 负载均衡 → 服务 → 缓存 → 数据库
4. 详细设计(15 分钟)
- 数据模型、API 设计、核心算法
5. 扩展与优化(5 分钟)
- 缓存策略、数据库分片、CDN、监控
3. 架构师能力模型
| 能力 | 说明 |
|---|---|
| 技术深度 | 至少一个领域有深入理解 |
| 技术广度 | 了解多种方案的优缺点 |
| 系统思维 | 全局视角,理解各部分关系 |
| 权衡能力 | 在约束条件下做最优决策 |
| 沟通能力 | 把技术方案讲给非技术人员 |
| 前瞻性 | 预见演进方向,提前准备 |
:::