寫這篇部落格無他,隻是對幾個月複習的一個總結,也算是完成了既定的目标,是一個結束,也是一個開始... ...
注:本人通信專業,大半年前隻會寫冒泡排序,無軟體基礎,無實習經曆。說這些是要告訴那些有目标、有理想,但是不夠自信或者擔心時間來不及而又想進網際網路公司的同學:你想要的,你就會得到,隻要你視之為目标,規劃好,并且堅持到底。
西安這段時間天氣不太好,連續下了很多天雨。9月13号下午3:00從西電北門出發,坐公共汽車到悅豪酒店,3:30到達。阿裡今年采取網上預約面試時間,是以早去也沒用,霸面就比較困難了,預約的時間是下午4:00,是以還有半個小時。到酒店就簽到,簽到時MM問我是C++還是JAVA方向的,果斷C++,然後告訴我可能4點還輪不到我,我說沒事,我等,然後等待。差不多3:40的時候就叫到我的名字了,我當時還确認了下,然後就被帶到一個面試官前面了,再然後一面就開始了:
一面:
1. 先讓自我介紹
2. 自我介紹中我說看了APUE,讓介紹最熟悉的章節。我說了IO多路轉接這一塊(項目中有使用),詳細說了select、poll、epoll的差別。
3. 問了履歷上寫的實驗室的項目,一個通信系統(主要使用FPGA實作的),雖然軟體方面使用的比較少,但是問的很細,系統之間的借口、幀結構、winpcap(libpcap)… 總之問的很細,最後他大緻了解了整體的架構。這一部分占了挺長的時間的,讓我以為他不想讓我過了,因為使用軟體方面的較少。
4. 問TCP/IP協定,具體問題忘了,記得畫了3次握手、TCP頭部的6個标志位,可能他感覺我沒說到他想知道的,就直接問了個快速重傳,畫了個示意圖就過了。
5. 一個程式題,就是給個字元串,求最長不重複字串,我想了一會組織下語言說了下,中間有個錯誤的地方,他指出來了,然後問我能寫出來不,因為當時提到使用哈希表,感覺有點複雜,我說我需要點時間,完整程式可能需要調試,他就沒讓我寫了(估計寫出來評價會高些,後來結束後發現自己以前在LeetCode上寫過的,不需要使用哈希,直接循環判斷是否重複就好了,當時一緊張忘記了,隻能想到哪說哪了)。
6. 又問了一個求數組中第二大的數,我想了一會,說了兩個方法,一個就是周遊一遍,更新最大和第二大,最後傳回第二大就好了;第二個就是使用了類似錦标賽排序的方法先找最大,然後再找第二大的,和他說了下,他說第二種太複雜了,我想也是,隻是一個很簡單的問題,第二種隻是比較次數比較少。讓寫了這個程式。因為程式簡單,是以一定不能出錯。寫好以後檢查了一下(參數判斷、函數調用、傳回值),最後交給他看,他大緻看了一下就讓我給他講一下,因為比較簡單,而且沒有錯誤,他還是比較滿意的。
7. 中間還問了點其他的問題,有點忘記了,都是些基礎知識。
8. 問我有沒有什麼問題,我就問了一個,具體忘記了。然後出來等通知了,出來時間4:30,差不多接近50分鐘吧。
因為今天是第二天的面試了,是以從QQ群裡也知道了一點資訊,就是如果從業人員告訴我回去等待,那就是一面沒過了,今年效率都很高的,連着面的(之前華為也是連着兩面)。等的時候确實有點焦急,但感覺一面還好,實在不行就去騰訊霸面去(騰訊的筆試也是今天下午,剛好沖突),是以也在自我安慰。然後就一直等到5:00點,通知去二面,這個時候二面的人已經很少了,加我就兩三個吧。
二面:
1. 開始還是自我介紹
2. 講做得最好的項目,因為我的實驗室項目都是網絡方面的(通信專業的),是以講了唯一的一個軟體小項目,重點講了IO多路轉接(select、poll、epoll)。
3. 講完後問程序、線程,
1) 問差別與聯系;
2) 什麼時候使用多程序、什麼時候使用多線程、什麼時候混合使用多程序和多線程,平時隻關注差別了,是以說的不是太好;
3) 程序間通信(IPC)、線程間通信,重點說了下匿名管道、命名管道、信号量、共享存儲等;
4) 線程間同步方法:說了互斥量、讀寫鎖、條件變量;
這個部分問的比較多,因為我履歷上就寫着熟悉UNIX/Linux環境程式設計,主要是多線程、多程序的适應範圍追問的比較厲害,背景方面的知識還有待加強。
4. 記憶體讀取時間數量級
這個可以估算出來的,開始說了us級,然後面試官讓我算一下,就假設記憶體頻率為1000Mhz,倒數就是ns級了(DDR3記憶體讀取位寬一般為>=64),(自己把ns忘了,直接us後就變ps了,然後被糾正了)。
5. 還問了一個設計題,顯示淘寶的線上數,認為在目前時刻之前的30分鐘以内隻要連上淘寶一次就算線上(重複連接配接隻算一次),然後問怎樣每隔一分鐘顯示一次淘寶線上數。自己想了一會,然後說了一下大緻思路。涉及的資料結構有哈希表、紅黑樹、B+樹,又讓介紹了紅黑樹和B樹,我又說了高并發情況下共享記憶體的一種方式(面試官感覺很驚奇,問我在哪看的,我說看一些高并發架構時看的),然後又說到分布式解決一緻性的方法,我說知道一個算法好像就是解決一緻性問題的,就是paxos,他說我還知道這個,就讓我說下paxos,我說在維基百科上看過,知道一點。其實我開始也沒思路,然後想如果是自己在實驗室做項目遇到這個問題會怎麼做,後來整個過程思維一直很活躍,面試官也一直在引導,因為不要實作,是以我感覺可行的都說出來,最後面試官應該也是認可了,至少這個思維的過程他認可了。
6. 中間穿插問了看了哪些書,下一步發展方向之類的問題。
7. 因為習慣,整個面試過程我一直在紙上寫寫畫畫,把一些答案什麼的都寫在紙上了。最後面試官問我有什麼問題,
我就問了阿裡是不是Java使用很多,C++很少(我面的是C++方向的)?
面試官說隻是淘寶是這樣的,其他不是的,C++使用也挺多的,背景底層很多C++實作的。
又問他平時會使用那些技術,做哪方面工作,然後他就示意我在紙上寫的一些東西,說是搜尋推薦、paxos相關的,還有一些我也沒記清的。
然後又讓出去等… …
二面出來感覺輕松多了,也沒想太多,因為都盡力回答了,感覺還好。等了大概10分鐘,帶我去HR面了(沒享受到傳說中的交叉面待遇,我也确實很一般,不是大牛)。
HR面:
HR是個MM,然後就是生活、學習、性格各個方面各種聊天,聊得很愉快,然後讓我到服務台确認下就可以回去等結果了。
到服務台問了下,說要等等的,就等了一會,然後就聽别人說來往可以查面試結果,移動2G今天還是很給力的,一會就刷出了四面通過,然後應該就沒問題了。
回來後晚上10點接到了阿裡的短信、電話offer,讓14号早上參加圓桌沙龍,談論薪資、工作地點等。
個人三面感受:
1. 基礎知識一定要紮實(C++(JAVA)、資料結構、算法、作業系統、TCP/IP、資料庫基本知識、Linux、設計模式… …,不同職位要求不同,都知道最好),因為面試問的問題很随機,但是基本都在這些基礎知識裡面。面試背景的Richard Stevens的書(APUE、UNIX網絡程式設計、TCP/IP)好好看看(我看了APUE、網絡程式設計看了一點、TCP/IP卷一)。
2. 手寫程式,一定要練,基本排序算法(快排、歸并、堆排、Shell等)、基本的資料結構(list、stack、heap、tree(高度、節點數、是否平衡、3種周遊遞歸非遞歸)、BST(插入、查找)),C基本字元串操作函數(strcmp之類的,還有memmove)、基本的算法KMP、LCS… … 推薦到LeetCode上刷題,推薦《劍指OFFER》、《Cracking the coding interview》(本人隻看了一題,但是書很好,某去谷歌的大牛,刷了好幾遍)、《程式設計珠玑》、《程式設計之美》,前兩本練手寫,後兩本重思路。
3. 履歷重點突出就好(該放的不該放的,排版什麼的好好搞一搞,至少要給人一種整齊美觀、重點突出的感覺)。自己最擅長的(或知道最多、最全面的)在自我介紹時要說出來,還有就是項目好好準備一下,使用的技術及其相關的技術一定要深刻全面了解。
4. 最後有時間擴充下自己的知識面,在自己感興趣的方向上多了解些實際使用的技術,這些東西有可能在關鍵時刻就起作用了。