如何做一个好的系统设计

92 阅读1分钟

当谈论到系统设计时我们在聊什么?

工作中的系统设计 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

其他

  • 安全性考虑
  • 如何测试/监控/部署?