工程师们害怕系统设计面试,是因为我们在学校项目甚至在工作期间并不会做大型的系统设计,也很少有机会从头开始搭建一个可拓展的系统。通常情况下,我们都是加入一个成熟的团队,负责为指定组件实现功能。我们会花费大部分时间修复bug,优化代码和测试数据。
但是,当面试官要求你在45分钟内设计大规模分布式系统时,你需要指出高层组件并描述它们之间如何交互的,而不是花时间说明如何通过避免缓冲区副本的方式来减少20毫秒反应时间的。
通常面试官会要求你在45分钟内设计Netflix(或支持数亿用户的某种弹性服务)。这个问题看似无法完成,因为 45分钟太短,根本无法详细讨论其中任何一个模块。这些服务是由成百上千名工程师耗时多年开发完成,你是不可能把所有这些工作简明扼要的写在5x5的白板上的。
既然完成这个问题基本是不可能的,那么面试官到底想知道些什么?其实他希望你给他一个的概述,定义高级模块,并尽可能简洁地描述组件之间的交互。大概分三个阶段:
简要讨论每个模块的功能。计算,存储,前端,后端,缓存,队列,网络,负载均衡等
你的面试会官会指定一两个模块并希望你详细讨论,大部分时候他不指望你写任何代码。
你可能觉得对于抽象层面的设计,大概在设计面试的时候胡扯就可以了。千万不要这样想! 你的面试官正在选择的可是未来可能每天和他一起工作的同事,任何有经验的面试官都会注意那些随便说像是“No-SQL”,“Mongo DB”和“Hadoop”这些术语的人,你要随时准备好他会问更多的细节和为什么你选择这些技术。如果你没有深刻理解或着没法证明和支持你的方法的时候,不要用比如 “GraphQL”这样的术语或很潮的技术。
我听说过一些非常尴尬的情况,应聘者假装是一个行家,但是最后发现,面试官正是该领域的知名专家。
在2006年,我面试微软,我的面试官问我是否实现过B树。我告诉他,我知道B树是什么,用于数据库,其他不记得了。他于是换了话题。后来我发现我的面试官是James Hamilton,他是数据库和分布式系统中最重要的专家。之后几年,我要为微软的Azure实现B+树(大型B+树储存了TB的数据,现在我对B+树略知一二。即便是现在,我也不敢对 James Hamilton 说我知道B+树是什么。)
在面试别人的时候,曾经一个应聘者告诉我他在某个代码库中实现了某些功能。他不知道我加入团队之前,曾经在那个代码库上工作过。我试探了他一下,意识到他仅仅实现了代码库的客户端,并不像他说的一样做了那么多。
上面的事并不常见,下面的事更有可能发生:
你的面试官可能正在做你谈论的技术,可以很容易地区分冒牌者和专家。
他可能已经问过了这个问题上千次,精通可能的解决方案,他一下就知道你真正理解多少。
所以千万不要假装是一个专家。面试你的人一定比你更了解这个领域,甚至可能是业界专家。
熟悉的领域对你有利,但是也不要急于求成,一下跳到你知道的解决方案,所以你要做这三件事:
收集要求。
多问问题。你的面试官对你的思考过程更感兴趣。
评估多个解决方案,讨论利弊。
无论你是否了解这个领域,这样做都有利于你的面试结果。
(声明:以下是一个假设的对话,如有雷同纯粹巧合)。
面试官:让我们实现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和分析数据。
面试官:好的,谢谢你的时间,和你交谈很愉快。
看看最新发布的课程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 Interview: https://goo.gl/ehnPQc
九章算法《系统设计班》: www.jiuzhang.com
Coderust 2.0: Faster Coding Interview Preparation using Visualisations: https://goo.gl/3xw7Kh
Lintcode Online Judge:www.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
或点击文末“阅读原文”