2020 Android 進階之路,從風口看未來,以架構贏世界

像程序那樣思考 發佈 2020-01-13T14:12:04+00:00

筆者是從2013 年底開始從事移動開發,剛畢業那麼還是從事服務端開發,寫著.NET 技術棧代碼,至今也有接近 5 年的經驗了。

過去十年是移動網際網路蓬勃發展的黃金期,相信每個人也都享受到了移動網際網路紅利,在此期間,移動網際網路經歷了曙光期、成長期、成熟期、現在來說已經進入飽和期。依然記得在 2010-2013 年期間,從事移動開發工作不知有多火,有工作 1-2 年經驗的開發者薪資基本是上萬,對招的人專業素質要求也不高,入門即可。從 2016 年底至今來看,局面而是另外一番景象,移動開發市場過度飽和,市場上充斥著太多初級開發者,網上一直流傳著移動網際網路的寒冬,很多開發者找工作都沒以前好找,一些崗位常常面臨著百里挑一景象,沒有個三五年經驗,現在 HR 都是刷刷的翻過。

那麼不禁要反問一句,現在從事移動開發,無論是 Android 還是 IOS,未來還有發展空間嗎?還有隨著移動開發越來越向大前端靠攏,甚至原本一些屬於原生開發者的崗位也被前端開發人員勝任,想想在本來擁擠的房間裡,還要分割本來屬於自己那麼點空間給他人用,變得更擁擠了,那滋味肯定是不好受了,那麼未來我們的容身之地又在哪裡呢?

筆者是從 2013 年底開始從事移動開發,剛畢業那麼還是從事服務端開發,寫著.NET 技術棧代碼,至今也有接近 5 年的經驗了。我想說,如果僅僅停留在表面的框架上,僅僅停留在使用別人的輪子上,而對於裡面實現機制和原理不求甚解的話,那是很容易被淘汰的。但是如果,在移動開發上有一門深度的技能,比如在 Android 中你對移動架構有一定獨特的見解,在性能優化上有一定的造詣,對於Android 系統體系有著清晰的認知,並且在一個行業積累了豐富的行業經驗,也是亮點所在,那基本就是屬於吃香的類型了。所以簡單來說,對於一個概念不能停留在使用層面,要深入研究裡面構造如何,為何會有這麼一個概念,如果沒有這個概念,那又會是呈現什麼樣的局面呢?開發編程也是一樣,要追尋的是編程的道,而不是編程的術,別看現在各種流行框架大行其道,要是深入研究下去,一層一層撥開,你也會驚訝裡面的實現機制無外乎就那麼幾種,套來套去,只不過一些開源庫作者或組織封裝的好而已。

基於目前市場表現,我們都知道下一個風口是 AI,但是作為一個移動開發者如何在即將來臨的 AI 時代吃口紅利呢。我的回答是:致力於做一個終身學習者,追本溯源去探尋代碼世界哪些不變的道,你又會說了,哪些是道呢,簡單舉例下,比如編程思想、常用的設計模式、設計原則、算法和數據結構、網絡通信機制、作業系統、重構原則、架構思維等等。同時在目前發展情形下,也越來越趨向全棧工程師的路線,借用之前在網上看到一篇文章的圖,想進階全棧工程師之路看需要哪些技能,如下:

從圖中可以看到技能被分成基礎軟技能、技術軟硬技能,不僅要熟悉移動端開發套路,還要對大前端技術棧也有一定要掌握,同時對於服務端開發流程也要了解,我們很多從事移動開發人員,基本一開始就是從移動端入手,對於服務端開發很多時候是沒有概念,這些跟那種從服務端開發轉型做移動開發相比起來就處於一定的劣勢了,有些甚至不知道 Restful 是什麼,還以為是一種框架呢,其實這僅僅只是服務端約定好的接口編碼風格而已。

進階之路

為何會想起寫這麼一篇文章呢,一方面這幾天工作需要,組內正好想規劃 2020 年 Android 技術路線,簡單來說就是目前我們組處在什麼樣的水平程度,目前所做項目用的技術處在什麼階段,在未來一年內,項目技術疊代該如何走,走到什麼程度。另一方面是從事 Android 開發這幾年,一直也沒好好規劃自己的技術路線,想認真整理下未來進階之路。我們都知道 Android 技術體系一直很龐大,剛開始學的時候基本是從一個點一個點開始,沒有系統全局觀概念,同時也是學不過來,從做上層應用開始,到做 Framework 層,然後再到系統層做驅動開發各個層面的開發者都有,絕大部分開發者都是從應用層開發,往往做到 Framework 層就淺嘗輒止了,一直以來,做Android 開發有這麼兩個說法,如果是做應用開發,往應用架構方向發展比較合適,如果是做系統層開發,往往底層驅動比較合適。

看張圖:

挑些圖中幾個點簡單來談談自己的一些想法。

移動架構

移動架構是 2017 移動技術年度TOP5話題之一,從中就體會到架構是有多火,記得剛開始學 Android 時候,哪有現在那麼框架,那時候談架構的更多是在服務端開發,比如多層架構,有展示層、業務邏輯層、數據訪問層這就是最簡單的三層模式,Android系統則是基於事件驅動響應機制設計的單頁面架構,其實跟瀏覽器中的窗口頁面是一樣的, 系統中一直有個消息輪詢監聽機制,哪個事件被觸發了,相應的響應代碼進行處理,這些處理操作是被提前註冊到系統中。

最早開始的開發模式基本是基於Android 系統自帶 MVC 模式,Activity 基本類似於Control 的作用了,View 和Mode 互相耦合,後來才演化出現在主流的 MVP、MVVM 模式,順便提一句,MVVM 模式其實是在微軟 WPF 技術體系中提出來。

圖中顯示兩個方面:

展示層: MVC、MVP、MVVM、Clean、Flux、Android Architecture Components

架構層:模塊化->組件化->插件化->沙盒/雙開技術,比如可以雙開微信,類似Docker, 每個頁面都是插件,類似Vue.js中每個頁面都是組件。

性能優化

簡單來說,一個APP 是需要從三個方面被關注的,業務功能、符合邏輯的交互、性能響應。如果我們在使用一個 APP 時候,經常滑動時經常卡頓、時不時崩潰、有些功能設計簡直非常規,比如在 Web 網站有樹層級等麵包屑點擊,你非要在手機也搞一個類似樹級點擊加載,那是不是有點強人所難了,我上拉下拉、左滑右滑不行嗎,非要通過點擊才行嗎?那麼性能優化核心是什麼呢?追求快、穩、省、小,關注卡頓、內存泄漏和崩潰、代碼質量和邏輯、安裝包大小四個方面。想進一步的了解的話,可以查閱下這篇文章《Android APP 性能優化的一些思考》

APP安全

APP從代碼安全、到傳輸安全,再到存儲安全。代碼可以通過混淆、加固來保證、傳輸安全基本基於加密算法和Token來保證傳輸的唯一性、存儲應用不可逆加密算法進行設置、所以掌握一些密碼學理論尤為重要,起碼要知道哈希散列算法,對稱加密和非對稱加密等一些常見的加密算法。

基礎進階

我們平常在工作中碰到的View滑動衝突問題、其實通過掌握View工作機制和Android觸摸事件體系就能輕易解決掉,常見解決方式有外部攔截法和內部攔截法,基於橫坐標滑動距離與縱坐標滑動距離相減得出的值,判斷出是左右滑動還是上下滑動。還有對於需要開發絢麗的動畫效果,那麼對於視圖動畫和屬性動畫一些特性必須有一定的了解。JNI 和 NDK 開發也是比較常見,特別對於一些做 SDK 項目為主的,這一塊開發流程也是需要掌握,Android 中的四大組件工作機制其實底層應用的是Binder機制,我們不妨從 AIDL 這個接口來了解 Binder。

持續集成

持續集成編譯環境是敏捷開發中很重要的一個組成部分,它能夠有效地提高整個團隊的生產效率,最大化的減少人為的出錯的可能。比如,通過代碼的持續提交,可以減少代碼合併的痛苦,更快地與其他人代碼集成,通過集成編譯,能夠及早地發現代碼庫存在的錯誤,並支持產品、測試等人員及時取包進行功能驗證,所以對於Git、Gradle工具、Jenkins伺服器需要掌握起來。

開發語言

19年可以說是 Kotlin 年,在 Google IO 之後 Kotlin 著實風光了一把,開發者對於效率的追求是 Kotlin 如此受歡迎的最大原因,而它的勢頭也很不錯,跨平台的野心讓更多人有了使用它的理由,如今看起來,它甚至比 Swift 更有前途。既然 Kotlin 已然成為 Android 世界的頭等公民,與 Java 完全兼容,我們有什麼理由不去擁抱它呢。

大前端

其實移動端開發也是屬於前端開發,只不過原來我們所指的前端往往都是Web的前端開發人員,開發的是網站,而移動端何嘗不是一種展示載體,同樣有入口,只不過相比網站端移動端具體天然的可移動性、可便捷性等特性。隨著 H5 興起,原生能實現的功能同樣在 H5 端也能實現,並且在體驗性方面也逐漸提高,並且H5天生就具有動態性和跨平台,這也是 H5 能夠一時潮流的原因之一。

設計原則

這些設計原創才是本質,才是不變的,才是我們需要真正要掌握的,開發語言特性、開發框架發展實在是太快了,我們更不上,不是有這麼一句話嗎,封裝具體變化的,抽象起來就行,去追尋哪些不變的內容。掌握一種設計模式其實也就掌握一種解決方案,這些都是前人總結的知識結晶,基本都是基於特定領域解決特定的問題,我們需要學會在前人肩膀上解決問題。

服務端開發

最近微服務火的一塌糊塗,雖然我們基本是做移動端開發,但是基於全棧發展的趨勢,對於服務端開發勢必要了解,可能沒有實戰項目讓你真刀真槍的干,但是對於微服務的結構理論、服務與服務之間通信、聚合是什麼樣的流程也是需要有所耳聞,在自己擅長領域深入專研的同時橫向擴展關注也是需要的,不能關起門來閉門造車,兩耳不聞窗外事那是不行的。

閱讀源碼

對於Android源碼和第三方庫源碼閱讀,可以根據自己感興趣的類型,選擇相應的源碼庫或模塊,給自己約定一個時間點,看完之後最後有個流程圖,哪些是核心類,類與類之間都有什麼關係,這些開原始碼實現的機制是什麼,用到哪些解決思想,這些要點最終可以通過文章輸出,我覺得輸出倒逼輸入是一種很不錯的學習方式。

移動AI

AI,也稱人工智慧,1956年,在達特茅斯學院舉行的一次會議上正式確立了人工智慧的研究領域。會議的參加者在接下來的數十年間是AI研究的領軍人物,他們中有許多人預言,經過一代人的努力,與人類具有同等智能水平的機器將會出現。現在來看AI這個概念很早就存在了,之前沒發展很大原因是基礎設施不夠完善、研究成本高,現在能夠大力發展是基於我們的網絡帶寬變大、計算機性能提升、計算成本降低等等因素備齊了。AI是需要通過算法來落地,那麼對於算法理論背景就是數學,所以想進階AI開發,就需要去學習相關數學知識,特別是線性代數和機率論這兩門,是支撐很多算法的理論知識。

小結

總的來說,技術發展能推動社會的進步,解放生產力,進而提高人的社會生產效率,創造價值。技術落地是需要商業應用場景配合,如何配合呢,就是通過每個不同商業模式來實現。最終一門技術是需要與具體使用業務緊密結合起來,如果脫離技術談業務顯得空洞,脫離業務談技術顯得偏理論,最好是兩者相結合。這也就要求我們這些從事軟體開發人員在追求技術積累的同時要注重業務積累,讓業務驅動技術發展,用技術手段來解決實際業務問題,在技術積累中,辨別哪些是不變的道,哪些又是一時流行的而已,這就需要練就一雙火眼金睛了。


在這也分享一份大佬自己收錄整理的Android學習PDF+架構視頻+面試文檔+源碼筆記,還有高級架構技術進階腦圖、Android開發面試專題資料,高級進階架構資料幫助大家學習提升進階,也節省大家在網上搜索資料的時間來學習,也可以分享給身邊好友一起學習

如果你有需要的話,可以點讚+評論+轉發關注我,然後私信我【進階】我發給你

關鍵字: