广受谷歌员工欢迎的 macOS 包管理器Homebrew 的开发者,技术大佬Max Howell,去谷歌面试时由于不会做一道非常基础的算法题——翻转二叉树,而被谷歌拒了。
当时圈内炸了锅,有人觉得是大佬不屑于去做,有人顺带吐槽了自己的类似经历......
其中一位网友的评论切中要害:“大佬不会做翻转二叉树,但他仍然开发出了Homebrew ;你虽会做,但却开发不来。”
至少我们能发现谷歌的这道题并没能挖掘出大佬真正的技术实力,从招聘目标来看,其实是有些失败的。
他承认自己当时确实不知道二叉树,但强调了谷歌不能因此拒掉他。
虽然他不懂很多CS 理论,但他开发出了在乎用户体验、饱受好评的Homebrew, “真正开源世界中一颗闪亮的星”,他认为这跟CS 理论没有半点关系。
01 为什么总出算法题?
企业为什么执着于出算法题呢?
有三方面原因:
省时省力:技术岗位的主要任务是完成工程项目,并没有太多时间和资源来针对岗位需求来制定题目。
算法题则无需编程语言或环境的配置,甚至用白板都能直接进行考核,对企业很方便。
算法题容易评估:企业要出跟实际项目相关的题型,就需要更多的时间和资源来设计和评估,许多复杂的细节难以量化和评价。
算法题有标准答案和客观指标,如时间/空间复杂度来直接评价候选人的水平。
企业的“保底思维”:算法题考察了程序员的基本功,像一个大漏斗,留下来的至少基本功不错,里面可能存在合适具体岗位的人选。
但只考算法题存在着许多局限性。
02 算法题的局限
2.1 实际项目有时不需要懂太多算法
有人会说,算法考核的都是基础,若连基础都不会,那怎么证明他有更强的实战能力呢?走路都不会,又怎么参加长跑比赛呢?
但算法与实际项目的关系,并非上楼梯似的递进,而更像水分子跟水一样的层级关系。人类真正了解水分子结构不过几百年,但不妨碍人类一直在用水。
就像打造一个游戏引擎,需要学习很多算法,但游戏设计师使用游戏引擎来设计游戏,却不需要懂太多算法。
其实,许多算法早已被封装好,集成在各种工具和框架中,除非底层开发工作,比如开发新的游戏引擎,许多岗位早已不需要接触这些算法原理了。
现实工作中,如何很好地完成业务需求,更多取决于候选人如何很好地去使用相关的工具与框架。
算法题通常是抽象、简化、标准的,实际项目中的问题往往是具体、复杂、多变的。
招聘时的算法题,往往预先设计了一个最优解,让候选人在限定时间内解出。
但现实中,工程问题往往不仅没有标准答案,有时甚至连问题在哪,是否能用现有技术解决都不清楚。
比如招聘中,企业会让候选人写一个从A到B点的最短路径算法。这类题目通常被精心设计,数据被构造,一定存在最优解,问题的输入和边界条都相对简单和规范。
但实际的交通系统项目中,存在着拥堵、施工、事故多种路况,步行、汽车、公交多种方式、用户随意更改目的地,以及要实时同步交通数据,这些都是要候选人花更多精力考虑的复杂情况,而非仅需记忆类似Dijkstra 的一个算法就能搞定。
项目代码是真实世界的,存粹的算法代码只存在于阉割版的证明理论里。
只有理论,而无法高效实现的算法也并不少,比如Kruskal 算法很早就出现,但很久之后才找到了较好的实现方式,变得实用。
技术人才的核心价值,是用代码实现具体的功能,而非仅懂理论概念。
但现实中复杂的项目,技术人员可以长时间沟通交流、协作,并且自行查阅资料。
随着AI 发展,查阅理论算法知识,更是轻而易举,记忆算法的价值大幅减弱。
这是我用AI 工具实现的“关键词出现频率统计”功能,其中涉及到了Porter Stemming和Snowball Stemming 等词干提取的算法,而我对这些算法一无所知。
目前算法题考核招聘方式,无法还原实际场景中的资料搜索、沟通协调等相关能力。
总之,通过算法题先筛人,再进一步靠面试判断岗位匹配度, “先筛人,后匹配”的模式,仅是旁敲侧击挖掘能力的方式。
不仅会漏掉如Howell 那种有潜力、创造力、有专长的技术大佬,也容易招到一群只会做算法题,但缺乏沟通协作、解决实际问题等拥有工程能力的人。
好比打靶并没刻意瞄准靶心,只是先让自己手别抖,这样“弹孔”容易稳定地集中在某一区域,招到一群相似的“优秀”人才,但却可能偏离岗位的“靶心”。
有没有什么方法,能直接冲着“靶心”瞄准,反过来从岗位出发,直接招到匹配该岗位人才的方式呢?
ShowMeBug 致力于深挖技术实力,为企业找到技术岗位的最佳匹配人选,专门打造了基于岗位的“实战题型”。
从岗位需求出发,ShowMeBug 自研能力模型,将岗位能力细化为逐条能力维度,再基于能力维度,推导出具体的技能与知识点。同时也支持企业自行调整。
这些知识点,是ShowMeBug 与各类行业大佬合作,总结大量过往实战项目案例提炼得出。
确保了什么样的岗位,就能明确需要什么样能力,并出相应的题目考核这些能力,使得通过测评的的候选人完美匹配岗位的需求。
比如,除了像 Java、JavaScript、C++、Python 等考核编程语言能力的基础编程题,也有像 Vue、SpringBoot 等,考核候选人使用前后端框架进行需求实现能力的题目。
下图中,就是一道考察候选人“是否能够处理耗时任务”的实战编程题:
这道题目模拟了一个常见的场景:用户在前端点击按钮后,需要优化接口,让后端将耗时任务放入不同线程中异步执行,从而让前端不需要等待所有任务完成才能收到响应,优化用户体验。
同时,ShowMeBug 题库也支持“开卷有益”功能,企业可以在试卷设置AI 编程助手。最大限度还原候选人现实中的工作环境,考核他的实战工作能力。
总之,企业在招聘时,可直接使用ShowMeBug 的5000+ 道题目直接进行考核,节省下大量时间与精力;
企业也可针对不同岗位,通过调整相应的能力维度、技术与知识点,来自定义想要考核的题目,满足自身个性化的招聘需求;
“实战题型” 的内容与AI助手,也很好地把候选人放在了真实工作环境下,去解决贴近实际项目的问题,最大限度地在屏幕前直接还原他的真实技术能力,助力企业精准择优。