18年底Android面經分享

本文已授權公號劉望舒 原創(chuàng)首發(fā)

前言

本人水平有限,此文針對于自認為技術實力對標阿里P6,百度T5或者以下的讀者,如果是大佬不小心點進來了,可以自行點x略過。文內并不會出現(xiàn)每一家公司的面試過程細節(jié),主要目的在于幫助大家怎么在像我一樣菜的情況下在這寒冬拿下offer或者說有復習準備方向。第一次寫這種東西,會比較啰嗦,心急的朋友可以直接滑到高頻題集和答題技巧篇。

背景介紹

11月因公司團隊解散而離職,突聞互聯(lián)網(wǎng)最寒冬又雙叒叕來了(每到冬天,媒體都來這么一發(fā)),什么小廠大量倒閉,大廠裁員或鎖HC,惶惶不安準備了一個多星期后,開始踏上面試求職之路,截止最終確定入職單位總計用了二十多天(期間有一半時間在做頸椎康復治療)。

求職開始于某個周日晚上十一點把簡歷公開到獵聘,第二天開始就被獵頭的電話打爆(對這個所謂寒冬有點疑惑),按先后順序面了xxx體育資訊(搞BC的)、xx者科技(技術方向不同,去了幾乎沒怎么面就讓我回家了)、騰訊音樂(電話一面掛)、技威時代(智能家居方向)、悅動圈(跑步運動,用戶量過億)、順豐科技OPPO、百度(止步現(xiàn)場第三輪技術面)、今日頭條 ,加粗的是拿到offer的,最終入職了頭條。

個人簡介

本人985學校本科畢業(yè),名字就不談了,怕給母校丟人,非科班出身的,三年多Android開發(fā)經驗,半年iOS開發(fā)經驗,和一個JavaScript小游戲開發(fā)經驗。技術水平,略低于百度T5的樣子(去百度面過,止步第四輪技術面)。一直在創(chuàng)業(yè)小廠工作,團隊總人數(shù)沒超過90人過,絕大多數(shù)時間處于獨立開發(fā),也就是一個人負責一個APP,甚至同時負責多個APP。技術棧得益于產品汪頻頻更改的需求,還是積累了不少廣度,但是因為人少活多,精力有限,所以深度還是有所欠缺。

面試準備

簡歷攻略

首先從企業(yè)招聘端分析他們想看到什么樣的簡歷,一般看簡歷的有三種人,獵頭、HR、技術負責人。獵頭和HR關注的點比較近似,放一起說,這兩者一般比較關注工作經歷、項目經驗、掌握的技能點是否和用人單位JD匹配,對于工作年限低的,比如三五年以下的,還會關注學歷,尤其是大廠,比如本科是很多廠的硬性要求,因為HR看簡歷的時間有限(我猜的,大廠投簡歷的人那么多,肯定看不過來?。琀R還會關注你在過往的經歷中的產出成績,能量化的最好。對于技術負責人,主要關注的就是你所熟悉的技術棧,和項目經驗了,也許會因人而異,這個可以換位思考,如果你想找一個隊友,你期待你的隊友是怎樣的一個人。

我對簡歷的理解是,對自己的基本情況做總結形成你的人設,目的是讓用人單位對你感興趣,獲得面試邀約。簡歷格式用PDF,兩頁最好,如果你覺得你足夠屌,可以一頁。注意排版要整潔,自我認知要客觀,別什么精通xxx張口就來,除非你是真的精通,已經完全不怕被面試官問倒的程度,反正我一個精通沒寫。對于什么教育程度、自我評價、專業(yè)技能點、工作項目經歷之類的用什么順序寫之類的,我覺得沒有一個固定的標準,我的建議就是以突出自身亮點、優(yōu)勢,揚長避短為原則的優(yōu)先級排序。比如你是985的學校畢業(yè)的,但是工作履歷不出彩,可以把學校放前面,我因為專業(yè)不是計算機類的,為了防止被HR刷掉,我只寫了xx大學,本科,事實上一般技術面試官也不是非要科班出身不可,就我經歷的幾個廠面試而言,我在自我介紹時主動說明了我的專業(yè)出身,面試官一般也會表示理解。那如果,學歷不夠出彩,但是之前公司背景屌或者說做過的項目比較知名比較屌,例如用戶量、日活很多之類的,那么就可以把項目經歷寫在比較靠前醒目的位置。如果自己有寫高質量博客的好習慣,或者在GayHub上有star比較多的開源項目,可以寫在自我評價里,作為加分項,因為本人這兩者都沒有,所以我自己沒寫自我評價。

有朋友問我,技能點該怎么寫,寫多少寫什么比較合適?這個主要還是要看個人情況,我只能提幾點供參考的建議,把你的技術棧提取出亮點來,把你的亮點和理解的最深的有門檻的技術寫在靠前的位置,可以參考下你目標公司的jd需要什么,你把你會的寫上去,不要寫太多,也不用寫那些一眼看上去沒啥技術含量的東西??梢赃m當?shù)某橄笠稽c,不用具體到點,舉個例子,熟悉常用的數(shù)據(jù)結構與算法,肯定比熟練運用HashMap、ArrayList,知道快速排序原理要強。項目經歷怎么寫?那還就是用著名的star法則,即情境(situation)、任務(task)、行動(action)、結果(result)。在什么場景下,采用了什么技術方案,取得了什么成果,通俗來講,還是提取項目中的技術亮點和能體現(xiàn)你能力的地方。比如說,對應用啟動的做了xx優(yōu)化,啟動速度快了30%,比競品厲害了多少。

還有很多人最關心的,面試題一般都問啥?很簡單,一部分從你的技能點發(fā)起提問,一部分從你的項目經歷發(fā)起提問,從這個角度來看,你是在給你自己設計考點,想要證明你的實力,那么你就在這兩個地方多花點功夫,把你簡歷上的東西琢磨深一點,不被面試官問起來虐到就行。因為你能進入面試環(huán)節(jié),就說明用人單位,通過簡歷對你的“畫像”基本能達到錄用需求了,你只需要在面試時表現(xiàn)出來,你簡歷上的不是吹牛B,而是真正的你,那么不說能拿多少錢,至少offer是穩(wěn)了。

投遞渠道

我自己在這過程中幾乎只用了獵聘、BOSS直聘,拉鉤也公開了簡歷,但拉鉤只約過一家,基本都是獵頭推薦和BOSS上的招聘方主動聯(lián)系我。

高頻題集

下面的題是混合了我面過的公司中還記得起來的題目,每個類型都大致是按照出現(xiàn)頻率倒序排列的,有些題目其實只是一系列問題的引子,讓面試官和候選人打開話題的。

基礎題

網(wǎng)絡相關
  • Https的原理?
  • Tcp和Udp的區(qū)別?
  • Http的報文結構?cookie是用來干嘛的?有哪些響應碼,分別都代表什么意思?
  • 有自己實現(xiàn)過Socket協(xié)議嗎?
多線程
  • Sleep()和wait()的區(qū)別?
  • Java有哪些線程池?他們的區(qū)別是什么?線程池工作流程是怎樣的?線程池實現(xiàn)原理是怎樣的?Cache線程池有哪些弊端?
  • 多線程間的通信方式?
  • synchronize關鍵字怎么用的?還知道哪些同步的方式?
  • Thread直接調用run方法會怎么樣?start方法作用是什么?
  • volatile關鍵字的作用是什么?
  • 怎么安全停止一個線程任務?原理是什么?線程池里有類似機制嗎?
數(shù)據(jù)結構
  • HashMap和HashTable的區(qū)別?和 ConcurrentHashMap 區(qū)別?和LinkedHashMap區(qū)別?內部實現(xiàn)原理?
  • LRUCache的原理?
  • ArrayList和LinkedList區(qū)別?為什么ArrayList不是線程安全的?
  • 數(shù)據(jù)庫的索引用的什么數(shù)據(jù)結構?
虛擬機
  • 垃圾回收機制?有哪些對象可以作為GC roots?
  • 跟Art、Dalvik對比
  • Java內存模型?
  • 類加載機制?雙親委托模型?
其它
  • 用過哪些設計模式?DCL單例模式為什么要兩次判空?Android里源碼或者你用過的開源庫都用到了什么設計模式?
    — final關鍵字的作用?
  • 靜態(tài)內部類和內部類的區(qū)別?
  • 值傳遞類問題
  • Kotlin為什么能和Java混編

Android題

  • 你有什么亮點?項目中遇到過什么難題或者坑,怎么解決的?
  • 做過哪些性能優(yōu)化?是怎么評測和具體優(yōu)化的?
  • Activity的冷啟動流程?AMS的作用?
  • 怎么分析內存泄漏?
  • View的事件分發(fā)機制?滑動沖突怎么解決?
  • 自定義View的原理和流程?
  • Handler原理?(一般會花式擴展)
  • 有哪些多進程通信方式?Binder機制?
  • Android的生命周期和啟動模式相關?
  • 你項目中用到哪些開源庫?說說其實現(xiàn)原理?(OKhttp、RxJava、Retroit重點,如果有用到的話)
  • Android的打包流程?apk里有哪些東西?簽名算法的原理?
  • 了解哪些插件化技術?
  • LinearLayout的布局流程?
  • 對Mvp的理解?
  • Android怎么做?;??

算法

  • 排序相關的(快排,分析不同排序區(qū)別,時間復雜度等)
  • 字符串、數(shù)組相關的(滑動窗口、雙指針)
  • 鏈表(反轉鏈表)
  • 遞歸、斐波那契數(shù)列(爬樓梯)
  • 動態(tài)規(guī)劃

答題技巧

分析考點

技術面是一場技術面試官對候選人的綜合評估

先從面試官角度來分析,在面試過程中的對候選人一些考查點吧。知己知彼百戰(zhàn)不殆,面試過程中逆向思考一波,有助于我們怎么應對技術面。

  • 候選人人設是否跟簡歷一致

主要看候選人是否坦誠真實,這個會直接影響能不能通過。候選人上的項目經驗和技能點應該盡可能與候選人匹配,比如說,候選人說做了XX項目,但是問起是怎么實現(xiàn)的,卻答不上來,或者說熟悉xx技能點,卻只會調用常用的api,對其源碼細節(jié)一點都不熟悉,那多半是不給過的。如果候選人要吹牛B,能拿出能圓上吹牛B的實力,也是可行的。比如說某某模塊其實是你同事做的,但是你也完全理解了,可以應答如流,面試官是不會計較的。

  • 技術的扎實程度和項目經驗匹配程度

考查包括對技術的理解和解決問題的能力,包含一些細節(jié),運用的場景,實現(xiàn)的原理等等,目的是為了測試候選人技術水平上限。答得越清晰,越深入,對細節(jié)掌握越牢靠越好,不一定需要全部答出答完美才能拿到offer,但這些題回答的效果最能影響到offer能談多少錢。小廠偏重于技能、項目經驗匹配度,大廠偏重于基礎、原理。小公司,面試官通常希望候選人盡快上手,就希望候選人有類似競品或者功能開發(fā)經驗的候選人,所以也可以從這些方面做準備。大公司呢,可能會提出一些場景來考查候選人怎么設計,這就要求候選人功底深厚,邏輯嚴謹了。上面的題集我沒寫答案,因為我覺得很多題本就沒有標準答案,也沒有必要背題的“標準答案”,優(yōu)秀的回答,應該是形成自己的理解輸出的,說的有理有據(jù)就行。

  • 候選人亮點、優(yōu)勢

一般是作為候選人的加分項,或者是面試官為了更快的打開話題,了解候選人的優(yōu)勢,并測測候選人的優(yōu)勢到底屌到什么程度。這個問題回答好了,候選人甚至能翻盤。

  • 溝通能力

在一線搬磚過的應該都懂,每天正正經經寫代碼的時間通常不到一半,還得花不少時間跟產品撕,跟后臺撕,跟UI撕等等。所以溝通協(xié)調能力也是很重要的,候選人需要理解面試官出題意圖,表達要邏輯清晰。最好是候選人能跟面試官建立起討論技術的氛圍。這方面很容易被多數(shù)候選人忽略,但其實挺重要的,面試官也許不能直接決定要你,但是一般可以直接決定淘汰你,候選人要不卑不亢,保持謙遜。候選人技術再屌,態(tài)度傲慢的話,也是很容易翻車的,但也不能太慫,顯得沒有技術底氣,所以最好是和諧的討論氛圍。

  • 學習能力,自驅性

一般總監(jiān)或負責人會比較關注這個。

答會的問題

  1. 要聽明白面試官的出題意圖,也就是注意審題,不要答非所問,如果對面試官提出的問題不是很理解,及時進一步溝通,把問題問清楚,這也體現(xiàn)了溝通能力,畢竟平時工作時,也會接到一些不是很清晰的需求,自己主動獲取更清晰的需求也是程序員的優(yōu)秀素質。
  2. 回答要盡量清晰準確,最好能答到問題的本質,展示出你對技術的更深層次的探索和挖掘。同時要注意面試官的反饋,這時候就要察言觀色了。
  • 如果面試官聽的津津有味,并不斷追問加大問題難度,那么恭喜你,你回答的很好!
  • 如果面試官表現(xiàn)得有點不耐煩,那就精簡下回答,畢竟面試時間有限,去掉那些啰嗦的話和題目關聯(lián)不大的東西。
  • 如果發(fā)現(xiàn)面試官問的題越來越簡單,越來越常規(guī)表面,那么就得警惕下了,可能是你之前的回答太一般,讓面試官覺得你比較菜,所以就不給你出難題了,這種情況就算最后給到offer,多半價格也談上不去了,甚至還可能是為了給你個臺階下,然后讓你回家等遙遙無期的通知了,這種情況下就得把問題回答得更深入一些了,知道多少答多少,盡可能主動展現(xiàn)出自己的水平來。

答不會(不確信)的問題

  1. 首先要對這個問題有一定的思考分析,不要輕易的說不會,但也不能完全不會還瞎JB答,完全不會的還是要敢于說不會,坦誠也是必要的素質。
  2. 如何思考分析呢?以我的經驗來看,主要是從問題的關聯(lián)知識或者可替代方案的角度來思考。對問題不是很清楚了解的時候,嘗試從已知的相關聯(lián)的知識點來做出合理推測,比如從一些開源庫里面借鑒思路,或者從Android源碼里面借鑒思路,但是這種情況就得跟面試官說清楚,你是推測的,還要說下為什么要這么推測,避免面試官誤以為你不懂裝懂。還有一種方式,就是你也提出一個可替代的能解決問題的方案。

例題分析

上面的題集有些問題看起來比較簡略,我這邊舉幾個典型例子做拓展,其它題目類似。

做過哪些性能優(yōu)化?是怎么評測和具體優(yōu)化的?(具體問法可能有很多種,注意識別考點)

性能優(yōu)化通常會設計到流暢度優(yōu)化、啟動優(yōu)化、apk瘦身優(yōu)化、網(wǎng)絡優(yōu)化、耗電量優(yōu)化,先給面試官拋出幾個大的方向,一邊回答一邊觀察面試官反饋,通常面試官會從這幾個方面挑揀一兩個感興趣的讓你更進一步的講解,如果沒有,那你就對每個方面抓住最核心關鍵的部分簡要回答就行了。舉個讓你繼續(xù)談流暢度優(yōu)化的問題,那你就得考慮到,怎么評測出是否流暢的?用了什么工具或者技巧?比如說用了GPU程序模式分析,用了騰訊GT插件的SM指標,用了TraceView、Systrace、Hierarchy Viewer等等,很可能面試官還會問,卡頓的原理是什么?哪些情況會導致卡頓?這時候你就得回答出FPS、垂直同步的原理了。接著你得說出你用了哪些技巧優(yōu)化的,優(yōu)化的成果怎么樣?那數(shù)字肯定是最有說服力的,所以大家平時在優(yōu)化前和優(yōu)化后都得做好記錄。你回答優(yōu)化技巧后,比如減少過度繪制啊、布局優(yōu)化啊,還有可能會追著問view的gone和ViewStub的區(qū)別,以及分別用在了什么場景?原理是什么?為什么就能優(yōu)化了?

  • 反思點:
    平時工作時,對技術細節(jié)、原理需要多關注,不光要知道怎么用,還要知道背后的機制。

你項目中用到哪些開源庫?說說其實現(xiàn)原理?

回答開源庫相關的問題,要想回答的好,就得自己想清楚幾個問題,想清楚了,就可以隨便回答了。

  • 這個庫是做什么用的?
  • 為什么要在項目中使用這個庫?
  • 這個庫都有哪些用法?對應什么樣的使用場景?
  • 這個庫的優(yōu)缺點是什么,跟同類型庫的比較?
  • 這個庫的核心實現(xiàn)原理是什么?如果讓你實現(xiàn)這個庫的某些核心功能,你會考慮怎么去實現(xiàn)?
  • 你從這個庫中學到什么有價值的或者說可借鑒的設計思想?

算法相關的

首先要想答好,還是得多理解數(shù)據(jù)結構,去LeetCode多刷題,多總結套路。我這塊兒也比較薄弱,只能說一些淺見。面試了這幾家,大概有一半考察了在白紙上手寫算法題。而且很多題我也答的并不是很理想完美,但依然拿到了offer,所以我就說一些逆風應對技巧吧。舉個爬樓梯的算法題作為例子。

假設你正在爬樓梯。需要 n 階你才能到達樓頂。每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

  • 先審題,發(fā)現(xiàn)n是個未知數(shù),題目也沒明說n的范圍,那么這個時候你應該跟面試官確認一些這個n的范圍(這體現(xiàn)了你的溝通能動性和對需求的理解能力)
  • 審完題后,發(fā)現(xiàn)還是一臉懵逼,不知道怎么下手。這時先冷靜,別指望一步登天,解出最優(yōu)解,考慮什么時間復雜度啊什么的,先解出答案再說。如果暴力解法都想不出來,那么就先把題目縮小范圍,把n明確化,比如是3階的樓梯怎么爬,這個時候一般可以畫圖來輔助自己尋找思路,直接腦子干想不如圖像直觀,很可能這么一頓操作你就能發(fā)現(xiàn)規(guī)律,找到解題思路了,就算最后真的沒寫出具體算法,將已知思路和阻塞自己的難點告知面試官,也可能會通過面試(這個過程體現(xiàn)了你解決未知難題的能力,程序員解決未知問題的能力是很重要的素質)。
  • 你畫了圖之后發(fā)現(xiàn)這個是個樹形結構,憑借刷題的套路總結,一般樹形結構的問題通??梢允褂眠f歸解決。而且巧得很,這還是一個斐波那契數(shù)列問題。這個時候你開始寫代碼,用到了遞歸算法,那就得注意遞歸的一些特性,比如說遞歸終止條件。在你寫完后,就可以跟面試官講解你的思路,和分析時間復雜度了。
  • 還沒完,你學過的算法課會告訴你,有些遞歸算法,是可以進一步用動態(tài)規(guī)劃的方式優(yōu)化的,你仔細觀察了一下,發(fā)現(xiàn)這個問題還可以用動態(tài)規(guī)劃的思想優(yōu)化(字節(jié)范兒:追求極致?。?/li>

面試準備資料推薦

書籍:

  • 《Android藝術探索》
  • 《Android進階之光》
  • 《Android進階解密》
  • 《深入理解Java虛擬機》
  • 《Android源碼設計模式》
  • 《深入理解Android內核設計思想》

社區(qū)和公眾號

  • 鴻洋的WanAndroid
  • 劉望舒
  • 玉剛說
  • 郭霖
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容