1. 程式人生 > >百度面試經驗和總結

百度面試經驗和總結

百度導航面試(拿到實習Offer)

一面

一面是電話面試,那個時候下午剛好下課,然後收到來自深圳的一個電話,是百度導航團隊的,問我能否第二天上午能否電話面試,我說可以。因為當時剛剛參加完CVTE面試不久,而且知道自己CVTE被刷了,所以那個時候又激動又慌張,因為面試了才知道自己還差很遠。於是那天晚上就看了一下JVM相關的知識,因為這個在CVTE面試有問到。到第二天面試的時候,電話終於來了,涉及的問題主要以下這些:

專案

  • 描述一下你在學校裡負責的專案?
  • 說一下專案裡面具體某部分的實現

專案相關的主要圍繞著這兩方面展開,關鍵是自己做過的東西自己一定要清楚怎麼實現的,要能夠完整清晰地解釋給別人聽,讓人家明白,不然自己不是很清楚,解釋的時候又解釋不清楚,這樣印象分就會減少很多。

安卓基礎

  • 瞭解Handler的機制嗎?
  • 訊息佇列中的訊息是怎麼知道傳遞到哪個Handler進行處理的?
  • 有沒有用過跟Handler相關的HandlerThread這個類?
  • 說一下Android的四大元件?你用過哪些?
  • 說一下Activity的生命週期?
  • 如果一個Activity因為意外退出了,應該在什麼時候儲存使用者的資料?
  • 說一下ContentProvider的作用?
  • Android中有哪些途徑可以用於應用程式的資料儲存?
  • 你瞭解過Android中哪些非同步載入機制?舉個例子
  • 瞭解過AsyncTask怎麼實現嗎?如果讓你來實現,你會怎麼做?
  • 你知道哪些設計模式?對觀察者模式瞭解嗎?

基本上能回憶起來就這些Android相關的基礎,總的來說難度不算太難,在詢問安卓基礎的過程中,還會有一些知識點結合你所做的專案,看看是否懂得靈活變通,而不是隻記住個概念。一面總體來說還算可以,大部分題目都能回答。如果真的懂,就把你知道全部都說了,這樣會體現你真的有看過相關的知識,並且掌握得還不錯,因為你自己可以組織你自己的語言把你所知道的說出來,說明到了一定的程度。如果真的不會,就直接說,不好意思,還沒了解。如果不懂裝懂,一本正經地胡說八道,反而會扣分。
一面是電話面試,大概聊了40分鐘左右,面試官對我評價還不錯。我以為可以暫時鬆一口氣,補一補其他基礎的時候,當天下午4點到5點的時候就接到了第二天電話二面的通知。我心裡一顫,晚上又開始密鑼緊鼓複習專業基礎了。

二面

二面如期而至。一面問到了安卓基礎,所以估計二面問安卓基礎的應該不會太多。所以也估計面試官會偏向資料結構方面的知識,於是也有了一些心理準備。

專案

  • 網路請求的快取機制你怎麼實現的?
  • 你用了什麼資料傳輸的格式?
  • 你怎麼從快取中找到你想要的資料?
  • 你會怎麼實現快取機制?
  • 專案中分了三層,層與層之間怎麼實現資料傳遞?
  • 你的專案需要傳輸多媒體型別的資料,Http協議的頭部有哪些變化?
  • 專案過程有沒有遇到一些問題?你是怎麼解決的?
  • 專案組裡面有沒有出現拖延的現象?如果有,你是怎麼解決的?

專業基礎

  • 你在大學裡面學了哪些課程?
  • 你瞭解哪些資料結構?
  • 知道雜湊表嗎?說一下雜湊函式怎麼構建的?
  • 怎麼避免雜湊地址的衝突?有幾種方法?
  • 你在大學裡學過哪些演算法?
  • 解釋一下什麼叫動態規劃?

其他方面

  • 你在計算機設計大賽拿了個三等獎,有沒有了解過拿了全國一等獎的專案是做什麼的?
  • 說一下你的第一個專案,簡單介紹一下
  • 你的新聞是哪裡來的?提取了新聞哪些特徵作為推薦演算法的依據?

二面用時大概半小時。總體看來,二面涵括的內容不僅僅包括個人的專案經歷和專業基礎,還有考察了面試者有沒有關注外面的世界和別人的工作,這也提醒了我們在平時不要只埋頭做自己的,主動關注別人的成果也是很重要的。

三面

比較幸運的是,一面和二面感覺都不算很難,發揮還算可以,兩位面試官給的評價都是還不錯。二面在週五,過了一個週末的時間,在週一下午4點多的時候(感覺百度處理事情都有規定的時間,比如通知都在下午4點到5點,面試基本都在上午11點左右,如果有同學要等百度通知的話下午4點到5點就不要周圍跑了免得錯過了電話就不好了),通知我過了二面,這個星期抽個時間去深圳進行三面。收到這個訊息真是又高興又擔心,畢竟來到了三面,還是現場面。根據蒐集到的面經介紹,百度現場面基本上都要手寫程式碼。正巧有個同學在週二要去深圳百度面試,於是就跟面試官確定了週二下午三點的面試時間。為了準備百度傳統的手寫程式碼的面試,那天晚上我還是有好好複習了java基礎知識和資料結構這些知識,以防萬一。但是很意外的是,竟然沒有讓我現場寫程式碼,而是問了一些專案方面的內容,還有性格和校園經歷等等。具體如下。

  • 簡單描述一下你的做過的專案。
  • 專案當中有分層的架構,層與層之間怎麼實現資料傳遞?
  • 說一下你現在的專業和課程有什麼區別?
  • 評價一下你自己是個怎樣的人?有什麼例子可以證明?
  • 你在大學期間有什麼事特別開心,又有什麼事特別沮喪?
  • 你的第一個專案拿的名次不是很好,那有沒有想過怎麼改進還是就這樣算了?
  • 你在做專案負責人的過程中,有沒有遇到一些特別大的問題,需要拿出來撕逼的?最後有沒有解決?怎麼解決?(偏向具體做法)
  • 有沒有看過一些非技術類的書籍?都有哪些?
  • 有沒有用過百度地圖?(因為沒有用過所以就被問了下面這一個問題。。。)用過哪些百度的產品?
  • (承接上題,因為我答的是百度搜索。。)你覺得百度搜索有哪些不好的地方?如果是你來做,會怎麼改進?

還有其他一些關於實習時間和轉正之類的內容,這些因公司而異,就不寫了。總體來說,三面涉及了少量技術,但都是和專案相關的,只要自己足夠清楚自己負責的內容,就沒有太大的問題。雖然面我的是一位研發經理,但是問的很多問題都是在瞭解你的個人性格、經歷等方面的內容,更像是HR面試,瞭解面試者的為人,以及是否適合在這裡工作。用時大概一個小時,相比前兩面輕鬆很多。

在三面(週二)結束之後,兩天之後(週五),就收到了面試通過的通知,HR安排入職。從簡歷投遞到面試通過,用時不到兩個星期。在這過程裡面,感覺相對幸運,畢竟是有兩次電話面試和一次現場面試,一起面試的同學(不同崗位)是直接到現場進行一二三面。而且更幸運的是拿到了百度實習的offer,這真是一個來之不易的機會。希望可以在百度裡面學到更多的知識,開闊自己的眼界。

總結補充

針對這幾場面試,做了一些總結,僅供參考。Android移動開發的面試主要考查四大塊的內容,分別是資料結構和演算法、Java基礎、安卓基礎、專案內容。以下是一些建議和書籍推薦

資料結構

我是看課本複習的資料結構,個人認為最好能掌握上課提到的所有資料結構,但是重點要掌握下面幾個:

  • 連結串列
  • 樹和二叉樹
  • 查詢(特別是二分查詢和平衡二叉樹,二分查詢要求能寫遞迴和非遞迴兩種演算法的程式碼,會求時間複雜度)
  • 排序(會寫快速排序和歸併排序演算法,會求時間複雜度,其他的排序演算法要知道演算法過程,需要特別注意堆排序)
  • 時間複雜度和空間複雜度(自己要學會面對非課本型別的一些簡單的演算法的時間複雜度和空間複雜度的推導,當然課本里面的推導也要熟悉)

JAVA基礎

java基礎除了基本的面向物件的特性之外,其實還有很多需要熟悉的內容,面試之前最好可以過一遍,即使不是很熟悉,但至少有個印象,免得面試時問起一臉茫然。

  • Java異常機制(Exception、Error、RuntimeException)
  • Java IO機制
  • 集合類框架(要深入到原理實現,即用到了什麼資料結構,過程是怎麼樣的,常考HashMap、LinkedList、ArrayList、HashSet,最好全部都看一下,這個很重要)
  • Java同步機制
  • Java多執行緒
  • Java反射機制和ClassLoader
  • Java字元編碼
  • (如果有精力)Java虛擬機器(這個相對較深入,有餘力的話可以看下《深入Java虛擬機器》這本書,看前三章基本上可以對虛擬機器有個大概的瞭解,起碼不會出現被問起什麼都不知道的情況)

推薦:Java相關的技術部落格、java設計模式

Android基礎

Android基礎這方面,有個問題需要注意的,就是我們所知道的一些android元件或者機制,可能你只是知道它的存在,也知道大概的實現過程和原理,但是並沒有使用過,這種情況的確會發生的。因此你知道實現過程和原理也可以,沒有用過但在面試的時候問到,可以把你知道的都說出來,這樣就會讓人感覺,即使你沒有用過,但是你很清楚其中的原理,用起來也不難,只是現在的專案中暫時不需要而已。好了,說了這麼多,個人認為相關的Android基礎應該包含:

Android基礎
  • Android四大元件(Activity, Service, ContentProvider, BroadcastReceiver)
  • Fragment、ListView等常用控制元件的使用
  • 資料儲存(SharedPreference, SQLite, 檔案儲存系統)
  • 網路請求和資料解析(get和post請求,json資料格式,快取系統等等)
Android進階
  • View的工作過程和繪製
  • Android的訊息處理機制
  • Android快取系統的實現原理
  • Activity的啟動模式等
  • Android記憶體洩漏和效能優化
推薦書籍
  • 《瘋狂Android講義》(幾乎覆蓋了Android需要掌握的基礎內容,可以用來覆蓋知識面)
  • 《Android群英傳》(Android知識從基礎到進階的過渡,有涉及實現原理,但是沒有非常深入,可用來過渡學習較深入的Android知識,多圖,講解比較通俗)
  • 《Android開發藝術探索》(Android進階必備書籍之一,多文字和原始碼,帶你閱讀Android實現原始碼,瞭解背後的原理。因為沒有很多圖,而且多數用文字和程式碼來描述,所以讀起來需要一定的耐心。裡面涉及的內容都是相對深入而且也是面試和工作中經常用到的,所以建議要把它看懂和看透,會有很大幫助。)

專案經歷

要對自己所負責的部分很熟悉,清楚自己負責的部分是怎麼實現的。同時要顧及整體的系統實現,也就是要點面結合。除此之外,還要多瞭解其他人的專案做了什麼,大概怎麼做的,這考查到你涉獵面是不是夠廣,是不是有關注其他人的動態。

整個面試的經過和總結差不多就這樣。實習只是一個開始,一次面試的總結,是為了可以更好地看到自己存在哪些不足,以及以後該往哪些方向去努力。這份經歷和大家一起分享,一起進步!