话说其实我很久没有被正经面试过了。一开始去微软实习自然经过了经典的笔试和几轮面试,然后去了朋友的创业公司并立即被激动集团收编——没有面试,接着从激动集团去合伙创业——没有面试,然后被朋友推荐去盛大创新院——面试更像是讨论及聊天。由于长久缺乏职场磨练,我虽然对自己能力有一定信心,但也怀疑自己如果通过“正经渠道”去面试的话能有多少机会成功。而这次面试IBM终于算是过足了面试瘾,记录一下。
大约一两个月前,我收到一封邮件,某同学忽悠我去尝试下在IBM的.NET工作机会。我感觉这机会似乎还不错,也正好想考察一下自己的面试水平,于是表示说愿意尝试一下。很快收到HR的邮件,让我做一套在线的笔试题。
笔试题分两部分,一部分是.NET测试,另一部分是英语测试,分别有几十道选择题。HR在电话里说,.NET测试会偏向理论一些,有些难,可以用搜索引擎找下答案。被她那么一说我也不知道该如何是好,更不知该如何准备,于是就打算死马当活马医,霸王硬上弓吧。当天晚上直接打开链接做题,做了以后才发现,所谓“偏理论”估计是HR从以往的被面试者那里得到的反馈,事实上这套题目考的其实就是我一直强调的.NET基础,例如C#语言的特性(从面向对象到LINQ里的种种),CLR的一些表现,BCL内常用类库的实现细节,还有就是代码阅读题了。总体而言其中相当部分也是我常用的面试题,自然正中下怀。
.NET笔试十分顺利,但英语就麻烦许多了。要知道自从大学前两年的英语课以外,我已经好多年没有正经地学过、考过、用过英语了,什么GRE,托福,雅思,甚至六级我都没接触过。英语测试就跟传统的测试一样,例如给你一大段文字,提出一个问题,并选择一个正确答案,还有选出出现语法错误的某句话。测试的内容涉及政治、金融、文化、生活等方面,唯独没有我最熟悉的——技术领域的内容。尽管有Google和Bing翻译,但是从实际效果来看,自动翻译技术要达到“可用”还有很长的路要走。
第二天一大早就我收到的结果,.NET测试96%,这意味着我的成绩在“做过这套测试”的人里面排在前5%。为此我也暗自得意了一番,因为从某同学那里了解到,在之前应聘这个职位的人里面,笔试成绩无一超过50%。此外我的英语是71%,而“及格线”似乎是30%。总体而言,我的笔试成绩应该还是比较令人满意的。于是,HR跟我预约了第二天的电话面试,由J.P.Morgan的人来面试,全程英语。
于是我立马找出机器里的一堆技术视频来看,希望能让耳朵适应一下英语内容。听下来感觉倒还算不错,基本没有大大障碍。但是在第二天电话面试的实际过程中,我发现一旦隔了电话,导致背景里出现了很多噪音之后,听力立马会打一个折扣(适应以后会好一些)。面试我的人是两个老外,基本上没有口音(或者说就是美剧里常见的标准口音)。他们问了我很多东西,有部分和笔试差不多,例如最典型的:某对象分配在堆还是栈上——有趣的是,在他们的追问中,我也发现原来这个问题在流传甚广的“标准答案”以外还有一个变数,不过我略加思考应该也回答地没有问题。还有印象比较深刻的便是让我解释一下LINQ的相关内容(例如LINQ Provider的实现方式),GC的工作方式及特点,多线程开发会遇到的问题等等。就我个人感觉来说,这些问题我都应该回答地不错,用“对答如流”来形容似乎也不太过分。与其形成极端对比的是,对于WPF和WCF方面的问题,我也没有作任何“挣扎”,基本都是直接回答“不好意思,没有接触过,不太清楚”。电话面试耗时大约50分钟。
比较有趣的事情是,我在简历和自我介绍里提到我平时接触过及感兴趣的技术(基本就是我博客右边写的那样),可能他们也正巧对Scala感兴趣(毕竟是要用Java的),于是就提出让我向他们解释下Scala这门语言。解释地过程没有什么值得一提的,不过我也适时地表达了我对Java一贯的厌恶态度,我的原话是:Java is a dead language, it sucks,然后就围绕Java语言展开了简单地讨论,主要还是我以前谈过的那些。例如我解释道,我很喜欢Java平台、类库、框架、运行时等等,讨厌的只是Java语言;我很了解和关注Java语言,说它dead是因为它死不肯演化或者演化地很奇怪(Java 7和8);还有Java表达能力太差,虽然看上去简单,但是需要太多代码,写完了以后还看不懂。前段时间有人问我说去了IBM以后还会不会骂Java?我说我就是骂着Java进IBM的,所以绝对会继续骂不停口。而且我很希望到时候我在骂得时候,某些弟兄不要仅仅看到我是微软MVP的身份,也可以顺便一提IBM员工这茬。
电话面试后的第三天,HR又给我来电话说通过了,说接下来便是一场“面对面”的面试,地点在深圳。会有两个团队的人从香港过来与我面试,一个是做.NET的,一个.NET和Java均有涉及——同时还发给我一份Java的在线笔试题,说希望我能在面试前完成“以供参考”。那天正好是个周五,而面试安排在周一,与.NET的裸考不同,我有一个周末的准备时间。有了.NET笔试的经验,我估摸着Java笔试应该也是类似的题目,于是找了本一千多页的SCJP的辅导教材,认真地啃了一天半。期间也弥补了我对Java语言认识的一点缺失,因为我实在被Java的内嵌类、匿名类、泛型的复杂度给恶心到了。后来再有人跟我说Java语言简单,我就会回应说其实“它比你想象地要复杂很多”,要不我们可以来谈谈某些话题——更重要地是,复杂而不好用,导致人们会刻意规避这些复杂度,因此“连你也不知道Java语言原来这么复杂”。
不过Java笔试其实比.NET要简单不少,完全没有涉及Java语言的复杂部分,更像是考一些代码阅读题以及基础类库,对于后者我只能根据一些“常识”和“经验”来猜测结果了。最后我的Java笔试成绩是93%,也算是不错的样子,面试时老外跟我的开场白便是说我.NET和Java成绩都很好——他的组会同时使用Java和.NET。倒是原本提到的用.NET那组的面试,由于签证没有过关,只是在电话里简单地聊了几句。
面试房间有白板,因此面试的方式也有所不同。首先他提出一些业务上的场景,给我一些可用的组件(例如持久化队列),让我在白板上画出解决方案的设计图。然后他会继续做出一些假设,例如某一个服务的压力提高,成为了性能瓶颈,那么可以如何改进这个服务。不断涂涂改改最终也差不多画满了整面墙。此外还有各种关于性能诊断和优化的问题,涉及到日志记录的设计,CLR(主要还是GC部分),WinDBG,数据结构(线性表,哈西表,优先队列,平衡二叉树)等等。这些大都是开放题,因此可以谈得东西不少,我也不太担心因为不了解而无言以对。而且因为可以使用手势和示意图来辅助我那半吊子英语,也比纯粹在电话里的交流来的清楚。此外对方也谈到他对JVM的了解多过CLR,所以很多时候我也更像是在“解释”CLR的行为,目的是能够让对方理解,而不是去“迎合”对方心里的正确答案。总体而言,面试后的感觉其实比电话面试更有自信一些。
回到上海后,我也很快收到了回应:我通过了J.P.Mongan方面的面试,也是第一个通过的.NET技术人员。剩下的便是令人烦躁的Offer商讨问题,略过不谈。值得一提的是,在正式发Offer之前,IBM还让我做了一套智力题(就是那种根据规律选则下一个数或下一幅图),据说是每个IBM员工都需要经历的测试——这是我整个过程中经历的最困难,也是最没有信心的环节了。最后我得了72分,堪堪超过65分的及格线,幸好终究没有在阴沟里翻船。
以上便是我这次整体的经历。我也不想总结出什么理论地哲学化的大道理,就这样完整地记叙一遍吧。