专栏名称: 九章算法
专业的北美IT求职经验分享、技术交流社区,帮助你找到好的IT工作。由硅谷顶尖IT企业工程师维护。提供专业的算法培训/面试咨询,官网 www.jiuzhang.com
目录
相关文章推荐
九章算法  ·  降息了!码农的好日子回来了… ·  5 天前  
九章算法  ·  LeetCode刷题小分队,day2:10月 ... ·  5 天前  
九章算法  ·  下半年,这个计算机方向彻底爆发 ·  6 天前  
九章算法  ·  9月LeetCode刷题小分队正式开始啦:刷 ... ·  1 周前  
九章算法  ·  Meta E5据说顶包 ·  1 周前  
51好读  ›  专栏  ›  九章算法

系统设计面试模拟 | 如何设计Netflix?

九章算法  · 公众号  · 算法  · 2017-03-23 07:10

正文

工程师们害怕系统设计面试,是因为我们在学校项目甚至在工作期间并不会做大型的系统设计,也很少有机会从头开始搭建一个可拓展的系统。通常情况下,我们都是加入一个成熟的团队,负责为指定组件实现功能。我们会花费大部分时间修复bug,优化代码和测试数据。


但是,当面试官要求你在45分钟内设计大规模分布式系统时,你需要指出高层组件并描述它们之间如何交互的,而不是花时间说明如何通过避免缓冲区副本的方式来减少20毫秒反应时间的。


怎样在45分钟之内设计出Netflix


通常面试官会要求你在45分钟内设计Netflix(或支持数亿用户的某种弹性服务)。这个问题看似无法完成,因为 45分钟太短,根本无法详细讨论其中任何一个模块。这些服务是由成百上千名工程师耗时多年开发完成,你是不可能把所有这些工作简明扼要的写在5x5的白板上的。


既然完成这个问题基本是不可能的,那么面试官到底想知道些什么?其实他希望你给他一个的概述,定义高级模块,并尽可能简洁地描述组件之间的交互。大概分三个阶段:


1

画一个大框架来表示系统

2

放大框架并把它打散变成5-6个模块

3

简要讨论每个模块的功能。计算,存储,前端,后端,缓存,队列,网络,负载均衡等


你的面试会官会指定一两个模块并希望你详细讨论,大部分时候他不指望你写任何代码。


那么面试中常犯哪些错误呢?
乱用术语

你可能觉得对于抽象层面的设计,大概在设计面试的时候胡扯就可以了。千万不要这样想! 你的面试官正在选择的可是未来可能每天和他一起工作的同事,任何有经验的面试官都会注意那些随便说像是“No-SQL”,“Mongo DB”和“Hadoop”这些术语的人,你要随时准备好他会问更多的细节和为什么你选择这些技术。如果你没有深刻理解或着没法证明和支持你的方法的时候,不要用比如 “GraphQL”这样的术语或很潮的技术。

假装你是某个方面的行家

我听说过一些非常尴尬的情况,应聘者假装是一个行家,但是最后发现,面试官正是该领域的知名专家。


在2006年,我面试微软,我的面试官问我是否实现过B树。我告诉他,我知道B树是什么,用于数据库,其他不记得了。他于是换了话题。后来我发现我的面试官是James Hamilton,他是数据库和分布式系统中最重要的专家。之后几年,我要为微软的Azure实现B+树(大型B+树储存了TB的数据,现在我对B+树略知一二。即便是现在,我也不敢对 James Hamilton 说我知道B+树是什么。)


在面试别人的时候,曾经一个应聘者告诉我他在某个代码库中实现了某些功能。他不知道我加入团队之前,曾经在那个代码库上工作过。我试探了他一下,意识到他仅仅实现了代码库的客户端,并不像他说的一样做了那么多。


上面的事并不常见,下面的事更有可能发生:


  1. 你的面试官可能正在做你谈论的技术,可以很容易地区分冒牌者和专家。

  2. 他可能已经问过了这个问题上千次,精通可能的解决方案,他一下就知道你真正理解多少。


所以千万不要假装是一个专家。面试你的人一定比你更了解这个领域,甚至可能是业界专家。

即使是熟悉的领域,也不要急于求成

熟悉的领域对你有利,但是也不要急于求成,一下跳到你知道的解决方案,所以你要做这三件事:


  1. 收集要求。

  2.  多问问题。你的面试官对你的思考过程更感兴趣。

  3.  评估多个解决方案,讨论利弊。


无论你是否了解这个领域,这样做都有利于你的面试结果。

错误回答典例

(声明:以下是一个假设的对话,如有雷同纯粹巧合)。


面试官:让我们实现Twitter。你要如何存储所有的tweets?

候选人:我要使用NoSQL数据库比如MongoDB。


面试官:为什么不用MySQL?

候选人:RDBMS不可扩展。我们需要一个可扩展的数据库,比如MongoDB或BigTable。


面试官:但是我们在Twitter存储我们在MySQL中的所有tweets,它的扩展性非常好。

候选人:嗯,那也许你的规模不是那么大。当需要更大规模的服务的时候,比如Facebook,就要使用NO-SQL解决方案。


面试官:但Facebook也使用MySQL。

候选人:我不知道他们如何扩展,我必须再做做功课。也许他们用MySQL由BigTable支持前端。


面试官:那好吧。我们应该在哪里存储我们的分析数据?

候选人:显然在MySQL。


面试官:但是对MySQL来说太多了。我们在HDFS中储存。

候选人:可能你们在MongoDB成熟之前搭建的Twitter。 MongoDB可以轻松处理tweets和分析数据。


面试官:好的,谢谢你的时间,和你交谈很愉快。


如何找SDE面试资源?
如果你正在找一个准备系统设计面试的资源

看看最新发布的课程Grokking系统设计面试(Grokking the System Design Interview),它涵盖分布式系统的基础知识,并有互动课程,涵盖如何设计 Instagram,Dropbox,Twitter,Facebook Messenger,Youtube ,Facebook Post Search,Typeahead,Web crawlers,Yelp和Uber / Lyft。另外,还推荐九章算法的《系统设计班》,课程涵盖:


数据系统设计、爬虫系统与搜索建议系统、Tiny URL 设计、Google 三驾马车(Big Table / Google File System / MapReduce)、分布式系统设计、WhatsApp聊天系统设计、实时位置信息系统等。

如果你准备编程面试

请看看 Coderust 2.0: Faster Coding Interview Preparation using Visualisations。它有80多个Python,Java,Javascript,C++和Ruby代码的问题。每个问题都有交互式的可视化来解释每个步骤,以便你实际上理解解决方案,而不仅仅是记住它们。另外,实践出真知,还推荐你在lintcode.com上实战编程面试题,他支持 C ++, Python, Java 语言,并且有代码风格检测功能。

认为你已经准备好了,但需要一些练习

可以安排模拟面试(Mock Interview)。


推荐资料


  • Grokking the System Design Interviewhttps://goo.gl/ehnPQc

  • 九章算法《系统设计班》: www.jiuzhang.com

  • Coderust 2.0: Faster Coding Interview Preparation using Visualisations: https://goo.gl/3xw7Kh

  • Lintcode Online Judgewww.lintcode.com


免费讲座

《ODD 设计 & 面试真题讲解》

美西时间3月29日周三 19:00-20:30

美东时间3月29日周三 22:00-23:30

北京时间3月30日周四 10:00-11:30(a.m)

报名登陆官网 www.jiuzhang.com

或点击文末“阅读原文”