談談關於 Android 面試的那些事,寫給有開發經驗的你們

前言

專欄的其他文章都針對 Android 面試不同的方面做了很深入的剖析,今天就主要說說之前10月到11月小米麪試前後的一些總結吧!當然,我不會透露任何的面試細節,即便是我說了,對大家也沒任何幫助,因爲面試面的是內力,不是要你給出每一個問題的標準答案,而是要你給出這個問題的你的、自己的答案

作者簡介

首先簡單說說自己的經歷,13年一個普通二本學校軟件工程專業畢業,12年去了一家外包公司(實打實的做外包項目),太累,趁畢業辭職回了學校。13年畢業稀裏糊塗和幾個哥們開始自己創業,不到一年,團隊解散。然後到了我上一家公司,從一個人獨立的做項目到組建移動端團隊,其中也有參與的產品目前每月可以收入上百萬。但是,今年年中,我突然發現這3年多時間自己變化甚微,不僅僅是收入,還有技術、能力……甚至都開始迷茫了,接下來到底該往哪裏走,繼續技術深入?目前的平臺沒有需要;直接轉管理?個人對管理這個東西還是比較敬畏,不希望別人做我的小白鼠耽誤了別人,當然我也反感做別人的小白鼠(這也是離職的一個因素)。上一個家公司能給的就只有平淡的穩定,所以這個時候我開始反思是不是應該去經歷一下大公司、大平臺,此前覺得進了大公司後面還是要自己出來,何不就直接就在創業公司打拼呢!現在想想,有一個很重要的自身因素是非常重要的,那就是積累(業務能力、高度等等的能力),如果沒有積累,就得不到信任,這是一個很殘忍的現實,關於這點,我就不再深入了,相信在小公司工作過幾年的同學都有自己的認知。因此,我決定找工作了!

關於簡歷

面試首先要提到的就是簡歷,簡歷這個東西真的是一個很深奧的事情,爲什麼深奧,其實是對像和我這樣的人深奧:學歷不好、工作經歷不好。當然,這和目前技術研發人才需求的大環境也有關係,而且上述兩點會越來越影響簡歷的通過性。說一個真實的事情大家就有概念了,這是一個前同事私下告訴我的,他比我先一年多離開公司,然後到了一個大廠(一個大電商),他現在也負責招聘面試,如果社招簡歷不是碩士,都會往後排排,雖然這不是公司規定,但是他們實際就是這樣操作的。是不是很嚇人?他自己都覺得嚇人。說了這麼多,那怎麼辦呢?學歷不好、工作經歷不好就別指望找到好工作了?當然不是,其實面試還是考的內功,簡歷只是一塊敲門磚,如果你的內功深厚,並且能夠很好的體現在簡歷上,那麼簡歷真的只是一個簡歷而已。大家應該注意到了,上面提到了兩點:

  1. 將能力很好的體現在簡歷上
  2. 內功深厚

如何將能力很好的體現到簡歷上其實不是一個理工科同學擅長的技能,所以要多寫多改多請教,多找找有經驗的朋友幫你看看,即便是沒有這樣的朋友,相信大家也有能力和渠道去接觸到這樣的人。另外關於簡歷的格式網上有很多文章,前面專欄裏文章也有提到過,這點就不再深入了,有一點很重要的我覺得應該加強一下大家的警惕,就是用過,但是知道不深入的技術點一定不要寫在簡歷上,一般大公司面試有一面一定是簡歷面,也就是按照你簡寫上寫的技術點問,如果發現你寫了,但是又說不出來很深的東西,那就相當減分了,所以這一點一定要注意。總之,簡歷不是你面試通過最關鍵的東西,最關鍵的是第二點:內功

關於內功

一個怎樣的Android工程師才能進入到大廠呢?下面幾個方面往往是需要具備的

一、基礎

要想拿到大廠的offer,基礎好是一個硬性條件,對於計算機相關專業畢業的同學來說,這些基礎就是你大學所學的課程,如果不是計算機相關專業畢業的同學,那麼就需要在基礎知識這個方面下足功夫了,具體來說下面的東西必須掌握:

  1. 操作系統原理(裏面有一些計算機組成原理的知識需要簡單掌握)
  2. 網絡原理

如果你沒有掌握這些知識,或者之前學過,但是忘了怎麼辦?學啊!怎麼學呢?去網上找一些大學的公開課,我是看的清華的,至於哪一個學校的適合你,就只有你自己判斷了。可能大家會有疑問,面試會問這些知識嗎?直接問的很少,但是隻有你瞭解了這些知識,才能更深入的瞭解一些技術和知識。舉兩個例子吧,第一個,如果要做Android裏的網絡優化,你不知道網絡裏面的一些原理,你怎麼知道怎麼優化?如果你不知道UDP和TCP的詳細區別,技術選擇時,你怎麼知道選擇哪一個作爲你通訊的協議?關於網絡還有一個出現概率很高的問題就是TCP的三次握手和四次握手,其實它就是網絡原理裏面的知識。第二個,操作系統中,內存是發揮什麼作用的,又是怎麼工作的,知道這些,你再去了解Android的內存管理就信手拈來了。

二、數據結構和算法

數據結構和算法其實是分開的東西,我們需要先掌握各種數據結構,再去加深算法,數據結構和算法其實也屬於基礎,但是它現在越來越重要,所以我就單獨拿出來說了。數據結構怎麼深入同樣我也推薦大家去看清華或者浙大《數據結構》公開課,特別是清華的,值得反覆研究。至於算法,首先要做的就是動手,LeetCode上直接幹!第二階段就是要總結各種算法的思想和套路,像遞歸、動態規劃等這些算法都是有套路的,在LeetCode上也有按數據結構和算法分類的篩選,大家可以針對性練習和總結。當然,對於一個Android程序員,能做到每天在LeetCode上刷題就非常不錯了,所以一定要堅持,等你堅持到一定的時間,你會發現你越來越遊刃有餘,我從15年底開始在LeetCode上刷題,目前已經刷了200多道了,小米的面試也非常注重算法,還要能寫。而且對一些特別注重算法的公司,算法這塊的考覈非常嚴苛,對,就是嚴苛,而不是嚴格。

三、設計模式

設計模式中包括了設計原則,其實對於Android開發人員來說,設計模式就那23種,知道並瞭解這些設計模式是第一個階段,僅僅是到這個階段是不夠的,一般面試也不會問你某個設計模式的概念,而會讓你具體的說說你對某一種設計模式的深入瞭解和使用,它的優缺點,所以,第二階段就是要運用它們,其次要和Android源碼中運用到設計模式地方進行結合學習。例如建造者模式,Andoird中的Dialog創建就使用到了,還有像單例模式、適配器模式、觀察者模式等等都是在Android中非常常用的設計模式,也是在面試中出現頻率很高的。

四、Java

Java我就來直接一點了,如下:

  1. Java集合(HashMap一般必考,通讀源碼很有必要)
  2. 反射
  3. 多線程
  4. IO、NIO(可選)
  5. 泛型
  6. JVM相關,如內存的管理、內存的回收、類的的加載等等
  7. Java異常

大家可能覺得這些自己多多少少都瞭解,但是當問到細節就不知道了,所以對於上面的知識還是需要系統的認知,項目中沒有機會深入就自己一個一個突破,比如Java集合,首先對集合要有一個宏觀的認知,這是我之前總結的一張關於Java集合的圖:

它就是我通過查看集合的源碼一步一步畫出來的,等我畫完,我腦袋裏也有了一個清晰的認識。然後從常見類的源碼開始動手,如HashMap,循序漸進,逐個擊破。從這點也可以看出,我們對每一類知識一定要深入的瞭解,而不是泛泛的知道,比如Android的一些熱修復框架,其中就是JVM中類加載和反射等技術。又比如併發中,線程池和ThreadLocal這些都是必要掌握和熟練使用的知識,也是面試經常會被問到的。

五、Android

Android其實要說的不多,對於一個有工作經驗的Android程序員來說,基礎的一些Android技術大家都是掌握了的,而如果要做一個加分的Android程序員,下面的Android技術就需要深入瞭解了:

  1. Android View的繪製和流程
  2. Android觸摸事件分發機制
  3. 性能優化(網絡、內存、電量、UI)
  4. 常見Android源碼,如Handler、AsyncTask等等
  5. 熟悉Binder原理
  6. 瞭解一些Framework常見知識,如AMS

同樣的,這些都是要系統的掌握和運用。

六、JNI

JNI其實屬於Android NDK中的一個技術點,但是它不像上面的知識需要系統的瞭解,JNI我們只需要知道Java怎麼調用C或C++的代碼,C或C++怎麼調用Java的代碼,並且相互之前怎麼傳遞各種參數(對象),因爲一般Android開會不會涉及到寫複雜的C或C++代碼,我們使用NDK也更多是爲了調用第三方的一些C或C++算法庫,如FFmpeg。當然,如果你能寫得一手好的C或C++代碼,那麼就更加分了。

七、框架和項目

在Android中會經常使用到一些第三方框架,這也是面試中會經常問到的,具體問題就是它們的原理或設計,像LeakCanary、OkHttp等,當然一般只會問你使用過的,在平時我們使用第三方框架的時,就需要去了解他們,僅僅是爲了用而用,是面試官不想看到的現象,因爲只會用,不懂原理,就不能控制,而是被框架控制。如何去了解呢,首先要知道這個框架怎麼用,然後在找入口,從入口一步一步去探索。自己做的項目也和第三方框架類似,你自己參與的項目的架構如果你都不清楚,那麼面試官也就知道你對技術的飢渴度了。比如我之前的公司就使用Netty做終端和服務器的通信,在我的簡歷中也體現了這點,我有信心將它體現到簡歷上,是因爲我花時間去詳細瞭解過Netty,從NIO到Netty,到Netty常用的類,再到一些慨唸的瞭解,如零拷貝、IO多路複用、粘包、拆包等等。所以當你在項目中使用過了,並且被問到時你能很好的說出來,那一定是加分的。

八、其他

其他都是能爲你的簡歷加分(好學歷和好工作背景就不說了):

  1. 有開源項目
  2. 參與過開源項目
  3. 有個人博客(有內容、有深度、有價值)

這些也屬於一個人的內功,但是它和上面我要提到的還不一樣,因爲它不是必須,但又有可能很重要。

內功小結

大家看我一會就把Android研發人員需要具備的內功總結完了,但是如果你真的要把這些都真正的掌握、變成自己的東西真的不容易。每個人都有自己的目標和夢想,在走向目標和夢想的道路上,肯定有各種各樣的困難。只有克服困難,才能繼續前行,所以,堅持吧!

知識點詳細清單

上面我總結的我怕大家還是覺得太泛泛,沒有乾貨,所以再給大家補一個清單:

  • Activity的生命週期
  • Activity的任務棧
  • Activity的啓動模式
  • Fragment的生命週期
  • Fragment的通訊,Fragment之間,Fragment和Activity
  • 什麼是Service,和Thread的區別
  • Broadcast的作用和註冊方式
  • 什麼是本地廣播
  • 什麼是有序廣播
  • Android的異步處理方式有哪些
  • AsycnTask、HandlerThread、IntentService源碼
  • Binder
  • View的繪製流程
  • 事件分發機制
  • 自定義View的幾種場景和方式
  • ListView的緩存機制
  • Handler、Message、MessageQueue、Looper
  • 第三方開源框架設計和原理
  • ANR是什麼,怎麼避免和排查
  • OOM是什麼,一般如果避免和解決
  • 內存泄露是什麼,常見的內存泄露有哪些
  • 版本管理工具的使用,Git、SVN
  • 代碼編譯工具
  • 代碼混淆
  • Java IO
  • 多線程
  • 類加載器
  • 反射
  • 23種設計模式
  • HTTP、TCP、UDP協議
  • 計算機網絡
  • 操作系統原理
  • 算法和數據結構:排序、二叉樹遍歷、動態規劃
  • 常見加密方式和原理

關於Android的前景

不斷地也聽見很多人在談做Android是否還有前途、Android研發在走下坡路了、Android的工作太難找了,對於這些其實我的看法很簡單,現在真的還沒到說Android開發已經無路可走的地步,當然未來怎樣我無法預判。現在各大公司其實都很缺Android研發(中高級),不斷的在招人,就拿小米來說,別說來面試的人了,就簡歷都拿不到太多,需要花很多時間去找簡歷。所以,對於有Android開發經驗的同學,更多應該想想怎麼往深探索,而不是一味想着換方向,不管換到哪個方向,都會面對從初級到高級到資深再到專家的時間點。所以我認爲正確的職業規劃應該是金字塔形,核心競爭力一定要紮實!

總結

上面算是一個簡單面試前技術點的總結,東西很多,如果要從零開始掌握這些也是非常艱難的過程,唯有靠自己點點滴滴積累,別無他法。其實自己總結出這些東西並不難,難的是如何學、如何堅持、如何加固,每個人的學習和積累方式都不同,一定要找到自己的方式,什麼是好的方式標準就是讓自己可以牢記、快速記,牢記比快速記更重要,如何堅持是一種意志力上的考驗,往往我們需要爲自己找一些長期和短期的目標,激勵自己不斷的進步。包括我在內的大部分人都不是什麼天才,唯一能讓自己進步的方式就是腳踏實地的去幹,相信越努力、越幸運!

最後這裏是關於我自己的Android 學習,面試文檔,視頻收集大整理,有興趣的夥伴們可以看看~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章