作者:JarryWell
連結:https://www.jianshu.com/p/840688b02c7f
感嘆一聲
耗時兩個月的找工作經歷終於是畫上句號了,幾十個日日夜夜的酸甜苦辣只有裸辭的親嘗者才能體會到吧,下麵想來複盤或者說總結一下這段經歷。但不管怎麼總結,核心還是那一句話:一定要充分的準備!!!涉及到的知識點一項都不漏的複習一遍(至於深淺程度主要看自己平時的積累了),一則能很大程度的提高自信(不需要擔心被面試官問倒);二則面對問到的知識點時還可以擴充套件的說清楚該知識點在安卓或者Java體系中的關係和邏輯。否則後續因為複習不到位而與自己理想的公司或崗位失之交臂時你會感到些懊惱。
簡歷準備階段
可以說面試官瞭解你的唯一入口就是簡歷了,因此一般都是根據你寫的專案經驗為入口來展開來問知識點。這個時間段應該要去認真閱讀自己參與過的專案程式碼,歸納出技術點、解決的問題以及最終達到的效果來完善專案經驗。另外要註意:簡歷一定要寫自己比較熟悉的技術點,因為簡歷作為一個入口,面試官很可能會層層深入的詢問你,如果不是特別熟悉就可能會招架不住。
反例:我在簡歷裡寫了一個WebView與RecycleView滑動衝突的專案經歷,有好幾個面試官犀利的看到在fling()滑行過程中會出現在交界處位置停頓的問題,繼續問到這個情況要怎麼解決,如果沒有擴充套件去瞭解MD控制元件(CoordinatorLayout+ Behavior)滑動機制的話可能就回答不上來了。甚至還有面試官繼續追問道:如果要你自己基於onTouchEvent()這個事件機制來解決這個問題要如何做,透過三個層次的追問就給問蒙了,囧。
初期準備階段
剛開始兩個禮拜還能耐得住性子在家裡老老實實的複習,一個知識點一個知識點的過。第三個禮拜便開始著急了,覺得這樣複習太慢有點浪費時間。於是草草把沒有複習完的內容快速過了一遍,著急開始找前同事和獵頭推簡歷,面試機會確實是來了,而且是一線網際網路公司。結果可想而知都很不理想:阿裡的第一輪電話面試就敗下陣來、oppo勉強衝到第二輪也沒能再過關。看到問題後於是停止了推簡歷,又老老實實的複習剩下的知識點,並做好複習筆記。雖然從失敗中總結到了經驗,但白白浪費了機會,得不償失。
該階段複習可以參考知識點串列:https://www.jianshu.com/p/0f82b0650909,基本涵蓋到安卓和Java的絕大部分的基礎知識點了,後續階段的複習也可以參考這裡的知識點。
另外一個總結得不錯的串列可以作為補充:https://lrh1993.gitbooks.io/android_interview_guide/content。
中期階段
過完前面的基礎知識點後,這個階段主要是去熟悉原始碼了。可以結合專案中用到的開源框架有針對性的閱讀下原始碼,面試過程中一般會根據你在專案中用到的框架,詢問你對這些框架的原理是否熟練掌握。通用框架一般無外乎網路庫、圖片庫、工具類、外掛化或熱更新庫等。這些知識點應該平時多去積累和練習為好,此時只要稍加複習即可。如果不是特別熟悉的可以去參考別人總結比較好的文章對著原始碼梳理,一定要在自己腦中形成知識結構,基本的實現細節要陳述出來。
另外就是平常用到的安卓原生程式碼一起要去熟悉下,比如:訊息機制、View的繪製流程、Binder通訊、java集合、併發等。覺得這些更像是基礎吧,沒什麼好說的。理解的越深對自己平常的運用越有幫助。
後期階段
有了上面兩個階段的準備後,前兩輪的基礎面試基本沒什麼問題了。如果標的崗位是資深開發或者架構師的話,一般還會問到更底層原理和更抽象的宏觀層面問題。
底層原理方面:比如虛擬機器的記憶體區域和gc流程、tcp的流量和擁塞控制、https建立連線的互動流程等,這裡可以去找對應的技術文章熟悉瞭解。
宏觀層面:一般是架構樣式(MVC、MVP、MVVM)、開發樣式(模組化、元件化、模組元件化)以及設計樣式相關問題,要能熟練掌握到靈活運用的層度,並總結出它們之間的異同特點。
另一大塊就是演演算法了,某些一線公司比較喜歡考,比如今日頭條在面試郵件中就明確指明要考演演算法。因此要對標你的標的公司是不是要考來進行複習。具體考哪些內容,以我面試的那些歷程來看,基本都沒超出《劍指offer》那六十幾道題的範圍(可能有對應題的變形),因此花一個禮拜左右的時間把那六十幾道題弄懂並自己動手實現一遍基本ok,當然一些基礎演演算法還要自己認真去總結學習,比如排序、二分查詢、連結串列和樹的基本操作等。
面試經歷
主要是根據回憶總結的(會有遺漏點)。
1、騰訊(QQ音樂)
感覺不擅長互動較少的電話面,很難快速暖場,問題回答確實不好。當時還在複習的初級階段內容都沒看完,也是一部分原因,基本算是草草收場吧。問得比較多的是最佳化相關的問題。
2、支付寶(海外版)
仍是電話面的,還是沒有找到感覺,回答不在狀態。最後獵頭反饋的本次面評是:過往專案功能較簡單、某些技術細節掌握不到位。算是浪費了機會。
3、今日頭條
是所有參加的面試裡比較專業的面試體驗吧,面試官體現了很好的技術素養。總共參加了3輪影片面試(技術面全部面完),開始還以為很有希望(感覺面得不錯,基本沒有阻塞的知識點),最終結果卻是掛掉了,原因目前未知。當然這裡也花了很長時間準備(3個禮拜左右),主要是因為要考演演算法,重頭複習了演演算法,還把所有知識點重頭捋了一遍。
主要考察的問題大體有如下一些:
android:
-
webview載入h5的最佳化(問得很多)
-
最佳化相關(包大小、啟動最佳化、卡頓),webp的透明通道如何處理,程式碼壓縮如何處理
-
native-jni相關;如何分析native的崩潰堆疊;
-
行程保活
-
外掛化原理
-
網路最佳化(答的不好)
-
https,fiddler抓包怎麼處理的,為什麼fiddler可以篡改https的資料。essay-header中的host作用是什麼
-
懂不懂kotlin (直接說不會了)
-
activity的4種啟動樣式,A啟動B時activity的兩個acitivity的生命週期的流程是什麼
-
如何監聽activity是從後臺切換到了前臺?不是在onResume()中處理
push行程的掛掉之後,再次拉起時如何恢復push行程中service的狀態 -
兩個行程如何使用binder進行雙向通訊
-
如何監測普通物件是否洩漏,leakcanary在dump時卡頓厲害,這裡該如何最佳化
listview和recycleview的差別 -
WebSocket、socket、NIO
-
對app架構的理解
-
activity的啟動流程
-
兩個頁面的訊息同步怎麼做?(類似以前評論sdk的在子評論頁面點贊時,back回來後需要同步這個點贊狀態)
java:
-
類載入流程
-
類的唯一標識是什麼
-
gc流程
-
map都有哪些型別,特點是什麼,hashmap內部結構
-
動態代理跟靜態代理區別,如何代理一個普通物件
演演算法:
-
合併兩個有序連結串列,使得最終有序。
-
Map
map,按value平方的升序列印key-value。
-
1000萬個0~100之間的小數,找top100。如果是保留兩位小數,怎麼做?
4、akulaku
整體的面試體驗還是不錯的,面試官技術素養也不錯。一下午走完了所有流程(2輪技術1輪HR)。該公司應該也算是創業公司吧,有阿裡的投資,內部很多產品線,主打東南亞電商和金融,目前算是個爆發增長期。
記憶比較深刻的問題有:
retrofit的動態代理中是如何處理介面傳回型別的(因為介面申明的泛型在執行時會被擦除)
在做專案架構時封裝的BaseActivity/BaseFragment一般要放哪些物件
Binder整體的執行邏輯是怎樣的(要能說出底層的大概原理)
5、恆信永利
公司沒什麼名氣,做網際網路金融。但從面試過程來看技術實力還是相當不錯,當時面的是架構師崗。準備不是太充分很多問題回答的確實不好(應該只複習到中期階段),整體來講也還可以。而且在這之後就開始慢慢找到自信了。
記憶比較深刻的問題有:
-
架構的核心是要解決什麼問題,怎樣才稱為好的架構
-
橋接樣式屬於什麼型別的設計樣式(結構型樣式),它是用來解決什麼場景的問題
-
畫一下IM系統中使用者A給使用者B傳送訊息時資料包和信令包的互動圖。
CurrentHashMap的實現有沒有看過原始碼,說一下它最佳化併發的原理。
對CAS的理解,用你熟悉的併發方式實現一下生產者-消費者樣式並評估它的效率。
6、oppo(應用商店)
公司就不說了,整體是很不錯的。面試體驗也還可以,參加的是他們週末的招聘會,面了2輪技術面。感覺是第二輪群面的時候表現得不好,有細節沒準備充分。有點浪費機會了的感覺,導致後面也沒有機會面其他部門了。
比較深刻的似乎大都是跟View相關的問題:
-
View體系中動畫的繪製原理。(沒有答到點上,需要看View中對動畫處理的那部分原始碼)
-
上面的提到的滑動衝突中fling()的停頓問題如何解決
-
有哪些方式可以實現滾動一個子View
-
activity的啟動流程
7、vivo(大資料中心-埋點sdk)
公司也不說了,整體都挺好的。總共面了3輪技術面+HR面,由於前面面經的積累,目前來看基本沒再碰到應用層面的難題。
印象較深的面試題有:
-
說一說系統ANR的實現原理,平常是如何解ANR問題的,如果在發生ANR時trace檔案列印的堆疊是MessageQueue.nativePollOnce()處阻塞該如何定位具體問題在哪
-
如何實現熱更新的不需要重啟行程就生效
-
activity的啟動流程
-
說一下樂觀鎖和悲觀鎖
-
單例樣式在實際使用中有什麼缺點
8、順豐科技(快運)
公司平臺還是不錯的,而且是今年發展的核心業務,團隊還在建設中,發展前景還是很不錯的。只是工作內容會比較偏重業務,看個人對工作的興趣吧。
由於是重業務的工作性質,面試問得最多的就是資料庫相關的:
-
如何做資料庫表結構的升級。
-
客戶端資料庫SQLite的極限是可以存多少資料,如果資料量特別大,如何最佳化資料的查詢效率。
-
畫一下IM系統客戶端的資料庫表的結構圖,物體要包含使用者資訊、單人會話、群聊。
-
弱網狀態下如何保證資料的最終的可用性和可靠性(http的快取和壓縮)。
9、萬興科技
是一家創業版的上市公司,公司技術能力還不錯,主打一款影片編輯軟體,因此對標的技術點就是多媒體相關開發(c/c++、音影片、opengl)。感覺公司的商業樣式比較奇怪,竟然現在還在賣軟體license授權,可能是因為標的市場在國外的緣故吧。不過對多媒體開發有興趣的還是值得試試。
總結
其實客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
朋友會在“發現-看一看”看到你“在看”的內容