跳到主要内容

研发类面试流程

本文将介绍一些研发类面试的常见流程,帮助大家提前熟悉面试的环节。

除了流程之外,本文更重点的是介绍在面试官的视角下,各个流程的考察重点,以及面试官的心里活动。知己知彼方能百战不殆,大家在掌握了面试官的考察内容之后,也可以在面试中更好地展示自己的优势。

面试目的

从求职者的角度来讲,面试的目的就是拿到 Offer。但是面试是一个双向的过程,求职者的目的是拿到心仪的 Offer;但是同时面试也是带着目的来参与到面试中,那就是:

  1. 考察候选人是否符合公司的要求
  2. 在多个符合公司要求的候选人中,选择最优秀的候选人

考虑到面试官的“目的”,作为候选人就需要重新审视自己在面试中的目标了:

  1. 要展示出自己的技能满足公司的要求:公司的要求可以在招聘简章中查看,一般在招聘描述(Job Description,简称 JD)中。

  2. 展示核心竞争力:这是更为残酷的环节,候选人要在横向的对比中,展示出比其他候选人更为出色的、与众不同的点,这样才能在第一步的筛选中脱颖而出。

而实际面试中,更为出色的点可能难以界定,比较好展示的其实是与众不同的点,而且更多的是想法上的与众不同。比如其他候选人的简历都写了来自课程设计的《图书管理系统》、《酒店管理系统》,而你的简历中写了一个《Git 的简单实现》、《猫咪情绪识别系统》,显然会给面试官留下深刻的印象。

与众不同的点一定来自于个人的兴趣与思考,而不是所有人都会做、会学的学校的课程。

面试流程

1. 自我介绍

一般来说面试的第一个环节是自我介绍。

自我介绍是你展示自己的第一步,也是面试官了解你的第一步。一个好的自我介绍通常包含了以下内容:

  1. 姓名:让面试官认识你
  2. 学校/专业:展示你的学历背景,也让面试官了解你的学习方向
  3. 排名与绩点(非必需):如果成绩优秀的话,作为自己的优势项,可以向面试官介绍下。如果成绩一般的话,可以不用说明
  4. 专业技能:学校中一般以教授基础知识为主,实际工作中用的一些技术可能在学校中并没有学习,可以向面试官介绍下自己的专业技能。如果 JD 上有明确的技能要求的话,尽量向公司要求的技能靠拢。
  5. 实习经历(非必需):如果有实习经历的话,可以向面试官介绍下,毕竟工作与学校的项目不一样,实习经历可以更好地展示你具备一定的工作能力
  6. 项目经验:项目经验是面试官了解你的重要途径,可以向面试官介绍你的做过的项目,可能来自实习、个人练习等
  7. 自我评价:可以一句话评价下自己,作为自我介绍的收尾。一定要简短,但是突出自己的核心竞争力

作为面试官,尤其是校园招聘的面试官,不会花时间提前看所有求职者的简历。可能在看到你的前几分钟,面试官才会拿到你的简历。让你做自我介绍的时间,也是面试官仔细查看你的简历的时间,因此自我介绍的流程,要与简历上一一对应,这样可以方便面试官更好地了解你。

2. 项目介绍

项目介绍是面试中的重点部分,毕竟自我介绍中的专业技能掌握的情况,要靠实际的项目来体现。

2.1. 项目介绍的重点

项目介绍部分主要要体现以下几个方面:

  1. 项目背景:项目的背景是什么,为什么要做这个项目
  2. 项目技术栈:项目中用到了哪些技术,为什么选择这些技术
  3. 项目难点/亮点:项目中遇到的难点是什么,如何解决的
  4. 个人工作:项目中你负责的部分是什么,你的工作如何解决了项目的难点

上面的内容中,重点需要介绍的是个人的所作的工作,尤其是解决了项目中的哪些难点,个人的工作有哪些亮点。

2.2. 项目介绍的技巧

我在当面试官的时候,遇到过很多求职者,在介绍自己项目的时候,介绍了很多项目的背景、技术栈,但是很少介绍自己的工作。这样通篇下来,我只能知道你的项目用到了什么,但是完全不知道你在项目中做了什么。

面试是让面试官了解你的过程,因此在介绍项目的时候,一定要突出自己的工作。

如果是团队合作的项目,自己又做了很少的一部分,可以放心大胆的把其他人的工作放到自己头上,但是前提一定是彻底了解清楚项目的信息,不会被面试官问倒即可。作为面试官,其实并不在意你所说的工作是不是你做的,一方面因为考察的是对项目、对知识的理解,只要能够回答出尽可能多的问题,我会认为你对项目是有了解的;另一方面,大部分人的项目其实都很简单,尤其是本科生的项目,很多时候在项目中问不出什么太多内容,还是要靠后续的技术问题和算法问题。

另外在介绍项目时,面试官可能会问一些问题,在回答时尽量往自己擅长的地方引导,让面试官知道你很擅长某些内容,这是在面试的所有流程中都行之有效的重要技巧。

2.3. 项目的选择

不要写 xx 管理系统!不要写 xx 管理系统!不要写 xx 管理系统!

重要的事情说三遍,很多候选人,特别是本科生,简历中的项目都是《xx 管理系统》,一看就是来自与课程设计。如果候选人来自同一个学校,还会“撞”项目。我曾经帮助大厂在哈尔滨做面试的时候,真的真的在一天内看到了不下 5 个《文件管理系统》。

这一点上研究生会有天然的优势,实验室中的项目还是要比本科阶段的毕业设计强很多的,如果没有项目可以写上。

如果有实习经历的话,完全可以写上实习时做的项目,同时有实习经历,也可以证明你的行动力要比大多数人都强。

前文也有提到,项目来自于个人的兴趣与思考,动手能力强的同学可能会有很多自己特别的项目,这些同学只需要准备好面试技巧即可。

如果不知道做什么项目,最简单的方式就是重复造轮子,找一个自己熟悉或者听过的开源项目,自己写一个类似的实现。通常开源项目都具备一定的难度,同时又有开源代码可以参考。很多开源项目的代码质量都很高,也是一个很好的学习途径。

我个人十分推荐自己动手实现一个 Git,架构设计真的很精妙。(本站后续也计划推出一些大家可以跟着做的项目,大家敬请期待~)

2.4. 项目的延申

这个环节因面试官而异。我很喜欢在项目介绍的部分,针对求职者的项目,提出一些延伸的问题,比如在已有的功能上提一些新的需求。

这个环节主要考察:

  1. 候选人是否真的对这个项目熟悉,并且有自己的思考与理解
  2. 候选人的是否具备一定的设计能力,如何较好的给已有的系统增加新的功能
  3. 候选人解决问题的能力,给定的新的、没有想到过的需求,如何思考并解决

如果大家真的了解自己的项目,并且有较好的 设计能力,那么这是一个很好的展示个人能力的环节。

复习这个环节也很简单,提前问一问自己,项目哪里能够优化,有没有新的功能可以加入。

也有两种情况,一是项目过于简单,二是项目属于垂类项目,我可能很难问出有价值的东西。

3. 技术问题

技术类的问题,也就是我们俗称的基础知识,业内黑话叫做“八股文”。

不知什么时候起,这一环节慢慢演变成了一个“背诵”环节。

本意是用来考察候选人的基础知识,但是由于基础知识的内容其实有限,平时的开发工作中又很偏向原理。每次面试之前,我也会掏出我的面试笔记,好好复习一下基础知识的内容。

这部分建议参考 研发类复习指南 中的内容,我也会持续更新这部分的内容,大家可以常回来看看。

虽然说背诵看起来会容易复习一些,但是掌握全部的知识点还是需要很长的时间。我也希望大家不要只是背诵,在学习的过程中多问问自己为什么,比如网络的模型为什么这样分层,DNS 为什么要递归查询等等,理解了原理,掌握起来也会更加轻松。

在实际的工作中,如果想要在程序员的道路上不断精进,这一部分其实十分重要,直到现在我也会时常找到这部分的内容复习一下。

4. 算法问题

到了我最喜欢的算法环节了。这是一个重点考察候选人的思维能力、解决问题能力的环节,当然也考察候选人的刷题量。

很多人最开始做算法题的时候,可能会把解题与智商相关联,其实刷多了就会发现,这就是一个熟能生巧的过程。一个类型的题目都有一定的规律,刷多了之后,看到一个题目,自然会分析出题目的类别,靠着肌肉记忆可能都能写出代码来。

刷题的路线可以参考 LeetCode 官方刷题路线,本站也会持续更新题解,当然刷的快的小伙伴也可以提前去 LeetCode 上查看题解。

遇到不会的题目可以查看题解,但是要保证自己能够独立写出来,这样才能真正掌握这个题目。

即使刷过了很多的题目,也不能保证面试中遇到的题目都可以轻易的解出来,而且面试都是手写代码,没有办法使用 IDE 的提示,因此在面试之前,一定要熟练掌握自己常用的语言的语法。

此环节一般分为两步:

  1. 确认解题思路:这一步可以与面试官沟通,确认自己的思路是否正确,同时确认一些边界条件等等。面试官可能也会隐藏一些关键信息,比如特殊值处理、边界等等,这个过程其实就是期望候选人可以跟自己多进行沟通,当然也是因人而异,至少我个人还是很喜欢跟面试官或者候选人交流的
  2. 写代码:在确认了思路后,开始进行代码的编写。这一步要求尽量符合 《代码整洁之道》 中的要求,注意变量的命名等等,尽量写出简洁、易读的代码。在写代码的过程中,面试官可能会提出一些问题,比如代码的复杂度、边界条件等等,这个过程也是考察候选人的代码能力的过程

有时候通过前面的内容,面试官可能对候选人的能力已经有了一定的了解,会根据候选人的能力找一些难度适当的问题。一些企业也有官方的题库,大家可以根据网上的面经,查看下通常都会问哪些问题。

如果有同学想去外企,那么一定要着重训练刷题的环节,外企机会每一轮面试都会有算法题,而且难度会比较大。

至于为什么说这是我最喜欢的环节,因为面试要写面试评价,作为面试官,在校招时期一天要持续的面很多人,期间几乎没有间隔。而候选人做一道题大概需要十到十五分钟,那么这个时间刚好用来写面试评价......

5. 系统设计

校园招聘很少单独问系统设计的,这部分的内容主要是针对有一定工作经验的候选人。当然本站也会推出一些 系统设计 的内容,了解一些系统设计的原理,看看一些大厂的架构设计,对于和学习都有很大的帮助,还可以复刻一些大厂的系统设计的题目,作为自己的个人项目。

6. 提问环节

如果面试还有时间,我也会问候选人有什么问题要问我的。

通常这一环节被认为是考察候选人的沟通交流能力,是否积极等等,也确实有很多的面试官会在意这些内容,所以尽量展示出自己积极、勤学的一面。

也有面试官会在意候选人是否有了解公司的情况,一些公司,尤其是外企,很注重候选人与企业文化的匹配程度,也建议提前了解下。

作为面试官的一些话

我认为一个好的面试官,除了要考察候选人是否匹配公司的要求之外,更多的是发现候选的闪光之处。可能有的候选人代码能力不是特别的强,但是又很多的想法,我依然会给通过。

我曾经实际遇到过一位候选人,经历十分有趣。大学期间联系了国外学校的老师,自己争取到了交换的机会,并且顺利完成了交换的项目。虽然那位候选人的技术栈与我们的要求不是特别的匹配,但是我依然给了他 Offer,因为他在面试过程中所表现出的行动力、主动性打动了我。最后他也顺利入职我们公司,成为了我的同事。

所以,尽量在面试中展现出你积极自信的一面,展示出你的想法,展示出你的行动力,展示出你的与众不同,要相信,总有一个面试官会看到你的闪光之处。