研发类面试流程
本文将介绍一些研发类面试的常见流程,帮助大家提前熟悉面试的环节。
除了流程之外,本文更重点的是介绍在面试官的视角下,各个流程的考察重点,以及面试官的心里活动。知己知彼方能百战不殆,大家在掌握了面试官的考察内容之后,也可以在面试中更好地展示自己的优势。
面试目的
从求职者的角度来讲,面试的目的就是拿到 Offer。但是面试是一个双向的过程,求职者的目的是拿到心仪的 Offer;但是同时面试也是带着目的来参与到面试中,那就是:
- 考察候选人是否符合公司的要求
- 在多个符合公司要求的候选人中,选择最优秀的候选人
考虑到面试官的“目的”,作为候选人就需要重新审视自己在面试中的目标了:
-
要展示出自己的技能满足公司的要求:公司的要求可以在招聘简章中查看,一般在招聘描述(Job Description,简称 JD)中。
-
展示核心竞争力:这是更为残酷的环节,候选人要在横向的对比中,展示出比其他候选人更为出色的、与众不同的点,这样才能在第一步的筛选中脱颖而出。
而实际面试中,更为出色的点可能难以界定,比较好展示的其实是与众不同的点,而且更多的是想法上的与众不同。比如其他候选人的简历都写了来自课程设计的《图书管理系统》、《酒店管理系统》,而你的简历中写了一个《Git 的简单实现》、《猫咪情绪识别系统》,显然会给面试官留下深刻的印象。
与众不同的点一定来自于个人的兴趣与思考,而不是所有人都会做、会学的学校的课程。
面试流程
1. 自我介绍
一般来说面试的第一个环节是自我介绍。
自我介绍是你展示自己的第一步,也是面试官了解你的第一步。一个好的自我介绍通常包含了以下内容:
- 姓名:让面试官认识你
- 学校/专业:展示你的学历背景,也让面试官了解你的学习方向
- 排名与绩点(非必需):如果成绩优秀的话,作为自己的优势项,可以向面试官介绍下。如果成绩一般的话,可以不用说明
- 专业 技能:学校中一般以教授基础知识为主,实际工作中用的一些技术可能在学校中并没有学习,可以向面试官介绍下自己的专业技能。如果 JD 上有明确的技能要求的话,尽量向公司要求的技能靠拢。
- 实习经历(非必需):如果有实习经历的话,可以向面试官介绍下,毕竟工作与学校的项目不一样,实习经历可以更好地展示你具备一定的工作能力
- 项目经验:项目经验是面试官了解你的重要途径,可以向面试官介绍你的做过的项目,可能来自实习、个人练习等
- 自我评价:可以一句话评价下自己,作为自我介绍的收尾。一定要简短,但是突出自己的核心竞争力
作为面试官,尤其是校园招聘的面试官,不会花时间提前看所有求职者的简历。可能在看到你的前几分钟,面试官才会拿到你的简历。让你做自我介绍的时间,也是面试官仔细查看你的简历的时间,因此自我介绍的流程,要与简历上一一对应,这样可以方便面试官更好地了解你。
2. 项目介绍
项目介绍是面试中的重点部分,毕竟自我介绍中的专业技能掌握的情况,要靠实际的项目来体现。
2.1. 项目介绍的重点
项目介绍部分主要要体现以下几个方面:
- 项目背景:项目的背景是什么,为什么要做这个项目
- 项目技术栈:项目中用到了哪些技术,为什么选择这些技术
- 项目难点/亮点:项目中遇到的难点是什么,如何解决的
- 个人工作:项目中你负责的部分是什么,你的工作如何解决了项目的难点
上面的内容中,重点需要介绍的是个人的所作的工作,尤其是解决了项目中的哪些难点,个人的工作有哪些亮点。
2.2. 项目介绍的技巧
我在当面试官的时候,遇到过很多求职者,在介绍自己项目的时候,介绍了很多项目的背景、技术栈,但是很少介绍自己的工作。这样通篇下来,我只能知道你的项目用到了什么,但是完全不知道你在项目中做了什么。
面试是让面试官了解你的过程,因此在介绍项目的时候,一定要突出自己的工作。
如果是团队合作的项目,自己又做了很少的一部分,可以放心大胆的把其他人的工作放到自己头上,但是前提一定是彻底了解清楚项目的信息,不会被面试官问倒即可。作为面试官,其实并不在意你所说的工作是不是你做的,一方面因为考察的是对项目、对知识的理解,只要能够回答出尽可能多的问题,我会认为你对项目是有了解的;另一方面,大部分人的项目其实都很简单,尤其是本科生的项目,很多时候在项目中问不出什么太多内容,还是要靠后续的技术问题和算法问题。
另外在介绍项目时,面试官可能会问一些问题,在回答时尽量往自己擅长的地方引导,让面试官知道你很擅长某些内容,这是在面试的所有流程中都行之有效的重要技巧。
2.3. 项目的选择
不要写 xx 管理系统!不要写 xx 管理系统!不要写 xx 管理系统!
重要的事情说三遍,很多候选人,特别是本科生,简历中的项目都是《xx 管理系统》,一看就是来自与课程设计。如果候选人来自同一个学校,还会“撞”项目。我曾经帮助大厂在哈尔滨做面试的时候,真的真的在一天内看到了不下 5 个《文件管理系统》。
这一点上研究生会有天然的优势,实验室中的项目还是要比本科阶段的毕业设计强很多的,如果没有项目可以写上。
如果有实习经历的话,完全可以写上实习时做的项目,同时有实习经历,也可以证明你的行动力要比大多数人都强。
前文也有提到,项目来自于个人的兴趣与思考,动手能力强的同学可能会有很多自己特别的项目,这些同学只需要准备好面试技巧即可。
如果不知道做什么项目,最简单的方式就是重复造轮子,找一个自己熟悉或者听过的开源项目,自己写一个类似的实现。通常开源项目都具备一定的难度,同时又有开源代码可以参考。很多开源项目的代码质量都很高,也是一个很好的学习途径。
我个人十分推荐自己动手实现一个 Git,架构设计真的很精妙。(本站后续也计划推出一些大家可以跟着做的项目,大家敬请期待~)
2.4. 项目的延申
这个环节因面试官而异。我很喜欢在项目介绍的部分,针对求职者的项目,提出一些延伸的问题,比如在已有的功能上提一些新的需求。
这个环节主要考察:
- 候选人是否真的对这个项目熟悉,并且有自己的思考与理解
- 候选人的是否具备一定的设计能力,如何较好的给已有的系统增加新的功能
- 候选人解决问题的能力,给定的新的、没有想到过的需求,如何思考并解决
如果大家真的了解自己的项目,并且有较好的 设计能力,那么这是一个很好的展示个人能力的环节。
复习这个环节也很简单,提前问一问自己,项目哪里能够优化,有没有新的功能可以加入。
也有两种情况,一是项目过于简单,二是项目属于垂类项目,我可能很难问出有价值的东西。
3. 技术问题
技术类的问题,也就是我们俗称的基础知识,业内黑话叫做“八股文”。
不知什么时候起,这一环节慢慢演变成了一个“背诵”环节。
本意是用来考察候选人的基础知识,但是由于基础知识的内容其实有限,平时的开发工作中又很偏向原理。每次面试之前,我也会掏出我的面试笔记,好好复习一下基础知识的内容。
这部分建议参考 研发类复习指南 中的内容,我也会持续更新这部分的内容,大家可以常回来看看。
虽然说背诵看起来会容易复习一些,但是掌握全部的知识点还是需要很长的时间。 我也希望大家不要只是背诵,在学习的过程中多问问自己为什么,比如网络的模型为什么这样分层,DNS 为什么要递归查询等等,理解了原理,掌握起来也会更加轻松。
在实际的工作中,如果想要在程序员的道路上不断精进,这一部分其实十分重要,直到现在我也会时常找到这部分的内容复习一下。
4. 算法问题
到了我最喜欢的算法环节了。这是一个重点考察候选人的思维能力、解决问题能力的环节,当然也考察候选人的刷题量。
很多人最开始做算法题的时候,可能会把解题与智商相关联,其实刷多了就会发现,这就是一个熟能生巧的过程。一个类型的题目都有一定的规律,刷多了之后,看到一个题目,自然会分析出题目的类别,靠着肌肉记忆可能都能写出代码来。
刷题的路线可以参考 LeetCode 官方刷题路线,本站也会持续更新题解,当然刷的快的小伙伴也可以提前去 LeetCode 上查看题解。
遇到不会的题目可以查看题解,但是要保证自己能够独立写出来,这样才能真正掌握这个题目。
即使刷过了很多的题目,也不能保证面试中遇到的题目都可以轻易的解出来,而且面试都是手写代码,没有办法使用 IDE 的提示,因此在面试之前,一定要熟练掌握自己常用的语言的语法。
此环节一般分为两步:
- 确认解题思路:这一步可以与面试官沟通,确认自己的思路是否正确,同时确认一些边界条件等等。面试官可能也会隐藏一些关键信息,比如特殊值处理、边界等等,这个过程其实就是期望候选人可以跟自己多进行沟通,当然也是因人而异,至少我个人还是很喜欢跟面试官或者候选人交流的
- 写代码:在确认了思路后,开始进行代码的编写。这一步要求尽量符合 《代码整洁之道》 中的要求,注意变量的命名等等,尽量写出简洁、易读的代码。在写代码的过程中,面试官可能会提出一些问题,比如代码的复杂度、边界条件等等,这个过程也是考察候选人的代码能力的过程
有时候通过前面的内容,面试官可能对候选人的能力已经有了一定的了解,会根据候选人的能力找一些难度适当的问题。一些企业也有官方的题库,大家可以根据网上的面经,查看下通常都会问哪些问题。
如果有同学想去外企,那么一定要着重训练刷题的环节,外企机会每一轮面试都会有算法题,而且难度会比较大。
至于为什么说这是我最喜欢的环节,因为面试要写面试评价,作为面试官,在校招时期一天要持续的面很多人,期间几乎没有间隔。而候选人做一道题大概需要十到十五分钟,那么这个时间刚好用来写面试评价......
5. 系统设计
校园招聘很少单独问系统设计的,这部分的内容主要是针对有一定工作经验的候选人。当然本站也会推出一些 系统设计 的内容,了解一些系统设计的原理,看看一些大厂的架构设计,对于和学习都有很大的帮助,还可以复刻一些大厂的系统设计的题目,作为自己的个人项目。
6. 提问环节
如果面试还有时间,我也会问候选人有什么问题要问我的。
通常这一环节被认为是考察候选人的沟通交流能力,是否积极等等,也确实有很多的面试官会在意这些内容,所以尽量展示出自己积极、勤学的一面。
也有面试官会在意候选人是否有了解公司的情况,一些公司,尤其是外企,很注重候选人与企业文化的匹配程度,也建议提前了解下。
作为面试官的一些话
我认为一个好的面试官,除了要考察候选人是否匹配公司的要求之外,更多的是发现候选的闪光之处。可能有的候选人代码能力不是特别的强,但是又很多的想法,我依然会给通过。
我曾经实际遇到过一位候选人,经历十分有趣。大学期间联系了国外学校的老师,自己争取到了交换的机会,并且顺利完成了交换的项目。虽然那位候选人的技术栈与我们的要求不是特别的匹配,但是我依然给了他 Offer,因为他在面试过程中所表现出的行动力、主动性打动了我。最后他也顺利入职我们公司,成为了我的同事。
所以,尽量在面试中展现出你积极自信的一面,展示出你的想法,展示出你的行动力,展示出你的与众不同,要相信,总有一个面试官会看到你的闪光之处。