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

专栏 | 九章算法

网址 | www.jiuzhang.com

工程师们害怕系统设计面试,是因为我们在学校项目甚至在工作期间并不会做大型的系统设计,也很少有机会从头开始搭建一个可拓展的系统。通常情况下,我们都是加入一个成熟的团队,负责为指定组件实现功能。我们会花费大部分时间修复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聊天系统设计、实时位置信息系统等。

欢迎关注我的微信公众号:九章算法(ninechapter)。
精英程序员交流社区,定期发布面试题、面试技巧、求职信息等

转载于:https://juejin.im/post/5c3587f4e51d4550fc42c617

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值