近几年在鹅厂也算面试过不下100名的初级与中级程序员了,虽然他们背景不同性格迥异,甚至连面试岗位的要求也有差别,然而,成功通过者就没有共同点了吗?当然有,我总结为以下四点:对工作经历的充分掌控、对知识的灵活理解、对问题的主动推进、对挑战的好奇进取。
以下分点举例说明。
对工作经历的充分掌控
小H是我的一名前同事兼好友,现在某家云主机厂商负责业务安全策略,工作之中用到了大数据分析,但模型以入门级别为主(例如逻辑回归);小H一直希望脱离「策略」的范畴迈向「算法」的世界,但是一直觉得现在的工作经历过分偏重业务而非算法,出去面试心底有点发虚。当我和小H聊到他们近期做的一个入侵检测业务,我说这就是一个典型的RNN(递归神经网络)和LSTM(长短期记忆模型、RNN的变种)的落地场景,为什么不去试试呢?
对工作经历的掌控能力好的面试者,首先散发着由内而外的自信心。这种自信心并不是无根之木(也面试过对互联网数研岗位缺乏认识却自信爆棚的跨行业求职者,无一例外悲剧),它来源于:
1、能够清晰定义问题。比如讲明白文本相似度模型是用来解决话题聚合不收敛的问题,而不是一上场就balabala算法有多酷炫。
2、能够独立思考路径。比如引入条件随机场是因为它有助于词与词之间的前后关系映射,而不是微博大V刘知远说过这是最好的方法。
3、能够明确问题瓶颈。比如SVM(支持向量机)面对大规模数据集的训练效率问题会是瓶颈,能提到这点两眼放光就基本上没问题了,再想到与MapReduce的结合更是加分项。
4、能够尝试潜在路径。刚才小H就显然是个反面案例,哪怕神经网络并不在当前场景下最优,起码对前沿的方法的积极应用会让面试官给你的探索精神打个高分。没有low的业务,只有low的方法论和执行力。
对知识的灵活理解
小U算是在校学生当中机器学习知识较为扎实的那种了,无论是传统的机器学习还是新潮的深度学习,各种概念都是手到擒来。直到我问了一个看似简单的送命题:ROC和AUC分别是什么意思?趁着他再一次精准无误的命中答案,我又抛出了第二个问题,ROC和AUC相对于其他指标有什么区别?这时我能感觉到轻微的卡壳,那么我又抛出第三个问题,既然有准确率、召回率、F1 Score等指标描述一个模型的好坏,为什么还需要ROC或AUC?这时我开始发现小U开始顾左右而言他了。
工作和学习之间最明显的区别就是,单纯掌握知识并不形成生产力,知识只有与实践结合才能有所用处。对知识的灵活理解,意味着当你面对一个具体的问题,你能自发与那些飘在天际的理论相互印证,然后大呼一声,哦,原来如此!所以在面试的准备环节,各个知识点最好都能通过实践印证一遍,哪怕只是一个很小的场景,关键是将知识与实践打通。
对问题的主动推进
算法工程师这个岗位的特殊之处就在于,既不像埋首于论文堆的研究员也不像流连于代码架构的开发工程师,相比之下更加强调将前沿算法与业务场景灵活结合的能力。
小G是极少的让我给出S评价的面试者。让我印象尤为深刻的是,小G作为某大厂一个入职不到两个月的新人实习生,负责一个通用分类组件的构建,实际承担的也是执行而非主导的角色,但却对该组件的业务需求和应用痛点了若指掌,甚至对每一痛点对应的算法优化方向也都提出了自己的见解。
当我问小G为什么能在这么短的时间内积累到这么深入的业务认识,小G的回答是这样的:如果只是闷头优化算法而对业务需求不管不顾,那么哪怕算法做得再精美绝伦也不会产生任何的业务价值。所以他会利用一切正式和不正式的沟通机会去了解业务方的痛点,真正做到以终为始(参见高效能人士的七个习惯),结合业务需求给出算法优化方向的建议(注意,是建议而已)。
对问题的主动推进能力一直是我最为关注的软技能。优秀的团队总是那些每个人都有可能成为发动机的团队,我真心盼望能多招几个发动机。
对挑战的好奇进取
X是三年前面试过的一位社招候选人,当时给的无论算法能力还是开发能力评价都是优秀,但是最后我却加了一个问号。这个问号来自于当我问他是否有什么问题要问我时,X表示没有问题。当我不厌其烦给他介绍我们团队的业务范围以及待解决问题之后,我发现X也没有任何的兴奋感,只有一些客套的应对。
Y是同一时间面试的毕业生,由于我的惯例是会给面试者抛出一道海量数据排序的题目,要求直接在白纸上裸写代码。Y由于编程经验严重不足,这个环节显然难以完成,但是Y没有畏难情绪,通过提问和思考把问题一步步抽丝剥茧,最终在白纸上画出了解决问题的流程图。
最终我们给X和Y同时发了offer,结局却有所不同:Y持续超出我们的预期,并取得了最高的考核绩效;X因为试用期表现低于预期只能让他遗憾离开了团队。这其实是三年以上工作经验候选人的普遍通病,就是容易被重复的工作磨平了好奇心和进取心,甘于去做一颗做普通的螺丝钉。而这种好奇与进取恰恰就是在职场能持续进步的根源,而反映到面试之中,就是:
Tips A: 如果你真的对一个岗位感兴趣,你就该通过一切渠道去了解公司、团队以及团队里的每个成员
Tips B: 面试不等同于考试,遇到挑战不要站在问题的角度,而是应该站在你的角度,想你有什么方法和资源去解决问题
外界许多教新手程序员面试的攻略总是聚焦于基础和技能,但我想能从优秀的人之上再脱颖而出的,是一个人发自内心的爆发力,是一个人对待万事万物的方法论。希望以上的面试之道,能对你们有所启发。