給Android程序員的一些面試建議

前言

應大傢的邀請,寫一篇關於Android面試相關的博客,需要說明的是本文隻針對Android應用開發,不針對rom開發以及逆向工程。我想面試對於程序員來說是很重要的一件事件,面試結果的好壞直接決定瞭能否進入某個公司以及以什麼級別和待遇進入某個公司。我參加面試的經驗並不多,但是以面試官的身份面試別人倒是有很多次,所以我可以結合這些經驗來介紹下如何更好地把握一個面試。

什麼是合適的候選者

在介紹如何面試之前,這裡先從公司的角度來分析:”到底什麼樣的候選者是公司所需要的技術人才?“就我在百度的一些面試官經驗來說,一個具有如下特征的Android程序員是我們所需要的:
1. 具有本科及以上學歷(名校更好)
2. 具有2年及以上的工作經驗(名企更好)
3. 技術紮實,有技術追求和工作激情
4. 良好的溝通和協作

在上面的四條中,其中第3條是最為重要的,即技術,在百度技術是大傢所推崇的,因此技術是決定能否通過面試的最重要最直接的原因。一般來說,越是大公司,其對技術的要求就越高,盡管部分崗位並不需要那麼好的技術,但是為瞭對候選者做出區分,其面試過程仍然會面試一些稍微深入的話題,相信大傢都有所體會。

除瞭技術以外,良好的溝通和協作能力也是比較重要的。也許很多人覺得這個比較抽象,心裡會想:”你怎麼知道我有沒有良好的溝通和協作能力呢“?其實這個問題並不難,面試過程就是一次溝通過程,如果不能和面試官很好地溝通,這就說明候選者的溝通有問題。如何很好地和面試官溝通呢?給如下幾點建議:
禮貌和尊重
聽懂面試官的問題並直接回答。有些候選者聽不懂面試官的問題,還有些面試者總是不直接回答問題,或者也許是不會的原因,就開始轉彎抹角甚至轉移話題,我認為這是很不好的,人要用於承擔,即使這個問題不會,那也可以大聲地說出來”不好意思,這個我不太會“,甚至還可以虛心地請教下面試官,面試不僅僅是一次找工作的過程,也是一次自我學習和提高的過程。大傢要知道的是,不是必須全部答對問題才能通過面試,隻要大部分問題能回答出來並且候選者的態度良好,那麼這樣的候選者仍然能通過面試,當然態度不好的候選者,即使技術很好也很大可能通不過面試。
謙虛謹慎、態度友好。有些候選者在面試的時候不謹慎,給人一種隨意的感覺,比如坐姿不端正,翹著二郎腿等等,換句話說就是別太隨意,作為面試官公司都要求不能太隨意,何況候選者呢!太隨意的舉動會給對方一種不被尊重的感覺。關於謙虛,這個就不必多說瞭,任何時候都要謙虛,面試過程中驕傲自大(俗稱”得瑟“),是很容易被斃的。態度友好,就是要讓面試官感受到你的誠意,這樣大傢溝通起來才比較舒服和自在。

下面對學歷和工作經驗做一些說明,學歷並不是一個硬性要求,即使候選者學校不怎麼好也是有可能通過面試的,這就要求候選者技術非常紮實。而工作經驗,之所以是2年以上,這是因為社會招聘的對象一般都是有一定工作經驗的,而1年工作經驗略短瞭點,拿百度來說,社招的最低級別一般為T4,差不多剛好就是2年經驗左右。

這裡做下總結,理想的候選者應該是這樣的
1. 紮實的技術功底,有技術追求(必須)
2. 態度、溝通和為人都很好(必須)
3. 2年左右工作經驗(基本必須)
4. 名校、名企、高學歷(非必須,加分項)
基本來說,滿足1和2就能通過面試,3和4都是次要條件,但是一般來說不滿足3就很難滿足1,不要說特例,木有參考意義。
由此可見,技術是面試結果的決定因素。那麼到底技術掌握到什麼程度才能比較輕松地通過面試呢?說瞭那麼多,好像和Android沒有一點關系,下面就開始以Android為例來分析下面試過程所需的技術。

Android面試過程所需要掌握的技術

一場面試都有一個流程,拿Android面試來說,面試內容不可能全是Android問題,裡面應該會有編程基礎相關的問題。我對Android面試中的問題做瞭下分類,如下所示:

類別 描述
數據結構和算法 熟悉或者知道
Java 熟練掌握
Android 熟練掌握
設計模式和架構 熟悉

一般來說,一個Android應用開發崗位是不需要太強的數據結構和算法的,但是這並不意味著候選者可以完全不懂數據結構和算法,所以數據結構和算法大傢還是要稍微瞭解下,由於它不是必須的,所以就算面試過程中回答的不好也沒關系,隻要後面的Java、Android相關的問題能夠完美回答就好。有同學和我反饋,說面試掛在瞭數據結構和算法,這在社招中應該是不多見的,這多半是因為Android的問題也沒有很好地回答出來,這就是社招和校招的不同之處,校招看基礎,社招看技術深度和業務。

關於設計模式和架構,其實中高級面試對這個的要求並不是特別高,熟悉下常見的設計模式基本就ok,比如單例模式、工程模式、觀察者模式等。

接下來主要描述下面試過程中對Android技術的要求。在我對Android的理解這篇文章中,我對Android的技術類別做瞭一下劃分,如下所示:

類別 描述 開發者所需級別
基本知識點 熟練掌握 初中級
深入知識點 熟練掌握 中高級
基本知識點的細節 掌握 高級
系統核心機制 熟悉、掌握 高級、資深
瑣碎的知識點 瞭解 所有級別

對於大部分面試者來說,大傢的目標崗位應該是中高級,中級崗位(百度T4)需要掌握的知識點是:基本知識點、深入知識點;高級崗位(百度T5)需要掌握的知識點是:基本知識點、深入知識點、基本知識點的細節和系統核心機制。
1. 基本知識點
比如四大組件如何使用、如何創建Service、如何進行佈局等。這類知識是需要熟練掌握的,並且也沒什麼難度。
2. 稍微深入的知識點
比如AIDL、Binder、多進程、View的繪制流程、事件分發、消息隊列等。這類知識對於高級開發者來說也是必須掌握的,然而相信很多候選者在面試之前並不能對這些問題瞭如指掌。這些問題基本都是面試過程中很常見的問題,也是高級崗位所必須掌握的問題,不搞定這些問題無法達到百度的高級工程師的標準,因此也不可能通過面試。
3. 基本知識點的細節
比如Activity的啟動模式和標記位、Service同時處於start和bind狀態時的停止問題、AsyncTask的同步異步問題以及使用時的限制等,這種問題還有很多。這類知識點,大傢在開發過程中可以並不會去註意,這會導致一個問題,那就是開發應用沒問題,但是在面試時面試官隻要稍微問下細節或者特殊情況,就hold不住瞭。 這類問題也是高級開發者所需要掌握的,有些面試官喜歡問一些看似刁鉆的問題,但是候選者如果回答不瞭也是不好的。
4. 系統核心機制
比如主線程的消息循環、主線程如何和AMS如何跨進程交互、SystemServer進程中的各種Service的工作方式、AsyncTask的工作原理等。這類知識對於高級開發者也是建議掌握的,因為它們可以讓開發者理解Android的運行體系。 這類問題並不是所有的Android面試都會涉及到,但是技術含量高的大公司有可能涉及此類問題。
5. 瑣碎的知識點
此類知識點我把它們定義為一些重要但是沒有什麼技術難度的問題,比如如何打開一個網頁、如何打電話、如何發短信、如何定位、多點觸控等,這類問題往往不好記憶,但是需要的時候去查一下就能立馬搞定。這類問題基本上不會出現在面試過程中。

大傢結合自己對Android的學習過程以及面試經驗,在面試中遇到的問題是不是都是包含在上面的5個分類之中呢?對於1和5相信所有人都沒有問題,但是對比2、3、4中的內容,大傢是不是都能很好地Cover呢?換句話說,如果2、3、4中的內容大傢都能很好地掌握,面試中的問題還能難倒我們嗎?在前面的分析中提到,技術是覺得面試是否成功的關鍵因素,那麼在面試前要做的就是把技術搞好,同時註意溝通和態度,這樣的話通過面試豈不是很簡單的事?

如何學習Android面試中所需的技術

這裡主要是指上面2、3和4這三個類別中的技術,說實話,這並不是一件很簡單的事。那麼到底如何學習呢,這裡先大概說下,隨後會有一系列博客來詳細地介紹這些技術的學習過程。首先要閱讀源碼,因為面試中的很多問題需要從源碼中找答案,其次要主動學習平時工作中遇不到的一些技術,由於項目的原因,我們不可能通過公司的項目來解除到Android中所有的重要技術,尤其是一些規模不大的項目來說,這個時候要主動去學習。也許有人要問:”我怎麼知道哪些東西是需要主動學習的呢?“這的確是個問題,但是我在前面的分類中做瞭一些舉例,大傢可以先嘗試學習下那些技術,它們都是很重要且時常在面試中出現的技術問題。另外學習的過程中要註意積累,比如寫博客、記筆記都是可以的,同時在Github上做開源也是不錯的選擇。

另外,為瞭更好更快地學習Android面試中所需的技術,大傢可以閱讀我的一本書《Android開發藝術探索》,書中對前面的2、3和4類別中的技術細節做瞭詳細深入的講解,通過這本書可以達到立竿見影的效果。說到《Android開發藝術探索》,我不得不說,我寫這本書的初衷是幫助Android程序員更好地成長為高級工程師,直到有一天一些讀者和我反饋,說這本書的內容很適合面試,我這才突然發現,原來這本書的內容真的適合面試,這也算是無心插柳吧。至於書的內容我就不做過多介紹瞭,大傢可以看目錄、樣章以及讀者評價,如果覺得不適合自己的話就不要購買瞭。

 

發佈留言