前段時間 ThoughtWorks 在網上和拉勾網合做搞了一次網絡招聘,名爲拋棄簡歷!讓代碼說話!,可謂賺足了眼球,不少程序猿紛紛摩拳擦掌、踊躍提交代碼,在網上也是討論的熱火朝天。git
我恰巧也在微博上看到了這條招聘信息,按我之前的性格對這類信息是不會感興趣的。一則本身自信向來不足,二則慣性思惟大公司出題通常都很難,好比智力題之類的。只是本身最近恰巧想換工做,因而便點進去看了看。github
整個題目看下來以爲還好,不怎麼難,主要考察基本功和編程習慣,好比面向對象編程思想、設計模式、單元測試之類的,而且語言不限。有人說他能夠用 10 行代碼就搞定,我絲絕不懷疑這個說法。但以我對 ThoughtWorks(WikiPedia) 的瞭解,他們出這道題的意圖應該不是比誰用的代碼行少或者誰的效率高,這畢竟不只是 ACM。面試
因而,本身便認認真真花了兩個晚上的時間把這道題完成而且提交上去。在這道題中我用了簡單工廠模式和策略模式,若是非要套還能夠套一個狀態模式。編碼也基本反應了我在平時工做中的習慣,而且基本用了面向接口編程以最大可能的下降耦合。編程
詳細信息請查閱拉勾網:【拉勾專場】拋棄簡歷!讓代碼說話!小程序
代碼要求:設計模式
1,語言不限,Java, C#, Ruby, C++, Js, Python, Scala, objective-C通通能夠,小語種也沒問題,只要你擅長;網絡
2,強烈建議寫單元測試;架構
3,請展現出你超讚的面向對象/函數式編程功底;併發
4,建議儘可能減小圈複雜度;框架
5,請提交可運行的代碼,及相關構建腳本/說明文檔(代碼運行平臺和環境);
FizzBuzzWhizz
你是一名體育老師,在某次課距離下課還有五分鐘時,你決定搞一個遊戲。此時有
100名學生在上課。遊戲的規則是:
你首先說出三個不一樣的特殊數,要求必須是個位數,好比三、五、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 那一項,由於提早作了。
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