
前言
面試從來不是要你給出每一個問題的標準答案,而是要你給出這個問題的你的、自己的答案,
一 關于簡歷
面試首先要提到的就是簡歷,簡歷這個東西真的是一個很深奧的事情,為什么深奧,其實是對像和我這樣的人深奧:學歷不好、作業經歷不好,當然,這和目前技術研發人才需求的大環境也有關系,而且上述兩點會越來越影響簡歷的通過性,說一個真實的事情大家就有概念了,這是一個前同事私下告訴我的,他比我先一年多離開公司,然后到了一個大廠(一個大電商),他現在也負責招聘面試,如果社招簡歷不是碩士,都會往后排排,雖然這不是公司規定,但是他們實際就是這樣操作的,是不是很嚇人?他自己都覺得嚇人,說了這么多,那怎么辦呢?學歷不好、作業經歷不好就別指望找到好作業了?當然不是,其實面試還是考的內功,簡歷只是一塊敲門磚,如果你的內功深厚,并且能夠很好的體現在簡歷上,那么簡歷真的只是一個簡歷而已,大家應該注意到了,上面提到了兩點:
1.將能力很好的體現在簡歷上
2.內功深厚
如何將能力很好的體現到簡歷上其實不是一個理工科同學擅長的技能,所以要多寫多改多請教,多找找有經驗的朋友幫你看看,即便是沒有這樣的朋友,相信大家也有能力和渠道去接觸到這樣的人,另外關于簡歷的格式網上有很多文章,前面專欄里文章也有提到過,這點就不再深入了,有一點很重要的我覺得應該加強一下大家的警惕,就是用過,但是知道不深入的技術點一定不要寫在簡歷上,一般大公司面試有一面一定是簡歷面,也就是按照你簡寫上寫的技術點問,如果發現你寫了,但是又說不出來很深的東西,那就相當減分了,所以這一點一定要注意,總之,簡歷不是你面試通過最關鍵的東西,最關鍵的是第二點:內功
二 關于內功
一個怎樣的Android工程師才能進入到大廠呢?下面幾個方面往往是需要具備的
2.1 基礎
要想拿到大廠的offer,基礎好是一個硬性條件,對于計算機相關專業畢業的同學來說,這些基礎就是你大學所學的課程,如果不是計算機相關專業畢業的同學,那么就需要在基礎知識這個方面下足功夫了,具體來說下面的東西必須掌握:
1.作業系統原理(里面有一些計算機組成原理的知識需要簡單掌握)
2.網路原理
如果你沒有掌握這些知識,或者之前學過,但是忘了怎么辦?學啊!怎么學呢?去網上找一些大學的公開課,我是看的清華的,至于哪一個學校的適合你,就只有你自己判斷了,可能大家會有疑問,面試會問這些知識嗎?直接問的很少,但是只有你了解了這些知識,才能更深入的了解一些技術和知識,舉兩個例子吧,第一個,如果要做Android里的網路優化,你不知道網路里面的一些原理,你怎么知道怎么優化?如果你不知道UDP和TCP的詳細區別,技術選擇時,你怎么知道選擇哪一個作為你通訊的協議?關于網路還有一個出現概率很高的問題就是TCP的三次握手和四次握手,其實它就是網路原理里面的知識,第二個,作業系統中,記憶體是發揮什么作用的,又是怎么作業的,知道這些,你再去了解Android的記憶體管理就信手拈來了,
2.2資料結構和演算法
資料結構和演算法其實是分開的東西,我們需要先掌握各種資料結構,再去加深演算法,資料結構和演算法其實也屬于基礎,但是它現在越來越重要,所以我就單獨拿出來說了,資料結構怎么深入同樣我也推薦大家去看清華或者浙大《資料結構》公開課,特別是清華的,值得反復研究,至于演算法,首先要做的就是動手,LeetCode上直接干!第二階段就是要總結各種演算法的思想和套路,像遞回、動態規劃等這些演算法都是有套路的,在LeetCode上也有按資料結構和演算法分類的篩選,大家可以針對性練習和總結,當然,對于一個Android程式員,能做到每天在LeetCode上刷題就非常不錯了,所以一定要堅持,等你堅持到一定的時間,你會發現你越來越游刃有余,我從15年底開始在LeetCode上刷題,目前已經刷了200多道了,小米的面試也非常注重演算法,還要能寫,而且對一些特別注重演算法的公司,演算法這塊的考核非常嚴苛,對,就是嚴苛,
2.3設計模式
設計模式中包括了設計原則,其實對于Android開發人員來說,設計模式就那23種,知道并了解這些設計模式是第一個階段,僅僅是到這個階段是不夠的,一般面試也不會問你某個設計模式的概念,而會讓你具體的說說你對某一種設計模式的深入了解和使用,它的優缺點,所以,第二階段就是要運用它們,其次要和Android原始碼中運用到設計模式地方進行結合學習,例如建造者模式,Andoird中的Dialog創建就使用到了,還有像單例模式、配接器模式、觀察者模式等等都是在Android中非常常用的設計模式,也是在面試中出現頻率很高的,

2.4 Java
Java我就來直接一點了,如下:
Java集合(HashMap一般必考,通讀原始碼很有必要)
反射
多執行緒
IO、NIO(可選)
泛型
JVM相關,如記憶體的管理、記憶體的回收、類的的加載等等
Java例外
大家可能覺得這些自己多多少少都了解,但是當問到細節就不知道了,所以對于上面的知識還是需要系統的認知,專案中沒有機會深入就自己一個一個突破,比如Java集合,首先對集合要有一個宏觀的認知,
從常見類的原始碼開始動手,如HashMap,循序漸進,逐個擊破,從這點也可以看出,我們對每一類知識一定要深入的了解,而不是泛泛的知道,比如Android的一些熱修復框架,其中就是JVM中類加載和反射等技術,又比如并發中,執行緒池和ThreadLocal這些都是必要掌握和熟練使用的知識,也是面試經常會被問到的,
2.5 Android
Android其實要說的不多,對于一個有作業經驗的Android程式員來說,基礎的一些Android技術大家都是掌握了的,而如果要做一個加分的Android程式員,下面的Android技術就需要深入了解了:
Android View的繪制和流程
Android觸摸事件分發機制
性能優化(網路、記憶體、電量、UI)
常見Android原始碼,如Handler、AsyncTask等等
熟悉Binder原理
了解一些Framework常見知識,如AMS
同樣的,這些都是要系統的掌握和運用,
2.6 JNI
JNI其實屬于Android NDK中的一個技術點,但是它不像上面的知識需要系統的了解,JNI我們只需要知道Java怎么呼叫C或C++的代碼,C或C++怎么呼叫Java的代碼,并且相互之前怎么傳遞各種引數(物件),因為一般Android開會不會涉及到寫復雜的C或C++代碼,我們使用NDK也更多是為了呼叫第三方的一些C或C++演算法庫,如FFmpeg,當然,如果你能寫得一手好的C或C++代碼,那么就更加分了,
2.7 框架和專案
在Android中會經常使用到一些第三方框架,這也是面試中會經常問到的,具體問題就是它們的原理或設計,像LeakCanary、OkHttp等,當然一般只會問你使用過的,在平時我們使用第三方框架的時,就需要去了解他們,僅僅是為了用而用,是面試官不想看到的現象,因為只會用,不懂原理,就不能控制,而是被框架控制,如何去了解呢,首先要知道這個框架怎么用,然后在找入口,從入口一步一步去探索,自己做的專案也和第三方框架類似,你自己參與的專案的架構如果你都不清楚,那么面試官也就知道你對技術的饑渴度了,比如我之前的公司就使用Netty做終端和服務器的通信,在我的簡歷中也體現了這點,我有信心將它體現到簡歷上,是因為我花時間去詳細了解過Netty,從NIO到Netty,到Netty常用的類,再到一些慨念的了解,如零拷貝、IO多路復用、粘包、拆包等等,所以當你在專案中使用過了,并且被問到時你能很好的說出來,那一定是加分的,
三.其他
其他都是能為你的簡歷加分(好學歷和好作業背景就不說了):
有開源專案
參與過開源專案
有個人博客(有內容、有深度、有價值)
這些也屬于一個人的內功,但是它和上面我要提到的還不一樣,因為它不是必須,但又有可能很重要,
四.內功小結
大家看我一會就把Android研發人員需要具備的內功總結完了,但是如果你真的要把這些都真正的掌握、變成自己的東西真的不容易,每個人都有自己的目標和夢想,在走向目標和夢想的道路上,肯定有各種各樣的困難,只有克服困難,才能繼續前行,所以,堅持吧!

五.知識點詳細清單
上面我總結的我怕大家還是覺得太泛泛,沒有干貨,所以再給大家補一個清單:
Activity的生命周期
Activity的任務堆疊
Activity的啟動模式
Fragment的生命周期
Fragment的通訊,Fragment之間,Fragment和Activity
什么是Service,和Thread的區別
Broadcast的作用和注冊方式
什么是本地廣播
什么是有序廣播
Android的異步處理方式有哪些
AsycnTask、HandlerThread、IntentService原始碼
Binder
View的繪制流程
事件分發機制
自定義View的幾種場景和方式
ListView的快取機制
Handler、Message、MessageQueue、Looper
第三方開源框架設計和原理
ANR是什么,怎么避免和排查
OOM是什么,一般如果避免和解決
記憶體泄露是什么,常見的記憶體泄露有哪些
版本管理工具的使用,Git、SVN
代碼編譯工具
代碼混淆
Java IO
多執行緒
類加載器
反射
23種設計模式
HTTP、TCP、UDP協議
計算機網路
作業系統原理
演算法和資料結構:排序、二叉樹遍歷、動態規劃
常見加密方式和原理
六.關于Android的前景
不斷地也聽見很多人在談做Android是否還有前途、Android研發在走下坡路了、Android的作業太難找了,對于這些其實我的看法很簡單,現在真的還沒到說Android開發已經無路可走的地步,當然未來怎樣我無法預判,現在各大公司其實都很缺Android研發(中高級),不斷的在招人,就拿小米來說,別說來面試的人了,就簡歷都拿不到太多,需要花很多時間去找簡歷,所以,對于有Android開發經驗的同學,更多應該想想怎么往深探索,而不是一味想著換方向,不管換到哪個方向,都會面對從初級到高級到資深再到專家的時間點,所以我認為正確的職業規劃應該是金字塔形,核心競爭力一定要扎實!
七.總結
上面算是一個簡單面試前技術點的總結,東西很多,如果要從零開始掌握這些也是非常艱難的程序,唯有靠自己點點滴滴積累,別無他法,其實自己總結出這些東西并不難,難的是如何學、如何堅持、如何加固,每個人的學習和積累方式都不同,一定要找到自己的方式,什么是好的方式標準就是讓自己可以牢記、快速記,牢記比快速記更重要,如何堅持是一種意志力上的考驗,往往我們需要為自己找一些長期和短期的目標,激勵自己不斷的進步,包括我在內的大部分人都不是什么天才,唯一能讓自己進步的方式就是腳踏實地的去干,相信越努力、越幸運!

8.獻給讀者
我自己做Android開發已經是第4個年頭了,畢業后兩年,有幸加入到位元組跳動這個大家庭,在位元組的4年,見證了太多人的來來去去,印象很深一個同事,跳槽阿里薪資直接double,但也看到很多人鍍著“大廠”的金四處碰壁,終究還是倒在了技術上!
我自己或許也算是個成功的例子,在4年的時間里從1-1做到了2-2,當然,這背后的“辛酸淚”就留到日后再說,總的來說,歸功于自己不斷地學習,復盤總結,提升技術!以下分享一下我4年來具體的學習路線及筆記檔案,希望能幫助到有心提升技術的朋友!
以下完整學習筆記PDF,可以點贊+評論支持下打工人老弟,點擊這里免費自取!
- 架構師筑基必備技能
目前Android APP開發主流語言就是Java語言,Java語言最大的特性就是提高了軟體的互動可能性,可以說安卓手機幾乎所有應用程式都是利用Java語言來進行撰寫的,
知識要點:
1、深入理解Java泛型
2、注解深入淺出
3、并發編程
4、資料傳輸與序列化
5、Java虛擬機原理
6、高效IO
- 設計思想解讀開源框架
隨著互聯網企業的不斷發展,產品專案中的模塊越來越多,用戶體驗要求也越來越高,想實作小步快跑、快速迭代的目的越來越難,插件化技術應用而生,如果沒有插件化技術,美團、淘寶這些集成了大量“app”的應用,可能會有幾個g那么大,
所以,當今的Android移動開發,不會熱修復、插件化、組件化,80%以上的面試都過不了,
知識要點:
1、熱修復設計
2、插件化框架設計
3、組件化框架設計
4、圖片加載框架
5、網路訪問框架設計
6、RXJava回應式編程框架設計
- 360°全方位性能調優
在不同層次的開發工程師手里,因為技術水平的參差不齊,即使很多手機在跑分軟體性能非常高,打開應用依然存在卡頓現象,
另外,隨著產品內容迭代,功能越來越復雜,UI頁面也越來越豐富,也成為流暢運行的一種阻礙,綜上所述,對APP進行性能優化已成為開發者該有的一種綜合素質,也是開發者能夠完成高質量應用程式作品的保證,
1、設計思想與代碼質量優化
2、程式性能優化
- 啟動速度與執行效率優化
- 布局檢測與優化
- 記憶體優化
- 耗電優化
- 網路傳輸與資料儲存優化
- APK大小優化
3、開發效率優化
- 分布式版本控制系統Git
- 自動化構建系統Gradle
4、專案實戰
- 啟動速度
- 流暢度
- 抖音在APK包大小資源優化的實踐
- 優酷回應式布局技術全決議
- 網路優化
- 手機淘寶雙十一性能優化專案揭秘
- 高德APP全鏈路原始碼依賴分析
- 徹底干掉OOM的實戰經驗分享
- 微信Android終端記憶體優化實踐
- Android框架體系架構
Android框架體系架構(高級UI+FrameWork原始碼) 這塊知識是現今使用者最多的,我們稱之Android2013~2016年的技術,
Android開發者也往往因為網上Copy代碼習慣了而導致對這塊經常“使用”的代碼熟悉而又陌生:熟悉的是幾乎天天在和它們打交道, 天天在復制這些代碼 ;陌生的是雖然天天和這些代碼打交道,但是并沒有深入研究過這些代碼的原理,代碼深處的內涵,
本篇知識要點:
1、高級UI晉升
2、Android內核組件
3、大型專案必備IPC
4、資料持久與序列化
5、Framework內核決議
- NDK模塊開發(音視頻系列)
NDK(Native Development Kit縮寫)一種基于原生程式介面的軟體開發工具包,可以讓您在 Android 應用中利用 C 和 C++ 代碼的工具,通過此工具開發的程式直接在本地運行,而不是虛擬機,
在Android中,NDK是一系列工具的集合,主要用于擴展Android SDK,NDK提供了一系列的工具可以幫助開發者快速的開發C或C++的動態庫,并能自動將so和Java應用一起打包成apk,
本篇知識要點:
1、NDK開發之C/C++入門
2、JNI模塊開發
3、Linux編程
4、底層圖片處理
5、音視頻開發
6、機器學習
- Flutter學習進階
2019 年無疑是 Flutter 技術如火如荼發展的一年,
每一個移動開發者都在為 Flutter 帶來的“快速開發、富有表現力和靈活的 UI、原生性能”的特色和理念而癡狂,從超級 App 到獨立應用,從純 Flutter 到混合堆疊,開發者們在不同的場景下樂此不疲的探索和應用著 Flutter 技術,也在面臨著各種各樣不同的挑戰,
本篇知識要點:
1、Flutter跨平臺開發概述
2、Windows中Flutter開發環境搭建
3、撰寫你的第一個Flutter APP
4、Flutter Dart語言系統入門
…
- 微信小程式開發
微信小程式作為現在比較火的編程開發應用場景之一,深受市場的青睞,這讓不少開發者眼饞不已,但是對于初學者來說,就完全摸不著頭腦了,不知道微信小程式開發制作需要學習那些知識,有需要的朋友可以參考本篇,
本篇知識要點:
1、小程式概述及入門
2、小程式UI開發
3、API操作
4、購物商場專案實戰
- Android相關原始碼解讀
只要是程式員,不管是Java還是Android,如果不去閱讀原始碼,只看API檔案,那就只是停留于皮毛,這對我們知識體系的建立和完備以及實戰技術的提升都是不利的,
由于篇幅原因,如有需要以上完整學習筆記PDF,可以點贊+評論支持下打工人老弟,點擊這里免費自取!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/263042.html
標籤:其他









