2019 阿里、頭條、騰訊、美團 Android 面試經驗分享

1. 前言
android

本文從面試準備、面試技巧等方面分享一些我的經驗。但願能給你們帶來幫助。
git


2.面試狀況github

  • 阿里(螞蟻金服):拿到 offer
  • 頭條(抖音、火山):拿到 offer
  • 美團(美團平臺):拿到 offer
  • 騰訊(騰訊音樂):二面掛


3. 準備

這部分將結合我本身的經驗,爲你們準備面試提供一個參考。面試

3.1 儘早開始準備

首先,儘早開始準備。足夠的時間是充足的準備的基本保證。不用擔憂由於早準備而遺忘的問題,由於每一次看都會比上一次看快不少。隨着複習次數增長,對知識點的掌握也會更加牢固。我一些同窗到面試前一個月甚至前幾天才準備,這時再想準備好龐大的知識點就力不從心了,天然面試結果也很差。所以,必定要儘早開始準備,必定要儘早開始準備,必定要儘早開始準備。我是在面試前半年左右時開始系統地準備,那時其實已經有點晚了。算法

3.2 造成本身的面試知識體系

面試,簡單地說就是回答出更多的問題。而準備面試,天然就要掌握更多面試中可能問到的知識。爲了方便系統地對知識點進行學習和複習,我以爲在準備階段造成一個本身的面試知識體系很是重要。而且,在學習過程當中,你的體系要不斷地完善。各類零散的知識點是不方便系統地學習和複習的。數據庫

具體來講,大體過程以下:編程

  1. 整理面試須要掌握的知識點。能夠經過 Github 和 博客上別人整理的面試總結或者知識腦圖,結合本身的項目經歷和麪試經驗整理出一個面試涉及的知識體系。設計模式

  2. 結合本身的狀況肯定學習計劃。能夠看着本身整理的知識體系,思考一下這兩個問題:「我掌握了哪些知識、掌握程度如何」、「須要學習哪些知識、優先級如何」。數組

  3. 學習新的知識和鞏固本身擅長的知識。同時,不斷完善本身的知識體系。緩存

在本身心中造成一個知識體系以後,不只學習的時候更有針對性和計劃性,面試時心態也會好不少。另外寫簡歷和麪試時也能夠用一些技巧,好比在對本身有一個明確的認識的前提下能夠避開本身不擅長的知識點,突出本身擅長的知識點。

下面,我詳細分享一下我本身的面試知識體系。個人面試知識體系包括如下幾個部分:

  • 知識點
  • 項目
  • 算法
  • 亮點

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 須要系統和漫長的準備,也須要必定的面試技巧。本文分享了我此次實習生招聘中準備和麪試的一些經驗,也介紹了我對暑期實習生招聘的一些瞭解。最後,祝你們都能找到本身滿意的實習或者工做!

PS須要交流經驗的歡迎留言

相關文章
相關標籤/搜索