如何在技术初试中考察程序员的技术能力

考察目标和思路

首先明确,技术初试的考察目标:

  • 候选人的技术基础;
  • 候选人解决问题的思路和能力。

技术基础是基石(冰山之下的东西),占 七分, 解决问题的思路和能力是落地(冰山之上露出的部分),占 三分。 业务和技术基础考察,三七开。


为什么要考察技术基础

绝大部分业务问题,都可以抽象成技术问题。在某种意义上,业务问题只是技术问题的领域化表述。

因此,通过技术基础考察候选者,才能考察到候选者的真实技术实力:技术深度和广度。


为什么候选人需要关注技术基础

一个常见的疑惑是:开发业务系统的大多数时候,基本不涉及数据结构与算法的设计与实现,为什么要考察 HashMap 的实现原理?为什么要学好数据结构与算法、操作系统、网络通信这些基础课程?

现在我可以给出一个答案了:

  • 正如上面所述,绝大多数的业务问题,实际上最终都会映射到基础技术问题上:数据结构与算法的实现、内存管理、并发控制、网络通信等;这些是理解现代互联网大规模程序以及解决程序疑难问题的基石,—— 除非能祝福自己永远都不会遇到疑难问题,永远都只满足于编写 CRUD;

  • 这些技术基础正是程序世界里最有趣最激动人心的地方。如果对这些不感兴趣,说明也许并不适合做程序员,不如做其它的事情,非技术的世界一直都很精彩广阔(有时我也想多出去走走,不想局限于技术世界);

  • 技术基础是程序员的内功,而具体技术则是招式。徒有招式而内功不深,遇到高手(优秀同行从业者的竞争及疑难杂症)容易不堪一击;

  • 在 CRUD 的基础上拓展其它才能也不失为一种好的选择,但这不会是一个真正的程序员的姿态,顶多是有技术基础的产品经理、项目经理、HR、运营、客满等其它岗位人才。这是职业选择的问题,已经超出了考察程序员的范畴。


为什么不能单考察业务维度?

因为业务方面通常比较熟悉,可能就直接按照现有方案说出来了,很难考察到候选人的深入理解、横向拓展和归纳总结能力。

这一点,建议有针对性地考察下候选人的归纳总结能力:比如, 微服务搭建或开发或维护/ 保证系统稳定性或性能方面 的过程中,你收获了哪些可以分享的经验?


为什么要考察业务维度?

技术基础考察,容易错过的地方是,候选人的非技术能力特质,比如沟通组织能力、带项目能力、抗压能力、解决实际问题的能力、团队影响力、其它性格特质等。


技术基础考察

技术基础怎么考察?通过有效的发问模式来考察。


是什么-为什么

是什么考察对概念的基本理解,为什么考察对概念的实现原理。

比如 索引是什么? 索引是如何实现的?如何建立更好的索引来加速查询?


引导-横向发问-深入发问

引导性,比如 “你对 java 同步工具熟悉吗?” 作个试探,得到肯定答复后,可以进一步问: “你熟悉哪些同步工具类?” 了解候选者的广度;

获取候选者的回答后,可以进一步问:“ 谈谈 ConcurrentHashMap 或 AQS 的实现原理?”

一个人在多大程度上把技术原理能讲得清晰,包括思路和细节,说明他对技术的掌握能力有多强。


跳跃式/交叉式发问

  • 比如,讲到哈希高效查找,可以谈谈 哈希一致性算法 。 两者既有关联又有很多不同点。也是一种技术广度的考察方法。

总结性发问

  • 比如,你在做 XXX 中,获得了哪些可以分享的经验? 考察候选人的归纳总结能力。

实战与理论结合

  • 比如,候选人叙述 JVM 内存模型布局之后,可以接着问:有哪些原因可能会导致 OOM , 有哪些预防措施? 你是否遇到过内存泄露的问题? 如何排查和解决这类问题?

  • 比如,候选人有谈到 SQL 优化和索引优化,那就正好谈谈索引的实现原理,如何建立最佳索引?

  • 比如,候选人有谈到事务,那就正好谈谈事务实现原理,隔离级别,快照实现等;


熟悉与不熟悉结合

针对候选人简历上写的熟悉的部分,和没有写出的都问下。比如候选人简历上写着:熟悉 JVM 内存模型, 那我就考察下内存管理相关(熟悉部分),再考察下 Java 并发工具类(不确定是否熟悉部分)。


解决问题能力考察

仅仅只是技术基础还不够,通常最好结合实际业务,针对他项目里的业务,抽象出技术问题进行考察。

解决思路重在层层递进。这一点对于面试官的要求也比较高,兼具良好的倾听能力、技术深度和业务经验兼具。首先要仔细倾听候选人的阐述,找到适当的技术切入点,然后进行发问。如果进不去,那就容易考察失败。

设计问题

  • 比如多个机器间共享大量业务对象,这些业务对象之间有些联合字段是重复的,如何去重?

  • 如果瞬时有大量请求涌入,如何保证服务器的稳定性?


面试过程

预先准备

面试官也需要做一些准备。比如熟悉候选者的技能优势、工作经历等,作一个面试设计。

在面试将要开始时,做好面试准备。此外,面试官也需要对公司的一些基本情况有所了解,尤其是公司所使用技术栈、业务全景及方向、工作内容、晋升制度等,这一点技术型候选人问得比较多。


面试启动

一般以候选人自我介绍启动,不过候选人往往会谈得比较散,因此,我会直接提问:谈谈你有哪些优势以及自己觉得可以改进的地方?

然后以一个相对简单的基础题作为技术提问的开始:你熟悉哪些高效查找算法?大多数人是能答上二分查找、哈希查找的。

问题设计

提前阅读候选人简历,从简历中筛选出关键词,根据这些关键词进行有针对性地问题设计。

比如候选人简历里提到 MVVM ,可以问 MVVM 与 MVC 的区别; 提到了观察者模式,可以谈谈观察者模式,顺便问问他还熟悉哪些设计模式。

宽松氛围

即使问的问题比较多比较难,也要注意保持宽松氛围。

在面试前,根据候选人基本信息适当调侃一下,比如一位候选人叫汪奎,那我就说:之前我们团队有位叫袁奎,我们都喊他奎爷。

在面试过程中,适当提示,或者给出少量自己的看法,也能缓解候选人的紧张情绪。


学会倾听

多问少说,让候选者多表现。根据候选者的回答适当地引导或递进或横向移动。


记录重点

认真客观地记录候选人的回答,尽可能避免任何主观评价,亦不作任何加工(比如自己给总结一下,总结能力也是候选人的一个特质)。


多练习

模拟面试?


参考资料:

技术面试官的9大误区


如何在技术初试中考察程序员的技术能力

上一篇:云组态编辑器


下一篇:nvidia显卡驱动