2019 年對我來說是最幸運的一年,很多小夥伴已經知道了,我多了一個「小情人」。然而,剛忙完回到公司的第二週,我接到了最殘酷的通知,公司經濟狀況不佳 —— 裁員!
雖然可以選擇降薪留下來,但是社保公積金最低,還需要996,無奈只好選告別了待了三年之久的 xxx,沒有 n+1,沒有 xxx,mmp。
由於離職時間點比較尷尬,馬上就是中秋節,剛好可以放鬆下回家陪陪家人。
中秋過後,嘗試投了幾份簡歷,但是效果不太好,面試機會也不多,可能是由於馬上就是國慶長假的緣故(也只能這樣安慰下自己)。
優貝在線
- Android 項目中 asset 目錄和 res 目錄有什麼區別
- 面向對象的特徵,並舉例說明面向對象的過程
- 如何結束一個正在運行的線程
- 簡述 MVC 和 MVP,並說一下 MVP 的優點
- 如何獲取某個 View 的大小並動態改變 View 的大小
- join()、wait()、interrupt()
- 二維數組旋轉
- 有一羣人A與B有關係,B與C有關係…分成兩隊,讓彼此都有關係
這是一個神奇的公司,只怪自己太菜筆試都沒有過,出師不利啊。然而奇怪的是國慶後,該公司的HR找了我不下3次。
三節課
- String、StringBuilder、StringBuffer 區別
- ArrayMap、HashMap、SparseArray 原理
- Fragment 添加方式,add、replace、show 區別
- volatile 關鍵字作用
- Binder 機制
- HTTP 版本之間區別
- invalidate()、requestLayout() 區別
- View 繪製流程
- 事件分發機制
- 渲染優化
- ArrayList 怎麼實現線程安全
必要商城
- Android 線程間通訊方式有哪些?
- 類B繼承A,A、B兩個類中都有靜態變量、成員變量、靜態代碼塊、構造方法執行順序是什麼?
- Java代碼執行時內存狀況
- Activity生命週期其他函數
- View什麼時候繪製完成?
- 如何獲取一個View的尺寸?
展心展力
- Handler 機制,一個線程幾個 Looper,幾個 Handler,Looper 如何確定是哪個 Handler?
- 內存溢出、內存泄漏的關係
- volatile、synchronized關鍵字的區別
- 垃圾回收機制,垃圾回收算法優缺點
- Java內存模型的理解
- HashMap實現原理,如何計算key的index,存儲方式
- 一個無限單向鏈表如何計算長度,如果有環如何計算長度
- RelativeLayout與LinerLayout的區別
- View繪製原理
- 事件分發機制,Activity怎麼處理的
團車網
- 自定義 View 流程
- View 繪製原理
- 事件分發機制
- AMS、WMS
- Handler 機制
- JMM
- 鎖機制
- AQS
- 內存優化怎麼優化
- 項目中遇到的最大的問題是什麼?怎麼解決的
- 如果遇到項目進度無法推進,你怎麼做的
- 你對近五年的規劃
某課
- Handler postDelay() 然後finish當前Activity會怎麼樣?
- View 繪製流程
- invalidate()、postInvalidate()、requestLayout()
- Tinker 爲什麼需要重啓
- volatile、synchronized
- Java內存模型
這是我迄今體驗最差的面試沒有之一,面試官特別裝逼,一直問我 API 細節,方法裏有什麼代碼(也怪自己太菜,一年多沒做 Android了)。最後面試官竟然 JVM 運行時內存區域和 JMM 都分不清,我實在忍不住了反問了一句:公司難道是在招 API 工程師嗎?
諸葛找房
- 事件分發機制
- HTTP 響應嗎
- Handler 機制
- 手寫排序算法
- 常用設計模式
異鄉好居
- http https
- js webview交互
- handler爲什麼不卡死
- App啓動流程
- 自定義view過程
- 動畫原理
- 事件分發機制
- 混淆怎麼處理
- 設計模式
- 對跨平臺技術的瞭解
FineChart
- HTTP、HTTPS區別
- HTTP報文
- 手寫反轉鏈表
- 手寫單例模式
- volatile關鍵字原理
- 事件分發機制
- App啓動流程
- 項目天氣曲線實現原理
- 第三方開源庫實現原理
- 線程池原理
- wait()、sleep()區別
- 項目中最大的困難是什麼?怎麼解決的?
- 常用集合類實現原理
- ConcurrentHashMap原理
阿里體育
電面
- List、Map、Set 哪個能存null,哪個能重複?
- 補間動畫與屬性動畫的區別
- Handler 機制
一面
- 怎麼實現View懸停?
- TCP怎麼做長連接?
- 網絡優化
- 熱修復原理
- Instant Run原理
- 視頻做過嗎?
- 相機做過嗎?
- LinkedHashMap、HashMap實現原理,區別是什麼?
二面
- Android與iOS相比有什麼差別
- Android與iOS系統內存管理機制瞭解嗎?
- 常見算法瞭解哪些,時間複雜度是什麼?
- 項目中遇到的困難是什麼?怎麼解決的?
- 你最大的優勢是什麼?
- 對於其他同事,爲什麼你覺得你這個優勢最突出?
不得不承認阿里實力還是很強的,也可能我投的崗位期望 P7 以上水平的緣故,被虐的很慘。突然感覺這幾年都荒廢了,選擇大於努力,一定要選擇好的方向,比如我選擇小程序就是一個錯誤。
多點科技
一面
- HashMap、ArrayMap
- Handler、IdleHandler、postDelay
- View 繪製原理
- 事件分發機制
- 如果子View已經處理了事件,父View怎麼攔截子View事件
- Binder機制
- 線程池原理
- 垃圾回收機制
- 類加載機制
二面
- OkHttp、Retrofit、Glide、ButterKnife、EventBus、RxJava
- Jetpack、LiveData、ViewModel
- ArrayList、LinkedList
- Material Design
- Java併發編程(JMM)
- MVP、MVVM區別
HR面
- 期望什麼樣的領導?
- 期望加入什麼樣的公司?
- 拿到幾個Offer了?
- 期望薪資?
董事之一
- 介紹了下公司的發展前景,公司的優勢
- 對未來工作的期望?
- 聊了將近一個小時…
美餐網
- 怎麼判斷二叉搜索樹是否合法,白板手寫出解法
- 給出一個業務場景怎麼處理
你沒有看錯,就只有兩道面試題,白板手寫代碼,這是我遇到的最奇葩的公司了,最後還說我代碼寫的不講究(這 tm 是面試吧,我已經說了由於篇幅有限,一些細節就忽略了),太浪費時間了。
360
一面
- 線程狀態轉換圖
- Activity生命週期,一個Activity啓動另外一個Activity生命週期函數調用
- Activity啓動模式,onNewIntent() 調用時機
- 動畫有哪些,實現原理
- setContentView()後面的流程
- Handler機制,Looper與ANR
- 過度重繪、UI卡頓
- WindowManager.addView(),View.getParent()是誰?
- JMM理解
- Lock機制
二面
- 內存泄露、內存溢出
- 類加載機制、雙親委派模型
- CAS
- 有多個線程1、2、3、4,1、2、3 並行完後與 4 串行,至少 3 種方式實現
- 網絡參考模型
- HTTP、HTTPS傳輸過程
- TCP三次握手、四次揮手
- 用過哪些設計模式
- 根據簡歷多渠道包怎麼構建的
- 反射原理
三面
- 一般都是根據簡歷問
- 對大前端技術的瞭解
- 類加載機制
- 對JDK個版本差異的瞭解
- Android系統啓動流程
- AMS、WMS
- 對Framework層源碼的瞭解,爲什麼這麼設計,優缺點
關於準備
每個人應聘的職位級別不一樣,需要準備的範圍也有所不同。我應聘的是高級職位,主要準備了以下幾點:
- Java 基礎
一般都會問 Java 虛擬機相關知識:類加載機制、雙親委派模型、垃圾回收機制、運行時內存區域、註解、泛型、反射等等。強烈建議精讀一下《深入理解 Java 虛擬機》這本書。
Java 併發編程也是高級必問知識:Thread生命週期、JMM、volatile、synchronizied、final、JUC、Lock、線程池等等。推薦看一下《Java 併發編程的藝術》。
- Android 基礎
這部分內容比較多,還是需要平時多積累,養成看源碼的習慣。
現在一般都不僅僅問原理是什麼了,比如 View 繪製原理會問 requestLayout() 和 invalidate() 什麼區別?什麼情況下 requestLayout() 會執行 onDraw() 方法?
Handler 機制大家都會說,網上找找都能找到,現在會問一個線程幾個 Looper,幾個 Handler?Looper 中的死循環爲什麼不會卡死主線程?IdleHandler 的原理?發送延時消息怎麼處理的?
如果你能從 Handler 答出 epoll 機制,接下來會問 epoll 機制的原理,有沒有看過源碼?
高級崗位 Framework 層原理肯定逃不過的,系統啓動流程、Binder、AMS、WMS 都是最基礎的,最好有一個自己深入研究的方向,比如 SurfaceFlinger。
進階一定要看剛哥的《Android 開發藝術探索》必備,Framework 部分《Android 內核剖析》、《Android 源碼情景解析》、《深入理解 Android》系列等都是很不錯的書籍。
另外強烈推薦張紹文的《Android開發高手課》。
- 網絡基礎
面試中一般會問 HTTP 的三次握手、四次揮手過程,以及爲什麼?HTTPS 的通訊過程?等等。
網絡是個大方向,對於 Android 工程師來說,常見的概念必須要瞭解的,當然深入研究一下也是很不錯的加分項。就像直播,網絡優化等方面都離不開網絡知識。
推薦看一下《圖解 HTTP》、《圖解 TCP/IP》,向深入研究可以看《TCP/IP 詳解》、《UNIX 網絡編程》。
- 數據結構與算法
數據結構計算機專業的一般都是必修課,網上資料很多這裏就不推薦了。
面試中數據結構一般會問 Java 集合類:ArrayList、HashMap、ConcurrentHashMap 等等,常見的高頻算法題一定要準備下。
算法可以看看《算法》、《算法導論》、覃超的《算法面試通關 40 講》、刷下 LeetCode。
- 設計模式與架構
設計模式一般會問你在項目中常用的設計模式有那些?等你說完之後會問你怎麼用的,什麼場景用的?它的優缺點是什麼?遵循了什麼原則?違背了什麼原則?…
架構 MVC、MVP、MVVM 爛大街的問題,一般會問它們的優缺點各是什麼?
總結
雖然後面還有好幾家面試,也有像豹廠這樣的很不錯的公司。但不得不承認一天面兩家,一週面 10 家實在太累了。
在收到大數字公司的 Offer 後就沒有再面了,加上 HR 將近五輪的面試聊得過程都很愉快,大數字公司也是我比較理想的公司。
雖然在之前也收到了幾家很不錯 Offer,相比之下還是大數字公司比較適合我,接下里的幾年也需要好好沉澱一下技術了。
經過這一次的被動面試經歷,我個人感受有以下幾點:
- 一定不要裸辭
如果是裸辭找工作,HR 一般都會問什麼時候離職的。如果手裏沒有 Offer,就很被動了,很有可能被壓薪資。主動權一定要掌握在自己手中。
- 選擇大於努力
即使很努力如果方向錯了就是浪費時間,就像我選擇了小程序就是個錯誤(大前端坑太多,入坑需謹慎)。我的建議是多深入研究一些以不變應萬變的技能。
- 學歷與履歷
雖然說能力很重要,但學歷是敲門磚(HR 就看這個)。如果連面試機會都沒有,還怎麼談然後?如果學歷不突出有很好的大廠履歷也很不錯,貌似是個蛋生雞,雞生蛋的問題。
- 充分準備
一些基礎知識和理論肯定是要背的,要理解的背,用自己的語言總結一下背下來。
雖然 Android 沒有前幾年火熱了,已經過去了會四大組件就能找到高薪職位的時代了。這隻能說明 Android 中級以下的崗位飽和了,現在高級工程師還是比較缺少的,我能明顯感覺到國慶後多了很多高級職位,所以努力讓自己成爲高級工程師纔是最重要的。
好了,希望對大家有所幫助。
我的 GitHub
我的公衆號
歡迎關注我的公衆號,分享各種技術乾貨,各種學習資料,職業發展和行業動態。
技術交流羣
歡迎加入技術交流羣,來一起交流學習。