在 FB 已经工作了已经快三年了,在这段日子里我学到了很多也成长得很快,一切似乎都有序地推进着,可回过头看加入 FB 的过程却有些一波三折。翻看邮件记录,我总共面了 FB 四次:头两次面完后我被拒了,第三次拿到了Offer但换成我拒了他们,直到第四次才达成一致加入进来。
第一次面试是在研究生刚毕业的时候,那会儿社交网络正火,对于 FB 和 Twitter 这些比较热门的公司都会收到很多简历,所以对于New Grad来说申请的门槛却要高很多,我也尝试网上申请但都石沉大海。
后来是通过 Interviewstreet (网站现在已经更名为 HackerRank 了)这个在线程序测试平台才拿到了面试机会。当时 Interviewstreet 上的题库很小但难度很高,只要做完8道题就可以解锁网站上公司申请功能。我当时只是觉得在上边做题很有趣,就一直不停地钻研着,也要感谢一位学长在题目解法上给了我很多的指点让我更快地领悟了各种算法的真谛。在艰难地完成了8道题后,我就随便点了网站上包括 FB 在内的几个知名公司提交了申请,我也没有觉得会有下文只是继续在上边做题来努力提高排位。
在我去 Seattle 面试 Amazon 的路上,我收到了 Interviewstreet 给 FB recruiter的引荐邮件。这让我感到非常惊喜,立刻表达了我强烈的兴趣,然后顺利安排了电话面试。电面一共面了两题,第一题很快就解决了,但是第二道关于二分查找的变体我却卡在了条件检查上了,最后是通过电子邮件把最后的答案发了过去。在邮件里我还把我写二分法的博客链接贴了上去来表达我是懂这个算法,好在面试官给了我 onsite 的机会。
因为那时候在忙着毕业的事情,还要带家人在美国游玩,所以把面试安排到了一个月以后。也因为如此,我并没有能够充分地去准备面试。
在去面试的前一周,我又飞了一次 Seattle 去面 Amazon,因为前一次的面试表现可能并不太出彩,所以他们又换了个组来面。周三飞去,周五飞回,周末跟朋友聚会做毕业离别,周一飞去 SFO,周二面试。因为 Syracuse 去这两个城市都没有直飞,所以飞机做了很长时间,体力的消耗也是巨大的。现在想想其实当时应该直接从西雅图飞到三番去,这样就不用东西部来来回回的了。
Onsite面试的问题都比较基础,有一道关于二叉树的问题,在第一次亚马逊onsite的时候我被问了一模一样的,虽然我有看解答思路,但是这次我又没能给出最优解,就这么“挂在了树上”。其中一轮是 behavioral 的面试,因为之前其实对 Facebook 并没有太多的了解,用的也很好,刚毕业也懵懵懂懂的,英语表达也欠流利,所以能感觉出来我的回答完全没有打动面试官。只是记得最深的问题就是“What do you want to change Facebook?” 所以在后来的时候我一直在思考这个问题。
第一次面试也就此结束,但也能感觉到其实那2012年加入Facebook其实也并不是太难,当时他们还刚刚上市获得巨大融资所以会疯狂扩张,其实是加入的最好时机。只可惜我没有抓住。
第二次面试在2013年7月,当时也在第一家公司工作又一年了其实也蛮适应的,也认识了一些人来帮我推荐,所以又拿到了一次面试 Facebook。而且因为我已经在湾区了,所以电面也直接安排成 onsite 的形式,只是只有一轮算法类的。
其实当时被问的问题并不难,只是有些刁钻,只要想到点子上实现就只是简单的排序后再遍历计数。可是我却一直卡在那里想不清楚条件应该是什么,所以没有能够完成。最后是面试官告诉了那个解题的要点是什么,听完我一下子恍然大悟,但为时已晚。当时如果多问些问题求提示可能会好很多。
第三次面试 Facebook 的过程就特别的戏剧化,2014年底那儿其实刚进 Twitter 的 Android 组才半年,Facebook 的 recruiter 主动联系了我提供机会,我想试着面面看了。第一次安排电面后,我因为一些个人原因不能参加,于是提出推迟到半个月后,他们也非常乐意地帮我重新安排了面试时间放在那个中午12点。
接着,我就安排好了那天请假在家好进行电话面试,也跟太太说了那天我会有空在家。结果太太中间为了预约了牙医的问诊,我当时好像想反正那天在家就去看看牙齿吧,而看牙时间也是在中午。于是那天我就去看牙了,完全忘记了有面试的事情。直到我躺在牙医的躺椅上,才隐约想起来我好像留在家里是有其他什么事情,一下子从椅子上惊起跟医生告别开车往回家赶。更不巧的巧合是,我的手机还没电关机了,所以也没有办法在路上接到面试官的电话来说明原因。
等我回到家,充上电开启手机时,面试的时间已经过去15分钟了。我便给recruiter打电话希望让对方联系上面试官再打给我。面试官也很友好,很快有打了过来,我们就正式开始了面试过程。因为时间的关系,我记得好像也没有打开电脑去做题目,只是简单了聊了些我的技术背景,为什么想加入 Facebook,面试题也只是口头说了一下思路。之后便按时结束了面试。
这次电面虽然看起来并不合理也不算合格,但是还是拿到了 onsite 的机会。一个月后我开车去了 Facebook 总部,四轮面试正常的2轮 Coding 1轮 System Design 和1轮Behavioral。除了一轮 Coding,其他的基本都发挥着跟我 level 对应的水平,没什么出彩的地方也没有重大失误。
那轮 Coding又是二分查找的变体,当面试官出完题后我先给出了线性的解法,时间复杂度 O(n) 空间复杂度 O(1)。很快面试官就问能不能再优化,我想空间上已经到极限了,只能是时间上的优化,但达到 O(1) 是不可能的,就只能是 O(log n),要达到这个时间水平就只能用二分,而题目也正好是个数组。整体思路上都是对的方向,只是我纠结在那条件判定没能理清逻辑,最后没能完成代码。
一周后 recruiter 就打来电话通知结果,也反应出是一轮 coding 不够好,希望能够加面一轮。由于11月底和12月都是假期比较多,所以那轮面试被安排到了2015年一月初。加面虽然只有一轮,但也是onsite形式,那次面试官是 manager 职位的,考察重点就明显放在写代码的能力上,而不像之前那个比较年轻的工程师钻在解法技巧上。所以问了三道题目都比较简洁明了,我也很轻松地完成了三道题目的代码。
很快又过来不到一周,recruiter 就发来邮件确认了 offer letter。只是当时在 Twitter 的 Android 核心组学到了很多,想在 Android 方面继续深造,而 Facebook 提供的职位只是 General Engineer 会偏向产品,所以就表示了歉意没有接受offer。
之后每个月,recruiter 都会发邮件来询问我的情况和意向,我们一直保持着交流,甚至在对方离开 Facebook 加入另一家科技公司后还有一起聚餐交流,当然也是想招我过去。之后我的 case 被转给了 Facebook 的另一个recruiter,依然会时不时地发邮件关心我的情况。
第四次面试是在2015年底,当时 Twitter 裁员了,虽然我没有失去工作,但是在那段事件里的任务开展得并不太如意,也害怕再一轮的裁员,于是就开始寻找新的机会。联系了 Facebook 的 recruiter,他们表示之前的 offer 依然有效,只需要重新确定入职时间。但我表达希望能获得 Android Engineer的职位,由于在 Facebook 这是不同的方向,有不一样的面试流程,所以他们又帮我转给了 Android 的 recruiter,所以就需要重新面试。只不过因为我已经过了coding的部分,所以没有电面,onsite也是只有两轮,针对 Android 的 Design 和 Behaviorial 各一轮。
面试也是比较中规中矩,面试官都很友好,能感受出Android上的知识和技术都很丰富。其中一位还留下了邮箱给我,在我进入 Facebook 之后还保持着交流,对我从开始的选组到后来的工作适应都提供了很多指导。
就这样我正式加入了Facebook,回看面试的过程再结合自己在公司里做面试官时的过程,其实不能感觉出 Facebook 对于初级工程师的招聘要求并不是特别的难,都是比较基础性的问题,主要考察写代码的能力。当然能不能拿到 offer 有时还要看当时对于该职位的需求有多大,这一定程度上看运气。比如近前几年对于 Android 的需求很大,最近对于 AI 和 ML 的工程师招收很多。如果想要拿到高 level,对于coding的要求还是一样的基础,只是主要考察的要素都集中在 design 和 behavioral上,考察的点也更将广泛。
在我成为Facebook里面试官的后,我也秉承着我面试时 Facebook 面试官对我的友好和面试侧重。比如有个电面的人因为时差弄错了时间让我在面试室等了半个小时,在 recruiter 重新建立联系后我也很乐意地在当天晚些时候重新面试了对方;还有一次 onsite,对方在算法上并没有准备好再加上是最后一轮比较累了,首道简单的问题也完全答不上来,我便不再追加问题而是坐下来回答对方感兴趣的问题并灌输 Facebook 的好。
hello iderzhang,我是来自Tencent的Android开发工程师Franklong(龙章煌),通过你之前写的的参加Android Dev Summit的博客认识到你,希望有机会和你成为朋友。
下个月我将去参加2018年的Android Dev Summit,不知道你是否也会去参加?期待你的回复
Thanks for sharing, this was pretty helpful. Hope you’re doing well with FB!