1.3 面试的3个环节
通常面试官会把每一轮面试分为3个环节(如图1.2所示):首先是行为面试,面试官参照简历了解应聘者的过往经验;其次是技术面试,这一环节很有可能会要求应聘者现场写代码;最后一个环节是应聘者问几个自己最感兴趣的问题。下面将详细讨论面试的这3个环节。
图1.2 面试的3个环节
1.3.1 行为面试环节
面试开始的5~10分钟通常是行为面试的时间。在行为面试这个环节里,面试官会注意应聘者的性格特点,深入地了解简历中列举的项目经历。由于这一环节一般不会问技术难题,因此也是一个暖场的过程,应聘者可以利用这几分钟调整自己的情绪,进入面试的状态。
不少面试官会让应聘者做一个简短的自我介绍。由于面试官手中拿着应聘者的简历,而那里有应聘者的详细信息,因此此时的自我介绍不用花很多时间,用30秒到1分钟的时间介绍自己的主要学习、工作经历即可。如果面试官对你的某一段经历或者参与的某一个项目很感兴趣,那么他会有针对性地提几个问题详细了解。
1.应聘者的项目经验
应聘者自我介绍之后,面试官接着会对照应聘者的简历去详细了解他感兴趣的项目。应聘者在准备简历的时候,建议用如图1.3所示的STAR模型描述自己经历过的每一个项目。
图1.3 简历中描述项目的STAR模型
Situation:简短的项目背景。比如项目的规模,开发的软件的功能、目标用户等。
Task:自己完成的任务。这个要写详细,要让面试官对自己的工作一目了然。在用词上要注意区分“参与”和“负责”:如果只是加入某一个开发团队写了几行代码就用“负责”,那就很危险。面试官看到简历上应聘者“负责”了某个项目,他可能就会问项目的总体框架设计、核心算法、团队合作等问题。这些问题对于只是简单“参与”的人来说,是很难回答的,会让面试官认为你不诚实,印象分会减去很多。
Action:为完成任务自己做了哪些工作,是怎么做的。这里可以详细介绍。做系统设计的,可以介绍系统架构的特点;做软件开发的,可以写基于什么工具在哪个平台下应用了哪些技术;做软件测试的,可以写是手工测试还是自动化测试、是白盒测试还是黑盒测试等。
Result:自己的贡献。这方面的信息可以写得具体些,最好能用数字加以说明。如果是参与功能开发,则可以说按时完成了多少功能;如果做优化,则可以说性能提高的百分比是多少;如果是维护,则可以说修改了多少个Bug。
举个例子,笔者用下面一段话介绍自己在微软Winforms项目组的经历:
Winforms是微软.NET中的一个成熟的UI平台(Situation)。本人的工作是在添加少量新功能之外主要负责维护已有的功能(Task)。新的功能主要是让Winforms的控件风格和Vista、Windows 7的风格保持一致。在维护方面,对于较难的问题,我用WinDbg等工具进行调试(Action)。在过去两年中,我共修改了超过200个Bug(Result)。
如果在应聘者的简历中上述4类信息还不够清晰,则面试官可能会追问相关的问题。除此之外,面试官针对项目经验最常问的问题包括如下几个类型:
你在该项目中碰到的最大问题是什么,你是怎么解决的?
从这个项目中你学到了什么?
什么时候会和其他团队成员(包括开发人员、测试人员、设计人员、项目经理等)有什么样的冲突,你们是怎么解决冲突的?
应聘者在准备简历的时候,针对每一个项目经历都应提前做好相应的准备。只有准备充分,应聘者在行为面试环节才可以表现得游刃有余。
面试小提示:
在介绍项目经验(包括在简历上介绍和面试时口头介绍)时,应聘者不必详述项目的背景,而要突出介绍自己完成的工作及取得的成绩。
2.应聘者掌握的技能
除应聘者参与过的项目之外,面试官对应聘者掌握的技能也很感兴趣,他有可能针对简历上提到的技能提出问题。和描述项目时要注意“参与”和“负责”一样,描述技能掌握程度时也要注意“了解”、“熟悉”和“精通”的区别。
“了解”指对某项技术只是上过课或者看过书,但没有做过实际的项目。通常不建议在简历中列出只是肤浅地了解一点的技能,除非这项技术应聘的职位的确需要。比如某学生读本科的时候学过《计算机图形学》这门课程,但一直没有开发过与图形绘制相关的项目,那就只能算是了解。如果他去应聘Autodesk公司,那么他可以在简历上提一下他了解图形学。Autodesk是一家开发三维设计软件的公司,有很多职位或多或少会与图形学有关系,那么了解图形学的总比完全不了解的要适合一些。但如果他是去应聘Oracle,那就没有必要提这一点了,因为开发数据库系统的Oracle公司大部分职位与图形学没有什么关系。
简历中我们描述技能的掌握程度大部分应该是“熟悉”。如果我们在实际项目中使用某项技术已经有较长的时间,通过查阅相关的文档可以独立解决大部分问题,那么我们就熟悉它了。对应届毕业生而言,他毕业设计所用到的技能可以用“熟悉”;对已经工作过的,在项目开发过程中所用到的技能,也可以用“熟悉”。
如果我们对一项技术使用得得心应手,在项目开发过程中,当同学或同事向我们请教这个领域的问题时,我们都有信心也有能力解决,这个时候我们就可以说自己精通了这项技术。应聘者不要试图在简历中把自己修饰成“高人”而轻易使用“精通”,除非自己能够很轻松地回答这个领域里的绝大多数问题,否则就会适得其反。通常如果应聘者在简历中说自己精通某项技术,面试官就会对他有很高的期望值,因此会挑一些比较难的问题来问。这也是越装高手就越容易露馅的原因。曾经碰到一个在简历中说自己精通C++的应聘者,连成员变量的初始化顺序这样的问题都被问得一头雾水,那最终的结果也就可想而知了。
3.回答“为什么跳槽”
在面试已经有工作经验的应聘者的时候,面试官总喜欢问为什么打算跳槽。每个人都有自己的跳槽动机和原因,因此面试官也不会期待一个标准答案。面试官只是想通过这个问题来了解应聘者的性格,因此应聘者可以大胆地根据自己的真实想法来回答这个问题。但是,应聘者也不要想说什么就说什么,以免给面试官留下负面的印象。
在回答这个问题时不要抱怨,也不要流露出负面的情绪。负面的情绪通常是能够传染的,当应聘者总是在抱怨的时候,面试官就会担心如果把他招进来,那么他将成为团队负面情绪的传染源,从而影响整个团队的士气。应聘者应尽量避免以下4个原因:
老板太苛刻。如果面试官就是当前招聘的职位的老板,那么当他听到应聘者抱怨现在的老板苛刻时,他肯定会想要是把这个人招进来,接下来他就会抱怨我也苛刻了。
同事太难相处。如果应聘者说他周围有很多很难相处的同事,则面试官很有可能会觉得这个人本身就很难相处。
加班太频繁。对于大部分IT企业来说,加班是家常便饭。如果正在面试的公司也需要经常加班,那等于应聘者说他不想进这家公司。
工资太低。现在的工资太低的确是大部分人跳槽的真实原因,但不建议在面试的时候对面试官抱怨。面试的目的是拿到Offer,我们要尽量给面试官留下好印象。现在假设你是面试官,有两个人来面试:一个人一开口就说现在工资太低了,希望新工作能加多少多少工资;另一个说我只管努力干活,工资公司看着给,相信公司不会亏待勤奋的员工。你更喜欢哪个?这里不是说工资不重要,但我们要清楚面试不是谈工资的时候。等完成技术面试之后谈Offer的时候,再和HR谈工资也不迟。通过面试之后我们就掌握主动权了,想怎么谈就怎么谈,如果工资真的开高了,那么HR会和你很客气地商量。
笔者在面试的时候通常给出的答案是:现在的工作做了一段时间,已经没有太多的激情了,因此希望寻找一份更有挑战的工作。然后具体论述为什么有些厌倦现在的职位,以及面试的职位我为什么会有兴趣。笔者自己跳过几次槽,第一次从Autodesk跳槽到微软,第二次从微软跳槽到思科,后来又从思科回到了微软。从面试的结果来看,这样的回答都让面试官很满意,最终也都拿到了Offer。
当时在微软面试被问到为什么要跳槽时,笔者的回答是:我在Autodesk开发的软件Civil 3D是一款面向土木行业的设计软件。如果我想在现在的职位上得到提升,就必须加强土木行业的学习,可我对诸如计算土方量、道路设计等没有太多兴趣,因此出来寻找机会。
在微软工作两年半之后去思科面试的时候,笔者的回答是:我在微软的主要工作是开发和维护.NET的UI平台Winforms。由于Winforms已经非常成熟,不需要添加多少新功能,因此我的大部分工作是维护和修改Bug。两年下来,调试的能力得到了很大的提高,但长期如此,自己的软件开发和设计能力将不能得到提高,因此想出来寻找可以设计和开发系统的职位。同时,我在过去几年里的工作都是开发桌面软件,对网络了解甚少,因此希望下一个工作能与网络相关。众所周知,思科是一家网络公司,这里的软件和系统或多或少都离不开网络,因此我对思科的职位很感兴趣。
1.3.2 技术面试环节
面试官在通过简历及行为面试大致了解应聘者的背景之后,接下来就要开始技术面试了。一轮一小时的面试,通常技术面试会占据40~50分钟。这是面试的重头戏,对面试的结果起决定性作用。虽然不同公司不同面试官的背景、性格各不相同,但总体来说他们都会关注应聘者的5种素质:扎实的基础知识、能写高质量的代码、分析问题时思路清晰、能优化时间效率和空间效率,以及学习沟通等各方面的能力(如图1.4所示)。
图1.4 应聘者需要具备的素质
应聘者在面试之前需要做足准备,对编程语言、数据结构和算法等基础知识有全面的了解。面试的时候如果遇到简单的问题,则应聘者一定要注重细节,写出完整、鲁棒的代码。如果遇到复杂的问题,则应聘者可以通过画图、举具体例子分析和分解复杂问题等方法先厘清思路再动手编程。除此之外,应聘者还应该不断优化时间效率和空间效率,力求找到最优的解法。在面试过程中,应聘者还应该主动提问,以弄清楚题目的要求,表现自己的沟通能力。当面试官前后问的两个问题有相关性的时候,尽量把解决前面问题的思路迁移到后面的问题中去,展示自己良好的学习能力。如果能做到这几点,那么通过面试获得心仪的职位将是水到渠成的事情。
1.扎实的基础知识
扎实的基本功是成为优秀程序员的前提条件,因此面试官首要关注的应聘者素质就是是否具备扎实的基础知识。通常基本功在编程面试环节体现在3个方面:编程语言、数据结构和算法。
首先,每个程序员至少要掌握一两门编程语言。面试官从应聘者在面试过程中写的代码及跟进的提问中能看出其编程语言掌握的熟练程度。以很多公司面试要求的C++举例。如果写的函数需要传入一个指针,则面试官可能会问是否需要为该指针加上const、把const加在指针不同的位置是否有区别;如果写的函数需要传入的参数是一个复杂类型的实例,则面试官可能会问传入值参数和传入引用参数有什么区别、什么时候需要为传入的引用参数加上const。
其次,数据结构通常是编程面试
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
《剑指Offer:名企面试官精讲典型编程题》剖析了50个典型的程序员面试题,从基础知识、代码质量、解题思路、优化效率和综合能力五个方面系统整理了影响面试的5个要点。全书分为7章,主要包括面试的流程,讨论面试流程中每一环节需要注意的问题;面试需要的基础知识,从编程语言、数据结构及算法三方面总结了程序员面试的知识点;高质量的代码、解决面试题的思路、优化时间和空间效率。