2.5年, 從0->阿里 向山科人學習

    歷來沒有想到本身的求職之路會這麼順利, 第一次投阿里就拿到了offer, 之前一直都是作好被刷的準備的...php

    3月31號晚上收到了來自阿里的正式offer, 簽下錄取意向書, 粗略算了一下, 從2012年9月份正式入學進入計算機繫到2015年3月簽下阿里offer, 大約兩年半的時間, 這期間有不少人值得感謝: 磊哥, 立萍, 宋藝, 興華老師... 發生了不少事兒: 從最初的懵懵懂懂到後來的立志進入像阿里同樣的一線互聯網企業, 從對計算機一竅不通到有本身的目標和興趣愛好, 從不知道技術博客是啥到我的博客的訪問量超過40W...  也學習了不少內容: C++, Linux, 數據結構與算法, 計算機網絡(TCP/IP), 操做系統(OS)...html


    磊哥一直想讓我寫下此次面試的通過, 同時也記錄一下這一年來準備招聘的過程, 不少有意思的事兒若是如今不寫下來之後很快就忘了, 況且看了這麼多的面試經驗, 如今到了"回饋社會」的時候了, 可是一直拖着不知道怎麼開始, 這一拖就到了5月份, 這篇博客陸陸續續寫了半個多月, 感受今天應該告一段落了, 否則總有新的東西加進來,這篇博客是永遠寫不完的...linux

    因爲不少朋友和大神學弟對我找工做的準備過程以及面試經歷比較感興趣, 我就分別談一下本身的這兩段經歷吧:程序員

 

養兵千日

    我是在2013年11月份中旬遇到磊哥的, 當時磊哥剛剛拿下阿里巴巴的offer, 意氣風發, 我越俎代庖請磊哥給咱們這些學弟學妹作交流講座的詳細通過在個人另外一篇博客《個人2013 -歲月劃過生命線》(連接)有詳細的記錄, 在此我就再也不贅述了, 不事後來我又找了磊哥好幾回, 聊了不少, 也收穫不少, 下定決心必定要進入阿里之類的一線互聯網公司, 後來磊哥也一直鼓勵並幫助我進入阿里, 所以, 我一直把磊哥當成爲命裏的貴人.面試

    個人準備工做大體分爲五方面內容: C++, Linux, 數據結構與算法, 計算機網絡(TCP/IP)和操做系統. 若是一個本科生可以把這五方面的基礎打得比較堅實再加上稍稍一點兒運氣, 拿下互聯網的offer是不在話下的, 另外若是你實力夠強的話, 那僅需的一點兒運氣也是不須要的, 在此我引用671學長的一句關於面試的經典: 」面試 = 運氣*(50-n)/100 + 實力*(50+n)/100, n=f(x),x即實力,n與x成正比關係,這就意味着: 你實力越強,對運氣的依賴性越低,因此實力纔是很是重要的一個環節.」, 下面分別介紹一下我所準備的五方面內容:算法

 

C++:編程

    C++被我稱之爲飛機中的戰鬥機, 我對C++是情有獨鍾的, 他功能很是強大, 尤爲是其與Linux操做系統結合, C++靈活的語法, 再加上Linux強大的平臺支持, 讓人感受有種手握核武器的感受[不過今天(4月28號)獲悉本身在阿里實習被分派到了YunOS手機操做系統部門, 之後要主攻Java了...], 這方面我讀過的經典的書有《C++ Primer》,《Effective C++》,《深度探索C++對象模型》與《STL源碼剖析》,其實在面試阿里的時候《STL源碼剖析》這本書是還暫時未讀完,並且個人簡歷上面也沒寫我讀過STL源碼, 可是面試官仍然問了不少這方面的內容,如:關聯容器的典型實現原理, vector/list的實現, 迭代器失效的問題, string的三種實現方式等, 面試官對STL實現的看重可見一斑; 另外《深度探索C++對象模型》也是面試官常問的內容之一,像虛函數的實現機制, 重載的實現原理什麼的都是常問的, 在網上流傳着一段關於本書的書評, 感受比較有意思(連接); 《Effective C++》中的內容在我面試時沒怎麼問到, 可是我我的感受trains技法是比較難,並且屬於比較重要且經常使用的內容, 所以你們也須要悉心準備一下. 這方面的書要多讀幾遍, 不要異想天開的認爲這些書只讀一邊就可以徹底理解, 經典之因此叫經典, 就是不管你第幾回讀都能找到新感受!服務器

 

Linux:網絡

    關於Linux部分是值得大書特書的, 我感受此次之因此面試這麼順利, 很大一部分是Linux幫了個人忙. 我我的把Linux的內容分爲兩部分:一是Linux開發環境,一是Linux編程:數據結構

    1) Linux開發環境: 在這部分我認爲最主要的是學習Linux這個操做系統平臺的思想(Linux不少方面都與Windows有所不一樣, 如一切皆文件等), 以及使本身適應Linux的命令行,其餘的都是次要的. 所以這方面的內容是比較好學的. 這方面比較重點的內容是: Linux經常使用命令, Vi/Vim使用, 軟件管理, 用戶管理, 權限管理, 進程管理, Shell編程以及經常使用開發工具(如gcc/g++, gdb, make)的使用等. 這方面的內容我比較推薦兩本比較經典的書《鳥哥的Linux私房菜》,《Linux Shell腳本攻略》, 可是對於這種實踐性課程,光看書是不夠的,並且有時僅僅看書是很枯燥的,所以我在此給你們推薦一部」李明Linux視頻教程」(連接),你們結合着書與視頻練習, 不會感到枯燥; 李明老師對於Linux不管是基礎知識仍是高級應用的功力都十分精湛,聽課時既能學到知識又能拓寬視野, 所以這部視頻我看了兩遍, 而Linux的筆記就寫了兩遍, 我把全部的聽課時的筆記都整理髮布到了博客上(連接); 我原來看的是初版的視頻, 系統是基於CentOS 5.5的,後來李明老師又出了第二版, 固然第二版增長了不少內容, 組織也更加清晰合理, 總的說第二版是比初版更好的, 可是珠玉在前, 我仍然是對初版情有獨鍾, 所以第二版僅挑着初版照顧不到的內容看了看. 

    另-建議各位讀者朋友: 在剛剛開始學習Linux時, 最好在電腦中只裝一個Linux, Ubuntu也好, CentOS也罷(不過我我的仍是比較推薦使用Ubuntu做爲桌面操做系統), 此時最好徹底摒棄Windows的觀念, 平常只用Linux, 最多不超過一個月就開始對Linux與命令行有感受了!

    2)Linux編程: 這部分固然仍是首推W.Richard Stevens的三部書了,《Unix 環境高級編程》, 《Unix網絡編程-卷I-聯網套接字》,《Unix網絡編程-卷II-進程間通訊》, 可是這三本書內容深入, 並且卷帙浩繁, 組織龐大. 俗話說"沒有三兩三, 休想過樑山」, 沒有很是熟練的Linux/Unix操做系統基礎, 沒有必定的Linux編程基礎, 這三本書是不容易讀懂的, 所以在這三部饕餮盛宴以前, 我首先推薦一碟開胃小菜《Linux程序設計》. 可是這四部書的內容並不必定須要所有讀完的, 《Linux程序設計》中有三分之一的內容是不須要讀的(像終端控制, gtk/gnome編程什麼的), APUE的重點是前18章, UNP卷I重點是TCP與UDP編程的內容, UNP卷II主要講解System V與Posix兩種IPC進程間通訊的方式, 可是這兩種IPC方式的內容大體是想通的, 像二者都有共享內存, 信號量, 消息隊列等, 所以學會Linux/Unix編程的思想與原理就好, API的具體用法多查一下MAN手冊就行了, 有了這些基礎以後我建議再讀一讀遊雙老師的《高性能Linux服務器編程》, 這本書深刻淺出的講述了編寫Linux服務器程序的理論基礎與實踐經驗, 並且還介紹瞭如何編寫服務器的測試程序以及開發Linux服務器程序的經常使用工具等頗有實際意義的內容, 很是值得一讀; 並且這部書還重點介紹了Linux中的重型武器Epool, 並與select/pool進行了應用層與理論層的對比, 這是APUE與UNP所不具有的, 且這也是面試的重點之一! 對於學有餘力的朋友我在推薦一部Linux與C++編程領域的神做《Linux多線程服務端編程 -使用Muduo網絡庫》, 陳碩老師在書中不只介紹了使用C++進行Linux分佈式網絡服務器編程的經常使用技法, 並且還總結了使用C++進行編程的經驗教訓, 並且這些問題還都是面試時常考的(像string的幾種實現模式等), 無奈本人兩方面的基礎較淺, 只能挑着一些比較簡單的主題研讀一番..

    和學習Linux開發環境同樣, 我也比較推薦在學習Linux編程時不要僅僅看書, 我在剛剛開始學習Linux編程時, 因爲大三課程較緊, 所以只是讀書不多實踐, 到後來感受這樣學習效果不好, 到後來在我準備本身的面試項目MyHttpd的時候居然不敢動手去寫, 所以在這兒我着重推薦C++教程網的兩部視頻"Linux系統編程」與"Linux網絡編程」, 後來我結合視頻與書籍, 不斷的去實踐, 並將重要的內容總結成博客並發表出來(連接); 固然C++教程網也出了不少其餘內容的視頻, 像"跟我一塊兒學C++」, "本身動手寫FTP」等,內容很充實, 可以學到的知識不少, 可是都是價格不菲, 並且我只看了系統編程與網絡編程部分, 所以其餘的我不便推薦, 但願之後有時間可以把C++教程網的視頻都可以學完, 到時候本身的編程功力確定可以提高一個層次. 還有就是如今傳智播客也開設了C++課程, 我在淘寶上買了他們那邊第三期和第四期的視頻,並且我也仔細學習了他們的Linux基礎編程與Linux高級編程的視頻教程,可是說實話真是乏善可陳,並且有不少內容我感受傳智播客的老師是在學了C++教程網的視頻再現炒現賣給他們學生上課的, 所以在此我並不推薦看這些視頻(因爲我拿不出法律可依的證據, 只是對比他們兩方的授課內容類似, 即便錯誤之處亦相同, 所以若是不相信的朋友就權當我是在乎淫吧).

 

數據結構與算法

    這方面我準備的時間最長, 花費的心血較多, 從2012年入學直到如今(2015年5月份)我都一直在持續不斷的補充本身數據結構與算法方面的知識. 這方面我感受比較經典的書是《數據結構與算法-維斯(C++版)》和《算法導論》, 維斯的書很是的棒, 不管是理論仍是實踐都有很是多的亮點, 並且這部書還有C語言版與Java版,總有一款適合你(*^_^*); 《算法導論》大名鼎鼎,其內容就不用我贅述了, 並且我也只讀了部分的內容, 像鏈表,樹,圖,紅黑樹等,在此也是沒有資格推薦的.

    面試時鏈表,樹, 排序與Hash的內容考察較多, 尤爲是與STL的內部實現相結合來考察(既考察了C++經常使用技法, 又考察了數據結構與算法的內容,一箭雙鵰). 關於數據結構與算法部分的面試,有三部書不得不推薦一下《劍指offer》,《編程之美》和《編程珠璣》, 還有一個網站LeetCode(連接). 這些內容都是都是我從不少面經中總結出來的, 尤爲是LeetCode, 裏面一些很讚的面試真題, 沒事的時候建議刷一下.

    最後關於」數據結構與算法」的學習, 我建議最好在網上找些這方面的視頻結合着書看, 由於這部分比較費腦子, 書看累了的時候就能夠看些視頻, 敲敲代碼, 幫助消化.並且在我看來, 一個準備在IT領域有所做爲的程序員/工程師, 數據結構與算法的是不管什麼時候都是不能放下的, 在這兒我推薦一篇Google工程師的博客, 我記得當時我看完以後頗受感染, 不知道你們有什麼感覺(連接).

 

計算機網絡(TCP/IP)

    關於TCP/IP,面試的時候問得頗多, 相似TCP的11種狀態, TIME_WAIT狀態的緣由, TCP三次握手的緣由等. 能夠看出網絡層與傳輸層(重點是TCP)的內容是重點, 若是按照優先級對TCP/IP進行排序的話, 應該是傳輸層>網絡層>鏈路層, 關於計算機網絡, 我看的書有《計算機網絡(謝希仁著)》與《計算機網絡聯考複習指導(王道)》,《TCP/IP詳解-卷I》只挑了重點的幾章內容(原本是打算把這整本書仔細研讀一遍的, 但因爲時間不足, 這個願望一直未能實現, 打算等到在阿里實習結束,本科畢業以前必定好好的把這部經典讀完). 在面試結束後的一個月內, 我本身根據此次面試的通過以及結合本身讀到的面經的內容, 本身總結了四篇TCP/IP的博客, 我的感受有志於進入互聯網公司的讀者朋友能夠讀一下(連接).

 

操做系統(OS)

    關於操做系統, 重點在於進程管理與內存管理這兩章, 再加上SPOOLing等一些零零碎碎的內容. 操做系統我感受比較不錯的書籍有《現代操做系統》,《操做系統聯考複習指導(王道)》與《計算機操做系統(湯子瀛)》;《現代操做系統》我只看了有限的幾章,《操做系統聯考複習指導(王道)》我讀了兩遍, 估計你們也看出來了, 這本書與前面提到的《計算機網絡聯考複習指導(王道)》都是考研書, 可是可是考研類的書每每對課本內容的重點總結的比較精確. 像這本操做系統, 我就感受對OS重點總結是比較精確, 固然通過壓縮以後有些問題也是有些闡述不明(像內存管理中的頁式管理和段頁式管理等), 但其餘的內容感受總結的確實是挺到位的(所以個人幾篇操做系統的博客就是以王道的書爲藍本,再結合面試中常考的知識點寫成的, 不過如今還未發表, 由於排版整理的工做還未完成, 不過他們會最終發到這個目錄下面:連接). 最後一本書是咱們的上課時的課本,我的感受這本書仍是挺靠譜的, 可是有些內容有些囉嗦, 學院派氣味很濃, 有些問題原本舉個例子就能夠闡明的卻用了一大段晦澀難懂的描述性文字, 讓人似懂非懂. 

    我學習操做系統與計算機網絡的有一點心得是: 感受二者很相似, 都是內容很零碎, 但又都不很難; 所以, 他們的學習最好與系統編程/網絡編程結合起來學習, 這樣就會有一番更深深的體會.

    另-若是你們對Linux內核比較感興趣並且實力足夠的話,建議讀一下《Linux內核的設計與實現》或《Linux內核源代碼情景剖析》,前者內容較難, 我只讀了有限的幾章, 然後者的總頁數超過1000頁, 這兩部書有很大的毅力來讀的...

 

用兵一時

    3月7號(2015年)磊哥把個人簡歷推到YunOS, 3月12(週二)晚七點參加一面, 3月13(週三)下午三點參加二面, 隔了一週3月20號(週三)晚八點參加三面, 3月24號(週日)參加四面, 3月30號收到offer.

    前面說過, 我歷來沒有想到此次面試會這麼順利, 很早之前我就作好了前幾家面試會被打擊的準備, 並且此次面試又是這麼倉促, 從簡歷推上去到真正面試只有三四天的準備時間, 還要一直提心吊膽不知道啥時候一個電話打來就要面試,終於在磊哥的一頓催促之下, 阿里那邊的人在我返校以後的第五天晚上,開始了面試:

一面:

    一面問得問題有: (1)TCP三次握手過程, 與爲啥須要採用三次握手; (2)TCP TIME_WAIT狀態的緣由; (3)C++ 虛函數機制(C++對象模型); (4)C++ Static關鍵字; (5)Select/Poll/Epoll的異同(使用與內部實現方面); (6)C++迭代器失效問題(iterator原理); (7)map/set容器的實現原理(紅黑樹知識+STL容器內部原理);

    前面的這幾個問題比較簡單, 回答的都比較流暢, 估計面試官打算在最後一題發難吧, 最後一個系統設計題難度陡然提升, 一會兒就沒了感受, 題的內容是 "如今有兩塊內存, 一塊10G設名爲A, 一塊20G設名爲B, 如今A中數據已滿, 但還有新的數據到來, 所以只能轉向B寫入, 可是還須要把A中的內容作數據遷移, 移動到B, 那麼如今問題來了: 如何保證在不打斷新數據寫入的前提下, 將內存A中的數據完整的遷移到B, 即不能出如今A中數據遷移完成以前B內存滿了或者打斷新數據輸入的狀況」, 這個問題糾纏了十多分鐘, 我嘗試了從數據結構和操做系統的角度去解決這個問題, 但都被面試官否決了, 直到如今這道題我仍然不知道該如何解決.

 

二面:

    二面問得問題有: (1)個人博客的訪問量的問題(估計是暖場吧); (2)Linux 夥伴堆算法(slab)實現的原理, 以及與普通內存分配相比有什麼優點(Linux內核); (3)Linux 高併發的實現, 線程池的實現思想, 怎樣處理高併發(根據項目來問); (4) Linux 寫一個併發測試程序; (5) 如何實現一個String, 他的內存是長什麼樣的(STL內部實現);

    記得當時二面面試官打電話過來的時候還在上課, 跟老師匆匆說明狀況以後就找了一間空教室開始面試. 與一面面試官的和善不一樣, 二面面試官剛開始問得問題就咄咄逼人(相對較難),並且在我回答問題時還曾經不止一次被他打斷. 因爲題目相對較難(也多是我本身水平不足)感受須要思考一段時間才能回答, 並且有好幾個問題是我之前沒有接觸過的(像題目2, 題目4, 題目5), 我只能憑本身的理解去回答, 面試還未結束, 我就感受此次面試的結果有點兒懸, 可能過不了這一關了... 但當時內心卻是很坦然, 因爲剛開始就沒有打算可以經過, 所以也就沒有那種"天生我材必有用」或那種"此處不留爺,自有留爺處,到處不留爺, 爺去投八路」的氣概,只是以爲過不了就過不了,大不了從頭再來.面試到最後, 我問面試官是哪一個部門的, 回答說是"阿里雲·雲計算」部門,忽然感受今天被虐成渣不怨了, 心想若是此次面試通不過, 下次直接投雲計算部門, 不投YunOS了, 後來跟同窗提及這個想法,他說我是被虐瘋了.

    二面結束以後給磊哥發了一短信, 跟他說今天面試感受不是太好.估計通不過了, 磊哥卻說面試應該不會就此停下, 可是可能會中間再加一輪技術面, 由原來的三面變成四面.  緣由是在我一面快結束時問了一下面試官對個人評價, 面試官除了說我真正的項目經驗不足以外又說"大三可以有這樣的紮實的基礎已經至關不錯了」, 褒獎之意溢於言表, 估計面試官給的評價應該不錯, 所以若是二面面試官給箇中評的話,那我就應該可以順利的進入HR終面, 但若是是差評的話, 那就估計還要再加一輪技術面, 給出一個最終的技術評價.果不其然, 在等了一週以後, 三面來了...

 

三面:

    在三面正式開始以前, 我先問了一句是技術面仍是HR面, "是技術面」. 心裏頓時緊張起來,但面試官告訴我不用緊張,放鬆就好,只是聊一下我這邊的具體狀況, 果真三面30多分鐘基本上都是處於比較輕鬆的氛圍之中. 問得問題有:我經常使用的數據結構有哪些, 對將來有什麼打算, 對杭州有什麼印象, 有沒有女友, 有沒有在杭州長期居住的打算,若是我去杭州的話, 我女友怎麼辦等等, 因爲面試官很健談, 後來又聊起了邏輯思惟與追求完美的話題, 總的來講, 這一面並不如前兩面那樣技術氛圍濃厚, 面試官也特別和善(因爲面試官在正式面試以前曾經放過我鴿子, 面試開始時面試官居然還不住給我道歉,真是受寵若驚了...), 後來面試官把他的兩個聯繫方式都留給了我, 讓我有什麼就能夠直接聯繫他, 後來在收到offer後聯繫團隊時還跟面試官經過幾回電話, 求面試官老師幫忙, 面試官老師在百忙之中還幫我聯繫HR , 告訴我該如何更快的融入團隊.. 說實話, 真的很是感謝這位面試官.

 

四面:

    四面是HR面, 萬萬沒想到的是HR老師居然在周天下午打電話過來, 當時剛剛打完羽毛球, 上氣不接下氣的接了HR的電話, 而後直接開始面試. 此次面試基本沒問技術方面的問題, 因爲我說了個人博客, 所以HR老師也看了一下個人博客, 見訪問量還比較高, 我謙虛的說"多是因爲寫的東西都比較基礎, 所以看的人比較多吧O(∩_∩)O~~」; 而後又問到爲何不打算讀研了; 在大學期間遇到的最大的困難是什麼, 是怎麼解決的; 除了上課,在大學裏其餘的時間都在幹嗎等等. 總的來講, 此次面試雖然不涉及技術, 但大部分問題都是不太好答的, 所以, 在此建議你們在平常生活中對生活對一些思考, 不只僅是爲了應付HR, 更要活的明白一些.

    四面結束以後, 自我感受不錯, 果不其然在第二週的週一, 收到offer通知, 知道本身的阿里面試算是能夠告一段落了.

    最後再說一下: 在每次面試快要結束時, 面試官都會讓你問他/她一個或幾個問題, 或者你本身主動問個問題, 在這兒我比較推薦的一個問題是"在您看來, 在阿里(固然是目標公司)若是要勝任一份工程師的工做, 他/她須要怎麼樣的能力或素質, 或者說若是我還想繼續應聘這個工做, 我還須要作那些努力」, 這個問題暗含了三層意思:一是對我此次面試結果的詢問, 二是我該如何努力彌補本身的不足,三是表達了你對這份工做的渴望,但願可以勝任或者得到這份工做. 我在四次面試中都主動或被動的問到了這個問題, 四面的面試官各自給出了本身的答案, 雖然答案各異, 可是綜合起來可以得出一個對本身綜合評價,同時,也可以知道爲接下來迎接下一輪面試或者參加工做該作哪方面的努力, 所以我感受這個問題仍是比較好的.

 

放飛夢想

    不出意外7月份就要去杭州了, 因爲得知本身進入的是YunOS手機操做系統團隊, 師兄給出的建議是學習一下Java以及Android的內容, 所以須要把接下來這兩個月的學習規劃一下了, 這兩個月的學習我將其劃分爲三個方面: Java, 數據結構與算法(Java), Android編程.

    Java: 因爲之前個人Java幾乎接近0, 所以此次搞了本《Java核心技術(卷I)》, 又下了了馬士兵等人的視頻, 打算必定好好學習一下.

    Android: 在網上下了Mars視頻, 感受深刻淺出, 挺不錯的(Mars是千鋒的老師,算是給他們作廣告了,呵呵), 又跟同窗借了《第一行Android代碼》打算好好學習一下, 可是若是時間不夠, 就只能儘可能多學了.

    數據結構與算法: 搞了一部《算法(第四版)》(該書與《算法導論》齊名), 同前所述, 我認爲」數據結構與算法不管什麼時候都不能放下」, 這部書講述了數據結構與算法經典內容, 並且書中的代碼所有都由Java實現, 數據結構與Java一箭雙鵰, 值得一讀!

    最後, 還有幸到今年山東ACM省賽上當了一把裁判, 開了眼界, 也圓了本身在三年以前」到ACM賽場打一場醬油」的心願...

    之後的路還很長, 人生之路纔剛剛開頭, 走出大學, 纔算真正的開始...

相關文章
相關標籤/搜索