前面的一段時間時間和大家分享了許多文章,一部分文章是關于校招,另外一部分是關于社招的面試經驗,社招往往比校招的要求更加嚴格,相比之下也更難。其實在阿裡,除了校招和社招這兩種招聘方式之外還有第三種,就是内推。所謂内推,就是在公司或者企業裡,有了解或者熟悉你的人,并且認為你有擔任某些技術人員的能力,直接跨過招聘網站将你的履歷交給面試官的一種工作的推薦方式(大概就是這樣吧)。
bat都是存在内推的,在知乎上有篇文章<b>《阿裡内推面試,應該注意什麼?》(連結)</b>有不少可以參考的意見,其中幾點我覺得能讓我們更加了解阿裡的内推,其一是内推與非内推的本質差別在于:内推的同學大多可以知道你被推薦的部門和團隊。是以如果你有心,你可以了解到更多,甚至團隊的成員、老大、研究方向,甚至目前的任務排期,這是所謂知彼。其二是内推的職位往往是有需求的,如果能在面試過程中,回答問題的時候,能向所推薦的團隊的研究方向和任務靠攏是會給面試官很大的好感和驚喜,特别是如果你的面試官恰好是那個團隊的成員的時候。當然前提是你确實有些實力,不然果斷點到為止,别往槍口撞。
那麼問題來了,怎麼才能認識肯給你提供内推機會的人呢?這一點尤為重要,首先第一你要是一匹千裡馬才行,技術能力還是第一位的,阿裡招聘每一位工程師都是因為認為你對于企業是有價值的,隻有我們能力足夠優秀才行,否則就是給你機會,你也無法把握。其次麼,那就是你要認識伯樂。認識伯樂的方式有很多,如果你是應屆生,可以找在阿裡工作的學長(可以通過老師,要是通過比賽或者項目認識就更好了),如果是已經工作幾年的同學,也可以找曾經的同學,甚至你都可以加阿裡的員工群,直接找群主或者管理者(真的有童鞋這樣成功了)。這裡給大家找到伯樂的方法的連接配接《關于“内推”,你必須知道的事!》(連結),隻能幫你到這了。總之,隻要你是千裡馬,就一定能找到伯樂。
今天和大家分享的就是一位獲得内推并且成功拿到阿裡offer的童鞋關于找工作的準備過程以及面試經曆的部落格:
<b>
</b>
<b>《2.5年, 從0 ->阿裡》</b>
從來沒有想到自己的求職之路會這麼順利, 第一次投阿裡就拿到了offer, 以前一直都是做好被刷的準備的...
3月31号晚上收到了來自阿裡的正式offer, 簽下錄取意向書, 粗略算了一下, 從2012年9月份正式入學進入計算機系到2015年3月簽下阿裡offer, 大約兩年半的時間, 這期間有很多人值得感謝: 磊哥, 立萍, 宋藝, 興華老師... 發生了很多事兒: 從最初的懵懵懂懂到後來的立志進入像阿裡一樣的一線網際網路企業, 從對計算機一竅不通到有自己的目标和興趣愛好, 從不知道技術部落格是啥到個人部落格的通路量超過40w... 也學習了很多内容: c++, linux, 資料結構與算法, 計算機網絡(tcp/ip), 作業系統(os)...
磊哥一直想讓我寫下這次面試的經過, 同時也記錄一下這一年來準備招聘的過程, 很多有意思的事兒如果現在不寫下來以後很快就忘了, 何況看了這麼多的面試經驗, 現在到了"回饋社會”的時候了。由于很多朋友和大神學弟對我找工作的準備過程以及面試經曆比較感興趣, 我就分别談一下自己的這兩段經曆吧:

<b>養兵千日</b>
我是在2013年11月份中旬遇到磊哥的, 當時磊哥剛剛拿下阿裡巴巴的offer, 意氣風發。我越俎代庖請磊哥給我們做講座的詳細經過在我的另一篇部落格《我的2013 -歲月劃過生命線》有詳細的記錄, 在此就不再贅述了, 不過後來我又找了磊哥好幾次, 聊了很多, 也收獲很多, 下定決心一定要進入阿裡之類的一線網際網路公司, 後來磊哥也鼓勵并幫助我進入阿裡, 是以, 我一直把磊哥當成為命裡的貴人.
我的準備工作大緻分為五方面内容: c++, linux, 資料結構與算法, 計算機網絡(tcp/ip)和作業系統. 如果一個大學生能夠把這五方面的基礎打得比較堅實再加上稍稍一點兒運氣, 拿下技術工程師offer是不在話下的, 如果你實力夠強的話, 那一點兒運氣也不需要。在此我引用一句學長關于面試的總結: “面試 = 運氣*(50-n)/100 + 實力*(50+n)/100, n=f(x),x即實力,n與x成正比關系,這就意味着: 你實力越強,對運氣的依賴性越低,是以實力才是非常重要的一個環節.”, 下面分别介紹一下我所準備的五方面内容:
<b>c++:</b>
c++被我稱之為飛機中的戰鬥機, 我對c++是情有獨鐘的, 其功能非常強大, 尤其是與linux作業系統結合, c++靈活的文法, 再加上linux強大的平台支援, 讓人感覺有種手握核武器的感覺[不過後來獲悉自己在阿裡實習被分派到了yunos手機作業系統部門, 以後要主攻java了...], 這方面我讀過的經典有《c++ primer》,《effective c++》,《深度探索c++對象模型》與《stl源碼剖析》,其實在面試阿裡的時候《stl源碼剖析》這本書是還暫時未讀完,而且我的履歷上面也沒寫我讀過stl源碼, 但是面試官仍然問了很多這方面的内容,如:關聯容器的典型實作原理, vector/list的實作, 疊代器失效的問題, string的三種實作方式等, 面試官對stl實作的看重可見一斑;。
另外《深度探索c++對象模型》也是面試官常問的内容,像虛函數的實作機制, 重載的實作原理什麼的都是常問的; 《effective c++》中的内容在我面試時沒怎麼問到, 但是我個人感覺trains技法是比較難,而且屬于比較重要且常用的内容, 是以大家也需要悉心準備一下. 這方面的書要多讀幾遍, 不要異想天開地認為這些書隻讀一邊就能夠完全了解, 經典之是以叫經典, 就是無論你第幾次讀都能找到新感覺!
<b>linux:</b>
關于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”等,内容很充實, 能夠學到的知識很多, 但是都是價格不菲。
<b>資料結構與算法</b>
這方面我準備的時間最長, 花費的心血較多, 從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的部落格, 個人感覺有志于進入網際網路公司的讀者朋友可以讀一下(連結).
<b>作業系統(os)</b>
關于作業系統, 重點在于程序管理與記憶體管理這兩章, 再加上spooling等一些零零碎碎的内容. 作業系統我感覺比較不錯的書籍有《現代作業系統》,《作業系統聯考複習指導(王道)》與《計算機作業系統(湯子瀛)》;《現代作業系統》我隻看了有限的幾章,《作業系統聯考複習指導(王道)》我讀了兩遍, 估計大家也看出來了, 這本書與前面提到的《計算機網絡聯考複習指導(王道)》都是考研書, 但是但是考研類的書往往對課本内容的重點總結的比較精确. 像這本作業系統, 我就感覺對os重點總結是比較精确, 當然經過壓縮之後有些問題也是有些闡述不明(像記憶體管理中的頁式管理和段頁式管理等), 但其他的内容感覺總結的确實是挺到位的(是以我的幾篇作業系統的部落格就是以王道的書為藍本,再結合面試中常考的知識點寫成的, 不過現在還未發表, 因為排版整理的工作還未完成, 不過他們會最終發到這個目錄下面:連結). 最後一本書是我們的上課時的課本,個人感覺這本書還是挺靠譜的, 但是有些内容有些啰嗦, 學院派氣味很濃, 有些問題本來舉個例子就可以闡明的卻用了一大段晦澀難懂的描述性文字, 讓人似懂非懂.
我學習作業系統與計算機網絡的有一點心得是: 感覺兩者很類似, 都是内容很零碎, 但又都不很難; 是以, 他們的學習最好與系統程式設計/網絡程式設計結合起來學習, 這樣就會有一番更深深的體會.
另-如果大家對linux核心比較感興趣而且實力足夠的話,建議讀一下《linux核心的設計與實作》或《linux核心源代碼情景剖析》,前者内容較難, 我隻讀了有限的幾章, 而後者的總頁數超過1000頁, 這兩部書有很大的毅力來讀的...
<b>用兵一時</b>
3月7号(2015年)磊哥把我的履歷推到yunos, 3月12(周二)晚七點參加一面, 3月13(周三)下午三點參加二面, 隔了一周3月20号(周三)晚八點參加三面, 3月24号(周日)參加四面, 3月30号收到offer.
前面說過, 我從來沒有想到這次面試會這麼順利, 很早以前我就做好了前幾家面試會被打擊的準備, 而且這次面試又是這麼倉促, 從履歷推上去到真正面試隻有三四天的準備時間, 還要一直提心吊膽不知道啥時候一個電話打來就要面試,終于在磊哥的一頓催促之下, 阿裡那邊的人在我返校之後的第五天晚上,開始了面試:
<b>一面:</b>
一面問得問題有: (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記憶體滿了或者打斷新資料輸入的情況”, 這個問題糾纏了十多分鐘, 我嘗試了從資料結構和作業系統的角度去解決這個問題, 但都被面試官否決了, 直到現在這道題我仍然不知道該如何解決.
<b>二面:</b>
二面問的問題有: (1)我的部落格的通路量的問題(估計是暖場吧); (2)linux 夥伴堆算法(slab)實作的原理, 以及與普通記憶體配置設定相比有什麼優勢(linux核心); (3)linux 高并發的實作, 線程池的實作思想, 怎樣處理高并發(根據項目來問); (4) linux 寫一個并發測試程式; (5) 如何實作一個string, 他的記憶體是長什麼樣的(stl内部實作);
記得當時二面面試官打電話過來的時候還在上課, 跟老師匆匆說明情況之後就找了一間空教室開始面試. 與一面面試官的和藹不同, 二面面試官剛開始問的問題就咄咄逼人(相對較難),而且在我回答問題時還曾經不止一次被他打斷. 由于題目相對較難(也可能是我自己水準不足)感覺需要思考一段時間才能回答, 而且有好幾個問題是我以前沒有接觸過的, 我隻能憑自己的了解去回答, 面試還未結束, 我就感覺這次面試的結果有點兒懸, 可能過不了這一關了... 但當時心裡倒是很坦然, 由于剛開始就沒有打算能夠通過, 是以也就沒有那種"天生我材必有用”或那種"此處不留爺,自有留爺處,處處不留爺, 爺去投八路”的氣概,隻是覺得過不了就過不了,大不了從頭再來.面試到最後, 我問面試官是哪個部門的, 回答說是"阿裡雲·雲計算”部門,突然感覺今天被虐成渣不怨了, 心想如果這次面試通不過, 下次直接投雲計算部門, 不投yunos了, 後來跟同學說起這個想法,他說我是被虐瘋了.
二面結束之後給磊哥發了一短信, 跟他說今天面試感覺不是太好.估計通不過了, 磊哥卻說面試應該不會就此停下, 但是可能會中間再加一輪技術面, 由原來的三面變成四面. 原因是在我一面快結束時問了一下面試官對我的評價, 面試官除了說我真正的項目經驗不足之外又說"大三能夠有這樣的紮實的基礎已經相當不錯了”, 褒獎之意溢于言表, 估計面試官給的評價應該不錯, 是以如果二面面試官給個中評的話,那我就應該能夠順利的進入hr終面, 但如果是差評的話, 那就估計還要再加一輪技術面, 給出一個最終的技術評價.果不其然, 在等了一周之後, 三面來了...
<b>三面:</b>
在三面正式開始之前, 我先問了一句是技術面還是hr面, "是技術面”. 内心頓時緊張起來,但面試官告訴我不用緊張,放松就好,隻是聊一下我這邊的具體情況, 果然三面30多分鐘基本上都是處于比較輕松的氛圍之中. 問得問題有:我常用的資料結構有哪些, 對未來有什麼打算, 對杭州有什麼印象, 有沒有女朋友, 有沒有在杭州長期居住的打算,如果我去杭州的話, 我女朋友怎麼辦等等, 由于面試官很健談, 後來又聊起了邏輯思維與追求完美的話題, 總的來說, 這一面并不如前兩面那樣技術氛圍濃厚, 面試官也特别和藹(由于面試官在正式面試之前曾經放過我鴿子, 面試開始時面試官竟然還不住給我道歉,真是受寵若驚了...), 後來面試官把他的兩個聯系方式都留給了我, 讓我有什麼就可以直接聯系他, 後來在收到offer後聯系團隊時還跟面試官通過幾次電話, 求面試官老師幫忙, 面試官老師在百忙之中還幫我聯系hr , 告訴我該如何更快的融入團隊.. 說實話, 真的非常感謝這位面試官.
<b>四面:</b>
四面是hr面, 萬萬沒想到的是hr老師竟然在周天下午打電話過來, 當時剛剛打完羽毛球, 上氣不接下氣的接了hr的電話, 然後直接開始面試. 這次面試基本沒問技術方面的問題, 由于我說了我的部落格, 是以hr老師也看了一下我的部落格, 見通路量還比較高, 我謙虛的說"可能是由于寫的東西都比較基礎, 是以看的人比較多吧o(∩_∩)o~~”; 然後又問到為什麼不打算讀研了; 在大學期間遇到的最大的困難是什麼, 是怎麼解決的; 除了上課,在大學裡其他的時間都在幹嘛等等. 總的來說, 這次面試雖然不涉及技術, 但大部分問題都是不太好答的, 是以, 在此建議大家在日常生活中對生活對一些思考, 不僅僅是為了應付hr, 更要活的明白一些.
四面結束之後, 自我感覺不錯, 果不其然在第二周的周一, 收到offer通知, 知道自己的阿裡面試算是可以告一段落了.
<b>最後再說一下</b>: 在每次面試快要結束時, 面試官都會讓你問他/她一個或幾個問題, 或者你自己主動問個問題, 在這兒我比較推薦的一個問題是"在您看來, 在阿裡(當然是目标公司)如果要勝任一份工程師的工作, 他/她需要怎麼樣的能力或素質, 或者說如果我還想繼續應聘這個工作, 我還需要做那些努力”, 這個問題暗含了三層意思:一是對我這次面試結果的詢問, 二是我該如何努力彌補自己的不足,三是表達了你對這份工作的渴望,希望能夠勝任或者獲得這份工作.
我在四次面試中都主動或被動的問到了這個問題, 四面的面試官各自給出了自己的答案, 雖然答案各異, 但是綜合起來能夠得出一個對自己綜合評價,同時,也能夠知道為接下來迎接下一輪面試或者參加工作該做哪方面的努力, 是以我感覺這個問題還是比較好的。
<b>本系列文章:</b>
<b>如何拿到阿裡技術offer:從《我為什麼來到支付寶》體味阿裡社會招聘 </b>
<b>如何獲得阿裡技術offer:從《阿裡dba面試題》體味阿裡社會招聘 </b>
<b>如何拿到阿裡技術offer:從《阿裡電話面試經過與總結》體味阿裡社會招聘</b>
<b>如何拿到阿裡技術offer:從《阿裡巴巴面試總結與感悟》體味阿裡社會招聘</b>
<b>如何拿到阿裡技術offer:從《2.5年, 從0 ->阿裡》體味阿裡内推招聘 </b>
<b>如何拿到阿裡技術offer:從《方騰飛:阿裡感悟》體味阿裡招聘 </b>