Skip to content

第 3 章:系统设计面试框架

引言

系统设计面试是招聘流程中的重要环节,模拟真实的问题解决场景。面试不仅考察技术能力,也考察协作、沟通以及处理模糊需求的能力。

本章介绍一个帮助应对系统设计面试的四步框架


第 1 步:理解问题并确定设计范围

主要目标

  • 澄清需求和假设。
  • 避免过早提出解决方案。
  • 通过有价值的问题展现批判性思维。

方法

  • 提出澄清问题:

    • 最重要的功能是什么?
    • 系统需要支持多大规模?
    • 面向 Web、移动端,还是两者都支持?
    • 是否有现成技术或其他限制?
  • 记录假设: 在白板或纸上记下假设,以供后续参考。

示例

题目: 设计一个信息流系统。
问题:

  • 它是移动应用、Web 应用,还是两者都有?
  • 一个用户最多能有多少好友?
  • 信息流是否包含图片和视频?
  • 信息流是否按时间倒序排列?

第 2 步:提出高层设计并取得共识

主要目标

  • 制定高层架构。
  • 与面试官合作完善设计。

方法

  • 绘制架构草图:

    • 用方框图表示主要组件,例如客户端、API、数据库、缓存和 CDN。
    • 将面试官视为队友,共同完善设计。
  • 进行粗略估算:

    • 验证设计是否能满足规模要求。
  • 梳理用例: 找出边界情况并验证设计假设。

示例

信息流系统可拆成两条流程:

  1. 信息流发布流程: 将帖子写入数据库,并填充好友的信息流。
  2. 信息流获取流程: 汇总好友的帖子,按时间倒序展示。

第 3 步:深入设计

主要目标

  • 深入讨论关键组件。
  • 展现理解深度和应变能力。

方法

  • 确定重点组件: 聚焦与问题最相关的部分。
  • 讨论瓶颈: 找出潜在性能问题并提出解决方案。
  • 控制细节深度: 避免过度设计或不必要的深挖。

示例主题

  • 短链接服务: 重点讨论哈希函数设计。
  • 聊天系统: 探讨降低延迟以及处理在线、离线状态。
  • 信息流系统: 分析信息流的发布和获取流程。

第 4 步:总结

主要目标

  • 指出可以改进的地方。
  • 回顾设计并讨论后续问题。

方法

  • 找出瓶颈: 讨论潜在限制和扩展策略。
  • 总结设计: 回顾主要设计决策及其权衡。
  • 提出改进方向:
    • 如何从 100 万用户扩展到 1000 万用户。
    • 如何处理服务器故障或网络问题。

最佳实践

应该做

  • 提问: 在着手设计前澄清模糊之处。
  • 沟通: 向面试官说明思考过程。
  • 共同迭代: 把面试官当作合作者。
  • 保持灵活: 提出替代方案并改进设计。
  • 聚焦关键组件: 优先讨论系统的重要部分。

应避免

  • 过早给出方案: 在理解需求前不要开始设计。
  • 长时间沉默: 在整个过程中持续沟通。
  • 过度设计: 聚焦实用且可扩展的方案。

时间管理

建议的时间分配(45 分钟面试):

  1. 理解问题与范围: 3–10 分钟
  2. 高层设计并取得共识: 10–15 分钟
  3. 深入设计: 10–25 分钟
  4. 总结: 3–5 分钟