面试到底要面个啥
最近我们打算给GreptimeDB写一个JS SDK,把工作安排给了刚刚转正的校招同学。
其实在面试的时候我完全没有问过他是不是写过SDK,更没有问过他是不是知道gRPC,但是我们确实要做这样的工作,这种事情很常见。面试不可能覆盖工作内容的方方面面,或者说,完全覆盖不到工作内容的方方面面。
这就意味着程序员面试和很多其他工种的面试有着本质的不同。比如厨师面试,你可以考他做几道菜,以后的工作内容也是做这几道菜。或者歌手你可以考察视唱,这是所有演唱的基础。到了程序员这里,就比较复杂了,基础题也就是所谓的八股题,反而是脱离基础的,因为如果这真的是经常使用的基础,那么就不应该在面试之前需要特地准备对吧?歌手不需要面试前临时练习音准,武术家不需要在面试前临时练习马步,但是程序员需要临时去背诵一下设计模式有多少种,这个事情就很好笑。
所以我的结论是,对于一个合格的在职程序员来说,所有需要提前临时背诵的知识,都不能称为基础知识。但是我们确实又需要招到“基础扎实”的同学,那该怎么面试呢?
说回写SDK这个任务,可以分解为两件事:如何写一个JS SDK以及JS如何调用gRPC。
第一件事情可以通过阅读其他SDK的源码学习,第二件事可以通过阅读(英文)文档学习。
所以阅读源码和阅读英文文档可以看作是一种基础能力,一个合格的工程师应该可以在无需准备的情况下,在陌生类库的源码中找到想要了解的部分,以及通过英文文档写一个陌生类库的demo。
我们可以基于这个要求的内核扩展不同的考察形式,比如用Nim写一个简单的支持天气查询的server,当然这个没法现场做了。现场要求用陌生技术可能会压力比较大,导致因为紧张而难以发挥出应有的水平,所以现场可能还是会问熟知的技术栈,或者从熟知的技术栈循序渐进。
那换一个方式:http协议应该是一个基础知识,那我们可以从http1.1开始聊,聊到http2,然后再往gRPC的方向聊。观察面试者从固有知识和经验出发,到理解新知识的过程中,如何去获得新的信息,并且理解转化。这个过程中,知识的增量速度是学习能力,经验的复用程度是工程能力,这样就把一些真正的“基础能力”变得可以量化评定了。
所以程序员的面试应该有一部分是开放性的,正是不确定性的题目,才能够更好的指向确定性的基础能力。
其实很多面试官没有想过面试的道理,只是简单的以“做出来”和“没做出来”评价,这样面试感觉和直接抽签或者扔硬币也差不多吧。
