如何做好技术面试?

在公司承担技术面试的职责,刚开始的时候可能会感到困惑,不知道如何去面试别人,这里总结了一些技术面试的经验,以及一些在面试过程中的一些思考

技术面试应该要问些什么?

技术面试通常是对于候选人的技术能力的评估和相关知识进行评估的面试环节,在技术面试中,面试官通常要评估候选人在以下方面的职责:

  1. 技术基础知识和基础:面试官应该要问技术相关职位相关领域的技术知识问题,以验证其对基本概念、原理和技术的了解程度

  2. 编程能力:面试官要一定程度上考察候选人的编码能力,包括熟练掌握相应的编程语言、数据结构和算法相应的知识,以及解决问题和实现功能的能力

  3. 技术经验:面试官应该要结合候选人简历,沟通项目和工作中涉及的技术栈、开发流程、工具和框架等方面的知识,以评估其实际应用能力和项目经验

  4. 系统设计能力:面试官应该要考察候选人在系统设计和架构方面的能力,包括对系统组件、模块化、拓展性、可靠性和安全性等方面的理解和实践

  5. 问题解决和沟通能力:面试官有时也应该根据候选人的沟通情况,提出一些实际问题或场景,评估候选人解决问题的能力、思维方式和沟通表达能力

  6. 自我学习和技术热情:面试官应该要和候选人沟通学习的知识或者计划,以评估其对技术发展的关注程度,对技术的专注和热情以及对个人成长的追求

  7. 职业发展规则:面试官应该根据情况和候选人沟通职业发展规划以及公司目前和未来能够提供的发展机会

除以上职责,面试中还应该根据涉及到的具体岗位相关的技能和要求,评估其是否能够胜任所应聘的技术角色。

面试如何做

摆正心态

上面的总结只是八股文似的东西,想要做好技术面试,还是要从实践着手,我认为首要也是最重要的就是摆正心态

  • 保持谦逊开放的心态,承认自己知识的有限性,并尊重他人对相同领域的不同经验和理解

  • 学会倾听理解他人的观点和困惑,增强共情能力,并从中汲取更广泛的知识和视野

为什么首先要提摆正心态,从我经历过的一些面试官以及和其他一些人的沟通,很多人在面试的时候都会遇到一些“傲慢”的面试官,这里提的“傲慢”不止是态度上的傲慢,也包括对知识上的傲慢,这些面试官很难给人以良好的面试体验,究其心态原因可能有以下几个

  • 态度傲慢:面试官和候选人之间,潜在着身份的不对等,有的人可能会觉得你需要经过我的考察才能进入公司,由于握有这种权限滋生了态度上的傲慢
  • 知识偏见:往往我们掌握了某个知识或技能后,会产生一种错觉,认为它很简单和容易,难以意识到其他人可能对此感到困难或不熟悉,而且对别人叙述知识掌握过程种所遇到的困难,难以感同身受
  • 认知偏差:往往倾向于寻找和接受与自身观点和知识相符的信息,而忽视与之相抵触的信息。这也很容易造成很难接受与自己认知不符的观点

面试是候选人和公司之间的双向选择,作为面试官或者作为技术面试官,和候选人之间的沟通应该是平等的,无论何种形式的“傲慢”都会引起候选人的不满,也很容易错过优秀的候选人。

目标清晰

技术面试的目的是考察候选人是否能够胜任所招聘的岗位,这个目标一定要明确。从这个目标出发,在面试的过程中要引导出候选人所擅长能力,让候选人在这个领域得到充分的表达,而不是追着候选人不熟悉的领域穷追猛打,最后得出候选人能力不行的结论。

技术面试的首要的是看候选人能力是否和所应聘的岗位能力是否相符,在没有一票否决或者难以接受的缺陷存在的前提下,还是要引导候选人在擅长的领域得到充分的表达,然后评估能力和岗位的适配度。

面试的方法千千万,目标要清晰,一定要引导出候选人的综合能力表达,才能挑选出合适的候选人。

面试实操

如何衡量候选人的技术水平或者说如何询问能最大程度的让候选人表达出自己的技术水平比较考验面试官的能力。

面试套路

如何去面试,每个人都有自己的方法,但是我认为需要注意的是面试时可以使用八股文作为问题,但是不要以八股文的答案去衡量候选人的技术水平。

下面介绍下我在技术面试时的一贯套路:基础能力 -> 场景化的问题 -> 闲聊沟通

自我介绍完成之后,结合简历和候选人的工作经历先以基础知识开始问,逐步的拓展到有具体场景的应用,举个例子,先问多线程应该怎么实现,线程池的核心参数,然后再问具体场景比如代码中有个接口的调用,如何使用多线程优化响应时间,类似场景下线程池的参数应该如何设置,应该考量哪些方面,异步任务失败后如何补偿,答案并不是太重要,是要看候选人的回答思路。

几个技术问题沟通过后,如果觉得候选人技术水平还不错,可以继续往下聊,进入闲聊沟通阶段,可以问问最近在学习哪方面的知识或者在工作中有哪些让自己比较骄傲有成就感的工作分享一下,主要是考量是否在持续学习或者是否有总结复盘的能力,也能进一步的考察以前的工作内容以及负责的工作是否属实。

选择合适的场景

前文也说了引导出候选人比较擅长的能力,让候选人在擅长的领域得到充分的表达是评估候选人能力非常重要的一步,那么如何引导出候选人擅长的能力呢?以下是我的一些总结

首先根据候选人简历中的工作经历,初步分析一下以往工作主要是做2B业务多些还是2C业务多些。

如果是2B业务,场景化的问题应该主要向代码结构、系统模块化、系统拓展性方面延申,比如结合具体的业务场景介绍一下复杂业务场景下的参数校验应该如何做?复杂业务场景下如何划分模块?模块之间如何解耦?设计模式的应用?

候选人如果2C业务多些,场景化的问题应该向分布式、高并发、缓存方向延申,比如缓存一致性的实现,分布式锁的实现以及应用,如何减少接口的响应时间等

当然相关知识也可以穿插着问,在回答没有明显错误的前提下,答案并不重要,实现方案有很多种,重要的是回答的思路。

如果候选人回答的并不是很完善或者还想进一步的对问题进行一些提升,可以根据问题适当的做一些引导,比如如何减少接口的响应时间,大多数都会回答多线程解决,在问完多线程如何实现相关的问题后,可以再问下如果想要发挥整个集群的性能用以提升接口的响应,应该如何做?接着再看候选人的回答。

如何评估能力

面试最终的目的是对候选人能力进行评估,用以确定是否和招聘岗位相符,那么如何根据候选人的面试表现去评估候选人的技术能力呢?首先要有标准,下面是我总结的一些标准,比较笼统,可以作为参考

  • 初级应该能够掌握基础知识以及常见中间件的使用,能够根据业务要求完成系统设计以及实现,对业务分析和系统设计有一定的理解和经验
  • 中级应该熟悉常见中间件的原理,对问题排查有自己的思路,对特定问题域的业务分析和系统设计要有较丰富的经验和自己的理解
  • 高级和资深应该能够对常见的业务场景能够给出自己的解决方案,并保证整个系统的稳定性拓展性,能够协调完成整个系统的统筹工作

有了标准之后就是根据候选人面试表现评估技术水平,按照我的标准其实相对简单,会用初级,会用并知道为什么用中级,用的好高级

举个例子,比如面试的问题:用户个人信息出生日期、身份证号等现在数据库中都是明文存储,由于业务要求现在要求加密后存储,应该如何实现?查询的接口比较多,如果不想每个接口都改动,应该如何实现?

如果候选人能够给出切换方案,比如持久层如何实现,查询的时候如何实现,并且方案具备一定的可行性,那么差不多就是中级水平,如果候选人能够在给出方案的时候,能够结合系统设计给出回滚方案,如果系统出现问题但是数据库部分数据已被加密情况下如何回滚,如何保证业务的正常运行,如果能给出综合的解决方案那么差不多就是高级水平

还是那句话,答案并不重要,重要的是回答问题过程中的思路。比如上面的这个问题,就能够看出设计技术方案的时候只是根据业务要求完成系统设计即可还是统筹全局的思维给出解决方案。

合适的选择

  1. 在面试过程中,候选人的气质和交流方式对面试官的印象确实起着重要作用,这个问题比较玄学,可能一眼就觉得这是我找的人,可能一眼就决定要尽快结束面试,每个人都喜欢和自己气质相符的人一起工作,但是这样可能会对团队建设不利,尽管候选人的气质与面试官不太相符,但他们可能为团队带来新的思维方式、观点和经验。在这种情况下,除非是候选人引起了特别大的反感,在技术没有太大问题前提下,我个人倾向于将候选人推到下轮面试。
  2. 在面试时经常会遇到感觉能力比自己强的候选人,这些候选人经过交流会感觉自己探不到人家的底,这种果断推到下一轮面试,让后续面试官继续评估
  3. 面试时经常会遇到和岗位匹配度比较差的候选人,个人感觉应该果断终止面试,不要浪费双方的时间
  4. 心胸问题,是否将特别优秀的候选人推荐到下一轮面试,是考验面试官的一道难关
posted @ 2023-08-23 16:24  ~鲨鱼辣椒~  阅读(97)  评论(0编辑  收藏  举报