很幸運的拿到百度的面試機會。今天第二面面完后,估計二面沒戲了。這里大概總結下百度面試的風格。
9月20號一面
一面上來先讓你介紹項目,還好之前准備了一下。在項目的基礎上又添油加醋了一些東西,使項目看上去更專業一點。
我大概介紹了下項目,我提到項目用到了多線程,他就問我這個多線程訪問緩沖區是怎么實現的。有哪些類和接口,這些
類和接口是干什么的。說完之后,他問我tcp協議如何建立一個連接,這個當然沒問題了,三次握手。他又問那瀏覽器
和服務器通信的全過程是什么,我回答了tcp協議的工作流程,面試官說不是介紹tcp協議。我有點蒙,然后隨便說了
點服務器在80端口監聽,瀏覽器向服務器發送數據,服務器返回數據給瀏覽器。面試官又問那你的項目用到了多線程,那么
線程池是如何工作的?一開始沒理解他意思,他后來稍微提示了下,我才明白他要問的是線程池的線程重用。他又問,那么,
請你類比線程池,連接池,文件池。我有點蒙,表示沒聽過什么是連接池,然后靈機一動是不是http的keep-alive機制。面試官
說,那你說說什么事http的keep-alive。后來回去查資料才知道連接池是數據庫中的概念。然后面試官又問如何判斷鏈表中
是否有環,這個題我已經爛熟於心了,我假裝第一次碰到這個題,裝逼想了會,說快慢指針。尼瑪面試官一眼看穿,直接pass不再問了。
然后,面試官說,那你這個項目客戶端訪問服務器的訪問量比較小,那如果現在有個應用,可能一天有一億的訪問量,你如何降低
這個服務器的響應延遲。我想了下,可以用hadoop,面試官說,你寫過hadoop的代碼嗎?我說寫過一點,他說,那你介紹下什么
是hadoop,他是怎么運作的。我大概說了下,他說那你不用hadoop怎么解決這個問題。我又想了個轉發訪問的方法,就是假設有6台
服務器,A,B1,B2,B3,B4,B5。那么A接受用戶的請求,A再把請求轉發給B組服務器中的某一個,由他們進行處理。面試官問,
那現在假設有1t的數據,分別存儲在b1-b5上,每個存200M,現在有個請求過來后,發現數據分別在B1,B2,B3上。B1,B2,B3分別響應一個
文件分片,part1,part2,part3,你如何將這三個分片合成一個?我又蒙了,交流了下才明白他是想問排序。他又把問題簡化成假設有100個
長度為2048的文件分片,你如何按順序把這100個文件組合成一個新的文件。他給了我提示之后,我想到現在B組的服務器上對數據進行堆排序,
這樣服務器A拿到3個已經組織成堆的數據,A只要不斷輸出堆中的元素就行了。他說,那行,你寫下堆排序的代碼。如何把一個數組組織成一個堆,
如何在堆中插入一個元素。媽的,還好這塊我比較熟,也大概寫出來了。面到這里,一面就結束了,一面大概面了一個小時。
9月22號二面
收到二面的通知我是有點驚訝的,因為自覺一面面的一般。一上來,面試官就感覺和一面的不是一個風格,一面的面試官一看就是工作沒幾年的,
還帶着些許學生的稚氣。二面的面試官不太像個搞IT的,扎個小辮子,手腕纏着佛珠,頭發也有些許花白,感覺像個搞藝術的。應該是個資深員工。
一上來依舊是問項目,和一面不同,他特別關心數據庫的實現,詳細的問我數據庫的組織結構。有哪些表,表里有哪些字段,這些字段是什么
功能。由於是添油加醋,說的磕磕絆絆的。然后他問了三個問題,第一,你們如何處理書籍丟失,就是掃了一圈,有本書沒了,怎么處理的。
我,額,系統沒考慮到這個問題。第二,你們如何同步學校服務器和本地服務器之間的數據,額,沒同步。第三,你們有兩個服務器,一個是
學校的,一個是你們自己的,假如現在有個學生借書,這個請求發送到學校的服務器,學校的服務器執行成功了,把錢扣了。那然后再訪問本地的
服務器,結果失敗了,那怎么處理這個問題。我想了下,瞎說了個回滾,面試官說不可以。我又瞎說了個說給事務編號。媽的,這里面的一坨屎。
然后估計面試官也受不了了,他開始問跟項目沒關系的東西。他問,瀏覽器如何訪問服務器,這個問題一面遇到過,我答的還行。然后問http協議
有哪些狀態碼,這個也看過,介紹了200-500,但是他問了個那100是什么意思,我他媽瞎了,不知道。然后問http協議有哪些方法啊,還好這個
前一天晚上看了,又問post和get的區別。又問操作系統的虛擬內存是什么意思,尼瑪這考研內容,但是有點忘了,還好說了個大概。他問虛擬內存
存在什么地方,我有點蒙,什么意思,突然想到操作系統把內核分為內核空間和用戶空間,所以答虛擬內存用的是用戶空間,他又問還有可能存在什么
地方,我說可能存在硬盤里。然后又問線程之間如何通信,進程之間如何通信。我答的不好,隨便瞎說了點。然后問進程和線程有什么區別,進程如何
調用系統服務,我說linux里請求個標志位,是多少忘了,你媽當時0x80已經在嘴邊了沒說,后來一查就是int 0x80請求系統服務。他問,你用過linux啊
那你說說你用過哪些linux的命令,我說mount,top,contrab。然后問java里有哪些容器啊,我說,hashtable,hashmap,arraylist,linkedlist。
他說,那你說說hashmap和hashtable的區別。我一開始把hashtable和hashset搞混了,然后說了個hashmap是用來替代hashtable的,最后想起來
hashtable是線程安全的。然后他又問那哈希表有哪些處理沖突的辦法啊,我說了幾個常見的,提到了再哈希,他問,如果一個hash(hash(key))==hash(key)
怎么辦,我說那遇到這種情況就線性探測。然后我又提到了公共空間法,他問這個公共空間是怎么實現的,我說最簡單的用個數組,復雜點的用棵二叉查找樹。
他問二叉查找樹如何刪除一個節點,讓我寫代碼。我剛寫2分鍾,他說沒時間了,讓我說下思路。我大概說了下,他又問紅黑樹用於什么場景,我蒙了,
都知道紅黑樹的樹結構,但是沒想過用於什么場景啊。然后面試就結束了
總體來說,百度的面試官還是很nice的,如果你不會,他會給你很多提示,而且百度一個很大的特點就是,他的面試經常是給你一個場景,然后從這個場景中
引申出很多的問題。面試的問題也很活,你說到哪,他問到哪。還是和以前的面試有些區別。二面面的不好,估計掛了。在此分享出來這個面試經歷,希望
大家能從中得到一些信息。