六、系统设计面试(第二部分)

原文:Chapter 6: System Design Interviews (Part II)

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

这是我们的“谷歌面试准备系列完整指南”的第六章。

我们将继续讨论上一章的系统设计面试。 在这篇文章中,我们将主要关注一些实际的现场策略。

假设你已经有了合理的设计(如果没有,请查看我们之前的章节),这里的想法是,如何在系统设计面试中使结果最优。 如何清晰地传达你的方法既是一门科学,也是一门艺术。 此外,许多候选人都太急于炫耀自己的知识,并倾向于使用一些在当前情况下毫无意义的流行语。 我们将在本章中解决所有这些问题和危险信号。

简单的概要设计

简单,直接和高效的系统真的会胜利。 Unix 是一个很好的例子,它用小的组件构建,每个组件只做一件事情,但是使它变得完美。我一直是这样的系统的铁杆粉丝,从系统设计面试的角度来看,它也让你的生活更轻松。

有些人真的想炫耀自己可以设计一些复杂的东西,只是从一个过于复杂的系统开始。这是完全错误的心态。

面试官关心的不是你使用的是多么酷的技术,而是你能否设计一个可行的系统。我见过这么多的候选人,在不考虑这个问题的情况下,不停地说各种流行语。你知道吗,我认为这些流行语只是废话,请在面试中忘记。

推荐的方法是从尽可能简单的事情开始,并尝试设计一个概要解决方案。如果你被要求设计 Google 自动补全系统,你最开始可以为带有指定前缀的最常见的查询提建议,以便你只需要一个日志处理器和一个建议服务器。

当然,这个解决方案在很多情况下都不起作用,比如有时我们需要个性化,数据可能会超出内存限制。那么我们可以考虑问题的优先度并逐一解决。千万不要让问题过度复杂,而让自己陷入困境。

不要赶时间

编程面试中的一个常见陷阱就是,在没有多少考虑和讨论的情况下开始编程。 系统设计面试中也有同样的问题。

请记住,没有人会期望你在几秒钟内就能设计出一个方案。 将整个面试过程视为讨论而不是考试。 如果是讨论,会鼓励你把想法说出来。 你不需要快速做出解决方案,但是你可以谈论你如何看待这个问题,你现在想要解决什么问题,以及你被什么卡住了。

作为一名面试官,我会雇佣的候选人通常会使整个面试过程非常舒适。 这完全是一个讨论过程,就像我们一起在研究这个问题。 他们不会假装知道一切。 相反,他们会一直告诉我他们在纠结什么,以及他们如何解决问题。

权衡

没有任何一种解决方案在所有情况下都能完美运行,这意味着你应该非常清楚你设计的优缺点。

请记住,你的解决方案高度依赖于限制,可以是显式的也可以是隐式的。显式的限制是面试官设定的限制,就像你只有一台机器一样。但是,大多数人不重视隐式的限制。

很多时候我们只是在不知情的情况下做出假设。揭开这些隐藏的假设可以帮助你更好地理解你的解决方案。例如,时间和空间的权衡是设计问题的共同主题。在某些时候,可以慢一点,但是可以节省很多内存。如果你有明确的理由,速度在特殊情况下并不重要,那么你的设计是合理的。

好的做法是考虑一下其他方法,以及为什么你选择的方法更好。通常情况下,更好的原因是由于一些限制和假设。所以验证这些假设是很重要的。在面试中改变你的想法是完全没问题的。事实上,这是一个好兆头,你正在考虑所有情况。

数量

很多人很疑惑,是否考虑可扩展性以及是否将数据分发到多台机器。 有时你不会知道一台机器是否足够,除非做一些数学运算。 例如,在上一个问题(Google 自动补全)中,如果你拥有所有搜索查询的粗略数量,则应该能够告诉你需要多少内存,以及将所有索引放在内存中是否可行。

换句话说,有时候无论要不要扩展,面试官都不会告诉你。 你可以通过合理的假设得出答案,并进行计算。

这是非常重要的一点,因为在真实的项目中,优秀的工程师正在以这种方式做出很多决定。 这当然需要一些练习。

有一些现有的库

一个常见的错误就是,许多候选人都想告诉我“有些库可以做这个”,作为不详细设计这个功能的借口。

面试官是否知道现有的库?当然。但是,要求候选人设计特定的功能还有很多原因:

  • 现有的库可能做得不好。例如,很多库都能够从网页中提取日期信息,但是没有一个能够完美的实现它。事实上,在很多公司公司中,这个特性本身就需要一个大的团队。
  • 考虑到约束的特殊问题,可能会有更好的解决方案。
  • 最后,每个设计问题都有现有的系统,但讨论这个问题还是有意义的。

但是,我并不是说在系统设计面试中,不应该使用任何现有的工具。设计问题要关注重点。如果它是一个常见的工具,或者与整体问题相比毫无意义的东西,那么使用现有的工具是完全正确的。

总结

再次说明,在系统设计面试中,经验胜过一切。 如果你对这个问题毫无经验,要想出合理的设计是不容易的。

正如我刚才所说,如果你有足够的时间,我鼓励你在闲暇时间做一些事情。

另外,我还建议与经验丰富的工程师讨论。 如果你从来没有做过这样的讨论,你怎么能期望自己在面试中表现出色呢? 即使是本章的技巧,你也需要大量的练习,不要期望在第一次系统设计面试中掌握所有的技巧。

顺便提一下,如果你想得到资深的面试官的更多指导,可以查看 Gainlo,以便与 Google,Facebook 等公司的工程师进行模拟面试。