ThoughtWorks 面試備忘錄
前言
前段時間 ThoughtWorks 在網上和拉勾網合作搞了一次網絡招聘,名為拋棄簡歷!讓代碼說話!,可謂賺足了眼球,很多程序猿紛紛摩拳擦掌、踴躍提交代碼,在網上也是討論的熱火朝天。
我恰巧也在微博上看到了這條招聘信息,按我以前的性格對這類信息是不會感興趣的。一則自己自信向來不足,二則慣性思維大公司出題一般都很難,比如智力題之類的。只是自己最近恰巧想換工作,於是便點進去看了看。
整個題目看下來覺得還好,不怎么難,主要考察基本功和編程習慣,比如面向對象編程思想、設計模式、單元測試之類的,並且語言不限。有人說他可以用 10 行代碼就搞定,我絲毫不懷疑這個說法。但以我對 ThoughtWorks(WikiPedia) 的了解,他們出這道題的意圖應該不是比誰用的代碼行少或者誰的效率高,這畢竟不僅是 ACM。
於是,自己便認認真真花了兩個晚上的時間把這道題完成並且提交上去。在這道題中我用了簡單工廠模式和策略模式,如果非要套還可以套一個狀態模式。編碼也基本反應了我在平時工作中的習慣,並且基本用了面向接口編程以最大可能的降低耦合。
筆試題目
詳細信息請查閱拉勾網:【拉勾專場】拋棄簡歷!讓代碼說話!
代碼要求:
1,語言不限,Java, C#, Ruby, C++, Js, Python, Scala, objective-C統統可以,小語種也沒問題,只要你擅長;
2,強烈建議寫單元測試;
3,請展示出你超贊的面向對象/函數式編程功底;
4,建議盡量減少圈復雜度;
5,請提交可運行的代碼,及相關構建腳本/說明文檔(代碼運行平台和環境);
FizzBuzzWhizz
你是一名體育老師,在某次課距離下課還有五分鍾時,你決定搞一個游戲。此時有
100名學生在上課。游戲的規則是:
你首先說出三個不同的特殊數,要求必須是個位數,比如3、5、7。
讓所有學生拍成一隊,然后按順序報數。
學生報數時,如果所報數字是第一個特殊數(3)的倍數,那么不能說該數字,> 而要說Fizz;如果所報數字是第二個特殊數(5)的倍數,那么要說Buzz;如果所 > 報數字是第三個特殊數(7)的倍數,那么要說Whizz。
學生報數時,如果所報數字同時是兩個特殊數的倍數情況下,也要特殊處理,比> 如第一個特殊數和第二個特殊數的倍數,那么不能說該數字,而是要說FizzBuzz, > 以此類推。如果同時是三個特殊數的倍數,那么要說FizzBuzzWhizz。
學生報數時,如果所報數字包含了第一個特殊數,那么也不能說該數字,而是要> 說相應的單詞,比如本例中第一個特殊數是3,那么要報13的同學應該說Fizz。如果> 數字中包含了第一個特殊數,那么忽略規則3和規則4,比如要報35的同學只報
Fizz,不報BuzzWhizz。現在,我們需要你完成一個程序來模擬這個游戲,它首先接受3個特殊數,然后輸出100名學生應該報數的數或單詞。比如,
輸入
3,5,7
輸出(片段)
1
2
Fizz
4
Buzz
Fizz
Whizz
8
Fizz
Buzz
11
FizzFizz
Whizz
FizzBuzz
16
17
Fizz
19
Buzz
…一直到100
電話面試
ThoughtWorks 的工作效率還是挺高的,沒過幾天便接到他們 HR 的電話,說我代碼通過了,他們想了解一些我的基本信息,並且邀請我在合適的時候去他們公司面試。其間,問了我幾個印象比較深的問題:
-
期望的薪資?
這個問題比較突然,說實話我還沒准備好,近期都忙着看書准備面試了,還沒來得及思考。於是便說了下自己現在所在公司的待遇,當然相比現在有所增加,這點我還是沒那么傻的 _,HR 聽了也沒說什么。
-
出差較多,一年大概有 50% 以上的時間,國內國外都有,主要是國內,
能否接受?我對於出短差是不抗拒的,但對於他們給出的這個出差節奏還是覺得難以接受,但為了得到面試機會還是說了不介意出差。
-
英語水平怎么樣?
這個我就如實回答了,CET-6,基本啞巴英語,讀寫沒問題,聽說不行。HR 聽了也沒說什么。
-
項目經歷?
由於我當前從事的工作具有一定的保密性質,不便透露具體項目信息,想給她講一下我們系統的軟件架構(當時也昏頭了,給 HR 講這個她聽的懂啊),HR 讓我還是說點工作之余還做些什么吧。於是,我便如實說最近都在學 Python ,用 Python 做了個小程序抓取豆瓣上的電影信息。
經過大概二十分鍾的溝通后,約定了面試的時間,便掛斷了電話。晚上便收到了 HR 發的面試流程郵件,由此得知有如下幾個流程:
-
Paper Test
也就是邏輯測試。
-
Pair programming with Developers
和他們的開發人員結對編程。
-
Interview with Developer and PM
與他們的開發人員和 PM 討論應聘者的技術專長。
與 ThoughtWorks 的傳統面試流程相比,少了 Homework 那一項,因為提前做了。
Paper Test
2014 年 5 月 15 日,七點就早早起床,因為面試的地方在天府軟件園,離我這邊太遠了。洗了個澡,下樓吃了個早飯(平時都不好好吃早飯的,專門為了面試吃了個早飯,怕體力不支),然后就匆匆忙忙的趕公交去了。
這一路真是夠折騰的:先是坐公交,然后換乘地鐵二號線,然后在天府廣場換乘地鐵一號線,到了終點站世紀城后又換乘公交,最后還得步行幾百米才到達目的地。我當時就想如果以后真在這里上班,這每天在路上就得花費四個小時,還讓不讓人活啊!
順便吐槽一下高德地圖。本來我一直都是用百度地圖的,那天心血來潮(其實是想聽聽志玲姐姐的聲音)換成了高德地圖,用了幾天就發現了幾個嚴重的問題:
- 耗電太厲害了,只要把高德地圖打開,就能看到那電量唰唰唰的往下掉。
- 由於耗電太厲害,導致手機發熱嚴重。
- 最可惡的是經常搜索地點的時候提示我網絡不可用,讓我檢查網絡。為此我還專門用其他程序試了網絡的,一點問題也沒有。然后多搜索幾次,它又可以了。
當晚回家就換成了百度地圖。
不得不說我的時間觀念真的很強,剛好提前二十分鍾到達公司。ThoughtWorks 在一棟黃色寫字樓的七樓,到樓上后還不能直接進去,他們的門是刷卡的,前台妹妹幫我開了門,我說我是來面試的,她就問我是哪個 HR,我回答是某某,然后她就讓我在旁邊稍坐一會,她去叫某某。全程態度都很好,后來發現前台妹妹應該也是該公司質量最高的。
乘着等人的間隙,快速掃描了一遍公司環境。公司布置的很溫馨,到處牆上都貼着字條、照片什么的,也擺放了一些花花草草,看起來還是很舒服的。他們的辦公桌全部是挨着的,沒有隔開,沒什么私人空間,可能是為了方便結對編程吧。
不一會我的 HR 就過來了,寒暄了兩句就把我帶到了一個小辦公室里,然后給了我一疊試卷和一張保密協議。然后問我現在就開始做還是等十點整開始做,我回答都可以,看你們安排,然后她就說那就現在開始做吧,從 9:45 到 11:45。
整個試卷都是英文的,這一點我也有所耳聞,對於英文的讀寫我到是一點不擔心,何況他們還給了一張單詞表。由於保密協議規定不能泄露他們的題目,否則我也可以回憶幾道題目出來。這些題目都是邏輯測試題,主要就是模擬程序中的賦值、自增、自減等操作,開始會給你兩個例子,讓你明白一些基本的操作,然后就是正式的題目。
開始由於緊張會做的慢一些,隨后會越做越快。整套題做下來,最難的不是題目本身,而是英文。平時讀英文都是讀個大概,而現在需要每字每句都讀懂,特別是有定語從句套定語從句的,一不小心就會弄錯。
遺憾的是,我到最后也不知道自己究竟得了多少分。
午休
做完 Paper Test 也差不多十二點了,HR 想的還是很周到,幫我定了盒飯。於是,我便在他們的餐廳和他們一起用餐。餐廳里的裝備還是很齊全的,冰箱、微波爐、咖啡機、各種飲料、茶葉都有,從這點來看公司還是比較人性化的。
結對編程
傷心的時刻終於到來了。
按照計划,下午兩點到三點半是結對編程。還是剛才那個辦公室,我坐中間,一邊一個 ThoughtWorker,都是典型的程序猿長相和裝扮,其中有一個說話我有點聽不清楚,這讓我很驚訝,因為之前我聽說 ThoughtWorks 招人都愛招口才好,能說會道的。
首先,他們還是讓我先講一下我的那個程序的思路。我這個人就是不善表達,而且比較懶,連說話都嫌費事,就只是簡單說了幾點考慮:
- 運用了面向對象的思想,對照程序,舉了幾個例子。
- 運用了幾種設計模式,結合程序,指出了哪些地方用了哪種模式。
- 考慮了擴展性和可維護性,程序的輸出專門定義了接口。
他們聽完也沒說好也沒說不好,其實從始至終他們也沒說哪里好哪里不好,這讓我覺得心里沒底。
然后就進入了下一環節,真正的上機編程。題目就是之前的題目,只是增加了一條規則。他們讓我先看新規則,由於多少有點緊張,我看題的時候老是看不進去,頭腦還會偶爾空白,花費了不少時間才看懂題意,不知道這個會不會已經減分了,雖然他們說沒關系,讓我慢慢看。
這個時候他們問我,既然我提交的程序里做了單元測試,對單元測試了解程度怎么樣?我就如實回答了,對於敏捷開發有所了解,以前自己也嘗試過做 TDD 開發,但由於現在的單位沒有使用敏捷開發,因此不是太擅長。然后他們就讓我考慮一下應該怎么做這道題,還給了我幾頁紙和一支筆。
我想了一下,新增加的這條規則也不復雜,就修改某個函數,增加幾個分支就可以了。於是便照實跟他們說了,他們說只要我想好了就開始,不過讓我先寫單元測試。然后在寫單元測試的時候,在方法名字上,他們給我指出了一些問題,我以前是習慣先寫方法名然后再跟測試條件,比如 GetResultWith...,他們說這樣不好,並給我舉了個例子:ShouldIgnorRule5With...,於是我便依葫蘆畫瓢寫了個測試用例的名字。
其間還有個小插曲。之前那位說話我不太聽得清楚的面試官,萬萬沒想到他的英語發音我更是聽不清楚,不知道是他的發音不標准呢,還是我的聽力太爛?
然后在他們一步一步的引導下,寫了三個測試用例,都測試通過。
本來我以為結對編程就到此結束了,萬萬沒想到啊,他們又開始問了。
-
除了 C# 還會哪些語言?
我便列舉了一些自己會的語言,比如 C++,PHP,JavaScript,HTML/CSS 等。然后又說自己最近在學 Python,做了個小程序從豆瓣抓取電影信息。
-
對於學習語言有什么看法?
我說首先要有興趣,才會有動力去學。其次,在實踐中學習是最快的,光看理論會很痛苦,也容易忘,如果結合一些小項目,在實踐中去學會達到事半功倍的效果。
-
在以往的工作中遇到過什么技術難題,怎么解決的?
我說我現在從事的工作技術難度不是特別大,既沒有高並發也沒有大數據,在工作中沒遇到過太難的技術問題。曾經遇到過的一個問題是在C#中調用非托管C++以及在非托管C++中調用C#。前者可以通過P/Invoke平台調用,只是對於一些復雜的數據類型封送起來比較麻煩,可以考慮用序列化的方法通過字節流來傳遞。后者實現起來就比較麻煩了,最終我是通過托管C++做中間層來實現調用的。然后他問我為什么不做成服務用遠程調用呢?我說因為他們是進程內的調用,那樣做反而復雜了。
-
怎么解決某個經典的 UI 線程問題,即在非創建線程里試圖操作某個控件時引發線程間操作無效: 從不是創建控件的線程訪問它異常?
這個問題在實際開發中經常遇到,我的回答是使用委托回到創建線程去操作。或者使用SynchronizationContext的Post/Send方法來解決。
-
知不知道C#中新增了某個異步操作的關鍵字?
這個我還是如實說了,我們現在工作中用的C#版本是 4.0,也就是 VS 2010,但這個關鍵字我在網上看到過,好像叫 async 什么的吧。
-
比較 Remoting、WCF、ICE?
這個問題是由於我說我在工作中使用了分布式 RPC 框架 ICE 引起的,然后他就讓我比較一下這幾個框架。我說前兩個都是微軟自家的,在跨語言跨平台上不行,WCF 是在 Remoting 的基礎上發展而來的,我在工作中用的不多;ICE 支持跨語言跨平台,我們工作中最終選了它。
-
說說 .NET 這些年新增了哪些特性?
我說了泛型、LINQ、默認參數、可選參數,一下子還真想不起來太多。
-
讓我選一個我擅長的技術,給他們做一個像演說一樣的講解。
本來這可能是最重要的一個問題,可是我卻把它當成了最不重要的問題回答了。我的回答跟剛才某個問題很像:我現在的工作沒用到什么高深的技術,沒有什么好講的。意思是這樣,原話不是這樣。
-
最后,他們問我有沒有什么問題問他們?
我當時也沒准備什么問題,臨時隨便問了一下他們現在成都這邊 C# 開發人員多嗎?又是剛才說話我聽不清楚那位回答:我們這邊現在只有一個 C# 的項目,其他的基本都是 Java 的。然后我又問,那如果沒有 C# 的項目了怎么辦呢?我問這個問題的初衷是因為在網上看到說 ThoughtWorks 有淘汰機制的,想問一下是不是這樣就會被淘汰。沒想到,面試官好像有點生氣,回答我說:你怎么會問這樣的問題呢?一個程序猿不應該僅僅局限於一門語言,項目需要什么語言我們就用什么語言,像我以前也是做 C# 的,現在也做 Java 了,他(指另一位面試官)是做 Python 的,也會其他語言。我不知道他為什么會有這么大的反應,但我卻知道了尼瑪原來他們兩個都不是 C# 程序猿啊,至少已經很久不是了,而且 C# 在成都分公司也是朝不保夕的地位。
對於新語言的學習,我從來不排斥,大學選擇軟件工程就是因為熱愛編程,前不久還通宵調試過程序,現在也在學習 Python 和 PHP,他們可能誤解了我問題的意思了。
結局
幾分鍾后,HR 進來告訴我:對不起,經過我們的面試,我們覺得你現在與 ThoughtWorks 的文化還是不太契合。其實,之前的面試過程我的感覺都還不錯的(盲目樂觀),與兩位面試官的相處也很融洽,滿以為可以進入下一環節了,沒想到說我沒通過。當時可能自尊心作祟,一下就憤怒了,但我還是盡量克制,沒表現出來,匆匆離開了公司。
回去的路上越想越不通,遂發郵件詢問 HR 我被拒的原因,HR 到也很快就回復了我,建議我在技術的深度和廣度上做一些提高。但我不相信這是真實原因,我在想是不是邏輯測試太差了,然后又發郵件詢問邏輯測試成績和其他原因,這一次就再也沒有回復了。
總結
這是我從畢業到現在的第二次面試,第一次面試就是現在所在的單位。總結了一下面試失敗的原因:
-
缺乏面試技巧
很多問題回答的太實在了,換一種說法可能結局就不一樣了。
-
平時的積累總結不夠
雖然說現在的工作沒有太多的技術難題,但其實還是有很多可以總結的東西。平時遇到問題,想辦法解決了就算完事了,也沒怎么去總結,導致現在什么都說不出來。
-
不善言辭,不會表達
這個面試絕對不是我的真實水平,很多我會的東西都沒表達出來,他們在我的腦海里橫七豎八亂糟糟的放着,缺乏系統性、連貫性,導致讓我講的時候,千頭萬緒,不知從何說起,每一個小的知識點挑出來講似乎分量都不夠,但又串不起來。
-
技術有待提高
我現在的技術很多時候都浮於表面,缺乏深度,解決常規性問題沒問題,一旦遇到真正的技術難題可能就解決不了。
對於他們給我的建議,我會認真執行的,也感謝 ThoughtWorks 給了我一次難忘的面試經歷。
P.S 這個是我對這道題提交的代碼:FizzBuzzWhizz