寫在前面的話
我是14年畢業的,畢業一直做Android相關方面的開發,14年到18年經歷了幾家小公司,前後都倒閉了,可謂是一直顛簸流離,漂泊不定。在18年來到上海尋求發展,以前一直呆的是小公司,這次就想找個大公司,想穩定一點,同時大公司技術底蘊也比較強,想多學習學習,提升自己。前後大概經過了大半個月左右,找到了一家大廠,互聯網上市公司,我所在的技術團隊也有幾百號人,也算得上大公司了。
大小公司對比
大公司和小公司真的不一樣,我以前一直在小公司做開發,一個同時開發幾個app也是比較常見的。在大公司裏面,充斥着各種規章制度,流程規範價值觀的衡量,kpi考覈等。同時個人做的事也比較窄,因爲大公司要求的深度而不是廣度,人多,各人負責自己的那一方面,我在裏面主要做一些業務需求的迭代開發,整體而言不算很難,屬於比較養老的。在這家公司我呆了大概1年9個月的時間。以前我一直念念想找一家大公司,可是等我真正進去了以後才發現,其實不是我想的那樣,你要是被分進了核心項目組的話那還好說,如果在邊緣項目組的話,結果那就不好說了。KPI考覈這個東西,好壞還真不好衡量。就像阿里的325一樣,有的時候因爲這個KPI,愣是把人搞成了抑鬱症。
跳槽原由
跑題了,繼續回到這裏。在這家公司公司呆了一年多,活不多,做的事情也不是我想的那樣,跟我的發展規劃不一致,同時也因爲其他一些原因,我在1月初選擇了離職,本以爲找工作很容易,畢竟經驗也有了,大廠背景也有,可是萬萬沒想到,2020年發生特大疫情,新冠狀病毒疾病的發生,因爲這場疫情,很多公司都倒閉了,裁員,降薪隨處可見。到現在爲止還有很多公司還沒有復工,怕啊,要命了,口罩買不到,公司又裁員降薪,在家不上班,又沒有收入,貸款還不上,人都搞焦慮抑鬱了。我是1月份提了離職,然後準備了1個月,在2月份的時候開始投簡歷找工作。這次疫情影響很大,從投簡歷就能看出來,招人的需求不多,投了簡歷,公司迴應也不是很積極。從投簡歷,到約公司面試,到最後入職的話花了一個左右的時間。下面我就記錄以下具體的內容:
面試公司
面試的公司從幾個人的小公司到幾萬人的大公司,從不出名的小公司到BAT和宇宙條都有,我面試的公司主要有,TourABC,7貓,哈囉出行,360金融,觸寶,商米科技,比心陪練,傳音控股,毒APP,愛奇藝,B站,閱文集團,餓了嘛,阿里巴巴,今日頭條等比較出門的一些大公司,同時我還面試了一些比較小的的公司,不出名,前後大概有20家左右吧,通過率大概在50%左右,不過最後因爲薪資的問題沒有談攏,可能我在上家公司的薪資比較虛虛,我的期望薪資是增加20%,所以一些公司無法提供,所以就拒絕掉了。怎麼說呢,我出來上班,首先考慮的是薪資,比較都要先活着再談其他的。不過有的公司薪資雖然達到了,但是因爲做的東西跟我預期的不一樣,所以也拒了。還有一些大公司,像宇宙條,阿里,騰訊的,就是我自身問題了,能力達不到他們的要求,被拒了,這也很正常,畢竟能進去的也是少部分人,大多數的還是比較普通的。
面試方向
一開始我是找的關於應用層的開發,但是發現需求很少,現在Android面試找工作的方向一般有應用需求開發,系統framework研發,音視頻開發,基礎架構開發,跨平臺開發等幾個方面,從這次找工作來看,除了應用需求開發以外,其他的幾個方面的需求還是比較高的,但同時要求也很高,並不是說你會使用MVP+Rxjava+Retrofit+Dagger2+Glide+Jetpack+Flutter+RN等技術點就可以了,現在一般公司都要去你懂原理,瞭解技術實現細節了,現在市場上對於初中級的Android開發要求比較少了,更多的是對於高級研發的需求量比較大,所以對於Android研發的人而言,需要加強自身的硬技術,有過硬的技術就不怕找不到好工作。
因爲這次疫情的影響,找工作都是電話面試和視頻面試。基本上一面是電話面試,二面三面的是視頻面試,一般是在牛客網等平臺開一個面試房間,有的公司需要在線coding的,要求比較高。我從投簡歷到約公司面試,大概面了十幾家公司,我每次面試完一家公司都會做個總結,把涉及到的內容都記錄下來,同時不會的也會去惡補一下,都整理成相關文檔,現在詳細記錄以下我的面試內容,供有需求的同學參考參考:
面試內容
面試的範圍主要涉及Java基礎,Android相關的,數據結構與算法,計算機網絡等幾個方面。下面依次列出所問的問題:
Java部分
首先關於Java基礎知識點,主要包含以下內容,接口和抽象類區別,string.stringbuilder.stringbuffer三者區別,Java集合框架底層實現原理,線程和進程的理解,線程池得作用,線程的各種狀態,gc垃圾回收方面得知識點,具體如下:
- Java線程和多線程
- 說說JVM,它的程序計數器是幹嘛用的?GCRoots的對象可以有哪些。
- 集合list和linkedList 區別
- hashmap底層數據結構
- Java同步方式有哪些
- volatile關鍵字和synchronized關鍵字原理
- jvm的相關東西
- Integer的內容
- Java線程池相關的內容
Android部分
Android知識點考察,主要包含以下內容:activity的啓動模式,service的理解,進程間通信,插件化,組件化,熱更新之類的原理,網絡請求庫okhttp原理,設計模式,類加載機制,Handler的理解,Android啓動優化,性能優化相關的東西。具體如下:
- Android跨進程方式及原理
- Android性能優化,如何優化到極致,線程級別
- Android Handler的原理
- Android ANR的產生原因,如何定位ANR。
- 如何計算Android啓動時間,如何優化啓動。
- 說說Android架構模式,MVC是什麼解決了什麼東西,MVP是什麼?它跟MVC有什麼區別?MVVM瞭解嗎,是什麼東西。
- Android BInder機制是什麼。
- AIDL瞭解嗎,說說它的原理
- Android啓動Activity流程,涉及到哪些類?
- Android Binder爲什麼進行一次數據拷貝而不是2次或者0次。
- 事件分發機制是什麼?
- 網絡請求庫的實現原理是什麼,詳細說一下OkHttp的細節
- 圖片加載庫Glide的優點
- LRUCache緩存的原理
- 組件化模塊化,插件化得理解
- 如何進行性能優化以及如何設計一款性能優化的工具,從哪些方面入手
- react native,flutter和kotlin相關的內容
- Android 架構演變,MVP和MVVM
- Android各大市場上架APP的規範
- Google play市場
- 說說組件化和插件化,熱更新技術原理
網絡部分
- 你的項目架構是怎樣的
- 三次握手,四次揮手的相關問題
- 網絡請求框架的原理
- post和get的區別
- 如何實現一張5M的圖片上傳
其他關於每家公司問的面試內容可以參考我文末分享的面試資料,我每次面完一家公司都會詳細記錄之前公司的情況以及面試內容,有需要的可以去查看。底部獻上相關鏈接地址。
面試總結
這是我自己總結出來的面試問題答案,每次面完都會查漏補缺。
offer情況
總共面試了將近20家公司,大概可以的有40%~50%左右,不過有的公司因爲薪資達不到自己的期望,所以拒絕了,有的公司要求比較高,我沒有達到他們的期望也被拒絕了,最終選擇了一家中等規模的公司,主要做基礎架構部分的內容,他們家的app,用戶量達到5000萬左右,日活也有幾百萬,進去主要做性能優化這方面的,比較符合我的預期,所以就選擇了這家,目前已經上班半個月了,一切都還滿意。
面試複習路線推薦
多餘的話就不講了,接下來將分享面試的一個複習路線,如果你也在準備面試但是不知道怎麼高效複習,可以參考一下我的複習路線,有任何問題也歡迎一起互相交流,加油吧!
這裏給大家提供一個方向,進行體系化的學習:
1、看視頻進行系統學習
前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因爲Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面。關於視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時。
另外,我自己也珍藏了好幾套視頻,有需要的我也可以分享給你。
2、進行系統梳理知識,提升儲備
客戶端開發的知識點就那麼多,面試問來問去還是那麼點東西。所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度。so,出去面試時先看看自己複習到了哪個階段就好。
系統學習方向:
架構師築基必備技能:深入Java泛型+註解深入淺出+併發編程+數據傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO
Android高級UI與FrameWork源碼:高級UI晉升+Framework內核解析+Android組件內核+數據持久化
360°全方面性能調優:設計思想與代碼質量優化+程序性能優化+開發效率優化
解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網絡訪問框架設計+RXJava響應式編程框架設計+IOC架構設計+Android架構組件Jetpack
NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發
微信小程序:小程序介紹+UI開發+API操作+微信對接
Hybrid 開發與Flutter:Html5項目實戰+Flutter進階
知識梳理完之後,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結。
3、讀源碼,看實戰筆記,學習大神思路
“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。
主要內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等。
4、面試前夕,刷題衝刺
面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。
關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:
總結
改變人生,沒有什麼捷徑可言,這條路需要自己親自去走一走,只有深入思考,不斷反思總結,保持學習的熱情,一步一步構建自己完整的知識體系,纔是最終的制勝之道,也是程序員應該承擔的使命。
耗時一年多整理的一系列Android學習資源:Android源碼解析、Android第三方庫源碼筆記、Android進階架構師七大專題學習、歷年BAT面試題解析包、Android大佬學習筆記
等等,這些內容均免費分享給大家,需要完整版的朋友,點這裏可以看到全部內容。