最近,由于一个协作海外研发团队缩编,项目组需要招聘几个具有大约7年以上的C++资深研发工程师来充实这边的研发力量。我有幸和项目总监主持了一个笔试成绩相当不错的应聘者的技术面试。该应聘者有超过8年的研发经验,曾经是做过项目组长,在个人的知识积累和总结方面也颇有心得。但是由于其过去几年的研发背景是非windows平台,而且在windows平台上的训练也稍有不足,加上其他的一些因素,最后我们还是决定不接受该应聘者。这是非常正常的双向选择过程,我也相信凭借他的资历和能力,他完全可以找到另一份很好的工作。
这里要谈的,是面试过程中的一个细节。该应聘者显示出积极地心态和自信,这让我很感兴趣。作为目标候选人,我们期望他能给项目组带来不同的新鲜空气。于是我的一个问题是:
“如果你需要给项目组中所有的成员做一次你可以提供的培训,你会选择什么主题来进行?”
在确认了是需要技术培训以及我们期望的是最能表现其擅长的地方,具有专家级理解之后,他想了一下说“C++吧”。
这个答案让我感觉有点吃惊,对于一个有将近十年的具有项目管理经验的资深C++工程师,域知识,安全方面,设计方面,测试方面,自动化方面,实现方面,维护方面的知识肯定是构成他知识结构的绝大部分。如果一个人把一门工具语言当做他做拿手的部分,无疑他真正是这方面的专家中的专家。我就问,“C++是一门庞大的系统,您不能要全部讲吧?我怀疑这个世界上是否有一个人理解C++的各个方面。你的主题是什么?”
完全出乎我的意料,他说:“类的虚表部分,我研究过这部分,而且做过一些测试。”
我惊讶的说不出话来。
是的,类似虚表这样的知识,却是在理解以及解决一些困难问题有极大的帮助;问题是,这根本不是使得C++更具生产力的哪怕最小的一部分。本质上,虚表机制仅仅是C++的一种实现机制,根本不属于C++语言本身,尽管目前几乎所有的C++编译器使用基于虚表的方法完成动态绑定,但是你完全可以使用其他的机制来做这个,一句话,这个和C++没什么关系,如果不是根本无关的话。
C++拥有大量的特性使得其比起其前辈C来更具表达力和执行力,从最基本的函数名重载,名字空间的使用,就近声明道稍复杂的类支持,继承和复用再到更复杂的模板元编程,其中每一个都在不同的昂面使得代码更简洁且具维护性。如果一个具有差不多十年的C++经验的工程师对C++的理解还停留在未入门的阶段,我不知道这究竟是谁之过。国内C++教学和学习的氛围太差了,比你想象的还有差几个量级。令人欣慰的是,最后我知道最近三年该应聘者所从事的项目大部分是基于C的,总算让我的希望不至于完全泯灭。
在最后的面试评价中,我这样说,“尽管该应聘者宣称其可以做C++方面的培训,但是根据其表现,我非常怀疑其是否接受过严格的C++训练以及从事过严肃的C++编程。”由于C++是我们的必需要求,该应聘者被拒绝。我后来有重复检查了一下他的笔试问题,他把在初始化列表构造成员和在构造函数体中初始化成员的含义完全弄反,不过是再一次佐证了我的断言。要知道,这份笔试题目是仅仅是针对一般的以C++为工具的应聘者的。
本文的题目叫做“什么使你与众不同”,似乎有点文不对题。我其实想要强调,学习任何一门技术,都有扎扎实实打好基本功,去学习真正重要的知识。因为你的时间资源是有限的,你把有限的时间放在一些不重要的东西上,你就没有更多的时间可以用来学习重要的东西。那么什么是你与众不同,当然是你的判断和选择!别让别人左右了你的方向。
最后的补充,该应聘者让人影响深刻的一点是,他有自己的内部wiki站点,用来汇集自己的点滴积累,为此鼓掌!尽管这很没有什么,但是不常见!这也可以解释尽管它在C++方面的积累非常少(尽管他不这样认为)也可以成功run项目的原因。最后,祝他好运。