面试官视角谈谈系统设计

avatar 96192
cjlm007
12150
25
论坛里有不少从candidate角度分享系统设计的文章,从interviewer角度的相对少一些。看了下也面了两百人了,今天抛砖引玉一下,讲一下我的一些看法和观察。每个人面试标准不一样,一家之言仅供参考。

1) System design具体要准备什么

  • 找到常见的系统设计题目,弄清楚每道题重点问什么。

举个例子,比如你在准备面Facebook,他们常考的一个design find nearby places。这个题目搜一下过去两年的面经会发现到处都是,根据网友们的描述大致可以总结出这一题最核心考的是给一个地理坐标和距离,设计一个系统快速找到范围内的所有的POI。然后可以推断出主要考点是在read>>write的条件下,设计一个数据结构可以low latency地处理较大流量的POI查询。后面你就知道怎么准备了,网上很多方案,比如quad tree什么的。各个方案做一些比较和总结,能说出来pros/cons。最后再准备一些拔高的的知识点。整个面试如果能有条有理深入浅出的讲完,在level5这个级别下就会比较亮眼了。如果面到这个题,你的时间都应该花在这个核心问题上。其他的东西能不花时间的就不要花时间,比如user service/authentication啥的,完全不重要。

  • 常见的知识点,一个不能漏。

具体就看design data intensive application那个书就可以了,然后再看看各大公司的eng blog。论坛里有很多文章介绍怎么准备这些,这里不赘述。
有一点需要提一下的:对于在大公司工作的同学来说,日常工作用到的很多技术往往都是公司自己的轮子,比如service discovery的方案、microservice framework啥的。这些最好是提前能够看一下内部文档,弄清楚公司内部的方案大体是怎么实现的,对应的开源轮子是啥。遇到过候选人工作中用到公司封装起来的容器化infra,但是他自己却不知道什么是docker。

  • 对自己的实力边界以及所擅长的知识有一个清晰的了解。

比如你在公司里一直负责哪块,可以重点把相关的技术准备下,事半功倍。面试考深度和广度,深度部分最好是从日常工作切入。工作相关的可以多看看现在公司内部的技术文档,稍微展开展开,能学的地方很多。

  • 确定自己这次面的是个什么level,然后弄清楚这个level需要答成什么样,准备起来会有一个重心。

对于绝大部分非天才非大牛的L4来说,面系统设计不要试图答成L6的水平,that won't work。后面我会列一个各个级别系统设计的一个大致要求的范围,可以参考下。

2) 我观察到的很常见的问题:

  • 知识和经验上的硬伤。

比如完全不明白一个系统是怎么样end-to-end工作的。这个就无解了,只能回炉重练。实际上这样的候选人非常罕见。

  • 没有主线,过度发散,很容易被带偏。
这是非常常见的问题,很多候选人其实是知道怎么设计的,该有的知识也有。但是说话没个章法,一会说这一会说那,整个设计半个小时下来看不到什么逻辑性。Interviewer随便问个问题很容易就被带偏然后花好几分钟去描述一个其实不是很重要的东西。有的候选人也不知道是懒还是什么,图也不愿意画,讲的内容也不写成bullet point。最后面试结束写feedback的时候我也不知道写啥,感觉什么都讲了但是好像又没讲什么,那就只能fail了。

  • 花太多时间在不重要的地方上。

这也是个很常见的问题。一个题目出出来都是有重心的,如果他重点问你设计数据结构,你就不要在authentication上花一点点时间。面试的时间有限,每一题要考哪些signal都是提前设计好的。比如一共要考察10个点,在45分钟的时间budget下,你答的点越多越好。我见过太多candidate花大量时间去说一些不在我考察范围内的事情,这本质上就是把你有限的时间资源都浪费掉了,最后时间到了我只能收集到一两个点的signal,那当然容易是no hire。
如何找到重心?一靠经验,二靠准备。论坛有海量面经,下功夫精细准备10个题,后面基本上就了解要考什么了。上面也有讲。

  • 表现欲过重。

上来题目刚出还没怎么讲呢,就要大谈特谈如何才能scale at Facebook level。或者我已经明确说了我们就先考虑10w量级的用户,先把系统搭建起来然后再看scale。他还要花大量时间blabla说了一堆市面上比较fancy的技术(实际上他并不真的了解这些技术)。整体看下来特别像孔乙己在高谈阔论茴的四种写法。我个人是比较反感的,面试的核心是看你怎么解决问题,并不是让你造火箭,更何况绝大部分人也造不好。

这种问题基本只发生在比较junior的候选人身上,其实不太多见。很多不那么资深的候选人有一些焦虑,仿佛不“掌握”一些核心科技就没办法面试了。事实上很多东西没做过你说出来是稍微一问就露馅的。真正比较senior的candidate是清晰地知道自己知识边界的。一般我们出题目针对不那么资深的候选人,都是期望从小流量开始设计的,然后给定特定场景慢慢优化。




3) 我觉得什么样的算好:

  • 知识深度广度都没问题。
这当然是最重要的。我必须要非常确定这个候选人的知识储备完全可以胜任他这次面的level的工作,如果能稍微超出就更好了。

  • 思路清晰,表达流畅,有重点有逻辑有主线。

从需求分析开始,做一些简单的计算推断量级,然后overall architecture,到db/api design,再到部分重点component的设计,以及如何scale。从我的面试经验来看,整个面下来如果能有这样清晰的思路,已经能超过七八成的候选人了。

面试官说完一个题目后,你花一点时间和面试官确认下问题,然后稍微想一下这个题到底问啥,在纸上或者白板上写好大纲。目的是初步形成一个结构,避免后面乱展开。这时候准备题目就显得尤为重要了,充分的准备能让你有条不紊开始整个设计。

  • 表现出一定的passion。

面试的时候表现的积极一些,最后也问一些meaningful的问题。就算这公司你并不想去,只是想练手或者拿个offer抬价,但既然投入时间了那好歹要把这个时间最大化利用吧。我见过一些候选人面试的全过程中脸上写着“我不想来”四个字,那为何还要浪费彼此时间呢?
所有面试都本质都是人和人打交道,看的是候选人和面试官能不能有chemistry。产生chemistry的一瞬间可能是你的技术实力让我折服,或是我觉得你准备的很充分说明你是个靠谱用心的人,或者你对公司体现出来的兴趣和passion让我觉得招你进来你会成为一个很好的伙伴。
面完的问题环节有一些候选人就草草问一下类似can you describe dow does your daily work look like的万金油问题。有一次我很详细地说了一会,然后对方完全没反馈,直接冷冷的来了一句ok thank you就没有问题了。这个挺尴尬也挺减分的。相比之下有一些候选人最后的问题环节,很明显提前准备过,问了一些不那么万金油不那么general的问题,并且在我回答后还能有一些互动。这其实是我觉得加分的地方。

  • 有一个好的呈现知识的形式

远程面试的情况下,有的平台是自带白板的,有些公司面试的时候会给一些推荐的在线白板工具,或者干脆让你自己准备白板。提前准备下,熟悉一下这些白板的使用,面试的时候图画的清楚一些,会是不错的加分项。
比如我们用的面试平台有自带的白板功能,画线条/box/text是有快捷键辅助的,有的候选人明显是提前准备演练过,画的很溜,不仅仅节省了时间,看着也舒服。也有的候选人自己提前在家准备了白板,就放在身后,随时可以画图讨论。这些都是很好的例子,在实力差不多的情况下,我们当然更愿意跟这样的人共事。也有的候选人完全没准备过,工具用的不熟练,画出来歪歪扭扭的,相比之下就高下立判了。

4) 几个其他零散的小分享和建议,想到哪说到哪:

  • 我个人觉得grokking的那套已经被滥用了。很多人上来听完题目开始function/non-function requirements的,一看就是在套套路,且基本上最后表现都不太好。现在直接用这个套的我默认会减分。实际上grokking的内容并没有什么问题,但是不少候选人只学了表象的东西,再加上很多人强行套这个设计思路又套的不好,所以最后给我的观感很差。

  • 系统设计考核的是一硬一软两个能力。如果你的硬实力没有那么强,那就重点强化自己的软实力,比如说面试结构的把握,沟通等。硬功夫是需要时间积累的,大部分人尤其是稍微junior一点的候选人很难在一两个月时间内通过看书来完成这个实力的积累。这种情况下,少部分人会自作聪明的通过“飙terms”的方式来试图展现这个硬实力。比如说对一些看上去很新很fancy的技术侃侃而谈,或者在不必要的情况下过度设计等。很遗憾,这种方式往往是适得其反的。因为稍微资深一点的面试官基本上随便问两个问题就能够摸出深浅,硬实力没有加分,软实力则反而会大幅度减分。而且一个人在说自己不懂的知识的时候,往往也是非常心虚的,这也是一看就能看出来的。

  • 学会说不知道。没有哪家面试期望候选人全知全能,但是面试官有时候会不停问问题以判断候选人知识的宽度广度。如果明明不知道却硬要强撑着,这会适得其反。

  • 我发现简历上title是senior engineer的,后面大多数会加一个括号tech lead。互联网公司的TL "title"已经被滥用了,有的candidate其实就是带了一两个实习生,就要在简历上挂一个TL的title。我个人觉得这是很减分的。

  • 【coding相关,不是system design】大多数在线coding平台从interviewer视角都能看到你是不是离开了面试窗口。有的人刚给他念完题目马上就显示out of interview,然后沉默30秒钟后奋笔疾书。这种非常明显的作弊基本上在面试的前5分钟就注定了结局是strong no hire。成年人的世界不是不能作弊,但你好歹别这么容易的让人看出来啊。


附录:我个人心中对不同level面试的expectation
各家对level定义虽然大同小异,但是也是不一样的。参考就好,不要对号入座。

L3/L4
  • 能够给出能解决问题的完整设计,可以是interviewer主导,可以给hint
  • 给出的设计合理,data的流入流出走向清晰,不存在有哪个模块cdd是完全不知道怎么work的
  • 对trade off有理解。会做选择,会分析pros/cons
  • 至少对整个系统的某一个模块有一定深度的理解,能经受住一些challenge追问


L5
  • Candida能够主动引导面试的讨论,主动分析和划清问题的边界和需求
  • 对数字有较好的把握,可以大体估算出存储、traffic量级等数据
  • 不过度设计,不炫耀知识,而是根据问题的要求和预估的数据给出最合理的设计
  • 给出的设计大体能够经得住interviewer的多番challenge
  • 对整个设计中的1到2个细分领域有较深入的理解


L6+
  • 能熟练了解整个设计的所有基础部分,无需任何提示
  • 设计老练,给出的每个component都是有用的,没有多余的内容
  • 对如何scale这样问题有较深入的经验
  • 对2-3个细分领域有较深入理解
  • 能够从这场面试的交流中判断出此人所在领域足够给团队带来XFN级影响力


----------------------------------------------- 分割线 -----------------------------------------------

好了,文章到这里我也就不演了。感谢你看到这里,这其实同时也是一篇招聘软文,我们组在招人。

团队介绍:
TikTok Ads Platform北美团队成立于2020年中,重点研发针对中小企业主的广告投放平台。中小业主(SMB)是所有数字广告平台的业务重点,这部分业务具有庞大的人群数量和丰富的多样性等特点。组里负责的业务也是TikTok商业化变现的重点focus之一,我们的项目有impact,也有挑战。
今天snap/google/fb的大涨也能够从侧面证明广告业务一直是互联网公司的收入保障,ads tech也有一定的业界标准,在不同的公司都可以适用。对互联网广告业务有兴趣的同学,或者希望能在一个核心领域钻研多年的同学,这将是一个非常好的机会。
欢迎访问ads.tiktok.com来体验我们的产品,也可以参考一些组里主导项目发布后的press,如:techcrunch.com

要求:
本次招聘我们会放松一些工作年限的要求,半年或者一年工作经验的同学也都可以来看一看。当然,资深的candidate我们也是非常欢迎的。
尚未毕业的同学建议等后面秋季的校园招聘。

职位链接:
Backend engineer: job.toutiao.com
Frontend engineer: job.toutiao.com

用上面的内推链接直接申请即可,如果还有具体的问题可以发邮件至1point3acres.com询问,不需要把简历发到这个邮箱。
Note: Fullstack engineer也是组里非常急缺的人才,可以根据自己前后端的侧重点来直接申请backend或者frontend岗位。
  • 360
25条回复