猿題庫唐巧談招聘 像翻轉二叉樹這種題目是一定要考的
事件回放
2015 年 6 月 10 日,Homebrew 的作者 @Max Howell 在 推ter 上發表了如下一內容:
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.
事情大概是說,Max Howell 去 Google 面試,面試官說:雖然在 Google 有 90% 的工程師用你寫的 Homebrew,但是你居然不能在白板上寫出翻轉二叉樹的代碼,所以滾蛋吧。
這件事情如果發生在任何一個應屆生身上,那是再正常不過的了,但是偏偏面試者是有名的 Max Howell。于是乎,關于應該如何面試程序員,再一次被大家熱烈的討論。
我看了一下 Quora 和 Hacker News 上的討論,就此話題說說我的看法。
如何做這道題
在說招聘之前,我們先談談這道題應該怎么做吧。LeetCode 非常與時俱進地收錄了 這道題,我嘗試做了一下。由于 LeetCode 不支持用 Objective-C 或 Swift 寫,我只好用 Java 來寫,但是電腦里面沒有裝 Eclipse,所以我直接就在 LeetCode 編輯框里面提交了。
編譯錯了兩次,之后運行錯了一次,出現了 NullPointerException,于是想到沒有檢查指針為空,加上檢查之后,就通過了。下圖是提交記錄。
除去 LeetCode 自動生成的注釋和方法定義,我所寫的整個代碼行數為 9 行,大概花了 5 分鐘時間。代碼如下所示:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode (int x) { val = x; }
* }
*/
public class Solution {
public TreeNode invertTree (TreeNode root) {
if (root == null) {
return null;
}
root.left = invertTree (root.left);
root.right = invertTree (root.right);
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp;
return root;
}
} 那么這道題考查了什么呢?我覺得主要是考查了遞歸的思想。遞歸是程序設計的精髓,掌握了他可以將一個大問題分解成小問題,繼而求解。比如對于此題來說,反轉一個二叉樹其實就是:
- 反轉二叉樹的左右子樹
- 將左右子樹交換
而第 1 步又是一個反轉二叉樹的問題,所以就可以用遞歸來處理了。然后再考慮好遞歸的結束條件,這道題就可以解決了。
這是一道好的面試題嗎?
如果面試者是一個應屆生,我認為這是一道非常好的題目。因為應屆生剛剛學完學校的數據結構和算法知識,二叉樹和遞歸都是基本的知識,應該被掌握的。
如果面試者是一個有多年工作經驗的人,我認為這道題的難度其實不大,一個人即使多年不使用二叉樹,多年不使用遞歸,但是這種思考還是很容易想到的。當然,所花的時間可能會大一些。所以我并不認為這是一道難題。
但是,對于一個有工作經驗的人,考查他的工作內容,或許更有價值。因為相比代碼的邏輯思維能力來說,工作方式和解決問題態度,架構設計,設計模式都是更重要的考查點。
當我們面算法題的時候,我們在考查什么?
就像 Quora 上 提到的那樣,算法題面試被廣泛應用在各大頂級互聯網公司,包括 Google, 非死book, Microsoft, Amazon, Airbnb, Dropbox。在中國,這樣的情況同樣存在,BAT 的面試也充斥著算法題目。我當年在網易有道面試的時候,每一輪也都問了很多道算法題目。
但是,很多求職者都會問:“工作中用得到這些嗎?”,說實話,用得非常少。那么當我們面算法題的時候,我們到底在考查什么?就我的經驗來看,我們會從算法面試中考查到以下三點:
- 計算機的基礎知識。一個人基礎知識扎實,說明他在學校就很用功。
- 聰明程度。編程還是一個重智力的工作,智商高的人會在不停地知識更新中快速跟進學習。算法題其實就是計算機專業的智力測試題。這里面,動態規劃的算法題目由于變化多,體現得就特別明顯,考動態規劃其實就是測智力。
- 溝通能力和思維。面試算法題的時候,一般不會直接讓候選人寫代碼,而是會先一起討論。通過討論的過程,了解面試者溝通的能力和考慮問題的方式,也是考查的重點。
考查算法題會不會太片面?
是的,算法在工作中運用得比較少,一般人也不會在工作中專門積累解算法題的能力。所以通常做算法題最強的是應屆生,因為他們有時間去刷題。而在 實際工作中,很多能力,都比算法能力重要。比如對代碼的潔癖,對設計模式的理解,對計算機底層(操作系統、網絡)的理解,對待工作的態度等。
那么,為什么那么多公司不考查,或者不重點考查這些,而只是問算法題呢?
答案很簡單,因為要在幾個小時內了解一個人太難了。通常一場面試只有一個小時,如果要在一個小時內把上面說到的知識點都面面俱到的考查,是做不 到的。但是如果花幾天來考查,對于公司和求職者都是不可接受的。所以,很多大公司就用面算法題的方式來偷懶,因為這種方式雖然可能會誤傷很多優秀的人才, 但是不合格的人,要混進去還是相當困難的。
講一句不好聽的,很多公司在招聘的時候,首先根據學校,把非 985 的學校簡歷都過濾掉,也是一種不太合理,但是有效的方法。清華北大的人一定就牛逼嗎?不一定,但是從概率上講,比南翔技校的人通過面試的機會要高一些。所 以,為了提高面試效率和成本,就直接把一般學校的簡歷過濾掉,這是一個不人道,但是從經濟上合理的行為。
我自己也因為這個選拔方式深受打擊,我自認為還是非常優秀的,在學校時拿到過 ACM 國際大學生程序設計競賽的區域賽金牌,也在 IBM 實習過,學校專業課成績也很好,但是畢業那年我連 Google 的筆試資格都沒拿到。人家就在清華北大選人才,就足夠了。
我們應該怎么辦?
現有的面試方式,其實讓公司和候選者都不是太爽,主要的原因就是考查的時間太短,能夠參考的信息量太小。但是,隨著互聯網的發展,作為程序員,我們慢慢有了更多的方式來讓公司在面試前就了解自己。
我們可以搭建自己的博客,將自己的學習心得總結下來。我們可以將自己寫得好的代碼開源在 Github 上。我們可以在 stackoverflow 上回答問題,用 reputation 來證明自己的能力。我們還可以給著名的開源項目提 PR,成為重要的 Contributor。我們可以給 InfoQ 網站投稿。我們可以去 QCon 上分享技術。
如果你能在網絡上構建起自己的技術能力圖,那么對于很多公司來說,或許面試中偏技術性的考查就不那么重要了,面試的過程就可以更輕松愉快了。
但是,不要高興得太早,要做到上面提到的這些只會比做算法題更難。但是,至少我們可以讓自己的實習得到充分展示,能夠讓面試不那么片面,能夠讓公司更加全面的了解自己。
所以說最后,機會還是給那些努力的人。如果一個人學校不好,沒有做過什么大項目,在網上沒有任何可以考查的信息,那么面試的時候,估計等待他的還是各種算法題。
猿題庫是如何招聘的?
或許你會失望,我們其實就是和 Google 一樣,會問大量的算法題。即使你來自名校名企,但是不會翻轉二叉樹,我們肯定會把你拒掉。
對于有經驗的開發者,我們會適當降低算法題的難度,同時考查一些工作經歷,但是翻轉二叉樹這種難度的題目,是必須做出來的。
所以,如果你沒有各種社交網絡的資料證明自己的實力,那還是老老實實把基礎知識準備扎實吧。算法知識雖然用得少,但是在關鍵時候還是有用的,以后我會另外撰文舉例。
愿大家都能找到自己的伯樂~