當你開啟這個帖子的時候,我已經預設你是此文的目標讀者,也就是想進入國內一流網際網路企業的非牛人應屆生。
你不需要拿NOI的獎,無需是開源社群名人,也用不著發過牛逼的SCI論文。(沒錯,筆者就是這樣的技術屌絲)
請記住,校園招聘,應聘的絕大部分人都只是才出象牙塔的毛頭小子。企業需要的是你們的潛力與激情。牛人總是鳳毛麟角的。
程式設計師筆試面試的經驗貼、經驗書不計其數。本文不會教你如何具體的解題,但是會告訴你,你距離你的夢想究竟有多遠,以及如何去縮短這個距離。
筆者僅僅以自己的親身經驗為依據,將國內IT巨頭按Offer到手難度降序排列,大致分為如下3個梯隊:
T1:百度,阿里,騰訊,...
T2:網易,迅雷,完美時空,360,金山,...
T3:華為,中興,聯發科,...
Tx:壟斷類IT國企。如中國移動,...
T1主要是BAT三巨頭。他們對學生的技術能力與綜合素質都要求較高。他們尤其喜歡尋找牛人。因此你必須有紮實的基礎的同時還要有自己的技術個性和特點,讓他們欣賞你。這些公司無論是實力還是待遇都是一流的。但要注意這類公司太大,專案組太多,競爭也很激烈,因此要注意認真考慮你想去,而且對你而言有優勢的專案組。
T2都是其所在領域的領軍企業。待遇會比T1稍低。他們需要基礎紮實的學生,如果你的專案或者技術方向符合他們所在的領域會很有優勢。(如遊戲領域偏愛圖形學,安全領域偏向安全方向)
T3對學生的出生、資質最為看重(雙211,四六級),甚至對性格有較為挑剔的考察(華為的性格測試反而刷掉很多技術較牛但是性格較怪癖的學生),專業考察的很基礎,但考察面較廣。
Tx之所以給了個x,是因為他們和其他的企業無法比較。因為這類企業筆試考行測+專業基礎。面試考察綜合素質、表達能力,尤其看重你的非技術方面的能力。因此不做本文的重點討論。
無堅不摧——完整專案
“當他說他是OpenCC的作者的那一刻,哪個面試官不被秒殺。”
當然你不需要NB到這個程度。如果你能對面試官說:“我讀書期間做的專案有x萬行程式碼。Google關鍵字xxx可搜到該專案的演示視訊”,就足夠了。
程式設計師的所有技術能力都能在一個完整的專案中得到淋漓盡致的體現,因此勝過千言萬語的自我推銷。所謂的完整專案應該滿足以下條件:
1、完整性。具有一定的功能,或者解決了某個問題,具有一定意義。
2、難度。 使用或者研究了一些較新技術,或者有一定價值的技術含量或研究內容。
3、工作量。是一個需要澆築一定心血的產出品。
因此,當你決心把一個專案寫入你的簡歷中,你就一定要能回答出面試官的如下問題:
1、你負責了哪一塊?
這個問題是想知道這個專案裡究竟有哪些程式碼是你寫的,尤其是多人合作的專案。你必須強調你所做的工作。
問題就出來了。很多時候我們參與的專案,他的架構、核心技術你並不熟悉,而僅僅是寫了部分邏輯程式碼,那怎麼辦呢?
解決辦法是,花時間去了解專案的核心,對專案的整體有清晰的認識,至少要達到能夠表述的很清楚的程度(簡單的說就是能吹的很有說服力。回想你答辯的情形)。
如果你做的那一塊確實微不足道,而且你也無法表述專案全域性,那就放棄提及這個專案吧,否則只能讓面試官越看你越覺得銼。
2、你用到了哪些技術?
這是最好發揮的一個問題。你可以介紹專案用到的每個開源庫,也可以介紹你用到的原始碼管理工具(如SVN、GitHub),除錯工具(如WinDbg)甚至專案管理工具(UML工具、VS Project等)。總之,這是一個很好表達你的專案綜合能力的機會。
如果上面的都不出彩,那嘗試從你的專案架構、設計模式、介面設計等方面入手。總之要站在一個較高的角度,空談專案的業務需求和邏輯意義不大(當然,充滿創意的專案除外)
3、你遇到的最大問題是什麼?如何解決的?
這個問題是最重要的,也是最具有回答技巧的問題。你必須說出一個聽起來確實很難解決,但你確實又解決(或者避開)的問題。
如果你實在沒有頭緒,或者你覺得專案確實太簡單,沒發現困難問題,不妨從這些方面思考:
有網路功能的專案,考慮網路傳輸效率和網路同步等問題;
有多執行緒、多程式的專案,考慮他們之間的同步/互斥、負載、排程問題;
需要處理大資料的專案,考慮資料預處理、資料排程等問題;
如果這個專案出了論文,那麼嘗試描述論文解決的問題;
你解決問題的渠道,如MSDN、CSDN、開源社群的論壇、國外技術論壇、文件手冊等。
面試官想要聽到的,是你發現問題、分析問題、尋找解決方案、最終解決問題的思路與方法。細節並不重要,因為他也未必能完全弄懂每個技術細節。
總之,一個完整的專案能讓你充分的表達你的技術能力。在專案這一塊上,你需要下足功夫。
如果很不幸你沒有,那麼請往下看。
深厚內功——堅實基礎
一般第一輪技術面都是來考察你最基本的技術功底。
招聘季節,隨處可見抱著厚厚的《程式設計師面試寶典》啃的學生。偶爾也能看見《程式設計之美》《劍指Offer》的神書。這些經驗書確實有用。但是要想全面的掌握筆試面試的基礎考點,還是需要完整的複習。
其實,筆試面試對計算機基礎的考察是萬變不離其宗的。其考點無非分為:
語言語法(以C/C++為例)。
指標(陣列),函式指標,操作符運算順序,const(常指標與指向常量指標),static四大用法,字串(字元陣列),位元組對齊(sizeof),位運算。秒殺書籍:《C++ Primer》
物件導向。
構造與析構順序、多型、過載、覆蓋、C++物件模型等。秒殺書籍:《深入理解C++物件模型》。
資料結構。
棧,佇列,連結串列(雙向、迴圈),樹,堆,雜湊表。
基本演算法。
排序(最重要的是快速排序)、查詢、圖演算法、貪心演算法、動態規劃。秒殺書籍:《演算法導論》。
設計模式。
考察最多的就是單例模式。只因為他實在是太常見又太簡單了。秒殺書籍:《設計模式》,《重構》。
資料庫。
主要是SQL語句與儲存過程。
作業系統。
程式與執行緒、互斥與同步、死鎖、程式間通訊,頁表,虛存等。秒殺書籍:《Windows核心程式設計》,《Unix核心程式設計》。
計算機網路
ISO七層架構,TCP,UDP,IP地址等。
英語。
有些公司喜歡出一些用英文描述的問題,或者英文翻譯題。看懂IT領域內的英文並不難,如果你平時使用MSDN、Google、StackOverFlow的話根本不是問題。
如果你還有充分的時間,建議認真看上面推薦的秒殺書籍。如果時間不夠,就有針對性的去掌握這些考點。
不得不吐槽的是,很多技術不錯的朋友,有著很好的專案,反而掛在了筆試的基礎知識考察上面。因此不要小看這些考點。該背的還是要死背的。
筆試或者面試如果讓你在紙上寫程式,會有2種情況:
1、寫一個函式或演算法。
不要因為題目簡單就想在最短的時間寫出來。請一定要注意,對所有引數做邊界檢測和有效檢測。這才是考察的重點!
如果一個演算法具體實現你記不清了,就寫虛擬碼,在每行程式碼後加上詳細註釋。如果是面試,寫完以後跟面試官解釋說具體的程式碼你忘了,但是你記得演算法思想,因此用了虛擬碼。
如果具體思想也忘了,就嘗試用自己的思路解答問題。總之,儘量別交白卷。
2、設計一個軟體或系統。
這種情況不要求你寫詳細程式碼。你需要在程式結構、框架、設計模式或者系統架構等方面進行設計。
這種框架性的東西最好先打草稿,想好了再重新畫一遍,把每個模組的功能,模組之間的關係、各個模組的功能介面畫出來,如果是面試,寫完以後給面試官詳細解釋。
這裡強調一點,是否懂得架構設計,是鑑別程式碼菜鳥和熟手的重要指標。T級越高的公司,越偏向於考察架構層級的知識。比如百度筆試的最後一題經常是要求設計一個分散式伺服器系統。
錦上添花——無限潛力
通常技術一面是面基礎,二面更多的是雙方的進一步瞭解。如技術方向,技術潛力等。
如果二面面試官不問你技術問題,那麼你一定要積極主動的與他溝通,並表達你的意願。嘗試以下幾個方向:
1、表達你的技術潛力與熱情。
面試官可能會問你一些和技術看上去沒有任何關係的問題,比如問你最近在看什麼書,學習之餘喜歡做什麼,常去哪些網站之類的。
如果你說最近在看《誅仙》,平時喜歡玩LOL,你就是在把自己往懸崖上推。實際上面試官希望聽到的回答如下:
“我最近在看《C++ Primer第5版》,因為我在專案中用的C++11的特性越來越多了...”
“我業餘時間喜歡看看TED,上面總有很多讓我激動的新技術出現...”
“前段時間比較閒的時候,和朋友參加了xxx組織的開發者大會...”
“虎嗅和獵雲是我獲取IT資訊的常去地方...”
回答如此平凡的問題卻能體現你的閃光點。你是技術人員,請記住,告訴面試官你時刻對技術保持著激情,時刻關心的IT動態,比你告訴他你是學生會某幹部有用的多。(當然非技術人員,或者國企的面試除外!)
但是,一定要如實回答。面試官會針對你的回答進行緊逼追問。如果正好是他熟知的範疇,而你只是接觸過而沒有認真學習,就會陷入很尷尬的境地。
所以在回答這些問題的時候不用過於急著回答,不妨先想一想,要有能預測到面試官針對你的回答會問什麼樣的問題的能力。
就像上面的例子,面試官問你最近看的書,你未必要選擇最近看的一本書,而是應該選擇一本你吃的比較透的,最好還是面試官也會感興趣的書,這樣接下來的交流就能得心應手。
總之,平時的積累才是王道。
2、表達你的技術愛好。
進入正確公司的錯誤崗位,相當於考上了正確學校的錯誤專業。
所以請一定要記住,你的最終目的不是要進入該公司,而是要進入該公司你最想去的部門乃至專案組。
所以,試探得知面試官來自哪個專案組也很關鍵,因為面試官可能跟你想去的專案組毫無關係。技術方向的不對口的面試官面試你,對你是不利的。
這個時候你要清楚的表達出你的技術方向,並注意考慮你想去的專案組收你的可能性。如果發現該組招的人少,或者加入難度大,你需要考慮是否表現出來你有同樣的熱情加入其他專案組。
不服從分配可能導致你一無所獲。你之前面試的表現越優秀,在這一步能夠選擇的餘地就越大。
3、態度和情商。
如果你面試次數多了,拿的Offer多了,通常到了最後一面,有多大的希望能拿到Offer,你心裡應該有所感覺。
如果感覺不好,最後一面你需要更努力表達你的優勢。最後一面打動面試官的可能往往是你的真誠和熱情。
當面試官問你有多少Offer,不要懼怕回答。Offer是企業對你能力的證明。有Offer的學生更容易被青睞。通常如果你有了該公司最大競爭對手的Offer,你可以嘗試追求更好的崗位和待遇。但切忌用這個來漫天要價,除非你牛到了他們非要你不可的程度。
T3,Tx類的企業可能會問你一些很奇葩的問題。比如A公司問你他的競爭對手B公司怎麼樣。
很多計算機專業的學生思維過於死板,說了大實話,比如”B公司是最大的xxx企業“,於是死的很徹底。
你可以說”A公司的優勢在與xxx,而B公司的優勢在於xxx。不過在我看來,我更欣賞A公司的xxx,因為xxx“
這類企業就是這樣。他們的面試和T1,T2企業的面試差別很大,你要學會避重就輕,這不是謊言,而是策略。
寫在最後
只要你資質不差,有針對性的進行努力,拿下國內IT巨頭的Offer並不難。
最後,請記住,拿下Offer,你的技術生涯僅僅是進入了下一輪新的迭代。
技術之路最公平也最殘酷的原因是:沒有捷徑,需要日積月累的積累,以及對技術持久的熱情。