forked from apachecn/gainlo-interview-guide-zh
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
4245d8f
commit d59a186
Showing
1 changed file
with
75 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,75 @@ | ||
# 六、系统设计面试(第二部分) | ||
|
||
> 原文:[Chapter 6: System Design Interviews (Part II)](http://blog.gainlo.co/index.php/2017/04/13/system-design-interviews-part-ii-complete-guide-google-interview-preparation/) | ||
> 译者:[飞龙](https://github.com/wizardforcel) | ||
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/) | ||
> 自豪地采用[谷歌翻译](https://translate.google.cn/) | ||
这是我们的“谷歌面试准备系列完整指南”的第六章。 | ||
|
||
我们将继续讨论上一章的系统设计面试。 在这篇文章中,我们将主要关注一些实际的现场策略。 | ||
|
||
假设你已经有了合理的设计(如果没有,请查看我们之前的章节),这里的想法是,如何在系统设计面试中使结果最优。 如何清晰地传达你的方法既是一门科学,也是一门艺术。 此外,许多候选人都太急于炫耀自己的知识,并倾向于使用一些在当前情况下毫无意义的流行语。 我们将在本章中解决所有这些问题和危险信号。 | ||
|
||
## 简单的概要设计 | ||
|
||
简单,直接和高效的系统真的会胜利。 Unix 是一个很好的例子,它用小的组件构建,每个组件只做一件事情,但是使它变得完美。我一直是这样的系统的铁杆粉丝,从系统设计面试的角度来看,它也让你的生活更轻松。 | ||
|
||
有些人真的想炫耀自己可以设计一些复杂的东西,只是从一个过于复杂的系统开始。这是完全错误的心态。 | ||
|
||
面试官关心的不是你使用的是多么酷的技术,而是你能否设计一个可行的系统。我见过这么多的候选人,在不考虑这个问题的情况下,不停地说各种流行语。你知道吗,我认为这些流行语只是废话,请在面试中忘记。 | ||
|
||
推荐的方法是从尽可能简单的事情开始,并尝试设计一个概要解决方案。如果你被要求设计 Google 自动补全系统,你最开始可以为带有指定前缀的最常见的查询提建议,以便你只需要一个日志处理器和一个建议服务器。 | ||
|
||
当然,这个解决方案在很多情况下都不起作用,比如有时我们需要个性化,数据可能会超出内存限制。那么我们可以考虑问题的优先度并逐一解决。千万不要让问题过度复杂,而让自己陷入困境。 | ||
|
||
## 不要赶时间 | ||
|
||
编程面试中的一个常见陷阱就是,在没有多少考虑和讨论的情况下开始编程。 系统设计面试中也有同样的问题。 | ||
|
||
请记住,没有人会期望你在几秒钟内就能设计出一个方案。 将整个面试过程视为讨论而不是考试。 如果是讨论,会鼓励你把想法说出来。 你不需要快速做出解决方案,但是你可以谈论你如何看待这个问题,你现在想要解决什么问题,以及你被什么卡住了。 | ||
|
||
作为一名面试官,我会雇佣的候选人通常会使整个面试过程非常舒适。 这完全是一个讨论过程,就像我们一起在研究这个问题。 他们不会假装知道一切。 相反,他们会一直告诉我他们在纠结什么,以及他们如何解决问题。 | ||
|
||
## 权衡 | ||
|
||
没有任何一种解决方案在所有情况下都能完美运行,这意味着你应该非常清楚你设计的优缺点。 | ||
|
||
请记住,你的解决方案高度依赖于限制,可以是显式的也可以是隐式的。显式的限制是面试官设定的限制,就像你只有一台机器一样。但是,大多数人不重视隐式的限制。 | ||
|
||
很多时候我们只是在不知情的情况下做出假设。揭开这些隐藏的假设可以帮助你更好地理解你的解决方案。例如,时间和空间的权衡是设计问题的共同主题。在某些时候,可以慢一点,但是可以节省很多内存。如果你有明确的理由,速度在特殊情况下并不重要,那么你的设计是合理的。 | ||
|
||
好的做法是考虑一下其他方法,以及为什么你选择的方法更好。通常情况下,更好的原因是由于一些限制和假设。所以验证这些假设是很重要的。在面试中改变你的想法是完全没问题的。事实上,这是一个好兆头,你正在考虑所有情况。 | ||
|
||
## 数量 | ||
|
||
很多人很疑惑,是否考虑可扩展性以及是否将数据分发到多台机器。 有时你不会知道一台机器是否足够,除非做一些数学运算。 例如,在上一个问题(Google 自动补全)中,如果你拥有所有搜索查询的粗略数量,则应该能够告诉你需要多少内存,以及将所有索引放在内存中是否可行。 | ||
|
||
换句话说,有时候无论要不要扩展,面试官都不会告诉你。 你可以通过合理的假设得出答案,并进行计算。 | ||
|
||
这是非常重要的一点,因为在真实的项目中,优秀的工程师正在以这种方式做出很多决定。 这当然需要一些练习。 | ||
|
||
## 有一些现有的库 | ||
|
||
一个常见的错误就是,许多候选人都想告诉我“有些库可以做这个”,作为不详细设计这个功能的借口。 | ||
|
||
面试官是否知道现有的库?当然。但是,要求候选人设计特定的功能还有很多原因: | ||
|
||
+ 现有的库可能做得不好。例如,很多库都能够从网页中提取日期信息,但是没有一个能够完美的实现它。事实上,在很多公司公司中,这个特性本身就需要一个大的团队。 | ||
+ 考虑到约束的特殊问题,可能会有更好的解决方案。 | ||
+ 最后,每个设计问题都有现有的系统,但讨论这个问题还是有意义的。 | ||
|
||
但是,我并不是说在系统设计面试中,不应该使用任何现有的工具。设计问题要关注重点。如果它是一个常见的工具,或者与整体问题相比毫无意义的东西,那么使用现有的工具是完全正确的。 | ||
|
||
## 总结 | ||
|
||
再次说明,在系统设计面试中,经验胜过一切。 如果你对这个问题毫无经验,要想出合理的设计是不容易的。 | ||
|
||
正如我刚才所说,如果你有足够的时间,我鼓励你在闲暇时间做一些事情。 | ||
|
||
另外,我还建议与经验丰富的工程师讨论。 如果你从来没有做过这样的讨论,你怎么能期望自己在面试中表现出色呢? 即使是本章的技巧,你也需要大量的练习,不要期望在第一次系统设计面试中掌握所有的技巧。 | ||
|
||
顺便提一下,如果你想得到资深的面试官的更多指导,可以查看 Gainlo,以便与 Google,Facebook 等公司的工程师进行模拟面试。 |