前言
人生有好多事情,可以走捷徑或者可以找人替代,唯有求知、成長無捷徑及無法找人替代。
作爲一個3-5年的Android工程師,我們經常會遇到這些瓶頸:
1.技術視野窄:長期在小型軟件公司,外包公司工作,技術視野被限制的太厲害
2.薪資提升難:初中級Android崗位薪資上升空間有限,基本上你想拿15k以上,不會點源碼層的東西是根本拿不到的
3.學習資源少:入門之後想要提升很難,靠自己接觸的簡單業務項目,去反覆操練那些cv技術。博客和書本上的技術大多比較抽象並且零散,可以借鑑和指導,但是沒辦法複製成自己的
這個時候構建一個屬於自己的知識體系,能夠讓我們學到的知識體系化。讓自己清楚哪塊是自己的知識盲區,哪塊已經構建起根基;然後根據實際情況,有針對性的進行模塊學習,讓自己成爲一個合格的Android工程師。
什麼是“碎片化學習”
就像人們對於“學習”存在很多認識上的誤區一樣,對於什麼是“碎片化學習”,也沒有嚴謹、共識的定義。
根據我的觀察,一般人會認爲,“碎片化學習”是利用零散的“碎片化時間”獲取信息,進行“學習”;另外一些人則認爲,“碎片化學習”是將大的知識體系拆分爲小的、更易於理解和接受的“碎片化知識”(如“微課”),從而使人們學習起來更容易的一種學習模式或教學設計。
相對於前者,後者常見於少量專業人羣以及部分在線學習實踐者。
但是,從個人實踐的角度看,碎片化學習既包括利用碎片化時間獲取信息,也包括循序漸進地積累“小塊兒”的內容,進行知識建構。二者都是個人在信息時代學習的必備技能。
程序員碎片化學習的困境
5-15分鐘的碎片化學習,似乎是當下人的無奈之舉。整塊時間對於我們來說是個奢侈品,白天要上班、上學,晚上要加班或忙於各種社交、娛樂活動,睡前還要趴在牀上刷刷八卦、看看視頻或者勾搭一下男神女神,很快這一天就沒有了。
所以我們的學習時間基本就靠各種5-15分鐘的碎片時間。比如等地鐵、等上課、等開會的各種等待時間,或者坐車、走路、健身、喫飯、做家務等這些體力勞動但大腦空閒的時間。但是很顯然,這些學習場景嘈雜、混亂、不可控,我們很難保持專注。
而且在短時間內,我們很難快速進入最佳的學習狀態。你可以以回憶一下你的中學時代,剛上課的時候你的大腦是很難立即進入上課狀態的,所以會教課的老師,都要在課前慢慢引導學生們進入狀態。而碎片化學習,就是在大腦還沒有準備好的時候,就硬塞給它一堆難以消化的東西。
這個世界變化太快,未知的東西太多,所以我們程序員慢慢有了對抗落後的焦慮。在碎片化的時間裏瞭解到一個新語言、新框架,可以很大程度上緩解這種焦慮。於是人們就試圖將這種碎片化學習,當做繁忙生活中的重要學習方式。
可是這就像撓癢癢一樣,治表不治裏,我們的焦慮確實被滿足了,但除了知道點新的概念,多了點談資,生活卻似乎依然照舊。所以我們必須要明白,什麼叫有效學習。
普通人與優秀人的區別
經常和一些技術大咖打交道,我發現這些大神都有自己的知識體系,對於某一領域有着專業的研究;而普通的人只有一些碎片化的知識,無法將自己的知識系統的連接起來,這樣說可能有些難理解,這樣的知識體系,像我們樂高積木搭起來的建築物。
那麼,現在有一個問題:用我們下面圖片中的木質積木,可以搭建出上面的積木房子嗎?
我猜我們的答案是一樣的:不能。這也是爲什麼傳統的木質積木無法風靡的關鍵原因——很難搭建出有穩固的、有創造性的東西,不耐玩。
那爲什麼樂高積木就能夠搭建出種類繁多、形式各異的“建築物”呢?
請大家看一下樂高積木的積木塊:
發現它們和傳統積木塊的不同了嗎?
對,它們上面有很多凸起的圓點點!這些圓點點非常關鍵,它們可以嵌入其他積木塊預留的凹槽,把兩個積木塊連接起來。
也就是說,樂高積木塊上有連接點,所以可以彼此連接,拼搭出各種具有穩定結構的“建築物”!
把知識比作積木塊,如果知識上生出連接點,就也可以彼此連接,構建出適用於特定領域和特定問題的知識體系。
構建知識結構體系,破解碎片化學習困境
優秀的人都是不斷學習的人,但是學什麼、怎麼學呢,學什麼是方向的問題,怎麼學是學習方法方式的問題,兩者都非常重要,如果方向選擇不對,就會進入越努力越尷尬的地步;如果學習的方法方式不對,我們可能就會停留在某一高度,止步不前,我們應該聚焦某一領域,深度系統的思考,構建自己的知識體系,因爲我相信一句話,你所接受的一切信息,構成了你的思維方式。
就拿我們移動開發人員來說,從初級程序員進階到高級程序員,從初級架構師到資深架構師,應該如何構建自己的知識體系,成爲移動架構師需要掌握哪些技能?
2021最新Android高級知識體系
不少Android開發的小夥伴在工作幾年後,會覺得很迷惘,到底自己的開發能力處於什麼水平,該如何努力成爲對標大廠的高級開發,或者成爲架構師。這裏結合自身工作經驗及參照大廠招聘高級工程師的要求,整理了一份學習路線,路線的內容有中高級,也有難度大的,但是學會後終身受用,拿下大廠高級崗、甚至資深崗,或在小廠當Leader應該不在話下。
Java高級:
- 反射
- 註解
- 泛型
- 多線程:線程、線程池、Synchronized、volatile、ReentrantLock
- JVM:類加載、內存模型、垃圾回收機制、強弱虛引用
- 集合容器:Collection、Map
Android多線程:
- Handler:Handler、Looper、Message
- ThreadLocal
- AsyncTask
網絡:
- HTTP、HTTPS
- TCP UDP
- TCP/IP
- SOCKET
- 網絡請求過程:三次握手、四次揮手、證書、斷點續傳
視圖:
- Surface
- View:自定義View(measure、layout、draw)
- Window:PhoneWindow、DecorView、ViewRoot
- 事件分發機制:滑動衝突、dispatch
- 動畫:幀動畫、View動畫、屬性動畫
- ListView工作原理
- RecycleView工作原理、與ListView比較
- Webview:js通信,加載優化
圖片:
- BitMap:加載效率、緩存策略、內存計算
- Drawable
- 加載大圖
四大組件:
- Acitivity難點:四大launch模式、啓動流程、加載佈局流程
- Service難點:啓動方式、啓動流程、應用場景
- ContentProvider難點:生命週期、啓動流程、原理
- Broadcast難點:生命週期、註冊方式、啓動流程
性能優化:
- 啓動優化
- UI優化
- 內存優化
- 卡頓優化
- 網絡優化
- 數據庫優化
- 包體積優化
- ANR
三方庫:
- 圖片加載: Gride、Fresco、Picasso、Android-UIL
- 網絡通信:Retrofit、Okhttp、Volley
- 異步處理:RxJava、RxAndroid、RxBinding、EventBus
與時俱進:
- 跨平臺:Flutter、ReactNative、Weex
- 模塊化
- Hook技術
- 插件化:DroidPlugin、VirtualAPK 、Small、RePlugin
- 組件化:ARouter、CC
- 熱更新:Tinker、AndFix、Robust
- 動態化
Kotlin:
- 擴展函數
- 構造函數
- 協程
框架:
- Jetpack:ViewModel、LiveData、Lifecycles、Navigation、Room、Paging、WorkManager、DataBinding
- MVC
- MVP
- MVVM
- 設計模式:六大原則、常見設計模式
Android系統:
- 系統啓動流程
- 應用啓動流程
- 進程間通信:IPC機制、Binder原理、AIDL
- 構建:Grale、APT編譯註解處理器
- apk打包:打包流程、v1和v2簽名、分包multidex、加固
- Dalvik與ART
- SystemServer:ActivityMagangerService、PackageManagerService、WindowManagerService
- Dalvik與ART
- JNI:JNI基礎、NDK
音視頻:
- 音視頻基礎
- ffmpeg
- WebRTC
- OpenGL
- Vulkan
- OpenCV
結語
人生關鍵的路還是要靠自己走,求知這件事情,沒有什麼終端捷徑可走。只有自己深入思考,不斷總結反思,一步一步構建自己的知識體系,纔是最快的方法。
然而Android架構學習進階是一條漫長而艱苦的道路,不能靠一時激情,更不是熬幾天幾夜就能學好的,必須養成平時努力學習的習慣。所以:貴在堅持!
很多人在剛接觸這個行業的時候或者是在遇到瓶頸期的時候,總會遇到一些問題,比如學了一段時間感覺沒有方向感,不知道該從那裏入手去學習,對此我針對Android程序員,我這邊給大家整理了一套學習寶典!
- Android學習路線圖
首先,對於沒有學習方向,知識不體系的人,我把我工作幾年整理的學習路線分享給大家,做一個借鑑作用,還不知道怎麼學習的人可以直接照着我這個學習路線一個個的去學習,知識不體系的人可以參考下我整理路線的方式,總之希望能夠幫到你們!
- 模塊化學習資源
接下來是每個模塊我整理出來的文檔學習資料,幫助大家更細緻化的學習。
《Android彙總複習資料—Java》
《Android彙總複習資料—Android》
《Android彙總複習資料—Android擴展》
《Android彙總複習資料—Kotlin》
《Android彙總複習資料—Flutter》
《Android彙總複習資料—算法》
除了上面的學習路線,還可以額外的配合以下方式學習,效果翻倍~
①看視頻進行系統學習
前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰鬥機,也正因爲Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的。我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面。關於視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時。
另外,我自己也珍藏了好幾套視頻,有需要的我也可以分享給你。
②讀源碼,看實戰筆記,學習大神思路
“編程語言是程序員的表達的方式,而架構是程序員對世界的認知”。所以,程序員要想快速認知並學習架構,讀源碼是必不可少的。閱讀源碼,是解決問題 + 理解事物,更重要的:看到源碼背後的想法;程序員說:讀萬行源碼,行萬種實踐。
主要內含微信 MMKV 源碼、AsyncTask 源碼、Volley 源碼、Retrofit源碼、OkHttp 源碼等等。
③面試前夕,刷題衝刺
面試的前一週時間內,就可以開始刷題衝刺了。請記住,刷題的時候,技術的優先,算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎麼會問。
關於面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:
④2020大廠面試高頻知識點
- 圖片
- 網絡和安全機制
- 數據庫
- 插件化、模塊化、組件化、熱修復、增量更新、Gradle
- 架構設計和設計模式
- 性能優化
- Android Framework
- Android優秀三方庫源碼