假设你明天就去onsite面试了,那么这是一篇很好的佛脚文章;如果你刚开始刷题,那么这篇文章将是你刷题的指导方针。这一篇结合我自己面试以及在FB参加面试官培训的经历,聊一聊FB Coding面试时该如何表现。本文只介绍Coding Interview,system design和behaviour question不在本篇讨论范围。
官方视频
首先先把下面两个视频好好看两遍(需要翻墙),再开始看文章。这两个视频是Facebook recruiting team做的非常有参考价值的视频。一个是对recruiter 对 tech interview的概述,另一个是engineer示范的面试“标准答案”。看完我们来分析面试的答题点。
面试概述 https://www.facebook.com/Engineering/videos/10152735806862200/
面试示范 https://www.facebook.com/Engineering/videos/vb.9445547199/10152735777427200/
bug free?
Facebook的对外讲座上明确说过不要求bug free,思考的过程跟做出题目一样重要。所以说训练面试能力能很有效地弥补刷题上的不足,对于刷题充分的同学则是如虎添翼。我自己就在FB onsite面试中卡壳过,面试官还给了我提示,然后我通过分析体现出我对数据结构的理解,扳回了一城。
答题步骤
面试不是平时做leetcode那么直接,拿到题就做。面试不仅仅是做题,面试的本质是面试官对面试者对算法、数据结构的理解能力,分析能力以及表达能力的考察。如果一上来就啪啪啪把题目给做完了,反而是舍本逐末。我的一个朋友,他是ACM集训队的主力,然而他的校园面却跪了。据他自己说是刷刷刷就做完题目了,我猜测他是缺少了分析、交流这部分。不过最后他找recruiter argue拿到了onsite。所以正确的步骤是:
- 面试官提出问题,你要充分理解问题
- Ask questions to clarify problem。听完问题不要马上开始写代码!而是通过提问来明确题意
- 输入格式、数据结构,正负,有无重复
- 输出格式、数据结构
- 如何处理特殊情况
- 是否要排序
- Explain a high level approach。提问完不要马上开始写代码!而是思考并提出一种解法,Think out loud,讲出你的思路,分析过程跟解出题目一样重要,必要时借助白板画图写字来解释,跟面试官确认,如果他觉得可以,那就开始写,有时候他会有特殊的要求,比如时间复杂度要低于多少之类的,那得按照要求分析给出解法。当然如果时间不够,尽量快的用粗暴的方法写出一段可用的代码。
- Coding。从白板最上面开始写,设计code structure,尤其像递归/dfs之类的题,好的代码结构能减少bug,并且更容易理解。
- Test with edge cases。写好之后不要马上跟面试官说你写好了!因为一旦你说写好了,他找出的bug就算是你的失误,而如果你主动说我来代一组数据试试test一下,只要你在面试官提出来之前发现并改正bug,那就不会影响你的评价。代入edge cases测试,并且你要说出来“我代码写好了,现在准备代入一些特殊值检验”,不要默默在那代数字。检验0,特殊值,巨大值巨小值(nil)。
- 如何fix边界条件的错误。最快的就是添加一些if-else来排除特殊的错误,但是这样往往不够优雅,最好是从code pattern中寻找错误,从根本上解决问题,给出elegant solution。
- 分析时间空间复杂度。当你验证完了,告诉面试官,你做完了,他会仔细看你的代码,如果没bug,面试官会问,数据结构的选择,时间复杂度如何优化?很常见的优化时间复杂度比如DP,牺牲空间换取时间等等。Understand the trade off between alternate solutions,比如为什么用linked list不用array list?为什么用stack不用heap?为什么用xx而不用xx?
- 5分钟问问题,这个环节比较轻松,可以问问关于company,culture,以及为什么你喜欢Facebook。
面试训练
前面一篇文章提到做笔记,对好题的分析,一周最少一篇,可以按照面试步骤来写,用英文来写,从现在开始这样训练,练到面试的时候,你的面试套路已经炉火纯青了。同时跟刷题小伙伴一起mock interview的时候就可以按照本文的步骤来练习。数据结构的英文表述遇到困难的时候,记得写下来,练熟。
面试形式
- intern 2轮电面
- full time 1-2轮电面+on site 3轮coding + 1轮behaviour
根据面试表现,会有加面情况 - Coding面主要会问,Data structures and algorithms。
编程语言
选择你最熟悉的编程语言,熟悉常用的library(排序,数组初始化等等)和数据结构,并且理解这些lib和数据结构,以便面试问到的时候能够分析出来。
关于内推
New grads 和 intern最好的内推时间是89月份左右的秋招和23月份的春招。有需要内推的童鞋,刷题达到300+并且有两个以上优质项目的,欢迎发送简历到cfdtlee@gmail.com。会针对简历和面试提供建议。
Reference
这些材料是我收到FB面试的时候recruitor给我们发的,前面的两个视频就是我在这里发现的,现在分享给大家。
Crush Your Coding Interview workshop video (https://www.facebook.com/Engineering/posts/10152735857917200)
Practice Interview Questions (http://www.glassdoor.com/Interview/software-engineer-interview-questions-SRCH_KO0,17_SDRD_IP3.htm)
How To Get That Job At Facebook (https://www.facebook.com/notes/facebook-engineering/get-that-job-at-facebook/10150964382448920)
Coding practice (http://www.careercup.com/page)
Facebook Engineering Page (http://www.facebook.com/Engineering)
Open Source at Facebook (https://code.facebook.com/projects)
Important Statistics (https://newsroom.fb.com/company-info)
General News (http://techcrunch.com/tag/facebook)
湾区早鸟
开通了微信公众号,获取最新的更新可以扫二维码关注。