本篇文章給大家分享一下筆者面試的一些感受和經驗。
筆者從前期準備到所有面試結束,花費了差不多3個月的時間。真可謂“面試造航母,工作擰螺絲”,面試過程真的很累很辛苦。
筆者面了很多公司,最終拿下了騰訊、網易和快手的offer,最後選擇了騰訊。
有面試交流羣小夥伴問我是怎麼準備面試的,我也想談談我最近的一些想法和計劃,大家一起討論。因此寫下了這篇文章。
整體分爲以下兩個方面:
1、結合招聘崗位,只講重點。
簡歷內容這麼多,實際的你,更有很多很多可以描述的東西。但時間有限,沒有面試官會聽你說個沒完。
根據你求職的崗位,說重點即可。
其實簡歷製作的原則,也是一樣。只是自我介紹時間更短,內容更精華。
2、有理有據,少說空話。
如果你說“自己學習能力強”,這就是一句假大空的話。誰都可以說自己學習能力強。
你如果真的在這方面有突出,就要舉一個例子,比如是1個月從0到1考了什麼證書等。
3、有開頭有結尾,有邏輯。
開頭問候,結尾總結。中間1、2、3條理清楚。
4、特別提醒。
自我介紹中的內容,很可能是面試官後續發問的內容。所以,一是要引起重視,講最重要的,你最想讓面試官知道的內容。 而是做好準備,揚長避短,不要給自己挖坑。
比如前面你說自己學習能力強,但是沒有舉例子。
面試官很可能,順着你的話問你,怎麼證明你學習能力強呢? 結果你答不上來,或者是非常普通的成績,根本不能算是“學習能力強”。 那你就是給自己挖坑了。
其實自我介紹也是每個人各有不同,說起來也只能提供大致的思路。和你具體的求職崗位、經歷、個人風格有很大的關係。
項目經驗這塊因人而異,把覺得做的有亮點的東西挑出來,從四個方面來準備:
- 功能模塊的實現
- 達到了什麼效果
- 遇到了什麼問題,是如何解決的
- 涉及到的相關知識點
項目經驗和知識點 其實是一個雙向的過程,要 試圖去找到它們之間的聯繫:
- 談到項目經驗的時候,可以說:做完 xx 之後,我還去了解了一下 yy 背後的原理,xxx,這裏體現的是 你是否有求知慾 。
- 談到知識點的時候,可以說:yy 的原理是這樣的,在 xx 項目中我是如何應用它來解決問題的,這裏體現的是 你是否具備把知識付諸實踐的能力。
知識儲備
很多人準備面試的時候,大多數就會這樣的,打開牛客網,查找 “Android 面經”,找幾個多的開始看。以及從各大技術交流平臺搜索Android面試題。開始刷題複習。
這雖然看起來很自然,但是並不是一種 健康的方式,面試題的作用應當是查缺補漏,上學的時候也不是直接發習題冊然後對着答案學習吧?
知乎上有個問題,叫做 如何高效學習,裏面有一個回答我覺得很符合我自己的觀點,就是 建立起自己的知識體系,建立知識體系的目的在於:
- 鞏固記憶。
- 認識自己,找到自己的優勢及不足。
- 把握複習的進度。
- 經驗總結。
目前我參考和自己整理的總結的會分爲以下幾個大點:
1 Java 相關
-
容器(HashMap、HashSet、LinkedList、ArrayList、數組等)
-
內存模型
-
垃圾回收算法(JVM)
-
類加載過程(需要多看看,重在理解,對於熱修復和插件化比較重要)
-
反射
-
多線程和線程池
-
HTTP、HTTPS、TCP/IP、Socket通信、三次握手四次揮手過程
計算機網絡部分:
TCP 有哪些狀態
三次握手、四次揮手。爲啥不是三次不是兩次
HTTPS 和 HTTP 的區別,HTTPS 2.0 3.0?
瀏覽器輸入一個 URL 按下回車網絡傳輸的流程?
問的深一點的可能涉及到網絡架構,每層有什麼協議,FTP 相關原理,例:TCP 建立連接後,發包頻率是怎麼樣的?
- 設計模式(六大基本原則、項目中常用的設計模式、手寫單例等)
生產者模式和消費者模式的區別?
單例模式雙重加鎖,爲什麼這樣做?
知道的設計模式有哪些?
項目中常用的設計模式有哪些?
手寫生產者、消費者模式。
手寫觀察者模式代碼。
適配器模式、裝飾者模式、外觀模式的異同?
談談對 java 狀態機的理解。
談談應用更新(灰度、強制更新、分區更新?)
9.斷點續傳
-
Java 四大引用
-
Java 的泛型, 和 的區別
問到泛型、泛型擦除、通配符相關的東西
-
final、finally、finalize 的區別
-
接口、抽象類的區別
2 Android 相關
- 自定義 View
ViewGroup 繪製順序 (例:自定義 ViewGroup 如何實現 FlowLayout?如何實現 FlowLayout 調換順序)
自定義 View 如何實現打桌球效果;
自定義 View 如何實現拉弓效果,貝瑟爾曲線原理實現?
- 事件攔截分發
事件分發已經不是直接讓你講了,會給你具體的場景,比如 A 嵌套 B ,B 嵌套 C,從 C 中心按下,一下滑出到 A,事件分發的過程,這裏面肯定會有 ACTION_CANCEL 的相關調用時機。
-
解決過的一些性能問題,在項目中的實際運用。
-
性能優化工具
(TraceView、Systrace、調試 GPU 過度繪製 & GPU 呈現模式分析、Hierarchy Viewer、MAT、Memory Monitor & Heap Viewer & Allocation Tracker 等)
- 性能優化 (講講你自己項目中做過的性能優化)
網絡:API 優化、流量優化、弱網優化
內存:OOM 處理、內存泄漏、內存檢測、分析、Bitmap 優化 ,LeakCanary 原理,什麼檢測內存泄漏需要兩次?
繪製
電量:WeakLock 機制、JobScheduler 機制
APK 瘦身 (APK 瘦身是怎麼做的,只用 armabi-v7a 沒有什麼問題麼?
APK 瘦身這個基本是 100% 被面試問到,可能是我簡歷上提到的原因。)
內存抖動
內存泄漏
卡頓 {如何檢測卡頓,卡頓原理是什麼,怎麼判斷頁面響應卡頓還是邏輯處理造成的卡頓} ,BlockCanary 的原理
佈局優化、過度渲染處理、ANR 處理、監控、埋點、Crash 上傳。
啓動優化
-
Http[s]請求慢的解決辦法(DNS、攜帶數據、直接訪問 IP)
-
緩存自己如何實現(LRUCache 原理)
-
圖形圖像相關:OpenGL ES 管線流程、EGL 的認識、Shader 相關
-
SurfaceView、TextureView、GLSurfaceView 區別及使用場景
-
動畫、差值器、估值器(Android中的View動畫和屬性動畫 - 簡書、Android 動畫 介紹與使用)
屬性動畫、補間動畫、幀動畫的區別和使用場景
- MVC、MVP、MVVM
相互間的區別和各種使用場景,如何選擇適合自己的開發架構。
- Handler、ThreadLocal、AsyncTask、IntentService 原理及應用
Handler 機制原理,IdleHandler 什麼時候調用。
-
Gradle(Groovy 語法、Gradle 插件開發基礎)
-
熱修復、插件化
談談對 ClassLoader 的理解
雙親委託機制的好處
自定義 ClassLoader
插件化爲什麼會出現,如何代碼加載,資源加載,代理 Hook)
- 組件化架構思路
如何從一個老項目一步步實現組件化,主要問思路,考察架構能力和思考能力。(需要考慮很多,每一步做什麼,順序很重要)
組件化和模塊化的理解與區別?
-
系統打包流程
-
Android 有哪些存儲數據的方式。
-
SharedPrefrence 源碼和問題點;
-
sqlite 相關
sqlite 升級,增加字段的語句
數據庫框架對比和源碼分析
數據庫優化及數據遷移問題
getWritableDatabase 和 getReadableDatabase 的區別
-
如何判斷一個 APP 在前臺還是後臺?
-
混合開發
Hybrid 做過嗎? 例:Android 通過WebView調用 JS 代碼 例:JS 通過WebView調用 Android 代碼;
Hybrid 通信原理是什麼,有做研究嗎?
說說你用過的混合開發技術有哪些?各有什麼優缺點?
3 Android Framework
-
AMS 、PMS
-
Activity 啓動流程,App 啓動流程
-
Binder 機制(IPC、AIDL 的使用)
講講 Linux 上的 IPC 通信,Binder 有什麼優勢,Android 上有哪些多進程通信機制?
項目中遇見了什麼多進程場景?
AIDL 是什麼?解決了什麼問題?
談談對進程共享和線程安全的認知?
-
爲什麼使用 Parcelable,好處是什麼?
-
Android 圖像顯示相關流程,Vsync 信號等
4 三方源碼
-
Glide :加載、緩存、LRU 算法
(如何自己設計一個大圖加載框架)
(LRUCache 原理) -
EventBus
-
LeakCanary
-
ARouter
重點:Router 原理,如何實現組件間的通信,組件化平級調用數據的方式。
-
插件化(不同插件化機制原理與流派,優缺點。侷限性)
-
熱修復
-
RXJava
(RxJava 的線程切換原理) -
Retrofit
(Retrofit 在 OkHttp 上做了哪些封裝?動態代理和靜態代理的區別,是怎麼實現的) -
OkHttp
1、OkHttp 源碼,網絡緩存
2、如果從網絡加載一個 10M 的圖片,說下注意事項
5 算法與數據結構
-
單鏈表:反轉、插入、刪除
-
雙鏈表:插入、刪除
-
手寫常見排序、歸併排序、堆排序
-
二叉樹前序、中序、後序遍歷
-
最大 K 問題
-
廣度、深度優先搜索算法
-
String 轉 int。
核心算法就三行代碼,不過臨界條件很多,除了判空,還需要注意負數、Integer 的最大最小值邊界等;
-
如何判斷一個單鏈表有環?
-
鏈表翻轉;
-
快排;
-
100 億個單詞,找出出現頻率最高的單詞。要求幾種方案;
-
鏈表每 k 位逆序;
-
鏡像二叉樹;
-
找出一個無序數組中出現超過一半次數的數字;
-
計算二叉樹的最大深度,要求非遞歸算法。
-
String 方式計算加法。
6 項目&HR
-
項目開發中遇到的最大的一個難題和挑戰,你是如何解決的。(95% 會問到)
-
說說你開發最大的優勢點(95% 會問到)
-
你爲什麼會離開上家公司
-
你的缺點是什麼?
-
你能給公司帶來什麼效益?
-
你對未來的職業規劃?
騰訊三輪面試
一面:
- 算法題 通電小球
- Android 沉浸式狀態欄 怎麼實現的
- 事件處理函數有哪幾個,父View 子View 監聽同一個事件,重寫哪些方法。在哪個View重寫?
- ViewRootImpl接受事件嗎?
- apk編譯打包流程 V1,V2 簽名區別
- 利用logging監聽方法耗時,會不會讓app增大延遲。
- eventbus爲什麼要用CopyOnWriteList?
- 插件化怎麼加載資源的?
- JVM怎麼保證gc效率跟線程運行效率的 ?
- 如果android沒用對應的view,flutter能運行嗎?手寫單例模式,volatile 跟 synchronized區別?
- 接口暴露,但是不讓別人調用,有哪些辦法?
二面:
- 爲什麼採用flatbuffer? 比Json好在哪裏?
- 如何處理Crash,NativeCrash呢?Google是怎麼做到的?如果上報過程中再次產生Crash能不能捕捉到?
- uncaughtException是被誰調用的,如果再次崩潰能不能捕獲到?
- Linux是怎麼知道app崩潰的,如果想要在被kill前 做一些耗時操作,該怎麼做?
- 考慮設計一個crash捕捉模塊。
- 100萬個數字求100個最大值。
- 手寫快速排序算法。
三面 (GM面):
- kotlin比Java好在哪裏,是函數式編程嗎?
- 如何防止DNS劫持?
- 如果讓你實現一個調試器,你會怎麼設計?靜態調試?動態調試呢?
總結
其實客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
然而Android架構學習進階是一條漫長而艱苦的道路,不能靠一時激情,更不是熬幾天幾夜就能學好的,必須養成平時努力學習的習慣。所以:貴在堅持!
上面分享的騰訊、頭條、阿里、美團、字節跳動等公司2020年的面試真題解析大全,筆者還把這些技術點整理成了視頻和PDF(實際上比預期多花了不少精力),包含知識脈絡 + 諸多細節,由於篇幅有限,下面只是以圖片的形式給大家展示一部分。
【Android思維腦圖(技能樹)】
知識不體系?這裏還有整理出來的Android進階學習的思維腦圖,給大家參考一個方向。
【Android高級架構視頻學習資源】
**Android部分精講視頻領取學習後更加是如虎添翼!**進軍BATJ大廠等(備戰)!現在都說互聯網寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術能力夠強,公司換掉的代價大,怎麼可能會被裁掉,都是淘汰末端的業務Curd而已!現如今市場上初級程序員氾濫,這套教程針對Android開發工程師1-6年的人員、正處於瓶頸期,想要年後突破自己漲薪的,進階Android中高級、架構師對你更是如魚得水,趕快領取吧!
【Android進階學習視頻】、【全套Android面試祕籍】可以私信我【學習】查看免費領取方式!