1. 前言
本文從面試準備、面試技巧等方面分享一些個人經驗。希望能給大家帶來幫助。
2.面試情況
阿里(螞蟻金服):拿到 offer
頭條(抖音、火山):拿到 offer
美團(美團平臺):拿到 offer
騰訊(騰訊音樂):二面掛
3. 準備
這部分將結合我自己的經驗,為大家準備面試提供一個參考。
3.1 盡早開始準備
首先,盡早開始準備。足夠的時間是充足的準備的基本保證。不用擔心因為早準備而遺忘的問題,因為每一次看都會比上一次看快很多。隨著復習次數增加,對知識點的掌握也會更加牢固。我一些同學到面試前一個月甚至前幾天才準備,這時再想準備好龐大的知識點就力不從心了,自然面試結果也不好。因此,一定要盡早開始準備,一定要盡早開始準備,一定要盡早開始準備。我是在面試前半年左右時開始系統地準備,那時其實已經有點晚了。
3.2 形成自己的面試知識體系
面試,簡單地說就是回答出更多的問題。而準備面試,自然就要掌握更多面試中可能問到的知識。為了方便系統地對知識點進行學習和復習,我覺得在準備階段形成一個自己的面試知識體系非常重要。并且,在學習過程中,你的體系要不斷地完善。各種零散的知識點是不方便系統地學習和復習的。
具體來說,大致過程如下:
整理面試需要掌握的知識點。可以通過 Github 和 博客上別人整理的面試總結或者知識腦圖,結合自己的項目經歷和面試經驗整理出一個面試涉及的知識體系。
結合自己的情況確定學習計劃。可以看著自己整理的知識體系,思考一下這兩個問題:“我掌握了哪些知識、掌握程度如何”、“需要學習哪些知識、優先級如何”。
學習新的知識和鞏固自己擅長的知識。同時,不斷完善自己的知識體系。
在自己心中形成一個知識體系之后,不僅學習的時候更有針對性和計劃性,面試時心態也會好很多。另外寫簡歷和面試時也可以用一些技巧,比如在對自己有一個明確的認識的前提下可以避開自己不擅長的知識點,突出自己擅長的知識點。
下面,我詳細分享一下我自己的面試知識體系。我的面試知識體系包括以下幾個部分:
- 知識點
- 項目
- 算法
- 亮點
3.2.1 知識點
這里說的知識點,指的是面試中基本不用思考,只需要知道就能回答的東西。下面是我自己的面試知識點體系,大家覺得不錯的話,可以參考一下:
-
Android
-四大組件、Fragment、Context- 概述、生命周期、啟動
- 通信方式以及一些細節,比如 Fragment 的 commitAllowingStateLoss等
-進程間通信
- Binder
- Binder 結合 AMS、WMS 等系統服務
- 四大組件的啟動過程
- Window 的理解
-View
- 事件體系、滑動沖突
- 測量布局繪制流程
- ListView、RecyclerView 對比和緩存機制
- invalidate、requestLayout 等刷新方式
- SurfaceView 的原理
-圖形顯示原理
- Choreographer 結合 View 刷新
- VSYNC、雙緩沖、三緩沖
- SurfaceFlinger
-消息機制
- Handler、Looper、MessageQueue
- ThreadLocal
-線程形態
- AsyncTask
- HandlerThread
- IntentService
-內存泄漏
- 情況
- 分析
-性能優化
- 常見的一些套路,比如布局優化、內存泄漏優化、ListView/RecyclerView 優化、LruCache 等
- 可以結合圖形顯示原理和Handler機制擴展
- 大圖顯示
-開源庫,這部分通常會考察源碼的設計和實現
- EventBus
- Retrofit
- OkHttp
- 其他項目中用到的流行開源庫
-其他
- Android 版本變更
- APK 打包、安裝過程
- Android 類加載,結合 Java 類加載
- Dalvik/ART,結合 Java 虛擬機
- 進程保活、進程優先級
- JNI,這塊不用掌握很深,大致原理知道就行
- SharePreferences 的原理和注意點
- Parcelable 與 Serializable
- WebView
- MultiDex
-
Java
-語言
- 動態代理
- 類型信息、反射
- 泛型
- 異常
-容器,HashMap一定要看,其他的各種常見容器也都建議了解一下實現
- 常用容器:HashMap、LinkedHashMap、ArrayList、LinkedList等
- Android 容器:SparseArray 等
- 并發容器:ConcurrentHashMap、CopyOnWriteArrayList、阻塞隊列
-并發
- 線程狀態
- 內置/顯式的鎖、條件隊列
- 死鎖
- 線程池
- volatile、原子變量、CAS、ABA
- 內存模型和 happens-before
-虛擬機
- 內存區域
- 對象內存分配
- 引用計數和可達性分析
- 垃圾收集算法和垃圾收集器
設計模式
-常用設計模式,常考單例、模板、觀察者
-源碼中的設計模式
-MVC/MVP/MVVM-
計算機基礎
-計算機網絡- HTTP:請求、響應、緩存、版本變化
- TCP/IP:握手揮手、流量控制、擁塞控制、廣播/組播等。
-操作系統
- 進程和線程
- 虛擬內存、分頁和分段
-數據庫
- 索引
- 事務和ACID
- 關系型和非關系型
- ORM和SQL
上面比較詳細地羅列了我準備的知識點。除了這些常見知識點外,還有些知識點是結合項目的,與項目相關的知識點也要看一下。
計算機基礎部分知識量很大,在短時間內很難深入學習,主要還是靠平時積累。但是這方面內容,對校招來說是很重要的,而且越是大廠越重視。比如我的面試中,阿里相比于美團和頭條,我能感覺到對計算機基礎的考察更加重視。非科班出身的我在研究生期間花了好多時間補計算機基礎,但依然沒有學得很深入,這塊我準備的點也不多。
知識點部分在面試中會占到很大的比例。有時會直接問知識點,更多的情況是根據簡歷和項目引出一些問題考察知識點,然后基于當前問題不斷擴展。知識點的準備雖然范圍比較清晰,但是準備過程需要花費大量時間,死記硬背而不理解是不夠的。只有在深刻的理解之后,才能在面試中流暢地表達出來。
我自己的學習材料主要是書、源碼和博客。我一般先對某一塊知識找一兩本有名的書看,看書過程中要結合源碼,對有疑問的或者書上沒講清楚的內容 Google 一些文章看。有了一兩本書的底子后,再將剩余的知識點通過博客查漏補缺。在這個過程中,一定會發現新的知識,知識點也會隨之增加。
針對知識點的學習,在明確了學習內容后,我推薦一些我看過或正在用的學習資源:
-
綜合,下面兩個整理是我面試前看的比較多的,非常不錯的資料。
-
Android
- 《Android 開發藝術探索》:只要看這本即可,剩下的就看博客和源碼了。其他的書我還看過《第一行代碼》、《Android 編程權威指南》、《Android 群英傳》,但都沒任主席這本書寫得好。這本書會穿插一些源碼片段,講解了Android 開發中各種最基本的問題,這些問題也是面試中的熱點。建議看的時候結合源碼。另外書中內容基于 Android 5.0,有點久了,要注意版本問題。
- AndroidXRef:這個網站可以查各個版本的源碼,養成看源碼的習慣很重要。
-
Java
- 《深入理解 Java 虛擬機》:面試常考這本書的前三章。
- 《Java 并發編程實戰》:我非常喜歡的書,全面介紹了Java并發框架的使用方式和實現思想。代碼不多,重在闡述思想。本書內容到 JDK1.6,不過對面試來說夠了。
- JDK源碼:可以看 src.zip、編譯好的 OpenJDK 源碼或者 GitHub 上的源碼倉庫。需要注意版本區別。
-
計算機網絡,下面兩本書都比較薄,看了之后再看一些網上的整理,面試基本上沒問題了。
- 《圖解 TCP/IP》
- 《圖解 HTTP》
-
操作系統
- 《深入理解計算機系統》:這本書很厚,但是真的非常好,講得非常底層。掌握這本書的內容在校招面試中我覺得是很有競爭力的。在平時看比較適合。
設計模式部分,我沒有系統地看過書,只在網上學過,就不給大家推薦資源了。我覺得設計模式主要是理解常用設計模式的思想,知道他們在源碼中有哪些應用。
另外,學習知識點的時候要兼顧深度和廣度,廣度我覺得基本覆蓋主要的知識點就行,但深度是越深越好。理解得越深、越底層,越能在面試中更勝一籌。同時也能展現出自己的學習能力,學習能力是校招面試非常重視的。
3.2.2 項目
項目部分,我會先理一下項目整體架構,然后看一遍項目源碼中自己的部分,最后整理出如下內容:
- 項目背景
- 架構
- 技術點
- 疑難問題
- 優化點
- 用到的設計模式
上述內容除了項目背景外,都是面試中經常會問到的內容。整理過程中,我的方式是將內容寫在紙上。這種方式有助于方便地進行日常復習和面試前快速復習。頭兩次面試前,我都看了自己整理的項目內容。后面面試多了以后,對自己的項目中可以說的內容自然也會非常熟悉了。
另外,建議邊整理項目,邊考慮一下相關的知識點。非常有必要對相關的知識點做一下準備,特別是用到的主流開源庫。面試中,網絡庫是最常被問到的。
3.2.3 算法
不管哪個公司,算法都是面試中必考的一部分。我在美團和頭條的面試過程中,每一輪技術面都考了我一到兩道手寫算法題。難度上,都挺簡單的,但是一定要注意寫的對不對、規不規范。我一般會先跟面試官說一下我的思路再寫。
我在算法準備過程中,主要完成了下面幾部分準備:
-
理論學習:這塊我是看了一遍《數據結構與算法分析:C語言描述》,這本書雖然薄,但是講得不大好理解,所以看起來非常慢。我還是建議看《算法》或者在刷題時邊刷邊學。
- 數據結構:對面試來說,只要理解數組、鏈表、二叉樹、散列表、圖這幾種數據結構就夠了。而且這些結構中一般不會問跳躍表、伸展樹、紅黑樹等稍微復雜點的數據結構。
- 算法思想:DP、BFS、DFS、回溯、貪婪、分治。其中,DP考的概率應該是最大的。
- 查找:二分查找。
- 排序:各種排序算法的思想、實現、復雜度、穩定性都是面試中常考的內容。
- 背包問題:除0/1背包問題外有很多變種,面試和測評時我碰到過兩次背包問題,可以看一下。
刷題:我的方式是刷 LeetCode 各種類型的流行題,推薦一個清單。《劍指 Offer》我刷了兩遍,面試前還會拿出來看看,很多題都很可能被問到。
整理常見算法題:我自己整理了背包、各種排序以及鏈表和二叉樹的常見問題的Java實現,并且在不斷擴充,在面試前也可以用來快速復習。這個是我的整理。
除了正常的算法題之外,我和一些同學都被問過智力題。智力題也是面試官可能會問的一種題型。比如,過河問題在我們實驗室同學的面試中,出現了不止一次。然后,阿里的算法題問的比較靈活,經常會通過一個場景來考,不是 LeetCode 或《劍指 Offer》上常見的那種題目。比如,我阿里一面中的一個問題:“老板有 2000 元給我和同學分錢,首先由我提出分錢方案。如果同學不同意,則總額變為 1000 元,并由同學提出分錢方案。如果這時我不同意,則倆人各拿 100 元。請問一開始我應該怎么給出分錢方案?”。還有我阿里三面中的一個問題:“在一個手機屏幕上有兩列(類似于瀑布流),給你一些高度不同的 item,怎么擺放才能讓這兩列的整體高度最小?”。
3.2.4 亮點
亮點通常是一些可以深入的點或者比較底層的知識點,面試中亮出來經常會有很好的效果。可以有意準備一些點。比如,我在美團和頭條的面試中面試官都因為我對圖形顯示原理、SurfaceFlinger 這塊內容的理解而表揚了我,認可了我的學習能力。
另外,從我和我同學的面試經驗看,如果對 C++ 很了解或者有項目經驗的話,是很加分的。一方面 C++ 是比 Java 更接近底層的語言,另一方面 NDK 開發現在也越來越重要。
4. 面試技巧
4.1 引導面試官
在對自己的知識體系很清楚的前提下,可以適當地引導面試官以達到揚長避短的目的。
最直接的方法就是簡歷。面試官一般都會從簡歷開始問起,所以簡歷上的內容直接影響了面試走向。所以在寫簡歷時,最好在對自己的知識體系有一個清晰的認識之后,揚長避短地寫。
主動深入和擴展是我在面試中引導面試官的常用方式。一般面試官問一個問題,我會由淺入深地回答,然后盡量講得深、講得底層,講得差不多了就主動將話題切換到一個自己擅長的相關的話題上。比如 Android 中 應用與AMS間的通信、屏幕刷新等很多內容都能引到 Handler 上。這時候,之前準備的“亮點”就可以排上用場了。
4.2 表現出自己的好學
除了學習能力,對學習的熱情感覺面試官也很看重。不管是在技術面還是 HR 面中,表現自己對技術的追求都是不會錯的。當然,這個還是要建立在自己真的喜歡某種技術的基礎上。
可以通過以下幾種方式表現出自己的好學:
- 表現出自己對知識點的鉆研。這就需要引導面試官了。
- 表現自己對新技術的關注。可以主動提一些新技術和自己對某一技術未來發展趨勢的理解。比如我在阿里二面時講到 Google 新的開發框架 Flutter。
- 說明自己看過哪些書、對哪些東西深入研究過。
4.3 遇到不會的問題
這種情況我也不能說我做的很好,不過我在這里分享一下我遇到不會的問題時是怎么做的。
首先,我一般會主動說:“這方面內容我沒有深入研究過,我只能說一些比較淺顯的或者使用上的東西”。因為一開始就跟面試官說明自己的理解程度可以讓面試官心中有數,一般就不會再刻意刁難了,比起后面回答不上來,這是更好的方式。也表現出了自己的誠實。
然后,我會繼續說:“如果讓我來做的話,我會……”。因為說出自己的方案肯定比什么都不說好,甚至可以借題發揮,講到自己擅長的知識點上去。
最后,不懂裝懂是最不好的。
5. 總結
拿到心儀的 offer 需要系統和漫長的準備,也需要一定的面試技巧。本文分享了我這次實習生招聘中準備和面試的一些經驗,也介紹了我對暑期實習生招聘的一些了解。最后,祝大家都能找到自己滿意的實習或者工作!
想學習更多Android知識,或者獲取相關資料請查看我主頁 有面試資源系統整理分享,Java語言進階和Kotlin語言與Android相關技術內核,APP開發框架知識, 360°Android App全方位性能優化。Android前沿技術,高級UI、Gradle、RxJava、小程序、Hybrid、 移動架構師專題項目實戰環節、React Native、等技術教程!架構師課程、NDK模塊開發、 Flutter等全方面的 Android高級實踐技術講解。還有在線答疑