当谈论到系统设计时我们在聊什么?
工作中的系统设计 V.S 面试中的系统设计
- 共同点:
- 核心原则:模块化、一切从需求出发、低耦合、拓展性、底层存储设计……
- 为复杂的场景和需求提供合适的解决方案
- 知识和技术背景,了解技术知识
- 不同点:
- 工作中要求更深入某一种业务场景,实践细节和复杂性
- 面试中重视广度,不同业务场景的设计
- 工作中时间更长,面试中只有几十分钟,突出亮点
- 资源和实际限制不同,工作中要求投入产出比;面试没有资源限制
常见的误区
- 普通程序员不用管系统设计
- 没有从需求出发
- 妄图用一套架构套用在所有系统上
- 技术自嗨 V.S 技术守旧
- 没有考虑到拓展性的问题
- ……
- 忽视非功能性需求
- 没考虑到拓展性和可用性
1、一切从需求出发
2、Design For Failure
3、Trade off 权衡
如何做一个系统设计
需求
- 一切从需求出发!!!
- 要解决的问题领域/范围
- 用户用例 / user story / 需要的功能
- Function Requirements / Non-Function Requirements
- 用户流量预测估计
模块/服务划分
- 模块(服务)边界划分(High Level)
- 模块间的关系与交互(High Level)
- API设计(Low Level)
数据存储
- 数据如何存储/访问(Low Level)
- 数据库表设计(Low Level)
- Data Flow(Low Level)
可用性/拓展性考虑
- 系统如何拓展
- 潜在性能优化
- Design For Failure
其他
- 安全性考虑
- 如何测试/监控/部署?