原则与技巧

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

    面试人员应该具备的技能

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

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

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

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

    • position属性常用的取值static、relative以及absolute和它们的基本行为是每个前端都应该掌握的。这包括relative和absolute的定位原点。-fixed旧版本IE不支持,但是一个对技术有热情的工程师也是应该了解的。-有过研究工程师可以知道absolute的containing block计算方式跟正常流不同,当然如果没读过标准的话,表述方式不一定是这样。-对CSS布局有深入研究的工程师会知道position跟display、margin collapse、overflow、float这些特性相互叠加后的行为。
      区分度可以让题目可以适用于入门级到专家级的各种面试者,深度可以保证有深度研究的面试者可以展示他们的才能,覆盖范围可以有效地了解面试者擅长的方向。

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

    考察能力

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

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

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

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

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

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

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

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

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

      面试技巧

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

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

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

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

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

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

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

    • 面试题目: 根据你的等级和职位变化,入门级到专家级:广度↑、深度↑。

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

      参考资料

    • 如何面试前端工程师?

    • FEX面试原则
    • 面试到最后,该反过来问面试官一个问题了
    • 如何准备前端开发的面试
    • 国外程序员是如何准备面试的?