ps: 本文完成于2015年12月31号

对于一个公司来说,要想健康长久的发展,招聘是一个永久的话题。而对于一个互联网公司,尤其是以产品为主的公司来说,研发是招聘中的关键职位,高质量的研发人才也是所有企业都急缺的。一直持有一个观点:招一个优秀的人给他两倍的薪资带来的效果远远大于招两个普通的人。也一直秉着这个观点来招聘。

今年十月份去西安、武汉两地进行校招,发现了目前很多学生存在的问题(其实之前在前东家参与校招的时候也发现了):

  1. 技术脱离业界前沿。现在高校里开的课以及实验室用的技术基本都脱离业界,面试了很多学生,他们的技能还千篇一律都是ssh系列。而这种技术选项,目前也就在传统it行业流行,互联网公司早就摒弃了这一套。此外,分布式缓存、消息队列等技术更是鲜少有人涉及。更为遗憾的是,对于服务端工程师、前端工程师、客户工程师等职位应该具有的技术栈,在高校里也缺乏相应的课程和相关的人来指导(大公司一般都设置有入职培训针对这一点)。

  2. 基础素质欠缺。对于应届生来说,基础素质是最关键的一点,项目经验是加分项,但不是必需和最关键的。很多学生被问起hashmap的实现原理以及怎样解决冲突时就不知所云(明明就是数据结构课讲过的),被问到tcp/ip、操作系统时更是乱七八糟。也有些学生做过很多项目,自认为经验丰富,但当被问起使用的技术比如spring mvc的原理、mysql的索引机制时,没有任何思路。其实项目经验、工具这些东西决定了你的下限,你的基础知识和素质才决定了你的上限。互联网行业需要的是学习能力强、基本功扎实的优秀工程师,而非很多传统IT企业需要的螺丝钉。

  3. 没有畏惧心。这一点可能因人而异,毕竟有些人的性格就是桀骜不驯。但是在研发这个圈子里,大神太多,是大神但比你还努力的人也太多。技术也太广,任何一门技术都很难精通。做为一个研发工程师,你必须对所有人、所有技术都有一颗为畏惧心。每个人都有亮点值得你学习,每一种技术都需要你下大功夫才能精通。记得有些学生在基础知识被问得绊绊磕磕的时候,急得号称自己精通java,但试着去问了,却发现很多知识都似是而非。说到这里,最近公司的几个实习生让我体会挺深刻的,有些学生的确会对技术有畏惧感,很谦虚,抱着一种学习的态度;但是也有很多学生自视甚高,甚至有人待了一周(很多东西都没接触到)就离职,觉得我们这技术水平入不了他的法眼,总是拿一个我听都没听过的公司跟我说这个公司很厉害的,早就给offer了等等。不敢说我们公司的技术业界领先,至少我们做出了拥有几亿用户的产品。人,还是应该有一颗畏惧心,不论对人还是对事。

  4. 知其然不知其所以然。这一点的反面(知其然更知其所以然)对于研发人员其实是最关键的素质。能做出东西来只能证明你上手能力强,但并不代表你学习能力强。学习能力强,是指的能够快速吸纳理解新的知识,融汇贯通。比如,就拿最简单的spring ioc来说,用过的人基本都知道大概是个什么事情,但是抛开spring,让你自己去实现ioc,很多人估计就不知所措了。

校招毕竟只是研发招聘的补充,最关键的还是社招。但是面试了很多有经验的工程师之后,却也发现了很多问题。除了上面校招提到的一些,最令我印象深刻的就是薪资。本科毕业一两年的,之前在一些不知名的公司工作过的人,动辄就漫天要价。好吧,我觉得可能是真的很优秀,那倒也匹配的上。结果,面试过n次这种人之后,我发现帝都的薪资真的不能拿常人的眼光来看,也算是给我这种来自杭州的人开了眼界。毕竟帝都这地方互联网企业一大把,舍得给钱的、面向vc的创业公司也一大把。你觉得不值,还有一大批公司觉得值。这种现象,在今年上半年达到了顶峰。不能说正确与否,只能说市场如此,带来的效应就这样。

关于招聘,是一门学问。自己非专业的,所以很多东西肯定看的不够清楚。但对于研发招聘,自己经历过很多次被面试,也面试过很多人。有自己觉得好的面试形式,也有自己很嗤之以鼻的。

  1. N轮算法题目面试。这种形式是被微软和谷歌所推崇的,不一定好,但是至少客观,不会掺杂面试官的主管因素,而且据说后续的结果证明了算法好的人在工作上的成绩好的概率非常大。自己曾有幸经历过一次,由于自己对算法不感兴趣,也一直没刷过题目,所以结局很惨烈。不过,自己却也信服口服。应对这种面试,能做的就是做大量的题目(至少《算法导论》上的算法都要搞明白),总结方法,锻炼自己的思维。当然参加一下acm比赛也不妨为一种好方法。剩下的,就看你的天赋和运气了。
  2. 掺杂计算机基础知识、算法以及项目经验的面试。这种形式是国内大部分公司采取的。优点是能从多方面考察面试者的技术水平;缺点就是容易被面试官的主观因素所影响,尤其是很多水平很差的面试官,或者是面试官和被面试者方向不对路。
  3. 软件设计。这个不同于算法题目,一般是面向某一场景的软件设计题目。每个人提交代码,然后根据代码的效率、模式设计等判定结果。现场面试的时候,面试官当场提出问题、需求,现场进行优化编程。这个面试方式,我见过某土豪日企(应届生起薪30W+)采用过。这个我暂时说不上是好是坏,应该是针对特定企业的工业场景的一种面试方式。
  4. 现场结对编程/ppt讲解。记得之前看过一篇文章讲世界上研发面试最难的公司是Thoughtworks。面试官和你结对编程,然后再进行圆桌会议等等一系列复杂的流程。不过,在国内的thougtworks也许是为了迎合中国国情吧,倒是没见过这么招聘。记得校招的时候,初试出一道软件设计题目,你解决好后提交代码,现场面试的时候,就针对这个问题进行ppt演示,面试官当场提出问题,看你的应对。
  5. 只看学历、学校。这种面试方式,我知道的一次貌似只有hw校招。当时听同学说,面试官声称不关心你会不会或者专业对不对口,只要学校符合,其他的都能培养出来。当然,我相信,这只是某种形势下hw的招聘策略,毕竟hw里面招的牛人还是大有人在的。尤其是2000年左右,进hw那可是人人羡慕的。
  6. 群面。这种方式多见于非研发职位。不敢说在研发面试中出现好不好,但至少对我来说,如果有公司这么干,我肯定去都不去。码农们都不擅长和人打交道的好不。。。虽然,这不一定算是件好事。不过,研发总归还是要看技术的么。

目前,我们公司采取的是国内最流行的第二种,基础知识考查这个人的基本素质,也就是看看能否胜任当前工作;项目经验看看这人做过的东西有没有消化、深入理解,看这人的学习主动性、研究问题的深度、对技术的热情如何;开放性问题看看这人是否足够聪明。坚决杜绝问RTFM的问题,也坚决不出什么脑筋急转弯。也会采取一些措施,比如两轮平行面试,来避免掺杂主观因素。

那么怎么定义一个优秀的研发工程师呢?我们希望招到的研发人员或者说我们觉得优秀的研发人员,抛开具体技术来说,共性应该是这样的:

  1. 聪明、思维灵活。研发最重要的一点就是要聪明,这个观点貌似雷军也说过。很难想象一个不聪明的人是如何解决复杂的工程问题的。而什么叫聪明呢?我们现在在面试的时候,会随机从现实的项目中出一道曾遇到过的问题。面试的很多人都会说没遇到过、不知道。其实最终的答案并没有对错,没遇到过这个问题也是我们最希望的,如果你能给出解决方案或者思路才说明你有足够解决现实问题的能力。

  2. 对技术有热情。只有对技术有热情,才不会把工作仅仅当做工作,还会当做乐趣。这样才会对接触过的技术能深入研究下去,快速学习,快速成长起来。相比起聪明,这一点也是至关重要的。如果仅仅是聪明,而对技术不具有热情,那么很多人会浅尝辄止,不求甚解,最后聪明反被聪明误。而没有那么聪明的人如果足够有热情,找到合适的方法,努力学习原理层的东西,也会很快成为技术大牛的。

  3. 基础知识扎实。和上面校招那一部分说的一样,基础知识决定一个人的上限。如果一直停留在表面应用业务的开发,不接触到底层计算机原理,那么即使你在nb闪闪发光的大公司里,你也是可有可无的一个人,价值慢慢会趋于0。而基础知识扎实,那么学起其他的业务层技术也根本不会成为问题,上限也会很高。

  4. 有执行力。执行力在某种方面说就是结果导向。见过很多聪明、对技术有热情的人,却总是钻牛角尖,容易陷在一个细节上出不来,这一点自己也不例外。但是有人会考虑到整个项目的进度,做好控制,先用快速的方案实现,后续再调整和优化;有些人却往往为了一个细节,纠结来纠结去,最后造成进度延误,这就是一种没有执行力的表现。当然,如果你效率高,那么你随便钻牛角尖,不然你应该以全局为重。

以上是今年招聘的一些感悟,希望来年能招到更多符合期望的人才。