聊聊前端面试

33,082 阅读18分钟

最近 Zoom 国内又开放招聘了,我们组有了前端的 HC,所以我也参加了几场面试。合肥整体的前端氛围很一般,厉害的人比较少,来参加面试的偏初阶的比较多,不过我们面试也不卷,很少出一些复杂的算法题,面试难度并不高。我们对候选人的要求也没有那么高,基本上你能达到 p6 的水平,就能通过我的面试。当然,如果你是工作年限较久(六年以上)的老玩家,我对你的期望和要求也会相应的提高。

在面试的过程中我也发现了很多问题,因此作为一个 9 年工作经验和 7 年面试经验的老兵,我想分享一些经验给你,希望看完后对你有所帮助。

面试的目的

先想想看,为啥要面试?

首先,面试是一个双向选择的过程,在这个过程中,面试官通过一些提问和交流来判断候选人是否合适这个工作岗位,他是一个怎样的人,你未来想不想和他一同共事;那么候选人也可以通过面试的过程来感受到面试官是否专业,是否是自己心仪的公司或者是团队。

其次,对于候选人来说,面试的过程也可以发现自己的不足之处,通过一些专业性的技术交流可以了解自己对于某些知识点的理解和掌握的情况,以便之后查漏补缺。此外,通过对自己经历和项目的描述,也可以锻炼自己的表达和沟通的能力,如果在面试中发现自己并没有发挥好,那么则可以加强这方面的练习。

最后,对于用人单位来说,面试除了帮助自己招到合适靠谱的人才之外,也是竖立自己公司形象的机会,对于整个面试流程安排够不够专业,面试官的资历够不够深,能不能让候选人有个不错的面试体验,都多多少少会影响公司在业内的口碑。因此,很多大厂都会对面试官的级别要求比较高,并会给予一定的面试培训(我在百度的时候就有幸被培训过)。

写给候选人

对于候选人,我主要想从简历和面试准备这两个方面给你一些指导。

简历

写简历的目的,就是让面试官和 HR 能从几页纸中对你的过往经历有个大致的认识。首先,你得保证简历的真实性,不能有半点造假,因为这涉及到一个人的诚信问题。有些人为了让自己简历能被筛选通过,在学历和工作经历上作假,有些人为了让自己能多谈一点薪资在流水上作假。对于知名企业,对这些造假行为是零容忍的,因为很多企业都会对候选人做专业的背调,一旦查出来有作假行为,不仅 offer 没了,也可能会有永不录用的风险。

那么有些人可能会问:我学历不行,又没啥工作经验,不造假,简历都通不过呀。

不好意思,如果你的资历不够,那么你暂时就是进不了一些名企,可以先进一些小公司锻炼,然后有一定工作经验,且技术能力提升后,再考虑进大厂。你可以想想看,为啥一些优秀的本科生和硕士生一毕业就进入了名企,那是别人寒窗数十年努力学习换来的,所以后面路自然就好走一些。如果你年轻时候因为不懂事或者一些不可抗力因素而荒废了学业,那么起点低也是正常的,但是这样并不影响你未来通过努力学习和奋斗改变命运。

名企的 HR 对候选人的背景要求高,也是从一个概率学的角度来考虑的,毕竟,好的学校和工作背景意味着更好的学习能力和工作能力,这样的候选人符合岗位要求的概率自然就更高。

对于在小公司工作的人,进入大厂也并不是不可能,但是你可能要花费比一般人更多的努力去学习,那些学历背景不好最后也成为大佬的人,付出的努力,背后的辛酸,可能只有他们自己知道。

另外,通过大厂外包转正,或者结识圈内好友内推大厂,都会多一份成功的机会。 回到简历本身,除了真实性,第二个要点就是要突出重点。简历并不是记流水账,你不需要把之前所有过往的工作经历都写在简历上,面试官也没时间看。建议你给每段工作经历中挑出一两个重点的项目,详细去写项目的技术重点和难点,以及你在其中负责的角色,做的事情。

对于技能这块,也是要突出你擅长的技术栈,弱化甚至不用去写一些你不熟悉的技术栈。有些人在技能方面就是在罗列一些技术名词,这样毫无意义,一旦面试官去问其中一些技术点,而你又不能很好的回答,是非常减分的。

读到这里,可能有些人会说,我之前待的都是一些小公司,业务简单,项目都不难,没啥可写的。但你有没有想过,你每天的开发工作,有没有痛点或者不爽的地方?比如经常通过 CV 大法拷贝代码, 你有想过抽离和复用这些模块吗?公共 JS 模块的共享,你是通过拷贝代码,还是自己搭一个 NPM 私服?所有项目都放在一个 repo 下,编译打包速度慢,有没有想过拆成 multiple repo 或者是 mono repo?开发上线流程不规范,有没有想过参考一些业内成熟的方案搭建一套 CI/CD 方案呢?使用一些开源库遇到问题,你是去百度或者等着别人去解决,还是自己研究源码然后去提个 PR 呢?

再举一个正面的例子,多年前在知乎上,我看到一个在小公司做小程序的哥们,因为小程序的审核特别慢,而且也不允许动态加载和通过 new Function 或者 eval 的方式运行 JS 脚本,他就想到一个法子,大致就是通过把 JS 脚本当做数据来下载,然后通过 JS 实现的 JavaScript 解释器去动态跑这些代码。虽然这种方式对开发来说可能不够优雅,但也解决了他大部分的需求,另外这种爱折腾技术的精神,大厂能不爱吗?

除了突出重点之外,简历还需要有亮点。近几年选择做程序员的人越来越多,竞争越来越激烈,那么如何让你的简历脱颖而出,就需要你在简历中有一些亮点了。

那么什么算亮点呢,对于应届生来说,比如优秀的学历背景、名企实习经历、竞赛获奖,知名期刊发表过论文等等。对于有工作经验的人来说,比如名企的工作经历,有技术博客(有一定高质量的博文),做过知名的开源项目或者参与知名开源项目的共建,写过书等等。

当然,亮点只是加分项,它不能决定你是否能通过面试,但至少从简历上看,面试官会对你多一分兴趣。 不过你要记住,如果没有亮点,那就不要写了,比如我看过一些候选人的博客,内容简单,而且从时间上来看都是近期的写作,有非常大的专门为面试而准备的嫌疑;还有一部分的候选人贴的 GitHub 地址,点进去后空空如也,这些反而是减分项。

最后,简历上不要写一些偏主观的话,比如“我对技术感兴趣”,你对技术感不感兴趣,从你有没有写过技术博客,有没有参与过开源项目,或者翻译过一些国外技术文章等等一些事情就可以看出来。

面试准备

那么,一旦你的简历通过了筛选,进入到面试阶段,你需要做哪些准备呢?

首先,技术面主要是考察的就是技术能力,面试官对候选人的技术评价,通常会从基础知识、知识深度、知识广度三个方面来考察。在我看来,知识点主要是靠平时工作和学习的积累,你需要构建自己的知识体系,把这些知识点都牢记在自己的脑海中,那么面试的时候自然就可以和面试官谈笑风生。 前端的知识点多而杂,有些人会在面试前几天找一些常见的面试题来看,但是前端知识点那么多,短时间想搞透是很难的。所以我的建议是要把学习融入到平时,如果是你工作中遇到的技术,那么你必须要深刻理解其背后的本质,并做一些延伸学习。除工作之外,你也可以找一些和工作相关但可能暂时没有用到的技术学习,我公众号里推过很多课程,大部分课程都是非常值得学习的,我自己也做了几门 Vue.js 的课程,如果有条件,跟着名师学习要比自己踩坑效率高的多,一旦学进去了,投入产出比也是非常高的。

不要跟我说平时工作太忙没时间学习,那都是借口,即使你晚上加班到 12 点,你有没有想过你的有效工作时间是多少,中间有没有聊天、刷抖音、头条、微博,你的工作效率是怎样的,多少时间是在开发,多少时间是在改 bug,多少时间在开低效会议。

如果有心学习,每天抽两个小时不成问题,如果你真的每天 12 小时满负荷工作,那么你应该换个工作了,注意自己的身体吧。

我是反对刷面试题的,即使你在刷题,那你也不应该去背他们,而是查漏补缺,前端知识点很多,有些你没接触过的,不会也没有关系,但是你会的,你一定要把它们很好地表述出来。

为什么背题没有用,举个例子,“从输入 URL 到页面渲染中间发生什么” 这是一个老生常谈的问题,有些候选人回答这个问题感觉一看就是准备过的,但是一细问都会露馅,比如 TCP 的三次握手,每次发了回了什么样的包?浏览器解析文档过程中,遇到外链的 JS,会不会阻塞渲染,遇到外链的 CSS,会不会阻塞渲染,如果阻塞了,原因是什么,如果没阻塞,原因又是什么?一道题的背后,往往蕴含着非常多的知识点,如果你知识走马观花似地只背大致流程,意义并不是很大。

有些人可能会说,这道题细节太多了,我不可能都会啊。确实是很多,我也并不要求你全部掌握,我想表达的是,你可以从这道题背后,延伸学习很多基础知识。如果你不了解其背后深层次的原理,你去做性能优化基本都是无从下手。但是,如果你掌握的细节越多,就能说明你的知识储备很丰富,有些时候会让面试官眼前一亮。

其次,面试过程中面试官通常会问你简历中的项目的技术难点,技术挑战,你在其中的角色,以及怎么去解决其中遇到的问题的。这块是可以好好准备一下的,因为这里面不仅能体现出你的技术能力和思考能力,还能体现出你的表达能力。因此,平时多做技术分享,有机会参与一些述职演讲都能很好地帮助你提升这方面的能力。

另外,听说现在很多大厂内卷严重,面试喜欢问算法题,那么要不要突击刷算法题呢?

在我看来,算法题的学习也是平时工作积累下来的,比如背包问题、图和树的遍历、贪心算法,在工作中我都接触并实践过,那么自然对它们的理解更加深刻。

如果你确实工作中接触不到什么算法题,但你对算法感兴趣,可以抽点时间去学习一些常见的数据结构和算法。除此之外,你也可以去看一些源码,也能学习到一些常规算法的实现。在我看来,代码看的多了,写的多了,自然可以接触到算法相关的知识。

当然,面试官出算法题的目的也不是要考倒你,通常这只是一个加分项,主要考察你的思维能力,如果面试中真的遇到一些算法题卡壳了,你也不要放弃,至少要说一些你的思路,完全放弃是下下策。

要记住,面试是一个平等的过程,作为候选人就是要尽量把自己的能力和优势展示给面试官,尤其是一些匹配岗位需求的技能,可以 show 出来。不要觉得自己是来找工作的就显得唯唯诺诺的,要自信一些(但不能狂),这也能给面试官留个好印象。

最后,面试前也要对你面的公司和团队有个大致的了解,如果这个团队还做过一些对外输出的事情,比如有开源项目或者是技术博客,可以重点关注一下,在面试的时候也可以聊一聊,因为人都是有虚荣心的,有些面试官发现自己团队做的事情被人关注了,自然会很高兴,对你的印象也会更好。

通常面试最后面试官会问你有什么问题需要提问的,千万不要傻傻的去问对方对自己面试的评价如何,如果你对团队感兴趣,可以问一下团队的技术栈,所做的事情,团队的人员情况,技术氛围等等,也可以问问如果自己有幸进入这个团队,大致要负责哪方面的事情。如果能明显感觉自己这次面试失败了,也可以虚心请教面试官自己有哪些不足,或许能找到自己未来努力的方向。

写给面试官

对于面试官,我想说面试官有些时候代表的是一个公司的门面。面试官的专业能力是要相当过硬的,因为他需要从各个方面考察候选人的技术能力和综合素质是否达到自己的用人标准。

我在百度的时候面试官最低级别都是 T5(相当于阿里的 p6)起步,而且会接受专业的培训,并且通常面试官要和候选人平级或者是更高的级别,否则可能会因为段位不够不能够充分考察出应有的能力而不能做出相对客观的面试评价。 有些公司不知道出于什么考虑派一些段位较低的面试官出站,有些时候还会闹出一些不愉快的事情让公司的口碑和形象受损。在我看来,招聘还是一件很严肃的事情,因为你招来的人未来是要和你一起共事的,所以一定要非常重视。 那么,作为面试官,你应该如何面试呢?

对于前端茫茫多的知识点,想短时间内都考察一遍不现实,而且面试官也很忙,有些时候面试占据了太多的工作时间。所以我的经验是出一套难度适中的笔试题,HTML、CSS、JS、广度、编程、算法题都有涉及,然后对于工作五年之内,预期是 p6 及以下的候选人,先让他们做题。然后根据笔试的结果,就能够筛掉一批不合适的候选人。

那么笔试题通过了,面试的时候就可以针对笔试题的知识点,做一些深入的提问,通常问到对方不会或者你不会为止,这样就可以充分考察候选人对某个知识点的掌握程度。

除了笔试题的部分,剩下的面试我建议是针对候选人简历中提到的技术深入提问,而不要问他不了解的技术,举个例子:如果对方是一个 React 玩家,即使你团队的技术栈是 Vue,我也不建议你去问他 Vue 的问题,因为毫无意义,不过你倒是可以问他 React 和 Vue 相比,他们的优劣在哪里,这样可以考察他对技术有没有做一些深入的思考。

候选人简历中没提到的技术,但是你招聘的需求中有的,你可以问,如果候选人有了解那么你可以继续深问,如果候选人不是很了解,那么就没有必要继续问了。有些经验浅的面试官会就一些他非常熟悉的领域,或者是最近研究的一些技术疯狂提问,即使候选人已经表示这方面研究不多,这种面试体验想想都觉得很差。

当然,如果说你问了很多招聘要求的技术候选人都不会,那么说明候选人并不适合你们岗位,通常从简历筛选阶段就能筛掉这部分人。

要记住,你面试的目的不是为了考倒候选人,也不是为了炫技,你要做的是考察候选人的技术能力、学习能力、潜力等等综合能力,所以应该多让他有机会展示自己的能力,从他对技术或者是项目的描述中深挖一些更深层次点去提问,或者是从你的经验上去判断他的做法可能会存在的问题,然后再去问他有没有解决,如果没有的话,不妨问他有没有思路啥的。所以,这就要求面试官本身有一定的段位。

我在知乎看到某个资历较浅的面试官面了一些工作多年的候选人一些基础的 JavaScript 问题,因为对方没有回答出来而在知乎上挂出来,言语中充满着嘲讽的意味。我觉得大可不必这样,首先,你有没有去发现候选人其它方面的亮点,有没有给候选人充分的机会展示自己的能力,如果这位候选人真的没有答出基础的问题,确实有一定问题,但也没必要在公开场合上说,因为面试中存在着信息不对称,如果有一天你去面试别人再问你一个相对基础的问题而你也恰好不会,如果也被挂出来,你的感受又是如何?

你这样做只能说明你的面试非常不专业,对于一个工作经验久的人我不会在乎他还记不记得这些 JavaScript 基础,我对他本身的要求就会很高,我会更多的去问他最近深入研究的技术,或者考察他对于自己过往项目架构设计的理解,也可能会给他一个场景,抛出一些问题,来看看他对这些问题的理解和思考。

所以针对不同的候选人,对应的期望和要求是不一样的,对于工作五年之内的候选人,我更多是看他的干活能力,能不能独当一面。而对于工作更高年限的候选人,除了能干活之外,我还要考察他在专业领域的深度,对于一个较为复杂,涉及多个功能点的业务系统,或者技术难度较高的底层系统,能否做良好的架构拆解并实现。

总结

扯了挺多东西,总结下来,无论你是作为面试官还是候选人,都应该要保持持续学习,因为这俩角色是很容易互换的,在某平台看过一个段子:A 上午作为面试官去面试某个候选人 B,下午去面试遇到上午的 B 作为他的面试官,然后 B 把 A 上午刁难他的一些问题又问了一遍 A,结果 A 也没有很好回答出来。

因此,只有你的专业性足够强,才能让你无论在什么角色,都能够游刃有余,谈笑风生。但是,没有人可以随随便便的成功,那些你眼中看到的一些大佬,背后都付出了很多的努力,所以加油吧~