天天看點

Android面經分享:我是如何拿到騰訊頭條美團小米的offer從小廠跳到大廠的?

Android面經分享:我是如何拿到騰訊頭條美團小米的offer從小廠跳到大廠的?

一、今年的Android開發的招聘市場如何

今年Android開發的整體招聘趨勢可以概括為幾句話:賽道中的公司在蒙眼狂奔,成熟業務借機補強,更多公司在觀望。

這裡面賽道的公司指的是在疫情中受益或者在疫情之前就已經在狂奔的業務,比如線上辦公、線上教育、線上生活服務、直播帶貨等,市場上很多HC來自這些賽道裡面的公司,技術好,能幹活最受青睐。成熟的業務借機補強:很多成熟的業務在招聘進階開發解決性能和提效的問題,雖然手上握有HC,但是在發offer時比較謹慎,優中擇優不斷地比較。更多公司在觀望:很多公司當機HC,甚至出現“軟裁員”的情況(筆者公司屬于其中之一)。

二、Android開發面試的幾部分

1、基礎知識

  基礎知識包括幾個部分:Java(JDK、JVM)、Android、資料結構和算法、計算機基礎、設計模式。

Java部分:不太推薦這部分隻看部落格,因為很多部落格并不系統也不完整,推薦完整看一遍《深入了解Java虛拟機》這本書,基本上這裡面涵蓋了JVM相關的所有面試問題,包括記憶體分區、GC機制、記憶體模型、鎖、位元組碼、類加載等。JDK的部分會雜一些,基本上可以歸類為幾種:容器(必問HashMap、CurrentHashMap、ArrayList等)、線程池(必問)、注解、同步工具、動态代理、notify/wait/sleep。這部分可以從一些JDK相關的文章中去整理一遍。

Android部分:建議看《Android開發藝術探索》,最重要的一點是要跟着源碼讀這本書,書中篇幅所限,很多源碼隻有部分,隻看書的話并不能了解很多機制是怎麼樣,隻有讀源碼才能完全了解吃透,但是讀源碼的時候最好是找到線索即可,切忌陷入到具體的邏輯裡面不能自拔。這部分必問的是Handler機制、觸摸事件傳遞、四大元件啟動流程、View繪制流程、Binder機制、生命周期。需要徹底讀懂源碼,這樣才能解答很多靈活變通的問題。經典的問題比如:

  • 觸摸事件一定是先傳遞到Activity然後才傳遞給View的麼?
  • 如果要在Application的onCreate生命周期之前執行一些邏輯,可以放在哪裡?
  • draw、onDraw、dispatchDraw執行的順序如何?
  • View真正顯示是在onResume之前還是之後?
  • Activity中嵌套有一個Fragment,startActivity之後,Activity和Fragment的生命周期順序是如何的?

這些問題可能在不同的面試官會有不同的變形,隻有親自讀懂了源碼才可以應付這些問題,切忌從一些部落格上看到隻言片語就以為準備萬全了,部落格隻能作為參考。最重要是源碼,源碼,源碼!

資料結構與算法:這部分在用戶端開發中考察的比例會小一些,不過也有很多公司非常重視手寫代碼。經常碰到的問題有二叉樹周遊、有序二維數組查找,排序等,基本上以《劍指offer》或者《程式設計之美》為準就可以了。

計算機基礎:這部分涵蓋的比較雜,比如計算機網絡(7層網絡模型、Http和Https)、git工作流和指令、計算機緩存政策、UML、資訊安全等等。

設計模式:在自己的項目中一定要多總結和使用設計模式,面試官問你使用過什麼設計模式的時候,如果能回答出比如狀态模式、責任鍊、裝飾等等,肯定會加分不少。如果隻是回答單例和建造者模式,那就會遜色多了。這部分推薦看《研磨設計模式》。

開源項目:這個也是必問的環節之一,建議從自己項目使用的開源項目入手,跟着代碼,畫一遍流程圖和架構圖,仔細體會這裡面設計的優點和缺點。比如OkHttp、LeakCanery等等,這些都可以。開源項目根據面試官的個人經驗不同,問的深入程度也不一樣,這時候就需要你個人的一些引導技巧,比如面試官可能不是很熟悉這個架構,這時候你能主動表達出這裡面設計的一些細節,也能給面試官留下不錯的印象。切忌在履歷上寫隻是用過但是沒看過源碼的架構。

一些不錯的部落格推薦:

基礎知識梳理:

澤毛

開源架構鑒賞系列:

蘇策

系統源碼介紹:

袁輝輝大佬

一些面經面試題整理:

https://www.jianshu.com/p/d373bb8b5792

2、重點項目經曆

小廠的項目往往追求業務快速疊代上線,相對比較能容忍一些技術難點,但是這些技術難點往往是能展現一個人技術能力的。是以你如果在小廠,就不能過分陷入到業務中,必須跳出來找一些有亮點的技術點,做好做精。這些技術點才是一個程式員安身立命的本錢,否則公司業務陷入困境了,你的價值也就不複存在了。在如何準備面試中項目這部分,筆者有幾點心得:

分成三部分:為什麼要做這個點,考慮了什麼因素并且是如何做的,取得了什麼效果(比如啟動速度從1000ms降到200ms,這種具體的資料)

可以把幾個小點串起來,這樣可以顯得更系統和全面一些,比如代碼優化和性能優化結合在一起講。

小廠的一些優化點往往隻能做成本效益最高的一部分,這時候還可以講一下業界還有哪些更優的方案

最好再準備一下“如果你沒有離職項目中還有有什麼不足和可以優化的地方?”(筆者面試中碰到過幾次這樣的問題)

小廠跳大廠,技術基礎可以準備得很充分,但是項目絕對是一個弱項。大廠一個App可能就有幾十上百人在做,小廠很多所謂的優化在大廠的面試官眼中可能都是他們很早就做過了,這時候項目本身做了哪些東西并不是太重要,需要着重展現你解決問題的思路以及你是一個有追求的程式員,至少你要能做到業界的平均水準,這樣才能有機會通過面試。

3、開放式設計思路

開放式的設計問題需要融會貫通資料結構、設計模式和架構設計等方面的知識,這部分沒有固定的答案,筆者總結了一下這些問題可以套用的幾個解決問題的思路:

分治法

分治法是現代程式設計中非常重要的一個原則,主要是把大問題化解成小問題,再在小問題中去解決各自的問題。

分層法

把一個大的系統進行分層,比如View層-Controller層-Model層。把一個大的問題,劃分成幾個層次,每個層次的職責和層次之間之間資料流定義清楚,然後再在各個層次中去實作。

套用常見的模型

比如生産者消費者模型,“池”的模型(例如線程池、對象池)、緩存模型(LRU)等。

比較常見的開放式設計思路問題有如何設計一個網絡圖檔加載架構、如何設計一個檔案下載下傳系統、如何設計一個IM元件等等。這些問題都是非常大的問題,比如圖檔加載架構就可以套用分層法去化解,參考fresco的設計,劃分成View-Controler-DataSource這樣的層次。大量檔案的下載下傳系統可以套用線程池的模型去設計,這裡就不再展開講了。

4、技術以外的東西

大廠面試中技術以外的部分也是非常重要的一部分,這部分大多是一些軟技能:

自我驅動和追求

這部分主要是在平時工作中的一些自我驅動學習和自主追求一些技術能力,而不僅僅是完成需求就可以了,這樣才能展現出你個人的成長性和潛力。

溝通和協作

這部分會評估你未來在團隊的融入程度以及跟團隊跨團隊協作和溝通的能力。比如你在工作中是否能正确看待和解決一些跨部門溝通的問題。

下面是我個人整理的整個面試的一些知識圖譜,這上面的知識點基本上都是面試過程中問到的,屬于必知必會的知識點,如有需要可以留下郵箱,我發一下xmind格式的檔案

Android面經分享:我是如何拿到騰訊頭條美團小米的offer從小廠跳到大廠的?

三、與面試官聊天的收獲

  雖然很多面試都是在問問題和答問題中度過的,但是還是有一些面試官在面試完成後會對我的面試結果做一些總結和評價,這裡面也收獲頗多,跟大家分享一下。

1、大廠和小廠的選擇

很多剛進入職場以及學生會有這方面的困惑,不過我還是簡單粗暴地回答一下這個問題吧,建議去大廠。因為這幾個方面的原因:

大廠周圍的小夥伴大機率更優秀。

幾年後小廠和大廠的程式員市場溢價不同。同樣工作年限的程式員,大廠天然要比小廠的溢價高很多。

小廠更強調業務的快跑,忽視人的成長。很多小廠會在不同的業務方向上投幾個人做出一個App出來試試市場反應,很多人就不得不重複做之前已經會的一些功能,而且很多小廠使用者量很小,并不關心所謂的性能架構,因為優化了一個性能,能受益的使用者也非常少,還要占用開發業務的時間,你的老闆和業務部門也是非常不樂意的,這對于一個程式員的成長是非常不利的。如果一個小廠宣稱自己的團隊主要成員主要來自百度、新浪、網易等大廠的時候,你需要格外注意一下,這并不代表你進入這個團隊後能成長成百度的标準。

2、5年左右的開發的标準

這裡說一個标準,5年左右開發經驗的工程師,應該在某個或者某幾個方向上是整個公司的專家和标杆。比如設計能力、網絡優化、性能優化、音視訊等等,5年左右的開發不應該僅僅滿足于實作一些業務需求,應該更深入了解底層的原理和技術,這樣在未來的跳槽中才能有更高的溢價,比如從抖音出來的音視訊工程師就能在市場上享受非常高的溢價。

3、關于成長和職級

主動去承擔高一個職級的事情,自然而然你的職級也會跟着提升。很多同學包括我之前也是認為把我自己的事情做好了,找一些項目的亮點再去PK晉升職級。然而阿裡的面試官跟我聊這個問題的時候給了一個新的思路:很多P6的同學更新到P7是因為他們已經在做并且能做好P7的事情了,是以他們升了P7大家都覺得順理成章。從這個角度看職級和晉升,是不是角度不一樣了呢?

相信自己,沒有做不到的,隻有想不到的