前端工程师手册

原则与技巧

面试方式

一般程序员的面试分为:代码笔试+问答面试。可能有一面,二面,三面以及多面的情况。迁移两轮主要还是技术方面的为主,由浅入深。三四轮的话主要就是hr和boss和你聊待遇和规划了。

代码笔试主要就是考察基本能力,问答主要是对项目以及个人技能的深入了解。

面试人员应该具备的技能

一个优秀的程序员应该具有怎样的技能:

  • 基础扎实
  • 主动思考
  • 爱学习
  • 有深度
  • 有视野

往细致了点说,就是不要停留在使用的层面,多余了解更深层的原理。

关于题目

什么样的面试题是好的?淘宝大神wintercn认为有三点衡量指标:

  • 区分度
  • 深度
  • 覆盖范围

是的,请注意这里并没有使用“难度”这个词,因为这三个指标都与难度有关系。这个题的答案可以分成不同的层级:

  • position属性常用的取值static、relative以及absolute和它们的基本行为是每个前端都应该掌握的。这包括relative和absolute的定位原点。 -fixed旧版本IE不支持,但是一个对技术有热情的工程师也是应该了解的。 -有过研究工程师可以知道absolute的containing block计算方式跟正常流不同,当然如果没读过标准的话,表述方式不一定是这样。 -对CSS布局有深入研究的工程师会知道position跟display、margin collapse、overflow、float这些特性相互叠加后的行为。

区分度可以让题目可以适用于入门级到专家级的各种面试者,深度可以保证有深度研究的面试者可以展示他们的才能,覆盖范围可以有效地了解面试者擅长的方向。

当面试者前面回答的答案足够完美,我就会进行追问,确保问到我开始不懂或者面试者开始不懂为止,这样可以大大延展题目的区分度和深度。

考察能力

面试应该更注重“考察能力”。这个能力应该是:

web前端工程师的竞争力 = web前端知识 + 能力
能力 = 编程能力 + 工程能力 + 架构能力

这其中不包括所谓的学习能力,因为我认为学习能力是通过已有知识来体现的,如果一个具有超强学习能力的人来应聘web前端工程师但是他具有如此强的学习能力却连position这么重要的属性都没学会,那是不是下一步该要求这人附上证明自己没有精神疾病的诊断书?

工程能力和架构能力一般针对层级较高的工程师,所以一般来讲所谓能力考察就是编程能力,然后呢,编程能力一般考查方式就是案例问题,也就是传说中的——“算!法!题!”(当然我曾提到,它们与其说是算法题,不如说是稍微复杂点的小程序,它们之所以看上去不太有用是因为出题的人为了避免理解麻烦剥掉了实际的业务场景,毕竟各个公司的业务都不是一句两句可以讲清楚的)。

关于评判

面试中未必是所有题目全都回答"正确"就一定会通过或者较高评价。面试是面试官和面试者双方"挖掘与展示才能"的过程,参考前面提到的面试过程,全部回答正确的情况很可能是因为面试官不感兴趣懒得追问。

对于面试官而言,基本评判原则就是"我要不要这个人做我的同事?",多数情况下,这个答案会非常清楚。一些题目是充分的,也就是"回答对了说明这个人具有可以依靠的才能",一些题目则是必要的,也就是"回答错了说明这个人无法胜任我们的工作"。

在position一题的评判上,我一般认为能够答对static、relative以及absolute就已经可以达到必要标准。而因为CSS layout可能是面试官最擅长的部分,又考虑到误差,当面试者能回答80%以上的追问,基本就能判定面试者水平远高于主考官,在工作中能够作为CSS方面的专家来依靠。

一些人说"属性可以google搜索"则更离谱,position在CSS布局中是相当基础的知识,对它的行为理解深度实际上代表了一个工程师对于CSS布局系统的理解,这个理解需要长时期的学习,绝对不是可以临时google得来的。正如同考人英语,若是不认识visibility尚可以解释说确实没怎么用过,而不会写英文字母v则说明这个人根本没学过英语。

STAR面试法

这里提到了一种面试原则,叫做STAR面试法.STAR”是SITUATION(背景)、TASK(任务)、ACTION(行动)和RESULT(结果)四个英文单词的首字母组合。

在招聘面试中,仅仅通过应聘者的简历无法全面了解应聘者的知识、经验、技能的掌握程度及其工作风格、性格特点等方面的情况。而使用STAR技巧则可以对应聘者做出全面而客观的评价。

  • 背景(SITUATION): 通过不断提问与工作业绩有关的背景问题,可以全面了解该应聘者取得优秀业绩的前提,从而获知所取得的业绩有多少是与应聘者个人有关,多少是和市场的状况、行业的特点有关。
  • 工作任务(TASK): 每项任务的具体内容是什么样的。通过这些可以了解应聘者的工作经历和经验,以确定他所从事的工作与获得的经验是否适合所空缺的职位。
  • 行动(ACTION): 即了解他是如何完成工作的,都采取了哪些行动,所采取的行动是如何帮助他完成工作的。通过这些,可以进一步了解他的工作方式、思维方式和行为方式。
  • 结果(RESULT): 每项任务在采取了行动之后的结果是什么,是好还是不好,好是因为什么,不好又是因为什么。

面试技巧

基础知识

对基础部分的内容掌握必须牢靠,什么属性什么方法的,都要知道到底是什么。

项目经验

面试过程其实不是一个你问我答的情况,正规一点的面试还是要以你的实际接触为点,扩展开来对你考核。所以在讲项目的时候,你需要展示你自己的亮点,可以说一些装逼的词,但装逼也是得有真材实料的。比如我在项目中使用了WebSocket,那么面试官很可能问你WebSocket是什么,底层原理你知道么?如果你当场傻掉,面试官就会觉得你只是会使用别人的东西,并不在意实现原理,终究是码农。那么事先你就应当去看看WebSocket协议的官方文档(纯英文,看得累死我了!),这样面试官一问你,你能头头是道,会大大加分。再比如,你在项目中使用了模块化,那么你就一定要知道什么是模块化,而不是说你会用模块化工具。其实要求并不高,你只要能很好说清楚什么是AMD规范,什么是CommonJs规范,各自的优缺点是什么就很够了。

记住重要的一点是,一定要把面试官往你熟悉的领域引导,这真的很重要,因为如果你不引导,面试官不了解你的项目,看不到你的亮点,就只能一直问技术问题刁难你,人家在大公司待这么久了,还不是轻松碾压你。所以你在引导的同时,时不时提及一些事先准备好的关键词,技术官一问,你一回答,怎么都妥了。

当然,如果有些问题是你可能是真的不会的,但是也不要出现好像是、可能是、我猜之类的词眼(我之前就是这样跪掉的),而是说按照我的理解、给过一点思考时间、我不太懂这个问题需要我从哪个角度解析、我以前遇到类似的问题是怎样这个问题应该也是这样...这样给面试官的印象是,即便你不懂,但是你在全力思考,而且这样会给自己争取很多时间。

hr面谈

有的公司其实技术主管也就决定了你的待遇问题,所以这一环节不一定出现。但是问的几个问题大致可以提前思考一下:

  • 你为什么离职
  • 你为什么选择我们
  • 用几个词描述一下自己
  • 期望的待遇是如何定的
  • 你是如何规划自己的
  • 之前的工作那份对你的成长比较有帮助?(我觉得应该都有帮助)

对公司提问

这一块也是最后的环节,一般会让你问几个问题,我自己会问的有:

  • 如果我入职,我将在什么部门,从事的工作主要是什么
  • 公司的技术团队规模和方向
  • 员工的晋升途径
  • 公司的作息与加班情况,以及补偿情况
  • 公积金是按什么比例缴纳

总结

  • 面试题目: 根据你的等级和职位变化,入门级到专家级:广度↑、深度↑。
  • 题目类型: 技术视野、项目细节、理论知识,算法,开放性题,工作案例。
  • 细节追问: 可以确保问到你开始不懂或面试官开始不懂为止,这样可以大大延展题目的区分度和深度,知道你的实际能力。因为这种关联知识是长时- 期的学习,绝对不是临时记得住的。
  • 态度:回答问题再棒,面试官(可能是你面试职位的直接领导),会考虑我要不要这个人做我的同事?所以态度很重要。(感觉更像是相亲)
  • 机会总是留给有准备的人,每一次都要好好对待
  • 别紧张,说话的时候条理清晰
  • 这次面试我还有哪些需要提高的方面吗?

参考资料