用MOBA游戏的方式来评估候选人实力
2021.02.22

引子

大家好,我是 ShowMeBug 产品经理阿毛,是一个热爱开源的程序员(混过 Django Project 的contribution,也是某画板项目的核心开发者),也是个爱玩游戏的人(PC,NS,PS4家里都有)。

2020年下半年,我还过着平淡的程序员生活的时候,我的老同事兼 ShowMeBug CEO 亚飞满怀激情的找到我,说他有个idea,需要咱们程序员自己来做才能搞定。

我很疑惑,什么idea只有咱们程序员才能做好呀?

亚飞说,他想让咱们程序员面试和招聘过程能更爽,必须让最懂程序员的人来做才能做好。

来到公司后,他立即把用户姥爷们呼声最高的题库系统的设计/笔试系统改进工作交给了我。

先入为主,我是有些反感面试先让做一套笔试题的(尤其是算法笔试题),对于公司来说,笔试是一套低成本高效筛选人才的手段,不可或缺;但对面试者来说,好多公司的题目,和工作脱钩严重,很多大学ACM做成了肌肉记忆的题,工作多年不用,甚至已经连概念都忘了,导致面试准备当中需要耗费大量精力提前刷题。

我自己以前面试还遇到一件特别尴尬的事。我去某厂参加一场面试,刚到对方公司,面试官都还没见着,HR上手就是给我一套算法笔试题:“你先做了这个,做完了再叫我啊”,说完就把我关在了小黑屋。

按以前的性格,我可能直接就掀桌子走人了:Github里的项目都摆在那,能不能胜任工作看一下不就知道了吗;我又摸了摸自己的瘪瘪的钱包,想了想还是忍了吧(无能狂怒.jpg):想要人家的工作,还得遵守人家的规则。

顺利做了几道题之后,一道“手撸红黑树增删查改 ”映入眼帘,换成刚毕业那会,我还可以做出来,到了现在,已经完全没概念了,唯一记得的只有它在算法导论第13章。冥思苦想没有头绪,于是我就这样和这份工作失之交臂。

还有一些考察语言细节的题目,有些函数名字或者参数列表如果你没有刻意去记,实际用的时候,一个 help(func_name)能得到答案那种,面试的时候让你写,你就是写不出来,特别尴尬,这种时候我就会想:要是有IDE或者自己熟悉的编辑器就好了。

不知道你有没有遇到过跟我类似的情况,其实很多工作你是能胜任的,但是在没有刷题准备的情况下,可能你连面试第一关都过不了;而很多coding能力不怎么样的人,甚至培训机构量产的人,在系统刷题之后,也能面试成功。

所以,这次我们自己要做题库系统,设计新的笔试评估方案,我心里其实有很多小九九:

  • 笔试题能不能不要全是算法题
  • 有没有一种除了“总分”以外的方式能帮我们更好的评估人才

最重要的,回归咱们的初心:能不能有一套笔试/题库系统,同时能让技术人跟招聘者都用的爽呢?

我冥思苦想,时间一天天过去,方案却迟迟不能敲定,下班之后玩游戏的时间都给整没了。

终于有一天,我决定放飞自我,休息一下,玩玩 Dota;无能狂怒中我打完一了局OMG,气愤地点进了彩笔队友的个人资料,准备在心里狠狠羞辱他一番。看到他的游戏风格雷达图,我一下子就知道队友是什么货色了:人菜瘾大。

网上有张老图,大家感受下:

忽然间,我灵光一闪,为什么咱们程序员的能力不能用雷达图来表示呢?经过反复推敲,一套新的人才评估方案和技术人能力模型呼已经之欲出。

我先卖个关子,我们先来一起看看传统笔试和人才筛选,都有哪些问题,然后再来看看我们的新系统的设计怎么解决这些问题。

人才筛选难题

难题一:我们需要什么样的人?

需要写一份JD(岗位描述)的时候,头疼之时,你第一个想到的方法是什么?

不知道你的想法是否和我一样:”先抄抄某鹅的类似岗位描述再改改?“

某鹅这类大厂的JD好不好?

当然好,但是不一定适合你,也大概率不适合你:

  • 大厂的对人才的要求和普通企业对人才的要求很大程度不同:他们提供超出行业平均的薪资和福利,也对人才有更高的要求,六边形战士是他们的准入门槛。
  • 大厂的JD往往比较抽象,熟悉XX(某个很大的主题),精通XX(某个很大的主题),基本功扎实(涵盖了数据结构哦,算法,操作系统,计算机网络等等);而大部分中小型公司,对人才的要求和这种标准相去甚远。

难题二:笔试会把部分合适的候选人挡在门外

在我们的客户访谈中,有部分客户表示了对笔试形式带来的担忧,他们不需要全能的六边形战士,而笔试很可能会把本来合适的候选人拦在门外

  • 笔试很容易形成单一标准,难以准确评估被招聘者的能力(不然也不会有“面试造火箭,工作拧螺丝”的大流行),很多候选人非常反感笔试这种形式。

笔试结束后,我们往往还是难以决定要不要继续面试候选人,或者对候选人的评价存在比较大的偏差,笔试体系的设计和题目的选择直接决定笔试到底是为招聘赋能,还是增加障碍。

难题三:如何评价自己需要的人才?

就算有了JD在手,我们还是很难评价一个候选人是否匹配我们的JD;又或者,我们的JD只是一个对全能选手的描述,我们实际需要的人才,并不需要什么都会。

如何相对客观且高效的评价这些候选人,确实是一件非常头疼的事情。

一个典型的工程师,应该有一些软技能和一些硬技能。

  • 软技能:交流沟通,对业务的理解,逻辑思维,学习能力,等等
  • 硬技能:算法,CS基本功,对工具的熟悉程度,编程语言,等等

这些能力直接决定了一个工程师对一个岗位的胜任力,这意味着TA是否能搞定这个岗位的职责,能否有良好的绩效,能否跟着业务一起成长,等等。

软技能难以评估,面试的沟通过程能够更加清晰的评估这块的技能,光凭一份笔试题,比较难以对候选人的软技能做出一个相对客观的评价。

我有一个观点:让合适的工具做合适的事情。

笔试就应该好好评估候选人的硬技能,剩下的,交给面试:)

题库系统如何解决上面这些难题?

为了让企业能更加高效的招聘人才,也为了让人才能够找准自己的位置,我参考MOBA游戏的雷达图,尝试构建了一整套相对客观的评价系统,解决上述三个难题。

针对岗位构建人才画像

能力维度

我们可以使用下面这些相对抽象的能力维度来评价一个工程师的能力:

  • 算法:对于基本的数据结构和算法的认知水平。
  • CS基本功:操作系统,计算机网络,等等。
  • 编程语言:对所使用的语言的熟悉程度。
  • 专业技能:特定工具和领域的技能,比如 Web 框架,数据库等等。
  • 解决问题:解决问题是一种兼具创造性、操作性的思维方式和智性活动,对于评价面试者的潜力非常有帮助。

这些维度不能完美覆盖一个候选人的所有能力,但是已经足够我们判断一个候选人的综合能力,它避免我们以“算法”为单一维度来评价候选人。

岗位雷达图

这是一个可用人才的基准(及格线):

一个典型的能干活的 初级Java Web 工程师可能有如下的能力特点:

一个典型的能干活的初级前端工程师可能有如下的能力特点:

一个算法工程师的能力特点可能是下面这样:

几种类型的人才画像里,各种能力强弱有显著的区别

  • 对于初级前端工程师,对CS基本功和编程语言的要求相对较低,专业技能(例如对浏览和盒模型的理解则必须非常完备)。
  • 对于初级 Java Web工程师,需要对计算机网络等基本知识和Java编程语言有更深入的理解。
  • 对于算法工程师,他们对于算法和解决问题非常专业,其他方面弱一些完全没有任何问题。

准确的人才画像很大程度上可以帮助我们避免“面试造火箭,工作拧螺丝”的问题,你需要的人才画像一旦确定,很容易可以通过这种要求来为TA量身打造一场笔试/面试

通过人才画像确定笔试内容

以“大数据算法工程师(Java)”为例:

  • 我们希望他是一个基本功比较扎实的人,对算法掌握较好
  • 逻辑思维强,能独立解决问题
  • 专业技能上,要会一些基本的大数据工具的使用,但是不用特别深入
  • 使用语言是Java
  • 可能要实现API,因此要加入对网络协议的考察

有了这些要求,我们可以确定出各维度的知识的考察要点:

  • 算法:K-Means,贝叶斯分类器,MapReduce
  • CS基本功:HTTP协议(计算机网络),多线程(操作系统)
  • 编程语言:Java,JVM(Java)
  • 专业技能:Hadoop,Kafka, SQL
  • 解决问题:工作实战题目,设计一个推荐系统

我们根据不同领域技能的重要程度,得到一个初步的题目内容的占比:

这只是一个粗略的比例,但实际上已经足以直接使用了,下一步工作,是根据我们岗位的要求调整题目难度。

我们使用有难度梯度的题目,来区分同领域工程师的水平高低。

对于初级工程师,我们设计了一些初级题目(占大部分),一些中级题目(以便为不同水平的工程师产生区分度),这样,题目的完成情况(分数占比),就能低偏差地反映出候选人的能力水平。

你可以自由的从题库里面选择对应领域的题目加入试卷,根据岗位需求再调整比例和权重,最后就能得到一份相对理想的试卷。

通过笔试能力报告多维评估候选人

通过相应维度的题目和考察,ShowMeBug会根据候选人的答题情况,输出一份可供参考的能力维度分析

分能力维度的评价方式是“总分”的良好替代品,一个总分很难精确地告诉你要不要面试这个候选人,而能力维度可以

多维度评测提供的重要能力:

  • 人才匹配度评估:总分制无法直观地多维度提供关于人才能力的评估,匹配的才是最好的。
  • 纠偏以避免误伤:多方面能力可以相互佐证,避免某种能力达不到理想标准导致对人才的误判

这种方式很好地避免了使用单一的“算法”维度来评判候选人的硬技能,通过贴近实际工作场景的“专业技能”和“解决问题”类的题目,来改善面试造火箭,入职拧螺丝”的问题。

以算法工程师为例,假如我们得到三位候选人的能力评估报告如下:

对于算法工程师候选人,算法问题解决能力可能会有更高的权重,考量的时候将会成为我们的重点。

对于候选人A,只有算法一方面还不错,其他方面没有任何突出能力,因此我们暂时不让他进入面试环节。

候选人B,算法和解决问题能力都不错,专业技能稍弱,看起来是一个基础扎实的潜力型选手但是专业技能是比较容易误判的一个角度,没有使用过的工具很可能就答不上来,而且专业技能对于这个岗位也是比较容易补上的一种技能类型,因此我们愿意让候选人B进入面试环节。

对于候选人C,虽然算法表现没有候选人B理想,但是专业工具和编程语言都很不错,很可能这个人是一个工程经验丰富的野路子工程师,对于特定的算法题没有做过了解,因此我们认为他有胜任工作的潜力,也邀请这个候选人面试,同时可以针对算法评估中的偏差进行详细确认

通过上面的分析,我们很容可以看出,采用这种方式来评估人才,相比传统的方式,能够有更多的机会发现我们可用的候选人,为我们提供更多可用的选项,解决找不到人的难题;同时,也能直接淘汰掉能力不符合我们需求的候选人,节省企业的时间,极大提高招聘效率。

愿景

以上就是我在技术招聘当中笔试环节的一些思考和所做的一点微小的工作。

希望通过我们的努力,能让招聘者数分钟内就能生成一套合适的笔试题;同时,也让候选人能够无须刷题,本色出演也能找自己合适的位置。

现在这套系统即将推出,首期我们会先支持呼声最高的Java语言相关岗位。如果你或者你的公司有兴趣试用它,欢迎添加文末的微信跟我聊聊。

如果你也觉得招聘笔试应该是这样子的,请转发此文给你的朋友们帮助他们更好的招聘。

题库功能预约链接(上线后第一时间邀请你体验):https://www.showmebug.com/puzzles_feature

联系方式: