你的面試有問題,別再錯過天才了!

旁觀者發表於2012-03-30

My Problem With Your Interviews

在經歷了3輪電話面試且被Facebook拒絕之後,我發表了本文,但這不是出於報復心理。事實上,我幾個月前就已經打算寫這篇文章了。現在言歸正傳:技術公司(至少包括Google,Facebook,VMWare,毫無疑問還有很多)正在試圖尋找最棒的技術人才。(所以他們聯絡我,詢問是否有興趣與他們一起“探尋工作機遇”)。但是他們如何做到這點呢?

典型的面試(比如電話面試,或者現場面試)充斥著解題過程。有些人將其稱為“智力測驗”。它們通常不是真實世界的問題,目的是為了核實你的演算法技巧和你的電腦科學知識。簡單的包括遞迴,二分查詢,基礎資料結構(連結串列,雜湊表,樹)。更復雜的要求紅-黑樹,迪傑斯特拉(Dijkstra)演算法,NP完全性(NP-completeness)知識等。如果在電話裡,你在一個共享檔案中寫下程式碼。如果在現場--你在白板上寫下來。因此,這些難題應該檢驗你的電腦科學和演算法技能。不過讓我們退一步從另一個角度來看這幅場景。

  • 你在這些面試裡做的事情都是你從未在實際生活中做過的:你在不用編譯器或偵錯程式的條件下寫程式碼。你在有限的時間內做這些,並且是在別人的監視下或者線上等待中進行。但是暫時把這些放一邊,我們假設寫無法執行的程式碼有助於面試。

  • 這些智力測驗測試的技能都是大多數開發者從來不需要的。大多數人撰寫商業軟體,它並不需要紅-黑樹。你最近一次在商業軟體中使用遞迴是什麼時候?你最後一次完成這類事情是在大學。並且如果你是一名大一新生,其中的很多問題實際上都很簡單,因為你前幾天剛作為一項家庭作業把它們做完。但另一方面是,撰寫即使像二分查詢這樣簡單的事情也變得有點乏味,因為你只是昨天沒有做這件事而已。當然你將會完成它,但是要花一點時間,以便你能夠回憶起來,並且為了確保無誤而使用編譯器。(順便說一下,facebook的面試題真的很簡單。然而我沒有完成得很理想的確是我的失誤,也許應該歸根於面試緊張,或者只是因為我過去3年來都沒有做過此類事情而已。)

  • 不管怎麼說,測試的技能都是在你日常工作中很少用到的。即使是在像Google和Facebook這樣酷的公司裡,也仍然存在相當平常的專案,譬如需要編寫API程式碼,維護現有程式碼等。我不認為在你進公司的第一週會被允許微調搜尋引擎,不論你在面試中表現有多棒。

  • 在這些面試之前的面試準備是建議的,甚至實際上是必需的。準確的說,面試就像一場大學考試。但這樣就令人無語了--你並不希望人們針對你設定的面試標準去做準備。你希望他們都是。。。好的程式設計師。

  • 聚焦於這些電腦科學技能意味著這些公司可能會錯失優秀的工程師,即那些僅僅不對底層細節如此感興趣的人。

順便說一句,這是我在第一次Facebook電話面試後的一條回覆摘錄:

在另一方面,我認為在面試高階開發者時涉及電腦科學一年級家庭作業題並不是一個好主意。事實上--大多數人(包括我)在大學之後就沒有做過這些了,而且這看起來更像無意義的問題而不是實際程式設計。

以上列出的問題就是為什麼我不喜歡這類面試的原因。很顯然是因為我不喜歡解決這類難題。我只是不喜歡它們,它們對我毫無吸引力。你可能會爭辯說,除了日常工作以外,為了持續訓練演算法技能你可以參加(像TopCoder之類的)程式設計比賽。我會介紹一段自己高中時期的經歷。那時有兩種學生比賽--一種就極像這種型別的程式設計難題--在規定時間內佈置了大量這種難題,你必須提交一個覆蓋了儘可能多預定義(但是你尚不知道)的測試案例的解決方案。另一個比賽是在家建立一個軟體,然後當著評委會的面展示它。我在後者中是第一名,但是在前者中慘極了。為什麼?因為我討厭僅僅為了解題而去解決無用且不切實際的問題。相反我喜歡開發軟體。如果我愛好它們的話,我也許會擅長解題。我只是不喜歡而已。這並沒有技能的等級之分--一種是能解決複雜演算法難題的人(高階),另一種無法解決的人,因此只能去開發軟體(低階)。而是存在兩種不同種類的技能,並且在建立優良軟體的過程中它們都是有用的。一個撰寫底層部分,另一個設計API,架構,部署方案,處理程式碼抽象。那麼,回到“除了日常工作之外我現在做什麼”的問題上來--我負責構建過程。我已經在幾個我很喜歡的私人專案中工作過。這遠遠超出了我或許本應該很享受的TopCoder比賽的期望。

不幸的是這些很酷的公司主要僱用TopCoder型別的人。大概說得通的原因是,因為他們有大量的求職申請者,並且他們能夠負擔得起許多“錯誤-否定”。但是許多更小的公司採納了這些面試慣例,也因此他們未能得到最棒的技術人才。我讀過的最棒的關於軟體工程師面試的文章在幾周前剛剛出現。Jeff Atwood建議如何僱用一名程式設計師,我完全支援他的方法。

而我在面試時的問題就是他們實際上並不驗證你是否能做現實的程式設計工作。並且很明顯我的問題是我並不喜歡底層與演算法之類的東西,因此我無法為像Google和Facebook這樣酷的公司工作。

重要提示:我並沒有說你不應該知道計算複雜度是什麼,一個雜湊表如何工作,或者如何撰寫遞迴。你應該知道這些,因為那是為了能夠撰寫優良程式碼所必需的基礎。但是我認為對這些事情過於關注是與日常程式設計毫不相干的。(話說回來,如果我是一個只能用PHP寫網站並且認為雜湊表是一種傢俱的徹底的蠢蛋,是不可能通過前兩輪電話面試的。)

原文:My Problem With Your Interviews

iTran樂譯參加活動,讀好文章!

相關文章