九月中收到Facebook HR寄来的信,说在找machine learning tech lead engineer。这个
职位的工作,开发和研究会各占一半,可以选择的地点包括Menlo Park总部、Seattle、B
oston、New York、以及伦敦。问我有没有兴趣。大部分人应该都有吧,我也不例外。
约了个时间聊聊,内容大致是问问我目前的工作内容这样,解释这个职位的工作性质、以
及整个面试的流程 — 会先在10月安排coding interview,通过后可以参加他们11月在北
京跟新加坡办的hiring event。他们的工程师会过来,这个就算onsite了。在这hiring e
vent有五场面试,比较特别的是会有system design,例如设计一个推荐系统之类的。
如果都通过了,会在明年四月送H1B流程。但H1B是透过抽签,没被抽到就没有。如果一切
顺利,明年10月on-board。我问这些地点的工作内容有何差别?他回确实是有,Menlo Pa
rk进行的专案是最多的,Seattle也很多,但boston跟纽约相对会少一些。而伦敦则是pro
duct oriented跟security,所以在选择地点时也要把这些因素考虑进去。
结束后收到HR的信告知他需要我先回答几个问题。印象很深刻的是,一般人编号都是从1
开始,但他第一个问题的编号是0。非常的工程师文化!连HR都那么nerd XD
之后收到HR的coding interview邀请,随信附上Facebook的面试攻略,内容非常丰富!其
中包含一份类似cheat sheet之类的懒人包,一份内部员工的信件,还有一个长达两小时
的私人影片连结。他们明确指出会考的范围,比对了一下,刚好就是cracking the codin
g interview这本书涵盖的所有范围。难易程度介于leetcode的easy到medium之间,但要
求的完成度相当高,必须是workable code,并且是最佳解。要知道,他们所使用的codin
g interview的接口只是个单纯的编辑器,执行功能是关掉的。这意思是说,必须能用笔
在纸上写下来没有bug的code!在那封内部员工的信中也明确指出最好只使用纸跟笔来准
备面试。
Coding interview总共45分钟。前五分钟interviewer会介绍自己的工作,接下来35分钟
要解1-2道题,最后五分钟interviewee可以问一两个关于facebook的问题。中间这35分钟
不是单纯写code就好,必须先解释自己的解法再写code,接着会询问时间跟空间复杂度。
如果中途网络发生断线的状况,面试就必须重新安排。
面试当天是一位做marketplace的工程师来跟我面试。因为目前的工作跟图论比较相关,
我猜出graph相关题目的机会比较高,所以准备时也比较著重在这方面。还真的给我猜中
。有两题,第一题很简单,一分钟就完成了。接着他请我分析时间跟空间复杂度。解释了
一下,回说这最终要看使用到的python套件怎么实作。他便接着问如果是你,要怎么实作
那个套件的功能?我就解释了一下自己的想法,每个步骤的复杂度是多少。他同意我的看
法,接着第二道题。
第二题比第一题复杂,直觉告诉我需要第一题做出来的工具,但一时想不出来该怎么用,
卡了一下。见我在沉思,他便问什么地方卡住,跟他讨论一下就想到解法了。写完后他看
了一下提醒我输出需要按照某个东西排序。在改code的过程中,很不幸地他忽然看不到我
的code。后来他要了一个editor新的连结,但我们两个都进不去。面试只能改期。
第二次面试换成另一个人,给了跟矩阵相关的两道题。第一题是搜寻问题。但心想,这不
先排序怎么可能在O(logN)时间完成?但后来观察一下发现资料确实是排序过的,就赶紧
写了个binary search把它做了。
第二题面试官提示可以先针对这矩阵做出某种资料结构,但这提示所包含的可能性还是非
常多。也许是面试官见我的想法太跳tone,便问我有没有听过XX。听到这个提示就想到解
法了,但可惜时间不够把资料转换的部分完成。
在两次的面试中,我利用那最后五分钟共问了三个问题。
第一个问题是,下班后可以做很多事来提升自己,例如看paper或打kaggle,刷leetcode
是其中之一。那你下班后做什么事提升自己?leetcode是否为一种必要之恶?
面试官回答其实他有时间的话会先处理进度落后的专案,再来会看系统设计的书。至于le
etcode,确实,candidate在leetcode上的表现其实并不能转化为工作上的表现,但这仍
能帮助他们区分工程师的程度。所以,对,这是必要之恶。
第二个问题是,Facebook以骇客文化著名。我所理解的骇客文化是just do it & do it q
uick。另一方面,传统的软件开发流程要先确认需求,设计可以满足需求的规格...比较
可靠但开发速度就慢。Facebook如何在这两者之间取得平衡?
可能是我问的不好,面试官回复像算法那样的东西都需要审核云云,但我想知道的是Fa
cebook如何在骇客文化的前提下仍能保持程式码的品质?(还是该直接问他们有没有用sc
rum?)
最后一个问题是Facebook怎么评估员工?但面试官也没讲太多,只听到他们半年评估一次
,然后Facebook是他待过的所有公司中最tough的,但评估的目的是帮助员工成长。其实
我比较想知道的是,不论是KPI还是OKR,他们怎么设计metrics?
不意外地,根据Facebook的标准,我并没有通过这关。不过我真心觉得他们的面试流程不
错,有效率而且标准明确,所以跟各位分享。从这面试过程跟制度设计中,我感受到Face
book想找的,是能够提出解决方案,并有足够程式能力将之实现的人。
虽然没有成功,但从这次的经验我收获很多。首先是明白了顶级公司的要求,以及自己跟
这标准的差距。
另外,我对刷leetcode这件事也有点改观了,特别是像我这种本科非CS的人。之前总觉得
,把时间花在看paper或上线上课程对工作比较有帮助。CS相关的知识,像算法或资料
结构,都是工作后才补的。而这些相关知识到底够不够完备,其实我没有自信。透过刷le
etcode,可以了解自己还有哪些不足。像在这次的准备中,就学了Trie、Topological so
rt、deterministic finite automaton等等。
就题目难度而言,确实如他们所说是介于easy到medium。被刷掉,单纯就是自己还不够好
。接下来,预计花一年的时间刷完leetcode,目标是能够在纸上就写下bug free code。
希望自己可以达到顶级公司的程度。