写给前端应届生的面试总结

我是一名 2021 届本科生,未来的方向是互联网前端开发。从 2019 年年底开始,我陆陆续续参加了 5 家公司的近 30 场面试,并最终与阿里巴巴签约。

虽然我经历的面试次数不算太多,但是足够让我形成一定的面试经验。在这篇文章中,我会将这些经验沉淀下来,总结出我认为适用于大部分同学的方法。

在这篇文章中,我将围绕以下的几块阐述:

  • 提升简历亮点
  • 复习整理已有知识
  • 项目经验
  • 调整面试心态

提升简历亮点

很多互联网企业的招聘者每年需要面对成千上万的应届生简历,在如此繁重的工作下他们往往会比较疲惫,因此如果简历写得枯燥乏味或泛泛而谈,即使自身素养和技术实力都比较强,也很有可能无济于事。因此,我们必须思考如何使我们的简历在众多简历中脱颖而出。我在编写简历时请教过的一些学长和几位面试官,他们对我的简历提供了一些建议,我十分受用:

养成良好的简历排版习惯

  • 中文和英文之间、数字两端需要有空格
  • 英文标点之后需要空格,标点之前禁止空格
  • 每行最好不要超过 48 个汉字或单词
  • 英文名称需要规范大小写

例子:
Not Good:
基于typeScript+react+ant-design 设计并开发前端
Good:
基于 TypeScript + React + Ant Design 设计并开发前端

尽量列举自己熟悉的内容

在面试过程中,面试官很有可能会从简历中提取出可以问的问题,例如:

  • 我看见你的简历里写了 Koa 相关的经验,你能说一说 Koa 中的请求是如何经过中间件最后生成响应的吗?
  • 我看见你的简历里提到了 Umi,它和传统的 React 开发模式有什么不同吗?
  • 你既然说有 React Native 项目经验,可以简单说说它的工作原理吗?

项目经历同理。

如果面试官「满怀期待」地提了一个简历中我们并不熟悉的知识点,如果回答地不是特别好,或者磕磕巴巴的,那很有可能变成这场面试的减分项。

因此在编写简历时,要时刻注意写进简历的内容可能会被面试官提哪些问题,对于这些问题我们是否胸有成竹。个人建议写进简历的内容必须是自己非常熟悉的领域和知识点,对于项目经历,也应该着重写自己最近或者最熟悉的项目;对于其他内容,如果以增加简历丰富程度为目的,可以尽量粗略描写

避免废话和不合理用词

能用简洁的语言表达就尽量用,不建议为了增加篇幅而将一个简单的表达变得十分复杂。建议每一条字数限制在 30 个汉字或单词以内。

至于简历中对于某项技术或语言的掌握程度,可以划分为以下几个级别:

  1. 了解:理解基本概念,有过简单的使用经验(稍微用过)
  2. 熟悉/掌握:基本操作了然于胸,并且拥有大量的使用经验(经常用)
  3. 精通:了解并深入理解底层原理以及实现,甚至是其本身的贡献者(深究过)

一般来说,应届生的简历中建议避免「精通」一类的词,因为应届生接触的技术领域较为浅显,可能仅有一些简单的使用经验,因此在简历中使用「了解」和「熟悉/掌握」就已经可以了。但是不排除有个别优秀的同学确实在某一领域研究比较深入,例如:向 Linux 内核提交过 Patch、向 DefinitelyTyped 提交过 TS 声明包等等

合理使用数据

我们在编写项目经验时,如果一直重复使用生硬的「用了 XXX 技术」、「使用 XXX 框架」等短语,同样会使简历变得枯燥乏味,如果可以引入一些数据,例如持续 X 个月为 XXXX 人提供了稳定的服务、在上线的第一天就获得了 XXX UV/PV 的访问量、通过 XXX 使得 XXX 秒的加载时间缩短到了 XXX 毫秒等等。

在不夸大数据的前提下使用具体数据,可以快速使面试官了解到这个项目的复杂度和难度,但是要确保能回答出数据是如何计算的、如何达到数据描述的效果

复习整理已有知识

我们在平常的学习工作中积累了大量的知识和经验,但是一旦到了面试的时候很可能就会发现这些问题:

明明平时都知道的知识点,甚至面试之后立马就想起来了,可是面试时就是卡壳了
这些知识点都知道的,但是没想到会连在一起问,之前怎么没想到可以这样思考呢

出现上述的问题,就说明知识的积累已经足够丰富了,但是还没有形成一个完整的知识体系(或知识树)。对于平时缺乏整理知识意识和习惯的同学来说,这样的问题尤为明显。因此我建议在投递简历之前,我们可以先梳理自己的知识,构建一棵完整的知识树。

为了高效地完成知识体系的巩固,我建议使用项目管理的方法管理自己的复习计划。我推荐 Notion、Teambition 等支持看板功能的协作软件,以 Notion 为例:

选择 Templates -> Production management -> Roadmap

编辑 Status,添加未开始、进行中、已完成、复习中、已掌握:

Xnip2021-03-07_11-57-28

按照同样的方法,可以在 Type 字段中指定知识点的类型,例如:语言基础、语法特性应用、算法、数据结构、操作系统、计算机网络等等。此外,还可以指定完成的时间段,并增加 Calendar、List、Timeline 等模式以更全面地了解学习进度:

Xnip2021-03-07_12-01-39

对于梳理知识,我建议可以边学边写,记录在某个平台上,便于随时巩固复习。我最初选择的是幕布,后来迁移到了语雀上。关于如何记录自己学习过程中的知识点和收获,我采用的是类似于幕布的格式:

Xnip2021-03-07_12-08-44

它的好处是非常结构化,简洁直白,也可以转换成思维导图形式。建议在整理知识点时,不要大量复制博客上的文字,尽量自己理解,然后把自己对它的理解写下来。例子:

Xnip2021-03-07_12-10-26

项目经验与表达

虽然互联网企业对于应届生的项目经验和工程能力一般不太高,但是如果自己有一个或者多个完整的项目经验,在简历筛选和面试时是一个非常耀眼的亮点。

一般来说,面试官和招聘者比较喜欢大部分都是自己完成的项目,如果项目在某些代码托管平台开源、甚至是上线到生产环境或以包的形式发布(NPM、PIP、Dart 等),效果会更好。

积累经验

建议在复习知识的同时多积累一点项目经验,对于以前有过丰富经验的同学,在准备面试前仅需对自己的项目进行复盘,着重于项目的难点以及解决这些难点的思路;对于之前没有项目经验的同学,可以在这段时间自己完成一到两个比较复杂的项目,建议自己思考产品的点子、设计数据库、编写前后端,最后上线,并在上线后期不断优化、重构代码,在这个过程中同样需要注意自己在做项目的过程中遇到的难题,以及解决难题的过程和思路。

在我看来,一个拿得出手的项目需要满足以下条件:

  • 大部分自己独立完成
  • 良好的项目组织和架构设计
    • 良好的封装性、复用性
    • 合理的工程化、自动化接入
    • 良好的代码规范和命名规范
  • 完善的工作流
    • 开发
    • 测试
    • 部署
    • 维护
  • 项目部署至互联网可访问的生产环境
  • 足够优越的性能
    • 首开速度
    • 缓存策略
    • SEO 优化
    • 接口安全性
  • 精致的 UI
  • 开源、并通过项目产出一些相关的技术文章

对于在面试时如何介绍这个项目,我的方法是锻炼自己如何只用一句话就能让对方明白这个项目的意义

如何回答项目经验类的问题

面试官在针对项目经验提问时,最常见的问题就是上面提到的「在做项目的过程中有没有遇到什么难点,是怎么解决的」。遇到此类问题,首先要明白什么是难点。

所谓的难点,真的要特别难吗?

在我看来,难点并不完全是真正意义上的难点,仔细想想,在做项目的时候有多少机会碰到困难到需要对 JS、React 等的底层做 Hack 才能实现呢?这种情况肯定是非常少的。

我们在做项目中遇到的绝大多数可以称之为难点的情况,基本上都是有时间和场景局限性的,也就是说可能这个问题对于做项目时的你来说,由于知识点掌握程度、工程思维理解程度的限制,使当时的你感到了推进非常困难,但是对于现在的你来说也许不是问题了。

关于这个问题,可以查看这个知乎回答,当年我就是看完这个回答才豁然开朗的。回答下的评论区也非常精彩,可以多看一看。

当面试官在问难点时,他们究竟希望得到什么样的答案

对于面试官来说,他们问你项目难点,其实不是来听你这个项目难点有多难,用了多牛逼的解决方法,而是这样一个路径:

  1. 问题产生的背景:考察对项目的熟悉程度和问题原因的合理性
  2. 问题解决的思路:这其中思考过多少种可以达到目的的解决方案,以及为什么最终采用了这种解决方案,和其他方案比起来有什么优势
  3. 得到了什么结果:解决了还是没解决
  4. 通过解决问题获得的成长和收获:有什么沉淀、如何避免以后再次出现相同的问题

我们在回答此类问题时,很容易将自己的思维带入到当时做项目的情境中,而面试官由于没有亲身经历过你的项目,往往会无法跟上你,或者说无法在某些方面产生共鸣。因此,在回答时,我们需要熟练运用演讲技巧使对方可以快速且清晰的明白我们所回答的内容。

掌握演讲技巧

据我观察,我身边很多同学在描述一件事时总是说得非常凌乱而且没有逻辑(包括我),这是因为这部分人很少锻炼或者完全忽略了如何清晰地「讲故事」,能让听众快速了解故事的上下文。在做演讲时,常用的几种演讲法则有:黄金圈法则、2W1H 和 STAR,这些演讲法则的具体使用方法可以自行 Google。

在面试时,最常见的应该是 STAR 法则,它包括:

  • S:Situation,即遇到问题的背景,最好要一句话概括
  • T:Target,即对于这个问题,需要达到什么样的目标才算解决了
  • A:Action,当时采取的行动(最好能阐述自己寻找解决方案时的心路历程,并在最后说明采用该解决方案和其他相比有什么优势)
  • R:Result,即难题的解决结果(首先必须先说明问题解决了还是没解决,再阐述自己通过这个问题吸取了什么教训、学到了哪些新知识、有什么总结、以后如何避免等等)

这里结合上面的问题,使用我曾经在某次面试时使用的回答来举例子:

我曾经做过一个项目,前端是我一个人完成的。

S:[这个项目迭代非常频繁,每次我构建完项目后都要手动把生成的资源部署上线,中间这段时间完全就没有利用上,而且每次都要执行相同的命令,也十分机械化]。

T:[我很希望能让这个过程自动化,而不需要每次都值守发布]。

A:[经过一番查找资料,我发现有一种工具可以帮助我自动地完成构建、发布和部署的操作,叫做持续集成/持续部署(CI/CD)系统,然后我尝试了 XX 系统,并通过配置让它能与 GitHub 联动]。

R:[现在,我每推送一次更新到 Git 仓库的 master 分支,都能通过钩子自动触发 XX 系统的构建流程,构建完成后自动执行部署命令,极大的减少了人力投入。后来,我专门为此写了一篇比较详细的文章用于帮助那些也想达到相同目的的人]。

面试官在听这个「故事」的时候就能获得非常清晰的思路,而且最后还发现我对这个事情做了总结和沉淀,就会认为我解决问题的思路比较清晰,而且还有总结经验的习惯,那么这样一来,印象分自然而然就不低了。

此外,我还建议观看乔布斯在苹果发布会时做的一些演讲和 TED,对于提升表述能力有一定的帮助。

调整面试心态

有些同学在与面试官交谈时往往会非常紧张,这是正常的。但有部分同学会因为之前面试的失利而更加紧张,最后导致心态崩坏的情况。其实这种情况时必须要克服的。

可以把每次面试当作自己查漏补缺的机会,对于面试中没有答上来的问题,要思考为什么没有回答上来,是因为不知道这个知识点还是因为太紧张所以导致卡壳。每次面试完成后都需要及时复盘,总结经验教训,再将疏漏的知识点在自己构建的知识树上重点标记,然后反复拿出来复习,从而巩固欠缺的部分。

此外,互联网公司的面试官大部分还是非常 Nice 的,一般不会故意刁难你,因此完全没有必要过度担心,面试前可以深呼吸几次缓解紧张情绪。在面试时,把面试官当成同事、朋友,就像两个热爱技术的人在聊天一样,因为面试本身就是一个相互学习的过程,而不是一方质问一方回答的过程。在面试时面试官可能会从你身上学习经验,也可能会把自己的经验传授给你。

保持轻松的心态,不要让自己过度紧张,往往会得到更出乎意料的结果。

最后放一些资料

  1. 是针对前端的知识点复习计划和总结,内容比较全:https://bitable.feishu.cn/app8Ok6k9qafpMkgyRbfgxeEnet?from=logout&table=tblEnSV2PNAajtWE&view=vew5uodacp
  2. 我去年梳理的知识点大纲:https://www.yuque.com/docs/share/7044651a-ec98-41da-94d3-1744a4f571a3?# 《知识结构》(密码:apf2)