核心考察的是大流量下的distributed backend service design。因为这几家都是大公司,面对的都是每天至少billion级别的request,因此需要对这个场景的design有深刻认识。而design的核心思路就是trade-off。每个方案都不是十全十美的,比较postive的应对是:可以给出多种方案,在给出每种方案时,同时给出该方案的优点和缺点,并结合我们正在讨论的设计场景(给定的约束条件下),做出该方案好坏的点评,并最终选择一种“最适合”的方案。 模板套路大致为:
另外一个例子,同样是timeline, twitter用fan-out-write(将new feed直接写到follower的timeline里),而Facebook却用fan-out-read(在读的时候实时抓取相关用户的feeds并merge/rank)。why?我的理解是,这两个timeline是有本质不同的,twitter的timeline是比较传统的按时间顺序呈现你follow的人的feeds,而Facebook的news feeds更像一个timeline + social graph search, 不仅有好友最新的post,还有基于social graph搜索之后的相关结果(可能是你朋友的朋友,或者朋友赞过的照片,等),并且可能会有个性化结果。回归到fan-out-read/fan-out-write一个本质区别是,如果request/answer pattern越不确定(比如web search就是一个极端例子,query pattern趋近无限),或者answer features需要agile的变化,那么用fan-out-read越好(read所有candidate后,灵活的组织结果)。
一些常见面试题目,mitbbs上已经有高人进行了全面总结,我会转载贴在下面,我基本上是follow之。这里有一点补充:
tinyurl一定要非常充分的准备。我在F,L,G三家面试时都被问到了这题。这题看似简单,其实可以将上面讨论的大部分东西多装进来,可以讨论的地方很多。
这道题我觉得很有价值的文章:
其实针对一家的design准备过程,就是了解这家technology stack的过程。当你熟悉之后,在design环节灵活使用这些系统设计的idea来回答面试官的提问,会和面试官产生更多的认同感(可能他每天也在使用这些系统)。这比现场凭空想象,两人各执一词互相挑战的氛围,要轻松有爱很多吧:)
另外一块需要充分准备的就是个人的background project,这也是design环节可能会涉及的。对于之前工作上做过的项目,一定要力求没有死角,理解全面深刻。更进一步,能够从更高的角度去看这个项目。比如我在Google面试时,有一轮基本上大部分时间在讨论我做过的一个项目。因为之前针对这个项目做了很多深入思考,比如如何将这个项目的方案推广到更泛化的语义搜索。正好在那次面试中,面试官在讨论清楚已有项目之后,就问到了这个问题,因为之前已经总结了一些思路,所以侃侃而谈。后来才了解,面试官在G家也是做类似工作,我之前思考总结的那些idea也给了他不少启发,可以说是英雄惜英雄,氛围很融洽:)。个人感觉,这几家公司都会匹配和你简历背景非常吻合(大部分情况下)的面试官来和你聊,因此如果你对你简历的上的东西不熟悉,理解不全面,不深刻,面试官是很容易发现的,但如果你能带给他惊喜,那么恭喜你,你很有机会能拿到一个strong hire.
一般的followup question是估算需要多少server
另外这个帖子有讨论
这篇文章稍微提到要怎么approach这种题,可以稍微看看
登录发表评论 登录 注册
笔误,use case
user case? use case?