🍩 WMC's Blog

God's in his Heaven - All's right with the world

对于 New Grad 来说,如何准备 Coding Interview 及 Behavior Question?

本文总结了我在美国的 2019 年秋招加 2020 春招的面试经验和教训,希望能够对后人有所帮助(本文最适合米国应届毕业生阅读,但相信也可以帮到其他人)。

总的来说,面试并非是一场考试,更不是一场“逢场作戏”——它是公司检验候选人是否符合公司用人标准的流程。展现出自己是一个合格的程序员和合作者的一面吧!

请做一下自我介绍。

对于程序员来说,这一过程没有特殊的“套路”。介绍一下自己的学校、擅长的技术、自己曾经的实习项目和有趣的课程项目——如果是特定的组和岗位,可以特殊介绍一下符合该岗位的技术和项目经历。给自己和面试官一个快速热身的时间!

行为问题(behavior question)

展现出你是一个合格的合作者。总的来说,就是要“扬长避短”,善于从以前的错误中学习,展现出自己处理问题和待人接物的能力。

如何准备行为问题?

罗列你的工作和学习中遇到的各种困难,思考你当时的做法,以及是否有能够改进的空间。不妨把把可能出现的行为点列出一个表格,把你的经历、解决方案、改进空间按对应的行为点填写进去,以此来理清你的思路。

行为问题案例分析

下面是网络上流传得非常广的一些例子。这些问题可能看起来像是在故意刁难人——但如果你想明白了面试官到底在考察哪些问题、再带入你曾经的工作环境和解决方案,这些问题其实非常简单。

例题 1:你最不喜欢你做过的哪个项目?你有什么失败的经历?

这个问题当然不是让你大诉苦水用的了!对于面试官来说,你曾经的错误和失败甚至都是不值一提的——他们的关注点在于,当你遇到了这些棘手的问题,你当时是否做出一些尝试,并且在这之后你如何认识错误、吸取教训、改变自己。

例题 2:你的弱点是什么?

如果你回答“我没有什么弱点”,那么对面试官来说,你很可能是个无法全面认识自己的人;如果你像一些网络笑话那样回答“我的弱点就是工作太努力了”,那面试官就会认为你是一个狂妄自大、极端傲慢的人。讲一个你确确实实存在的、但不是十分恶劣的弱点,同样地讲一讲自己是如何尝试改掉自己的弱点的。

例题 3:你和领导或客户的意见相左,你怎么办?

这个问题相信在工作和学习中非常常见。如果你决定靠着嘴皮子去说服他、甚至决定按照自己认为对的方案直接动手做,相信面试官是不太愿意和你做同事的。以我自己的真实经历为例子,我会选择尽快将两种方案同时实现,分别测试并比较二者在性能和表现上的权衡,将两种实现的利弊展现给对方,让他来根据数据决定最终的取舍。

编程问题(coding interview)

编程问题考察的不仅仅是写代码的能力,同时还有你作为一个合格的合作者的素质。把面试官当成你的同事、向你求助的同学。

面试前的长期准备

对于候选人来说,如果对数据结构和算法不够熟悉,在短短一个小时要完成两至三题、同时解释思路并分析,是不太容易的。不妨拿出你的 《算法导论》 或者红色封皮的《算法》,复习一下常见的数据结构,如散列表、链表、栈、队列、堆、二叉树、字典树,以及一些常见的算法,如深度优先搜索、广度优先搜索、二分搜索、回溯法、双指针、并查集、滑动窗口、递归、动态规划等等。

一个比较好的练习方式是在 LeetCode 上挑一些热门题目来练习。LeetCode 的测试数据非常全面,并且在通过测试后提供按照时间复杂度排序的他人代码,非常有助于你发现自己代码能力的不足;同时丰富的讨论区有助于你用英语思考其他可能的解决方案。不妨打开 LeetCode,点击上面的 Mock Interview、或者随机挑选一题,约上一些有过面试经验的同学,试一试自己能否讲清楚问题的一种解法、分析时间复杂度、完成代码、口头带入测试数据检验。

面试中的流程和注意事项

讲完了面试前的准备,再讲一讲面试。在实际面试中,如果把面试题当成在线评测平台的题目,直接随手写出能够完美运行的最优解代码,也许你会通过这一轮的面试,但更可能的是你会收到“莫名其妙”的拒信。编程问题所考察的并不仅仅是能够写出不错的代码——同样重要的是,候选人的沟通能力和合作能力。假设一下面试官是你的同事,他来向你请教一个程序设计上的问题——那么你应该怎样回应他呢?从某种意义上来说,应当把面试当成是一次精心准备过的面对小白同事的答疑时间。

首先,向面试官确认问题。试着给出一个样例输入和对应的输出,“Is my understanding right?”

然后,思考和询问可能出现的 corner case。给出一些对应的例子,询问答案。这个程序需要解决非法输入吗?这个程序是否需要处理一些极端情况呢?在这个情况下应当输出什么结果呢?

接下来,和面试官讨论思路。尝试讲出你脑海中的第一个想法,并逐渐完善你的想法,并向面试官确认。“Am I on the right way?”“Do you think it’s okay to get started on coding?”

最后,才是开始写代码的时间。在写代码的时候,务必要一边写、一边解释、一边确认——就好像你对你的同事、你的课程作业队友解释你的代码和设计那样。同时,还要注意代码的规范性,包括命名方式、拆分为多个函数、面向对象等,让你的同事接手之后可以继续维护它。“Do you prefer it to be a class or just a function would be fine?”“Do you think the input and output type is good?”“Just for quick coding, I’ll use a rough naming with i, j, k for this loop instead of camel case naming.”“In this part, we use a path-compression for the Union-Find algorithm.”

写完之后还没完。尝试代入一下你刚才列出的样例输入和 corner case,看看输出是否正确?如果你使用的是可以线上直接编译运行的平台,不妨问“Do you want to do a test with the previous sample data, maybe just in oral, or compile and run?”最后,记得分析程序的时间复杂度,让面试官能够明白你的代码的限制所在。

你有什么问题想问我?

不要小看这一个问题!判断候选人是否充分展现出想要在该公司工作的兴趣,同样是面试官的考察范围之一——而你,就需要提出一些对工作环境、公司文化相关的问题,来表现出你对该公司的兴趣,因此这最后的五分钟,并非无足轻重。

一个比较经典的提问是,“What is the daily routine working at Amazon?”如果是组招、或者是一些比较新兴的创业公司,不妨问一问:“What is the size of the engineering team, like the number of engineers?”“What’s the tech stack that your group usually use?”“How do engineers at Amazon usually cooperate with others during work?”这些问题对于你了解该公司、该组都会非常有帮助。甚至,像 Amazon、Facebook 这样有着特定的企业文化的公司,如果面试官在自我介绍时说自己曾在某某其他公司工作过,不妨特别地问一问,“What is the most different thing you think working at Amazon from Microsoft?”“Do you like the culture of Amazon?”——当然,如果你觉得自己多半要挂掉这一场面试,也不要气馁,不妨问一问,“Do you have any suggestions for me?”

和招聘人员保持联系

如果你感觉到面试中,因电话信号不够好而影响了个人的发挥,或者更极端的情况下,某一轮的面试官非常不友好、甚至频繁打断或者刁难你,务必尽快联系招聘人员,不要吃哑巴亏——如果等到给出了最终结果之后再沟通或投诉,很有可能无法再对结果产生影响。

当然,更加可能发生的是,整个面试流程流畅而友好,招聘人员也快速地和你进行跟进——那么就和招聘人员多保持联系吧!至少,在邮件里面显示出你的热情,哪怕这一次拿不到 offer,也要期待下一次更好的见面~

推荐阅读

必读

请务必读一下这两篇文章——这两篇文章出自 Facebook 和 Amazon 的高级面试官之手,代表着绝大多数面试官的观点,涵盖了编程问题和行为问题两方面。在你的模拟面试中,不妨多注意一下这些部分。

Google、Facebook 等美国 IT 名企在面试中最看重什么? by Cat Chen
https://www.zhihu.com/question/39238915/answer/984802663

How to interview at Amazon - Leadership by David Anderson
https://www.linkedin.com/pulse/how-interview-amazon-leadership-david-anderson/

选读

请参考下述文章。下述文章部分出自面试官、部分出自候选人之手,有些甚至和面试无关——但对你有帮助。不妨思考一下,在面试中怎样表现才会让面试官觉得你是一个值得合作的人。

分享一些 Jedi Behavior Interview 的经验
https://www.1point3acres.com/bbs/thread-195416-1-1.html

面试官角度给点面试建议,顺便求大米
https://www.1point3acres.com/bbs/thread-572811-1-1.html

面试中需要注意的细节 - 如何让你刷题的辛苦得到应有的回报
https://www.1point3acres.com/bbs/thread-560499-1-1.html

狗家面试官:一个挂掉的案例分析
https://www.1point3acres.com/bbs/thread-559262-1-1.html

如何准备谷歌面试[或任何面试]
https://www.1point3acres.com/bbs/thread-567013-1-1.html

Crack the Behavior Questions——关于 Behavior Question 的碎碎念
https://www.1point3acres.com/bbs/thread-106072-1-1.html

16 个 behavior question 的面试官解析及 tips
https://zhuanlan.zhihu.com/p/20346977

问 BQ(behavioral question)时,他们到底在问什么
https://www.1point3acres.com/bbs/thread-566677-1-1.html

Programmer 的自我推销
https://aaronk9.gitbooks.io/programmer/content/

手把手教你在 Google 升职
https://www.1point3acres.com/bbs/thread-592865-1-1.html

书籍

这些是经典的面试书籍,详细介绍了你在面试的每一点准备工作和注意事项。

《编程之美》
《程序员面试金典》(Cracking the Coding Interview)