王国维的人生三重境界快被人们念叨烂了,资深文艺青年都已经不爱提这个,但把这种分法做个跨学科应用,倒是能看到一些新奇的东西。
十一前帮新东家在北京做了一轮校园招聘的算法面试官。虽然面试多年,但这还是我第一次如此密集地从事这项工作——一周时间里马不停蹄地面试了数十名候选者。长时间做一件事情,再结合原来类似的背景和经历,通常会发酵出一些东西,于是就有了下面的文字。
极少一部分玩票的人这里就不提了,剩下大部分的候选人其实还在这个职位的门槛外徘徊,处于“独上高楼,望尽天涯路”的摸索阶段。
比较初级的比如某些工程出身但没有信心投开发的候选人,看着这个稍显陌生的工程岗位觉得可以来碰碰运气(类似于以前的一个玩笑:不知道自己该干什么的都投产品经理去了)。
进阶一点的有啃过一两本相关书籍,上个两门课,做过两个玩具项目的学生,问一个问题通常都能口若悬河地说上一通,但你让他把刚才说的问题和方案用形式化的语言来表述一下,就只能干瞪眼。你把纸和笔都推到他面前要描述和推演,却发现得到口述内容的语音识别版。
我挑人通常对候选人的形式化思维能力有要求,这也是为什么我认为具备基本的数学能力是多么重要的原因。因为算法工程师跟传统的开发工程师不同,很多时候并没有一个现成的定义好的问题在等待着你,你通常需要先把需求方的自然语言翻译成形式化的语言,然后再翻译成机器编码(这部分扯起来就很多了,将来再撰文详述)。当然也有对这个职位充满了热情,但明显还没准备好的同学。这样的候选人只要对眼缘,我一般都会加以劝导,无论是重新思考自己的职业发展方向,还是进行合理的能力储备,都比这样凭着热血碰钉子强。这个阶段的同学,看山是山,看水是水,习惯用生活语言来描述问题,分析问题,而未懂得把握抽象在其后的共性,并用形式化的语言把问题和自己的想法表达出来。
合格的候选人通常经过一些学术或项目的锻炼,不知觉地跨过了第一阶段,真正地进入到这个门槛里,懂得了算法和抽象的乐趣,并乐在其中,“衣带渐宽终不悔,为伊消得人憔悴”。这批人通常已经具备了成形的形式化逻辑思维习惯,对于面临的实际问题,第一反应就是“如何量化”,“如何建模”,“已知变量是什么”,“目标函数是什么”,至不济的,也会用自己做过的项目作为一个模子去套新的问题。他们拥有成熟程度不等的知识体系,凡事都能套入到自己的体系中去表达和推演,在抽象层面对问题进行解答。但这也是一个拿着锤子满世界找钉子的阶段,每个人都认为自己的锤子是万能的,所有问题都要代入到自己熟悉的模型中去求解,于是往往能看到一些钻在牛角尖里绕不出来的面试者。比如一个其实不难的统计问题,想得太多,有时就会被面试者套入假设检验,有时是分类问题,有时又变成贝叶斯推断。这个阶段,看山不是山,看水不是水,有点痴狂,有点自信,有点执着,有点迷失。
总有一些人能摆脱自身知识形成的桎梏,跳出自己模型框框,回归到问题本身,达到了看山还是山,看水还是水的层面。他们在具备很好专业素质的前提下,不被自己的专业所束缚,他们首先关注问题的起点和目标,并通过自己的已有甚至未有的知识去描绘中间的路径,为问题定义出合理的边界和解决路径。能达到这个层面的,已不多见。即使在实际工作中,也有大量的第二层面的解法,面对问题,通过不断地加入模型,使得架构变得复杂。而只有回归到问题本身,从出发点进行分析,千锤百炼后,才能走出自身的困境,享受“蓦然回首,那人却在灯火阑珊处”的惊喜。
相对于能力划分拥有比较清晰标准的传统开发工程师来说,算法工程师是一个相对较新的职位,学校里也没有一些定义明确的培养课程(比如c/java、数据库、数据结构),可以据此来对候选人的能力进行衡量,所以对其能力的界定还比较模糊。这里我从面试官的角度来描述自己对这个问题的思考——除了基本的工程能力之外,还有哪些素质是必要的。这是个很大的值得探讨的话题,这里只是开了个头,表达得还很模糊,不足够具体和系统,属于随性的念叨。将来有机会我还会结合着自己的实践经历做进一步阐述,也欢迎大家在这里发表自己的见解。