2

如何应对系统设计面试问题? - hackpack

 2 years ago
source link: https://www.jdon.com/61220
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何应对系统设计面试问题? - hackpack
在研究数据结构/算法 (DSA) 面试问题时,有一个清晰的剧本:掌握概念并始终如一地实践以应用这些知识。这种做法很容易,因为 LeetCode、HackerRank 和 AlgoExpert 等网站上有数千个 DSA 问题,这些问题反映了你在面试中会遇到的问题类型。

但是,系统设计问题是另一回事。大多数实践系统设计问题并不能反映你在面试中会遇到的问题。当然,有很多关于如何解决系统设计面试问题的高质量信息。但是,如果没有一套可靠的练习题,很难让这些信息坚持下去。

系统设计缺乏高质量的练习题
缺乏高质量的练习题是有道理的。系统设计问题可能是高度复杂的。为了建立一个系统,你不仅需要来自多个组件的输入,而且几乎总是需要一些外部状态。你不仅需要接受输入和返回值,而且很可能要处理复杂的用户互动,如指示数据的处理或处理多组依赖步骤。与你的标准DSA问题相比,它通常提供一些数字或字符串的列表作为输入,并且有一个可以在单个函数内完成的解决方案。更重要的是,一个系统的 "边缘案例 "是很多的;你必须准备好解释,如果你的系统中任何组件的组合发生故障,会发生什么。花时间创建一个高质量的练习题意味着必须抓住所有这些复杂性,这是一项艰巨而耗时的工作。

真正的面试
由于需要花费大量精力来创建,大多数练习题都是经过充分研究的问题,具有精确的输入、输出和最佳实践。像 "实现一个键值存储 "或 "实现一个URL缩短服务 "的问题。真实世界的面试中的系统设计问题则要模糊得多。它们很可能是你没有直接接触过的东西。可能有许多 "正确的方法 "来设计它。可能有一些解决方案在最初的约束条件下是不正确的,但在不同的约束条件下则是理想的。虽然现有的系统设计练习题在研究解决系统设计问题的一般结构时提供了有价值的参考材料,但很难从一个已知的解决方案向后努力,并将其所有的替代方案可视化。这也很容易让人陷入记忆特定的知名系统的陷阱,而不是设计你从未见过的东西的更有创造性的过程。

在去年秋天的面试中,我遇到了这个寻找高质量的实战系统设计问题的问题。我同时参加了Meta(当时是Facebook)、Google和Amazon的面试,我非常紧张,因为我无法对自己的系统设计面试技巧建立起信心。我在互联网上搜索高质量的系统设计面试问题,但一直觉得自己做得不够好,或者只是记住了具体系统的解决方案。

创造我自己的问题
然后有一天,我开始注意到某些产品的功能,我觉得很有趣。例如,当从电视上登录Netflix时,我注意到你可以在电脑上导航到一个登录页面,输入电视上的代码,然后从那里完成流程。我观察到,当我在一个电子商务网站上往购物车里添加东西,然后在结账时分心,30分钟后我就会收到一封邮件,告诉我不要忘记我的物品。

我开始问自己:如果我是这个产品的工程师,必须从头开始建立这个功能,我将如何做?

例如:如果我是Netflix的工程师,一个产品经理来找我说:"我们想让人们在电视上轻松登录,给他们看一个代码,让他们在电脑上完成。"我将如何构建?

如果我是亚马逊的一名工程师,一名产品经理来找我说,"我们需要在人们退出结账流程并且不再回来时向他们发送电子邮件提醒,"我将如何构建?

然后我就会坐下来,拿着笔和纸,从头开始设计这个功能。大多数时候,我都会画一张图纸或图表,说明支持这一功能的系统将如何运作。通常情况下,我会涉足我的知识盲点,不得不去查一些东西。我甚至会去公司的工程博客,看看他们是否写过关于我所设计的功能的东西,如果我被卡住了,就放弃了。

这样做了几周后,我发现我在系统设计面试中的信心比以前多了一倍,而且我发现面试要容易得多。我在三家大型科技公司的面试中都表现良好,并获得了所有公司的录用。

为什么有效
我认为这种尝试为真实世界的功能设计系统的方法是一种有效的系统设计实践问题的来源。因为功能背后有一个真实世界的系统,你可以肯定它是相对复杂的。当然,如果你选择设计一个很小的功能,情况就不会是这样了。但通常情况下,面向用户的功能--尤其是流行产品的功能--会被大量的复杂性塞满,给你一个足够的问题空间。只要确保在你尝试设计这个功能之前,它不会让你觉得 "超级简单"。

另外,由于该功能存在于现实世界中,而不是为了求职面试,你可以确信它有足够的模糊性。大多数现实世界的问题都是模糊的,而大多数功能都能解决现实世界的问题。为这些功能提供动力的系统可能比你在面试时要设计的系统还要模糊。这是件好事。你希望训练的难度比实际面试的难度要大。这样一来,到了面试的时候,就很容易了。用Rip Torn的不朽名言来说:"如果你能躲开一个扳手,你就能躲开一个球。"

哪里可以找到资源
有一大堆寻找真实世界特征的好资源。阅读你要面试的公司的工程博客可以帮助你了解这些公司设计的系统类型,让你了解他们是如何谈论设计系统的。去参加聚会/技术讲座,在那里人们谈论他们在工作中建立的东西,是一个很好的机会,可以和这个人交谈,从源头上了解更多的概念。HackerNews和ProductHunt上的许多产品发布都有开源软件的链接,所以你能够深入到代码中,看到第一手的设计。要确保产品足够复杂,足以保证在现实世界中的功能。

总结
在寻找系统设计面试问题时,最好的地方是现实世界,是你使用的产品和功能。在现实生活中寻找功能,并自己设计这些系统,这样当你在面试时就会准备得更充分。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK