Android面經分享:開發4年裸辭面試20天收割8個offer,終於入職阿里,全是細節!

南方吳彥祖_藍斯發表於2021-08-20

各位朋友這是一篇面試總結文,是一篇從我本身出發,把面試過程中遇到的問題,以及一些小小的建議闡述出來,希望對正在面試或者將要面試的你有一些小幫助。

背景描述

首先描述下背景,樓主是一個4年多經驗的Android開發工程師,先後服務於3家網際網路公司,均從事於Android開發的工作。離職前我在最後這家公司已經工作了將近3年的時間。

那為什麼要離職呢?

其實這個問題一直都不是一個單一性的問題,它一定是一個多元化多維度的問題。對於我來說,主要體現在以下幾個方面。

1、當前所使用的技術對自身成大不是很大了。 2、當前所負責的專案發展空間到了瓶頸。 3、認為自己的職場履歷需要一段大廠經歷。 4、這一點本來不太想說,但是確實也是自己比較在意的一點,那就是組織架構頻繁變動,導致業務線頻繁變更,這一點對業務很不利,需要一直磨合。

面試目標:

其實當時的面試目標也不是單一的,比如我的面試目標按以下排序

  • 阿里巴巴 > 頭條 > 美團 > 小米

面試時間:

2021-03-01 ~ 2021-03-24 總共24天的時間,此處貼一張圖來證明。

準備週期:

2020-12-01 ~ 2021-02-28 總共2個月多一點的時間

面試經歷

我先後面試了大概20家公司,最後拿到了8個offer左右,最後選擇了自己最想去的公司 阿里巴巴,面試內容也進行了簡單總結,分為兩個部分。

  • 高頻問題區
  • 公司面試經歷分享

高頻問題

  • HashMap 1.7,1.8的差異,1.8中什麼情況下轉換為紅黑樹,建構函式中引數代表的意思
  • 用什麼Map可以保證執行緒安全,為什麼?ConcurrentHashMap為什麼能保證執行緒安全?1.7和1.8原理有什麼差異。
  • 有多少種單例模式,列舉算不算單例,單例模式中不用volatile會導致什麼問題?volatile特性是什麼?為什麼android中不推薦使用列舉。
  • Glide中怎麼實現圖片的載入進度條,Glide的快取是怎麼設計的?為什麼要用弱引用。
  • implementation 和 api的區別是什麼?
  • 事件分發的流程,以及怎麼解決滑動衝突?
  • 事件是怎麼產生的?mFirstTarget 為什麼是一個連結串列?
  • 自定義View需要經歷哪幾個過程?
  • A 跳轉到 B頁面,兩個頁面的生命週期怎麼走?什麼情況下A的stop()不會執行。
  • Activity 的4中啟動模式分別是什麼,有什麼不同。
  • okhttp中有幾個佇列?分別幹什麼用的?怎麼取消一個請求?
  • Rxjava中map和flatMap有什麼區別,都用過什麼運算子。
  • 如果Rxjava組合傳送任務,中間任務出現異常,其他任務該怎麼處理。
  • 哪個場景會發生記憶體洩露,記憶體洩露怎麼檢測,怎麼解決。以及leak cannery內部原理是什麼?為什麼新版本的不需要在Application中註冊了。
  • 手機適配問題怎麼處理,都有什麼方案。
  • Android9 10 11 都更新了什麼新特性,新版本中無法獲取IMEI怎麼處理。
  • 資料序列話有那倆種方式,Serialization和Parcelable區別,如果持久化需要用哪一個
  • 元件化怎麼分層,各個元件之間怎麼通訊。
  • 怎防止程式崩潰,如果已經到了Thread.UncaughtExceptionHandler是否可以讓程式繼續執行。
  • Handler Looper mesaageQueue message 之間的關係。
  • 子執行緒一定不能更新ui麼?什麼時候可以?什麼時候不可以。檢測邏輯是在什麼階段初始化的。
  • ANR發生的原理是什麼, 怎麼排查。
  • 程式怎麼保活。
  • 說下路由ARoute的實現原理,怎麼處理頁面過多記憶體佔用過大問題。
  • 執行緒池都什麼時候用,怎麼建立,建構函式中的引數分別代表什麼意思?
  • 程式優先順序
  • 反向輸出字串
  • 兩個有序連結串列合併
  • 字串移除多餘空格,且技術單詞首字元大寫。
  • 二叉樹中和為某一值的路徑
  • 本地廣播和正常廣播的區別
  • 二進位制低位轉高位
  • 字串陣列判重
  • 二叉樹 判斷是否為搜尋二叉樹
  • Activity啟動流程,Launcher啟動流程

下面是每個公司面試經歷分享:

天眼查(大小周,小周1.2倍)

面試體驗 ★★★★

這公司面試體驗很好,一共三輪面試,技術面二面,HR一面。

一面的面試官技術水平非常可以,跟大廠是同一級別,考察的細節很到位,都是比較注意的點,並非故意刁難,溝透過程也是非常愉快。

二面是leader面,相對注重整體架構考察,溝通也相對順利。

HR面其實體驗不是很好,介紹公司政策不是很專業,總是靠挖掘,有點像擠牙膏溝通,薪資說實話一般般。中等偏下。

總體下來體驗比較好,因為這個是第一家面試的公司,屬於熱身,學到了很多,尤其感謝1面面試官。

58同城

面試體驗 ★★★★

面試的是58同城的58學車部門,一共四輪面試,3輪技術面,一輪HR面 他們應該是交叉面試,因此技術面相對比較全面,體驗很好,交流很順利,尤其是三面,思維方式,以及考察問題都很專業。 HR面也很專業,介紹公司情況,部門前景,以及政策制度都很透徹,給了Offer,薪資相對也偏低。

以下幾個是58特殊考察的幾個題目:

1.thread wait sleep join 有什麼區別,主要考察wait sleep相關區別。 2.mvvp 和mvp的區別,細節裡怎麼實現的雙向繫結。 3.打渠道包 怎麼寫入渠道資料(app簽名在哪)這裡涉及V1,V2,V3簽名差異。 4.rgb565和rgb888有什麼區別,主要考察資料儲存位。 5.自定義view,實現一個自定義View,且支援按下放大,鬆開縮小動畫。

美團優選(大小周,且每天晚上9點後下班)

面試體驗 ★★★★★

一共三輪面試,全是影片面。

一面: 基礎面試,面試官比較憨厚,基礎部分不在贅述,特殊性考察有:兩個有序連結串列合併。字串移除多餘空格,且技術單詞首字元大寫。

二面: 主要考察專案,解決方案,溝通都很絲滑。

HR: 沒想到這個流程比較慢,可能他們候選人比較多,最後給了Offer定級L7,最後也是因為選擇了阿里放棄了。

位元組跳動(大小周)

面試體驗 ★★★★★

位元組跳動,我是連被幹翻2次,面試官確實是牛逼。

我第一次投的是抖音部門,過了一面,二面掛,面試評語是 基礎相對紮實,但是專案架構略有欠缺,因此掛在二面。

正在失望之餘,位元組的懂車帝又打來電話,說簡歷又被撈起來了,又去面了懂車帝,又掛了。

懂車帝一面確實比較牛逼,比如我記錄了部分問題:

  1. 如果想統一專案的執行緒池,包括三方引入包的執行緒池,怎麼處理。(最後解答可透過位元組碼修改實現)
  2. 如果想監控某一執行緒的耗時超過300毫秒的任務需要怎麼操作。(可反射獲取Handler抓取每個Message的執行耗時)
  3. 如果專案出現未捕獲的異常,怎麼預操作可以防止Crash。
  4. 如果設計一個App的啟動框架,需要考慮什麼問題,怎麼處理同步非同步的載入任務排程。
  5. glide 載入原理,怎麼感知載入和暫停。
  6. okhttp載入原理,怎麼控制同步和非同步任務。
  7. 說一個專案難點,具體怎麼解決的。
  8. 都用過什麼設計模式。
  9. mvp mvvm都在什麼場景下使用。
  10. 一個int陣列怎麼判斷是搜尋二叉樹的後續遍歷。

小米

面試體驗 ★★★

小米麵試體驗不是很好,一開始HR溝通是面試小米的IOT部門,從投簡歷到面試大概經歷了一個星期。

一面: 體驗很好,面試官很謙和,問題也很有質量,大概持續了1小時20分鐘,面試官對我也比較滿意。

二面: 二面跟一面差不多又過了一個多星期,這個效率真是有點差勁,關鍵是二面是小米電視部門來面的,跟之前的IOT不相關了。

三面: 還是小米電視的人,聊了一堆專案相關的內容。

其實我是一個老米粉,從米1一直到米10,一路走來對小米這家公司是有情懷的,但是有點搞不懂為啥面試鏈路是這樣的。希望多多改進啊,面試體檢有點差。

作業幫(每天晚上9點以後下班)

面試體驗 ★★★

這個公司是同事推薦的,因此面試流程相對迅速,第一天內推,第二天面試,面試分為三輪。

一面:同事面,問的範圍比較廣,面試官也比較善於溝通,很愉快。

二面:leader面,這個leader就是我同事的前同事,之前360搞瀏覽器核心的,不知道為啥搞Android了,性格相對比較悶,溝通反饋很差,溝通效率比較低。

為了緩解溝通尷尬,我儘量將問題回答對映到生活場景,還被他懟了,說:技術不用舉例子。。。。臥槽。。。

百度

面試體驗 ★★★

這個公司是聽說也是內推,但是我不知道是誰推的,一共四面

一面: 影片面,面試官非常nice,比較謙和。

二面: 提前約定的是2點開始,結果郵件就發成了3點,後來溝通改回了2點,結果我到了以後讓我等了半個多小時,這也就算了。面試官下來的時候應該是沒睡醒,所以面試帶有情緒。

回答完問題以後面試官習慣性問你 你覺得你說的對麼?有不太確定的我一般喜歡反問下 有沒有更好的解決方案,這個面試官真是一個方案都沒給,所以這沒啥可聊的。

百度這個面試體驗真的比較差,也許是我運氣不好遇到了比較差的人,但是這對於一個面試者產生的印象都會掛在百度公司上,誒。。。真難。。

阿里巴巴

面試體驗 ★★★★★

阿里巴巴,我面試的是阿里媽媽部門,是阿里比較賺錢的部門,一共5輪面試。

一面: 純演算法,大概寫了一個半小時,3道演算法題,每一行程式碼都評審解讀,面試官就是我現在的同事,上兩天我已經嘲諷他了,並且勸他以後要懂得善良。

二面: Android相關,面試官涉獵比較廣,聊了很多,最後聊到面試官說,我們今天差不多了已經一個半小時了,等你入職了我們繼續聊。

三面: leader面,這個leader不是吹,太特麼能砍了, 從生活到工作,到技術,到發展,整體扯了一遍,我倆又幹了一個半小時。

四面: P9大Boss面,這個主要聊了一些發展規劃相關的,聊了半小時左右。

五面: HR面,大概聊了1小時左右,主要問了一些之前公司的為人處事方式,還有一些基本資訊,介紹了阿里的政策制度,福利待遇等等。

阿里的Leader真的是非常有誠意,由於阿里Offer審批流程比較長,所以中途給我打了7-8個電話,每次都聊很多,讓我放心,因此最後我決定退掉其他所有Offer,加入阿里巴巴大家庭。

面試思路

面試過程即是一個  自我考察 的過程,同是也是一個  非常講究方式方法 的過程,接下來透過這兩個方面來展開闡述。

自我考察

技術實力是面試的大前提,你需要非常清晰的瞭解自己,瞭解自己所要面試崗位,這是決定面試是否成功的先決條件。

比如我工作時間4年多,我要面試的崗位是高階Android工程師,那我這個自身素質是否能滿足面試崗位所要求的條件?

其實這一點在我剛剛面試的時候也是拿不準的,因為在公司已經3年,這段時間對外界的發展其實是不瞭解的,所以我做了以下幾件事。

1、把自己負責的專案業務進行整體總結。 2、把專案中用到的所有技術進行整體總結。 3、複習常用 框架/系統 原始碼,比如Glide,Okhttp,Reteofit,Activity啟動流程,Hander,HashMap,鎖等等常用的原始碼原理。 4、檢視BOSS,拉勾對應崗位所要求的技能。

方式方法

面試環節中即便你技術很好,專案經驗很豐富,你也不乏有知識盲區,也有未能顧及的技術點,當這些點集中出現的時候你面試的成功率也會大大降低。所以針對面試我總結了以下幾個流程。

1、面試分為3個階段(初期,中期,高offer期)

初期 主要透過(BOSS,拉勾投遞即可),初期主要投遞小公司,這部分公司有兩個目的。 第一是相互交流技術點,不斷完善自己的技術覆蓋度。 第二是瞭解當前市場的需求點。

中期 主要透過獵頭去投遞,這個階段主要投遞中場,這類公司要求技術深度會比初期公司要深一些,演算法的考察會加重,同時面試官的技術水平也會偏高一些,甚至有的中場面試難度會達到大場的水平,這個中期儘可能的持續長一些,非常有利於後續的面試經驗總結。

高offer期 這個階段主要投遞你的目標企業,切記面試優先順序從最不意向的公司開始投遞。投遞的方式也是透過獵頭,這樣可以加快面試流程。以上的初中期更多的是完善你的技術覆蓋度,以及你的面試感。為了是讓你以最好的姿態去挑戰你最想去的企業,這樣一路走來你面試的成功率會大大提高。

2、溝通能力

面試除了考察你的技術實力以外,還有一點是比較重要的,那就是溝通能力,你面試的崗位越高,對你溝通能力的要求也就越高。

溝通是特別重要的一個點,這決定你是否能非常清晰的把你所知所想完整的闡述出來。

我們面試的過程就是自我營銷的一個過程,所以當你覺得自己溝通能力不是很強的時候,那麼你就需要定向的去總結幾個點。

比如 一個出色的自我介紹,  專案中遇到的最難解決的一個問題如果讓你設計一個架構你應該怎麼設計簡單的介紹一下你負責的業務 等....

3、面試頻率

面試週期我建議15-30天。

初期 小公司,我建議一天面試3個,如果有精力的話可以4個,這裡需要注意一點,小公司有很多不靠譜的,比如還用Eclipse的,比如上來還沒問技術就先打擊你的,這種可以找機會離開,不要浪費時間。面試時長建議控制在60分鐘以內,不要太摳細節。有條件的可以開啟錄音器,方便結束後晚上覆盤。你覆盤3-4天的時候你會發現面試內容開始大批次重複了。

中期 這個時期我建議一天最多2個公司,因為中場一般都是3輪或者以上的面試,有一部分是一路走完的。所以你需要給二面三面留出時間以方便充分溝通。千萬不要一面完就打算走,因為一二三面所考察的完全不同,一面主要是基礎,二面主要是框架/原始碼/簡歷裡的技術,三面一般會聊專案,方案或者思路。

高offer期 這個環節需要你按實際情況伺機而動,因為有的大廠是一條龍面完,有的是每一次面試都單獨約,但是大廠一般的流程都比較慢,都在1周以上才能完成整場面試。一般都在4-6面之間。但是建議一天最多安排2場面試,這個面試時長不確定性因素會比較多。如果面試官不是很討厭你,一般都會在60分鐘以上。

各位朋友,一定記得面試是一個雙向選擇的過程,面試者和招聘方一定是站在平等的溝通條件下進行面試溝通的,在此過程中雙方都不要帶有情緒或者有色眼鏡去看待對方。

都帶著誠意去溝通才是最和諧最節約時間的面試過程,最後希望正在面試的你能順利找到心意的工作。

技能儲備

Android學習是一條漫長的道路,我們要學習的東西不僅僅只有表面的 技術,還要深入底層,弄明白下面的 原理,只有這樣,我們才能夠提高自己的競爭力,在當今這個競爭激烈的世界裡立足。

如果你覺得自己學習效率低,缺乏正確的指導,可以參考下下面分享我多年工作以來收集整理的學習路線,給大家做個參考:

1、確定好方向,梳理成長路線圖

不用多說,相信大家都有一個共識:無論什麼行業,最牛逼的人肯定是站在金字塔端的人。所以,想做一個牛逼的程式設計師,那麼就要讓自己站的更高,成為技術大牛並不是一朝一夕的事情,需要時間的沉澱和技術的積累。

關於這一點,在我當時確立好Android方向時,就已經開始梳理自己的成長路線了,包括技術要怎麼系統地去學習,都列得非常詳細。

知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。

2、看影片進行系統學習

前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因為Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以透過影片來學習,效果更好,也更全面。關於影片學習,個人可以推薦去B站進行學習,B站上有很多學習影片,唯一的缺點就是免費的容易過時。

另外,我自己也珍藏了好幾套影片,有需要的我也可以分享給你。

3、透過原始碼來系統性地學習

只要是程式設計師,不管是Java還是Android,如果不去閱讀原始碼,只看API文件,那就只是停留於皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的。

“程式語言是程式設計師的表達的方式,而架構是程式設計師對世界的認知”。所以,程式設計師要想快速認知並學習架構,讀原始碼是必不可少的。閱讀原始碼,是解決問題 + 理解事物,更重要的:看到原始碼背後的想法;程式設計師說:讀萬行原始碼,行萬種實踐。

真正最能鍛鍊能力的便是直接去閱讀原始碼,不僅限於閱讀各大系統原始碼,還包括各種優秀的開源庫。

4、簡歷準備充分:簡歷+社招解答+經典HR面試解析

可以去知乎上面搜搜別人寫的有關簡歷的帖子,怎麼準備,吸引hr, 突出自己的優點和能力,或者讓朋友幫你看看簡歷有沒有問題,比如過於簡單或者浮誇,沒有重點等。

儘量把你的亮點總結成一句簡練的話,再加上數字來說明它的影響和意義。

其次在簡歷裡中加入了可互動、可展示的內容,更能顯出你的能力與眾不同。

有很多人經常也會遇到很多關於簡歷製作,職業困惑、HR經典面試問題回答等有關面試的問題。同樣我也蒐集整理了全套簡歷製作、金三銀四社招困惑、HR面試等問題解析,有疑問,可以提供專業的解答。

5、刷題備戰,直通大廠

面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,演算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。

關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:

以上這些資料都已打包整理完畢,點選 可以看到全部內容。或者點選 【 】 檢視獲取方式。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69983917/viewspace-2788099/,如需轉載,請註明出處,否則將追究法律責任。

相關文章