程序员如何做「系统设计」:不是画图,是解决问题
系统设计是程序员从写代码到设计系统的跨越。
会写代码是基础,能设计系统才能解决更大的问题。
一、系统设计的层次
1. 单体应用设计
一个应用怎么组织,模块之间怎么交互。
2. 分布式系统设计
多个服务怎么协同,数据怎么同步。
3. 大规模系统设计
如何支撑海量请求,高可用怎么实现。
二、系统设计的步骤
1. 需求分析
- 功能需求:系统要做什么
- 非功能需求:性能、可用性、扩展性
- 约束条件:时间、资源、技术栈
2. 容量预估
- 用户量、请求量
- 数据量、存储量
3. 架构设计
- 高层架构:分多少层、多少服务
- 数据存储:用什么数据库、怎么分库分表
- 缓存策略:哪些要缓存、缓存在哪里
- 异步处理:哪些可以异步、怎么异步
4. 详细设计
- 接口设计
- 数据模型
- 核心流程
5. 权衡取舍
- CAP 理论
- 一致性 vs 可用性
三、系统设计的关键问题
1. 可用性
多副本、故障转移、熔断降级。
2. 一致性
强一致 vs 最终一致,主从同步。
3. 扩展性
水平扩展 vs 垂直扩展,无状态服务。
4. 性能
缓存、异步、索引。
四、常见错误
❌ 不考虑约束
设计很完美,但实现不了。
❌ 过度设计
为不需要的规模提前设计。
❌ 不考虑维护
设计的时候不考虑后续维护。
五、一句话总结
系统设计 = 需求分析 + 容量预估 + 架构设计 + 详细设计 + 权衡取舍,核心是在约束条件下找到最优解。