50萬年薪程式設計師的面試題
有一位網友發了他們最近招聘時使用的一個面試題,把它作為薪資的薪資的參考標準之一,如果回答得好,就定位在50萬以上年薪。題目是這樣的:
有一個 10TB 的數據文件,裡面內容全是 64bit 整數,大小順序是亂的,要求把原有 10TB 文件中所有整數進行排序,排序後內容寫到新文件中,只用標準 C/C++ 或者 Golang,不用其他任何第三方工具庫,如何解決這個問題? 估計程式碼量大概多少? 寫程式碼和調試,一共需要多長時間實現? 在普通伺服器上,完成排序,需要運行多長時間?
非常經典的 大文件排序,這種類型的題目我看著特別有親切感。因為我自己是做大數據的,Hadoop MapReduce 底層實現里有相當一部分程式碼是專門做這個事情的,當時看過之後受益匪淺,最大的感受就是單純的文件排序(理想環境)和特定業務場景下的文件排序(現在環境)實現複雜度完全不是一個量級,有興趣的同學可以自己翻一下相關的源碼實現(Java)。
後來在團隊招聘的時候,很多候選人面試過程中都會提及 Hadoop MapReduce Shuffle 的實現過程,用於證明自己對於大數據底層實現原理是有研究的。提到的次數多了之後,我就發現大部分同學這部分內容的理解多數來源於《Hadoop權威指南》這本書相關的章節,描述的整體流程是沒有問題的,但很多都經不起推敲,涉及到實現細節,每個人掌握的程度差別就很大了。
考慮到不是每一個同學都會了解這個實現過程,或者看過相關的源程式碼,就做了一個簡化:完全脫離 Hadoop、Spark、Flink 之類的框架環境,就一台本地伺服器,用一個你自己熟悉的程式語言,不藉助第三方庫,針對大文件排序的問題,給出實現方案和關鍵細節。
候選人給出的答案大致可以劃分為以下幾個類型,我這裡列出的粒度比較大:
- 沒有思路;
- 能夠給出分而治之的思路,就是常見的劃分成多個小文件局部排序,然後再歸併成一個大文件;
- 能夠給出單執行緒版本的實現方案和關鍵細節;
- 能夠給出多執行緒版本的實現方案和關鍵細節;
- 能夠給出分散式版本的實現方案和關鍵細節,前面部分能夠搞定,才會到這裡;
對於第 2 種情況,候選人應該了解過數據結構與演算法里的分治法和歸併排序,或者就是提前背過類似的題目和答案,需要進一步考察;
對於第 3 或 4 種情況,實現方案主要考察候選人的邏輯思維和溝通能力,就是腦子裡有想法,還能夠講述明白;關鍵細節主要考察程式碼能力,可能會涉及到IO、多執行緒、異常處理等;
對於第 5 種情況,主要考察候選人分散式計算和存儲相關領域的儲備和經驗,因人而異。
我要求的答案必須是兩個部分:
- 實現方案
對於某個問題,能不能給出一個可行的實現方案。這個方案可以是自己想出來的,也可以是從別人那裡借鑒學習過來的。
因為現在市面上有好多大廠面試真經之類的東西,專門匯總常見的面試題型和答案,所以我需要進一步判斷你是真的有貨,還是只是看起來有貨。 - 關鍵細節
對於給出的實現方案,能不能落地成實際的程式碼。大部分看起來有貨的這個地方就會露餡,我也會根據候選人的回饋延伸出若干變種,充分考察程式碼能力。
有想法,能落地,才是一名程式設計師工程能力的最好體現。