程序员面试白皮书
上QQ阅读APP看书,第一时间看更新

1.2 面试

根据面试的不同对象,在招聘过程中你可能需要面对HR、技术面试官和老板。针对不同的角色,你应该准备不同的面试方式。具体分析如图1-2所示。这个表格主要是针对美国求职而言的。中国的程序员并不一定是这种形式,这里只是希望读者可以参考一下北美的面试流程。

图1-2 面试须知

1.2.1 HR

HR是你与公司的连接点。通常,HR负责安排协调面试,主要通过邮件联系。HR也有可能会直接打电话联系你,目的是了解你的基本情况,包括身份、毕业/离职时间等。HR通常会介绍职位要求和公司的基本情况,并且在面试当天接待你,了解你是否有其他面试安排或者其他公司的Offer。此外,HR还负责面试你的沟通能力,向老板反馈性格方面与团队的契合度以及对公司感兴趣的程度。因此,每次与HR的沟通也需要热情、职业。适合向HR了解的信息包括:公司的整体氛围、面试的流程安排、最近公司人员流动情况等。

1.2.2 技术面试官

技术面试官主要负责衡量你的技术水平,以及判断你是否符合职位要求。总体而言,对科技公司,技术面试官的意见最为重要。技术面试包括电话面试和现场面试,前者主要偏向概念性的问答,也包括通过协作网站直接写代码等。现场面试通常包括白板写代码,解决一个算法问题或者设计问题等。本书的主要目的就是帮助你通过这轮面试。

一些面试的小技巧如下:一定要先沟通,明确自己了解题意,不要过分考虑或者欠考虑。首先可以给出一个比较容易想到、但并不是最优的解决方案,再逐步优化。在思考的时候也要把思路讲出来,哪怕不是很成熟的方案。一旦遇到困难,可以先自己设法解决,如果五分钟没有思路,可以向面试官求助。适当的提示并不会影响你面试的最终结果。当开始写程序的时候,尽量注意语法格式、变量命名等,避免写伪代码,越接近真实代码越好。写完以后自己检查下有没有明显的错误,可以列举几个简单的测试数据,与面试官一起检验一下整个运行过程。

面试是一个合作解决问题的过程,沟通一定是面试的关键:需要通过沟通展示你的逻辑性、理解能力和表达能力。在面试的最后,通常对方会给你提问的机会,你可以问的问题包括:团队平时使用什么样的技术,通常的工作压力和工作时间,公司最让人兴奋的地方;在当前职位工作了多少年,面试官之前的工作经历与现在相比有什么异同等。

面试考察的基本功,包括以下方面:

• 程序风格:能正确使用缩进,括号要对齐,变量名可以起的有意义;

• 编码习惯:异常检查,边界处理;

• 沟通:让面试官时刻明白你的意图,不要闭着眼睛不停地写。因为你的算法未必对。对了你也未必写得出来。中间稍微有点问题,你就失败了。对于面试官来说,他根本不知道你的解题进行到哪一步了;

• 测试:主动写出合理的测试用例(Test case),一些常见的用例,如null检查。一般你没写的话,面试官会让你写,但如果你主动写出来,说明你有好的习惯,容易加分。

技术面试的流程通常如下,可供参考。

当你拿到一个具体问题时,可以按照以下流程回答:

1.明确题意:通过与面试官交流明确需要解答的问题。这部分主要为了让自己放松心态,并且给面试官留下你具有良好团队意识和交流能力的印象。

2.描述大体思路:描述你打算用什么算法,什么数据结构。主要是为了让面试官了解你的思维过程,如果你给出的解答与他想要的答案偏差太多,可以及时纠正。同时,描述思路也给了你自己思考的机会。

3.实现算法:先处理边界条件。对于重要的算法模块,加一些注释或者与面试官进行交流。目的是让面试官始终了解你在做什么,算法框架是什么。

4.跑一个测试:用一个测试用例走一遍你写的程序。目的在于和面试官一起确保你的算法是有效的,可以在过程中及时发现并纠正自己的错误。同时,给面试官留下你有写单元测试(unit test)习惯的良好印象。

5.描述算法复杂度,回答面试官的问题。

1.2.3 老板

团队的老板通常最后一个出场面试,或者陪同面试者一起吃午饭。老板负责收集整理所有人的反馈,并且决定是否发Offer。通常而言,老板可能不会问过于技术的问题,而是侧重考察你的协作沟通能力。老板的问题可能包括:如何面对工作中的难题/压力,你之前做过的项目,为什么适应这个职位等等。与老板沟通需要表现出你对他们团队的热情,并且在回答中尽量体现自己为什么适合这个职位。面试是一个相互的过程,通过与老板的面试,你需要了解这些问题:团队的成员构成,一般情况下项目如何分配,老板对你的期望,老板对团队在公司中发展的一些展望等等。

另外,准备一些常见的行为问题:比如你有没有过失败的经历,如果你老板给你不喜欢的任务怎么办,你想象中要成为什么样的人。这里一方面可以结合自身精力,另一方面多关注公司的介绍页面,包括公司创始人背景、企业文化、招聘的要求。这些都可以提前做好功课,尽量体现出来你的激情、负责、勤奋等优秀品质。