前言
應大家的邀請,寫一篇關於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程式設計師更好地成長為高階工程師,直到有一天一些讀者和我反饋,說這本書的內容很適合面試,我這才突然發現,原來這本書的內容真的適合面試,這也算是無心插柳吧。至於書的內容我就不做過多介紹了,大家可以看目錄、樣章以及讀者評價,如果覺得不適合自己的話就不要購買了。