最近雅虎北研解散的消息触动了各大互联网公司HR的神经。公司里一下子面试的任务多了起来。正好借机会总结一下自己毕业后作面试官以来参与若干场技术面试的一点心得,分享一下。
当好一个面试官其实也很不容易,不但要练就一双火眼金睛,把优秀的人才和水货在短短的面试的几十分钟里分辨出来,同时面试官本身就是候选人观察公司的一个窗口。在面试中,面试官还要注意很多接人待物的细节,既能彰显公司求贤若渴、对人才的尊重,又能将公司的技术水平和文化氛围展露一二,以求给候选人留下良好的印象。
社招某种意义上比校园招聘更困难。面对形形色色的社招候选人,首先一个要想清楚的问题就是我们到底该招什么样的人?简单的说就一句话,适合自己公司的人。每个公司都有独特的文化和特定的业务需求,更有各自的业务发展阶段。就算同样是招程序员,也应该因地制宜,有所侧重。拿我现在所在的公司(某大型外企驻华研发机构)、所在的行业(瞬息万变的互联网)来说,我觉得最重要的就是下面几点:
第一,聪明。作为大公司,尤其是外企,总部的制约总是一定程度的存在,互联网行业更是一个日新月异的行业。这时,项目背景和知识远没有能力靠谱。如果一个人的工作业绩,是知识日积月累的沃土上自然的发芽、开花、结果,那么在充满未知、充满变化的工作中,一旦项目发生较大变化,那么适应新任务、新角色、新挑战时,就很容易出现较大的落差,往往工作效率显著下降,更严重的甚至只能一拍两散。公司花这么大的力气组织招聘和培养人才,如果仅仅因为项目和行业的变化就发生大规模离职,想来从公司角度是非常不划算的。所以,在我参与的面试中,我比较提倡招募聪明人,要招比自己聪明的人,招能适应各种新技术、新行业、接受新挑战的人,招和自己不一样的人。当然,这也是由公司特点决定的。我们公司组织机构调整、项目变化频繁,公司规模很大、业务范围很宽,对正式员工相对较负责,内部培训较完善,裁人比较慎重,发生各种变化时内部换岗机会多。其他公司未必可以参考,但可以结合自己的需求和特点对号入座。
为了测试一个人的聪明程度,我通常会给他一道算法类的题目,让候选人尝试给出一个经过优化的解。选题时,我通常会选择那些不同思路、不同水平下有很多不同的解的题目。我一般并不指望候选人一下子把最优解做出来(实际上也有个别能做到的特别优秀的候选人,但同时也要小心他以前做过类似的题)。我会通过交流去尝试理解他的优化思路,然后适时的沿着他的思路给点提示,看看他能不能有什么进展。在交流中,我主要观察一个人的逻辑思维的严密性、考虑问题是否全面,思考是否迅捷,能不能突破既有思路的框框。我还要观察候选人能否在解题过程中很好的理解问题,对问题能否进行系统性的有条理的分析。俗话说文无第一、武无第二,其实任何最优解都有一些充分限定的条件或假设作为前提,除非用数学公式的风格严谨的出题,常规意义的完美解是很少存在的。一个人,如果能突破常规,能对问题有很好的分析,取得一定进展,在有限的时间和面试的压力下,我觉得能做到这些已经难能可贵了,面试官也并不一定有必要盲目的追求最优解。
在这里,也要顺道提醒参加面试的候选人。解题时,要留意面试官的问题和提示(如果有的话)。我记得见过一些候选人在面试中完全封闭在自己的世界里,从面试官的角度来说,他们完全没有任何进展的憋在那里,甚至在面试官主动帮助他的时候也没有取得任何有意义的反馈。纵使候选人天赋异禀、聪明绝顶,但如果在面试中与面试官都无法顺利协作,那么实际工作中又会如何呢?面试官既然花费时间参加面试,从内心深处都是非常希望找到合适候选人的,面试官也希望被面试的你通过面试。所以,从心态上不要简单的把面试当作一个非黑即白、相互对立的考试。从某种意义上说,我更不仅仅是一次考试,他更像相亲,呵呵。
第二,技术深度。作为软件工程师,毕竟还是一个技术性岗位。不管你有多聪明,如果个性和主观意愿上你并不能在技术上钻研到一定深度,那么公司将来派你冲锋陷阵时就要考虑一下了。毕竟就算对你来说是新领域,从公司角度看,还是需要你在最短的时间帮助他们提高产品技术水平,钻研到一定深度,在残酷的市场上竞争时没人看你是新手、老手,更没人会等着你慢慢成长。所以如果应试者没有追求卓越的习惯,不能在有限时间将你学习和掌握的技术钻研到足够的深度,那么雇佣你的公司将丧失在残酷的市场竞争中生存的机会。所以,我觉得公司要招的人是这样的:他们有追求卓越的意愿,有独立探索的精神,不断学习和自我进步;他们哪怕从事的是全新的领域,只要给他一点合理的适应和探索的时间,他都可以做的比很多人、比其他公司更好。
在技术深度方面的面试中,我通常会以候选人以前参与的项目、读过的书或者熟悉的编程语言,围绕着这些话题来出题。面试官当然不可能什么都懂得很深,所以面试题也不需要过于刁钻、古怪。拿以项目背景为主的话题为例,可以通过不断深入的去了解对方的角色和职责,看看他对项目中的各种技术、架构和具体实现是否熟悉。如果发现系统设计上的瑕疵或需求上的挑战,还可以更深入的探讨,看看候选人的反应。有些候选人号称是核心开发人员或者项目主管,但实际上问他很多细节问题根本回答不出来,这种候选人或许浮在上面做管理工作太多、技术上不是特别擅长,要么就是简历中水分太大并没有多少真金白银。谈谈熟悉的编程语言或技术书籍也是不错的选择,但要注意别考很偏的问题,因为那是在考知识,不是考能力。知识对于聪明人来说是可以学习的,面试中要侧重对知识的运用。很多技术涉猎不深的程序员,常常是知其然不知其所以然,更谈不上活学活用。工作年限较长的程序员,又做不到知其然也知其所以然的,恐怕是难以承担重任的。很遗憾在这里不能通过面试题和案例具体举例,以后方便的时候再跟大家交流吧。
第三,技术沟通能力。抛开个性因素和常规沟通技巧不谈,良好的技术沟通能力在日常工作中实际上非常重要。我们需要优秀的工程师不但能孤军奋战,也能团队协作:需要大家能在交流中抓住问题要旨,在交流和对话中完全没有沟通障碍的有效率的可以并肩战斗的伙伴。而良好的技术沟通能力,实际上往往需要很多方面的综合素质:“即时反应能力、很强的技术理解力、系统性的思考和分析能力、总结和概括能力以及具象化的展示和表达能力”,实际上,这样的人当真是很难得的。在面试中,面试官可以关注候选人在交流中所表现出来的行为特征,比如木讷、啰嗦、跑题、抢话、傲慢、声音小(不自信)等等。对有比较严重的沟通缺陷的候选人,纵使其它各项面试表现良好,也要格外慎重,否则极有可能会拖累团队的效率。
第四,代码。归根到底,程序员特别是基层研发人员是用代码说话的职业。我很难想象一个事业上成功的优秀的程序员,居然不能在面试中写出清晰、严谨、高效的代码。我个人是建议算法题和代码题分开来考。代码题一般重点考察两点:候选人的代码风格如何,包括函数和变量的命名,程序逻辑是否存在大量的冗余,同时注意候选人的一些个人的编程习惯;此外,还要重点考察候选人的程序逻辑上是否严密,对输入有无断言或正确性验证,对各种逻辑上的边界条件能否正确处理,写好程序后有没有一个自我测试的过程,能否通过合适的测试用例验证程序的正确性。即便对于那些面向基层管理职位和架构师职位的人我也是一视同仁的,在我看来没能力用代码说话的技术人员,是很难做好基层的项目管理、研发管理等职位的(个别妖孽除外)。归根到底,代码是程序员的基本功,一个初等数学乱七八糟的人,我们也不能指望他会成为微积分的大牛。
第五,品味和兴趣。通常,当我开始了解一个候选人的技术品味时,他已经通过了面试而且面试成绩还不错。通常我会问问候选人在业余时间读了什么技术书籍、探索了什么有趣的新技术,或经常去什么网站学习。一个人的技术水平的提高,除了来自工作时间公司的项目实践,也来自业余时间个人涉猎,这时一个程序员的兴趣和品味决定了他的视野和成就。作为面试官,一方面通过交流,我希望能向候选人学习,参考他公司之外的学习之道;另一方面,我也希望更全面掌握他的知识结构和兴趣爱好,看看有没有给能给面试加分的或者适配于工作需要的地方。
好了,今天先分享到这。有什么不当和疏漏在所难免,欢迎业界朋友多多指教!