前言
前段時間稍專門挑了一段時間在準備面試。經過兩次面試後,有一些比較深刻的認識。對於大廠來說,除了對專業知識考究之外,對算法也尤爲看重。
簡單的說一下情況,字節已經拿到offer,騰訊所有的面面試已經通過了,也應該有offer了。字節一共4面:3面技術,1面hr;騰訊5次技術面,1次hr面。其中5面是2個面試官上陣。
總的來說騰訊的面試確實強度更高更加持久。字節是分開一次1個小時面試的。而騰訊1、2面是一次一小時,而3面和4面是連續面試一口氣高強度的面試2小時,5面則是2個面試官輪流提問。騰訊是持久戰稍微腦子不清醒一點就可能出現大錯漏。我在4面就是如此,差點出事了。請準備好糖分和水分及時補充,或者洗把臉保持清晰。
正文
面試的過程一般只有1個小時,如何在一個小時內徹底的考究你本人的水平究竟到達那種境界,也是面試官努力的方向。
而面試往往是由兩部分構成:
- 1.算法
- 2.專業知識
關於算法
爲什麼把算法擺在第一點,因爲算法在我看來這是大部分沒有面試過大廠的朋友可能會忽視的一方面。它的重要程度不比專業知識的考究來的低。
在1-2小時內,如何能快速的看到你編碼水平和思維就看這些算法的考究。
因此需要對常見的數據結構比較熟悉,如鏈表,樹,棧,堆。需要知道遇到數組相關的題型可能需要用到如快慢指針等解題思路。還有廣度深度優先算法。最後,如果還有更難一點的,會涉及到回溯,動態規劃等解題思路。
前面幾點都比較好處理,只要在leetcode上做到一定量的題目,都能反應過來。經過了系統性的訓練,遇到一些常見的算法解題思路可以快速的反應過來。
而動態規劃相關的問題,我看來是最難的。關鍵是需要判斷題目是否可以分解成小問題且小問題之間不能互相影響,接着找到動態規劃方程,或者是狀態轉移表。
在聽到面試官的算法題後,先不要急着下筆。最好在下筆之前和麪試官聊聊你的思路。不同面試官的要求不同,有的面試官,希望算法是原地算法,有的面試官希望時間複雜度降低,有的希望空間複雜度降低。
最好能清晰的表達你的初步思路後,面試官會知道你的算法的方向是否正確,可以一定程度上給予你方向上的指引。
記住就算你做過原題,除非你的方案能保證是從空間和時間複雜度是最優,不然我還是建議面試者多和麪試官交流。在交流的過程中,面試官也能明白你的思考過程,從而判斷你這個人的編程能力如何。
最後,再給兩點建議:
一個人光看不練是不行的,一個人瞎琢磨效率偏低。
最好可以買幾本書或者課程指導。我是看了輝哥的課程,閱讀了極客時間的劉超的數據結構,還閱讀了書籍算法4。把基礎都補充好後,可以去leetcode中對每一個數據結構專項進行訓練。在這些基礎上,在做一做劍指offer中經典題目也就差不多了。
關於專業知識
網上很多人都在求大廠面試的真題,實際上我看來意義並不大。因爲面試官並不會面試你寫在簡歷之外的隨意一個問題。一般都是問你簡歷上的工作成果,以及背後延伸出來的知識點。更多的還是需要自己日常的積累。
當然也有一些老生常談的基本考點,如Handler,多線程等。
因此,背面試題不是最重要。關鍵是回顧你的簡歷上的工作成果以及簡歷上的知識點,並不斷的深挖。
下面是面試情況,以及一些簡答。實際上在回答的過程中,可以回答的更加詳細,本文只是篩選了部分問題簡單介紹了知識點的要點。
字節面試
字節面試一共4面。字節的面試風格偏向基礎的內容,以及簡歷上知識點的擴展。
字節1面
- 自我介紹,項目經歷,項目上的優化項以及原因
- 爲什麼使用
mmap
優化io讀寫,mmap
和傳統讀寫有什麼區別?爲什麼選擇它? - Object 中有什麼方法?
- Object 的equal實現?重寫equal需要注意的方面。
-
synchronized
原理。 -
volatile
原理 - ui優化
- 內存優化與LeakCanary的源碼?以及LeakCanary的缺點和如何解決。
- 算法:數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字(Leetcode原題)。
字節2面
- 自我介紹,項目經歷,項目上的優化項以及優化的原因
- Rxjava源碼原理,以及項目中你是如何將Rxjava流進行復用。
- 你項目中高度自定義了DiskLRUCache。問LRUCache的實現?問LinkedHashMap的實現?問DiskLruCache的實現?問Glide中實現的DiskLruCache的運用。
- Handler的原理
-
volatile
原理 -
synchronize
鎖的轉化流程。 -
ReentrantLock
實現。 - ui 優化,首屏渲染時機優化
- 啓動優化,與AlphaManager的實現。
- 插樁的原理以及運用。
- ASM
- Javapoet
- 動態代理
- LiveData 和 ViewModel的源碼實現
- x2c 源碼實現
- DNS 原理
- https的原理
- 算法:判斷一個字符串是否是迴文串(注意保證原字符串不可改變,可用O(n)的空間複雜度)。
方向:棧的考究。
字節3面 Leader面
1.工作軟技能的考覈,以及團隊中的定位
2.如何進行io 優化,指標是什麼,優化後的結果以及參數是多少?
方向:可以使用/proc/pid/stat
讀取cpu的idle,iowait等。使用mmap優化後的結果。
- 3.算法:在一個單鏈表中,每k個節點進行反轉,無法被反轉的部分放在末尾。
騰訊面試
騰訊的面試風格,普遍是基於你的簡歷上項目經歷,往細節往深處問。我是面試因算法失敗了一次,後面第二次就成功了。
總結一下2次騰訊面試
騰訊第一次面試1面
- 自我介紹,項目經歷,項目上的優化項以及原因
- ARouter 源碼實現,項目中對ARouter的擴展實現詳細設計
- ui 優化,啓動優化,首屏展示時機優化
-
volidate
實現 - Java異常捕獲
- DNS 原理
- https的原理
- jni 中JNIEnv 和線程的關係
- jni中有幾種註冊native方法。
- Native異常捕獲
騰訊第一次面試2面
- 自我介紹,項目經歷,項目上的優化項以及原因
- ARouter的實現,以及自定義擴展ARouter的實現
- 項目中的io 優化,以及爲什麼用mmap於io優化
- mmap的實現
- mmkv 中 對應 mmap 斷電時候的處理機制
- mmap沒調用msync時候,落盤時機。
- 算法:合併三個單鏈表(可參考leetcode 合併多個單鏈表)
因爲自己畫蛇添足,把每一個節點拷貝了一次,還沒有往後迭代,實在是錯漏百出就掛了。腦袋還是不夠清醒,結果飲恨而歸。
騰訊第二次面試1面
- 自我介紹,項目經歷,項目上的優化項以及原因
- ARouter 的實現,以及擴展的實現
- 啓動優化,以及ARouter的啓動優化方式,ARouter的分區方式
- Navigation的源碼解析
- 基於Navigation 編寫路由框架NavigationRouter 的源碼實現,以及實現的優點
- Navigation 實現的路由框架中如何處理Activity和Fragment 嵌套啓動的方式
- class的加載流程
- Handler的實現(最好能回答到epoll和eventfd的層面)
- 實現一個多線程下的消費者生產者模式
騰訊第二次面試2面
- 自我介紹,項目經歷,項目上的優化項以及原因
- io 優化 與 使用
mmap
的優勢和缺點 - ARouter 的實現,以及擴展的實現
- 多進程實現的路由
- 如何進行多進程的同步調用,此時另一個進程還沒有啓動?
- 數據結構中不支持多線程的數據結構,如果使用多線程操作會造成什麼結構
-
ArrayMap
實現 -
HashMap
與ArrayMap
比較,兩者的優缺點 - handler 的原理
- handler 是怎麼進行postDelay 延時操作。
- 當handler 只有一個延時的message時候,Looper中是如何運行。
-
volidate
原理 - 當沒有添加
volidate
修飾屬性的時候,數據什麼時候從緩存行刷新到主存。 - 算法題:在一個n*n的方格中。有兩種方格,1代表阻塞不能經過,0代表可達。兩點座標,a和b。問a到b的最短路徑。
騰訊第二次面試3面和4面
騰訊3面和4面是聯繫到一起的,這裏一起說了
- 自我介紹,項目經歷,項目上的優化項以及原因
-
mmap
實現原理和io優化 - View的繪製流程,從
setContentView
解析xml到View的繪製結束。 - 硬件渲染流程
- SurfaceFlinger 在 View繪製流程中扮演的角色
- Choregrapher 的工作原理
- OOM 如何優化,內存爆滿是虛擬內存容易先爆掉還是物理內存容易,一口氣映射4g的內存是否會發生異常。
- Bitmap 如何優化避免OOM,爲什麼放在native中bitmap不容易OOM
- 一個進程最多可以使用多少fd
- 你研究過RN和Flutter,RN的渲染機制和Flutter的渲染機制是如何運作的?他們之間區別是什麼?
- 插件化你是如何實現的。
- 算法1: 將一個int的數字轉化成漢語說法。如10000轉化爲一萬。
- 算法2:中國下棋的馬,能否喫掉另一個座標的旗子,請找出座標
騰訊二次面試5面
本次面試是兩個面試官進行考察,考察的東西偏向網絡協議。
- 自我介紹,項目經歷,項目上的優化項以及自己開源在GitHub上項目的特點。
- 當遇到弱網絡時候的優化
- 當遇到弱網絡時候,網絡是如何進行文件重傳
- 當遇到弱網絡時候,手機連接上了4g,但是沒有數據流量時候,如何檢測並恢復。
- 當app在播放音視頻的時候,需要注意的要點,以及相關的實現。
總結
從專業技能考察可以看到,實際上整個面試過程。騰訊面試的會相對仔細一點,技術廣度更加廣一點;而字節則更加偏向基礎是否紮實。都是從你的簡歷項目,技術點開始詢問,並根據你回答的問題,不斷的調整詢問的方向,不斷的向下挖你的知識點,看能達到什麼程度
但是無論如何,你回答的層面最好足夠深,從源碼層級說起來。有時候面試官的對問題的看法和你的看法有分歧,此時就需要你是否可以從源碼的層面上對這些問題有自己的解釋。
面試的時候只需要沉着冷靜的思考,從源碼的角度對面試官拋出來問題進行分析,就能比較輕鬆的解決。
最後有人好奇我去了哪裏。應該是去騰訊。
Android開發技能儲備
Android學習是一條漫長的道路,我們要學習的東西不僅僅只有表面的 技術,還要深入底層,弄明白下面的 原理,只有這樣,我們才能夠提高自己的競爭力,在當今這個競爭激烈的世界裏立足。
如果你覺得自己學習效率低,缺乏正確的指導,可以參考下下面分享我多年工作以來收集整理的學習路線,給大家做個參考:
學習一線大廠的各項技術:
大廠是我們的技術先驅,不僅僅是各種技術,還有很多令你大開眼界的使用方法,學習這些有利於自己競爭力的提高,深入理解後也可以提升你的學習效率。
現在競爭這麼激烈,只有通過不斷學習,提高自己,才能保持競爭力。
1.2020大廠面試高頻知識點
- 圖片
- 網絡和安全機制
- 數據庫
- 插件化、模塊化、組件化、熱修復、增量更新、Gradle
- 架構設計和設計模式
- 性能優化
- Android Framework
- Android優秀三方庫源碼
2.Jetpack架構組件從入門到精通
- Android Jetpack - Navigation
- Android Jetpack - Data Binding
- Android Jetpack - ViewModel & LiveData
- Android Jetpack - Room
- Android Jetpack - Paging
- Android Jetpack - WorkManger
- Android Jetpack架構組件之Lifecycle
- Android Jetpack Compose 最全上手指南
3.Framework精編內核解析
主要內容包含:
- 深入解析Binder
- 深入解析Handler
- Dalvik VM 進程系統
- 深入解析 WMS
- PackagerManagerService
4.Kotlin強化實戰(附Demo)
- 第一章 Kotlin入門教程
- 第二章 Kotlin 實戰避坑指南
- 第三章 項目實戰《Kotlin Jetpack 實戰》
- 從一個膜拜大神的 Demo 開始
- Kotlin 寫 Gradle 腳本是一種什麼體驗?
- Kotlin 編程的三重境界
- Kotlin 高階函數
- Kotlin 泛型
- Kotlin 擴展
- Kotlin 委託
- 協程“不爲人知”的調試技巧
- 圖解協程:suspend
5.Android設計思想解讀開源框架
- 熱修復
- 插件化
- 組件化框架設計
- 圖片加載框架
- 網絡請求框架
- RXJava 響應式編程框架設計
- IOC 架構設計
- Android架構組件Jetpack
6.NDK模塊開發
- NDK 模塊開發
- JNI 模塊
- Native 開發工具
- Linux 編程
- 底層圖片處理
- 音視頻開發
- 機器學習
定期面試:
光學習了大廠的技術還不夠,如何瞭解當下Android市場需要哪些技術呢?
定期的面試足以讓你瞭解當下市場需要哪些技術,也更加容易確定自身的短板在哪,同時,也可以督促自己學習提升(小夥子,你瞭解的技術有點落伍了呀…)
萬一拿到了高薪Offer,豈不是更賺?
多看大佬的學習筆記,學習大佬的設計思想:
只要是程序員,不管是Java還是Android,如果不去閱讀源碼,只看API文檔,那就只是停留於皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的。
真正最能鍛鍊能力的便是直接去閱讀源碼,不僅限於閱讀各大系統源碼,還包括各種優秀的開源庫。