如何表现出色


本节目标: 学会如何在系统设计面试中表现出色的技巧。

面试时要做什么

我们强调,候选人应该努力避免看起来毫无创意。面试官可能已经向许多候选人问过同样的问题。复制一个普通的设计可能不会给面试官留下深刻印象。

同时,面试可能是一个压力很大的场景。制定合理的解决问题的计划会是一个很好的策略。对于不同的候选人,可以有不同的策略来解决设计问题。我们建议采用以下策略。

制定战略,然后分而治之

面试过程中可以引导面试官, 按照如下方式进行:

提炼问题

我们需要了解设计问题及其要求。我们可以戴上产品经理的帽子,通过询问面试官细化的问题来确定相关功能的优先级。

我们的想法是与面试官一起去旅行,同时明白我们要怎么设计/为什么要这样设计。这些访谈旨在衡量我们是否能够从逻辑上从模糊的需求中推导出一个系统。

确保我们正在解决正确的问题。通常需要按照如下标准将需求分为两组:

  • 客户直接需求——例如: 能够近乎实时地向朋友发送消息。
  • 间接需求——例如: 消息服务性能不应随着用户负载的增加而降低。

提示

注意: 专业人士称这些为功能性和非功能性需求。

处理数据

我们需要识别和理解数据及其特征,以便为系统设计合适的数据存储系统和数据处理组件。

在寻找合适的系统和组件时可以参照下面的标准:

  • 现在数据的大小是多少?
  • 随着时间的推移,数据预计会以什么速度增长?
  • 其他子系统或最终用户将如何使用这些数据?
  • 数据是重读还是重写?
  • 我们需要数据的严格一致性,还是最终一致性?
  • 数据的持久性目标是什么?
  • 存储或传输用户数据时有哪些隐私和监管要求?

讨论组件

在某种程度上,我们的工作可以被视为:

  • 明确将使用哪些组件
  • 将它们放置在何处
  • 组件之间如何相互交互。

eg: 数据库的类型——使用传统数据库还是 NoSQL 数据库?

可能在某些情况下,我们有强烈的论据要使用 NoSQL 数据库,但我们的面试官可能会坚持我们使用传统数据库。遇到这种情况怎么办?

可以考虑从理论上设计一个新组件, 既满足业务需求, 也满足面试官的想法, 这种交互是展示我们设计技能的绝佳机会。

提示

注意: 我们经常将组件的细节抽象为框,并使用箭头来显示它们之间的交互。它有助于在较高级别定义面向用户的 API,以进一步了解系统数据和交互需求。

讨论权衡

请记住,设计问题没有唯一的正确答案(没有银弹)。如果我们把同样的问题交给两个不同的小组,他们可能会想出不同的设计。

这是因为设计解决方案中存在多样性:

  • 不同的组成有不同的优缺点。我们需要仔细权衡什么对我们有用。
  • 不同的选择在金钱和技术复杂性方面有不同的成本。我们需要有效地利用我们的资源。
  • 每个设计都有其弱点。作为设计师,我们应该意识到所有这些问题,并且我们有一个后续计划来解决它们。

我们应该向面试官指出我们设计中的弱点,并解释为什么我们还没有解决这些问题。

eg: 当前的设计无法处理十倍的负载,但可以预期到系统不会很快达到那个水平。

解决方案: 添加一个监控系统,密切关注负载随时间的增长情况,以便及时实施新设计。

这是一个例子,我们有意的选择牺牲性能的方式, 降低了系统成本。

在一个大系统中,总会有一些事情失败。 我们需要将容错和安全性集成到我们的设计中。

面试中不能做什么

以下是我们在系统设计面试中应该避免做的几件事:

  • 不要在系统设计面试中编写代码。
  • 不要在没有计划的情况下开始设计。
  • 不要默默工作。
  • 不要无缘无故地描述数字。我们必须框起来。
  • 如果我们不知道某事,不要掩饰,也不要假装知道。

提示

注意: 如果面试官要求我们设计一个我们从未听说过的系统,我们应该诚实地告诉他们。面试官要么向我们解释,要么他们可能会改变问题。