話說其實我很久沒有被正經面試過了。一開始去微軟實習自然經過了經典的筆試和幾輪面試,然後去了朋友的創業公司並立即被激動集團收編——沒有面試,接著從激動集團去合夥創業——沒有面試,然後被朋友推薦去盛大創新院——面試更像是討論及聊天。由於長久缺乏職場磨練,我雖然對自己能力有一定信心,但也懷疑自己如果通過“正經渠道”去面試的話能有多少機會成功。而這次面試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分的及格線,幸好終究沒有在陰溝裡翻船。
以上便是我這次整體的經歷。我也不想總結出什麼理論地哲學化的大道理,就這樣完整地記敘一遍吧。
原文:趙劼