面试主要是短时间内尽可能的认识和了解对方,了解什么呢?技术能力、个人能力、个人潜力以及性格等等,那么这么短的时间,如何才能了解对方呢。
在看本文时,可以从两个角度去看,如果你是要参与面试的,那么好好看看应该如何去被面试,如果你是面试官,那么参考一下有哪些技巧和方法。本文从一个角度,三个面试环节来介绍。
个人介绍
是否有条理,能够按照时间顺序,从前到后介绍自己的公司历程,其次介绍自己的项目历程,能够重点阐述自己核心负责的项目,以及核心产出。
我们来看一下,一般比较优秀的流程:
先说明自己的毕业时间和毕业学校(不管野鸡不野鸡,反正说明一下), 您好,我叫王小明,我在 20XX 年 XX 大学毕业。
按照时间顺序,开始介绍自己经历过的公司,以及简单陈述自己主要的职责和使用的技术栈,比如,刚毕业 201X 年在 XXX 公司做一个后台研发工作,主要使用的技术是 C++,使用 C++ 负责用户模块,核心是处理登录注册以及第三方授权;201X+1年由于技术成长的原因,转到了 XXXB 公司,成为一个前端开发工程师,主要是在研发过程中发现自己更爱前端研发工作,主要是使用 React 技术,负责各类 H5 运营活动开发工作,依此类推。
开始按照重要性介绍自己的项目,比如 H5 运营活动,核心是做了性能优化工作(具体怎么做,做了什么等面试官提问)数据从多少提升到了多少,或者做了什么研发工具,为团队研发效率做了什么提升等等,这部分是核心介绍部分。
上面就是一个过程,建议大家平时也多注重这些方面的整理。
一面技术细节
一面的话建议还是面试一些技能点,比较常用的,不希望大家去面一些比较偏门的点(当然如果要选择非常优秀的,那另说),这部分可以沉淀下来,其次面试题要逐步深入,而不是一个点一个点的过,像考题一样,我举个例子,比如你想考察大家对 JavaScript 基础数据的理解,那么可以这样一步步深入去提问。
JavaScript 基础数据类型有哪些?
你知道 JavaScript 是一个弱类型的,那么类型之间有是如何进行转换的,有哪些场景会自动转换,哪些场景可以强制转换?
说到自动转换的点,你知道 [1, 2, 3] + 1 等于多少,1+ {'test' : '123'}又等于多少?
说到强制类型转换,你知道 parseInt('123a') 是多少吗,以及 parseInt('a123') 呢?其次 parseInt(2, 0),parseInt(2, 1),parseInt(2114, 3)
那么从这个问题,就一步步深入了解这个人的能力到底在哪一层级,再比如一个例子,比如我们希望了解面试者对 GET 和 POST 的理解,那么可以按照下面这个步步来提问。
你知道 HTTP 有哪些请求方法?
那么其中的 GET 和 POST 场景应用有哪些区别呢?
说到两者的请求方式是否可以缓存这点知识,你知道缓存有几种方式吗?
POST 是向服务端发送数据修改请求,这时候其实会涉及到一些鉴权的部分,那么你了解常见的鉴权方式吗?
那么在 cookie/session 鉴权方式常见的问题就是 CSRF ,你知道 CSRF 吗,有什么方法可以来防御这类问题?
同样也是一步步深入去问,最终的效果就是你可以知道这个人了解的技术程度如何。这就是一面所要问的一些问题,那么接下来我们看看二面到底应该面什么。
二面项目细节
面试过程中前后一定要注意不要重复的问对方问题,避免人家觉得你们不专业,因此二面着重应该去考察面试者的项目细节,这时候要根据一面的反馈来设计面试题,比如这就是一个普通能力的研发人员,那么我们定级可能就不会高,如果这是一个能力较强,技术较好的,那么我们定位就是一个高级开发之类的,然后尝试往架构师方面去面试。
这里我们同样举一些例子,比如面试者说到了自己做过一个 IM 在线聊天工具,那么我们就可以这样一步步去问。
首先你介绍下这个项目核心实现部分。主要看下面试者是否熟悉这个项目,并且在项目实践过程中是否了解整体的项目实现,而不是单单关注自己那一部分的实现工作。
那么在这个项目中,你有参考过其他开源或者别人的设计思想吗?主要考察面试者在技术应用之前是否有做过技术选型的考虑,并且有对比分析,如果没有那么说明面试者还是比较局限在自己视野之内,如果做过技术选型,能够对比出优缺点,那么是非常不错的。
接下来就抓住 IM 在线聊天工具的一些问题来看看面试者是否真正的做过这个项目,并且掌握细节实现,比如 IM 中有一个离线消息的实现,一种情况是我们在打开系统界面时,由于消息太多可能导致你的界面一直在跳动,你们时如何来优化这个过程的,其次在聊天对话框离线消息多,同样会导致界面的一些问题。
接下来就是问一些优化方面的事情,比如为了用户体验,你们做了哪些优化尝试,有没有数据支撑和效果支撑。
如果让你重新设计这个架构,你觉得在哪些方面应该得到重视,这主要是考察面试者是否有一定的反思和总结能力。
这个过程就是循序渐进,一步步的了解面试者的理解程度和个人能力,每一个过程都是一个台阶,能力好的能够走到第五步,能力差的也许第一步或者第二步就没有继续的空间了。
其次在这部分可以根据面试者的简历,针对性的设计一些实践题目,比如让面试者现场思考,为了用户最好的体验,你如何去设计一个音乐详情页面,或者说为了用户体验你如何去设计一个像淘X、拼X那样的商品详情页面。
在这部分面试官要好好的阅读面试者的简历,一定要从技术实现细节、设计模式、架构设计、性能优化、服务安全等多个方面去面试,一定不要只是简单问技术点,因为第一面已经问过,这里往往就是结合项目来问。
三面个人潜力
三面的话主要是个人潜力以及压力面试,主要是挖掘出是否符合团队文化、个人学习、总结、沉淀以及承压能力。到这里其实技术面试的部分可以适当减少。这部分很重要,作为三面的面试官应该注重团队缺乏的人才,比如下面:
缺乏的是研发人员,那么我们尽量是要人稳定,能够留在这里就可以了,但是一定需要沟通能力较好,态度较好,并且符合团队文化的人才,所以这时候我们要从这三个方面去考察。
缺乏的是技术人员,那么我们就需要面试者要有一定的技术追求,这时候就需要考察面试者是否有做过技术工具、有没有去挖掘过团队目前的技术问题、技术学习沉淀和总结能力等等。
缺乏的是一些领导者,那么这时候就需要面试者是否有自我思考、自我约束等等的综合能力,其次是否有管理带团队经验。
缺乏的是团队气氛活跃的,那么就是看面试者的沟通技巧以及态度方式。
既然讲了那么多,我们来看一些实际的面试问题。
沟通能力,你在做 XX 项目时,应该会存在前后端协议矛盾的时候,你是如何来处理这个过程的,举个例子,假设有一个逻辑,后台说是交互展示问题,应该前端处理,而你作为前端觉得这是一个后端逻辑问题,应该在后台处理,你会怎么做?
态度问题,假设有一个功能,很重要,你已经提前知道了这个潜在的问题,并且已经提前告诉了产品,并告诉了严重性,而产品并没有在意,上线前被领导看到了这个问题,并且严厉指责你,你会如何处理这个事情。
技术追求,团队中你做过哪些研发效率优化的工具吗,比如自动化测试、比如引入一些效率优化的工具、比如优化 webpack 打包时间,你是如何去优化的,为什么只有你来了才这样做。
承压能力,你对现有团队的研发团队有什么吐槽的地方,有和领导沟通吗,既然没有沟通结果,会不会觉得是自己视野不够,那为什么你觉得自己视野是对的呢,我们都知道盲人摸象的道理,你是如何来印证自己的想法是对的呢?既然你印证了,为什么不把印证的过程告诉你领导呢?你都这么不满你领导了,为什么还要在哪里待了那么久呢?
团队协调,在项目中,我们很多同学的代码都不规范,这时候大家会想到我们要出一套代码规范出来约束大家,但是这种事情推广应用起来,其实阻力很大,很多同学都觉得这样影响了自己的研发效率了,反而导致时间成本更高。这明明是一个好的事情,但是各方面来看,阻力非常大,你可以如何来推动这个事情。
团队氛围,假设两位同学为了某个事情争执不下,你要怎么去协调这个事情,我举个例子,就是在争执一个需求是快速实现,还是按照最好的方式去实现。
当然了,我举的例子只是部分,其他的还有很多。反正三面的东西更多的是看你团队需要什么人才,并且这个人是否满足,或者说这个人面试完以后你适合把这个人定位在哪个模块哪个方向。
总结
这就是整个面试的一些技巧,通过这篇文章,希望能给大家一些引导,避免一些无效的面试。我也参与过很多面试与被面试,体验有好有坏,但是经过这么长时间后,我自己最大的感受就是给面试者最好的体验,认真的对待每一个面试,认真阅读简历,针对简历上的信息来定制一些面试题。切莫照本宣科,按部就班,这样去面试,那样双方的效果都不是很好。