Android 開發者成神之路!

2021-02-13 CSDN

一個 Android 技術專家,至少有 2~3 個專業領域。

作者 | Vasiliy Zukanov,已獲翻譯授權

許多 Android 開發者經常會問我,要學會哪些東西才能成為一個優秀的 Android 工程師?對於這個問題,他們的描述或多或少都有些差異,但是,總體來說,我們都需要學習一系列的技能,才能成為一個優秀的 Android 工程師。

在我看來,存在這樣的困惑是正常的。Android 是一個巨大並且動態的生態系統,你可能需要花好幾周時間去了解並學習它相關的一些工具和概念,但是最後你會發現,它們有好多都不是很重要,或者說並不是非常有用。因此,在本文中,我將分享我在 Android 開發中所使用到的重要技能,希望能夠幫到你,讓你把你的精力集中到重要的事情上。

當然,如果你是一個經驗豐富的 Android 開發者,這些知識可能你都知道。有很多技能和觀點都需要很多基礎知識的沉澱,當你沒有足夠的經驗的時候,很難看到這些技能點。文中,我不可能列出所有 Android 開發者都需要的技能。所以,我根據不同的經驗,將這些知識點進行了粗略分組。請注意,這只是一個粗略的分組,並不一定是很精確的。

寫在前面

如果你只是一個想成為 Android 開發者的人,並且還沒有寫過任何應用,那麼這篇文章對你來說,還有點太早。本文主要是為了幫助開發者成為一個更專業的人。

本文,我會給你很多建議,不會讓你空手而歸。文章中列出了如何在短時間成為一個專業的開發者。讀完文章,需要你自己去練習,並時常回來看看這些技能。

在本文開始之前,我就當你已經在 Google Play 發布過 Android 應用並且使用 GitHub 來進行源碼管理。

0-2 年開發經驗

Android 是一個非常複雜的框架,它擁有陡峭的學習曲線。有一些複雜的概念的確是 Native 的 Android 開發者需要學習的,但另一部分卻是由於 Android 的原因,造成了它的複雜度。

當你向專業進軍時,除了你的軟體開發工作以外,你應該學習 Android 框架,忘記語言、架構、流行的開源庫,專注於核心概念,並進行深入的研究。

具體來說,我建議你更多的了解以下內容:

當面臨「Low Memory Killer」的時候,如何保證你的應用程式穩定可靠的運行?這是一件很複雜的事情。長話短說,當用戶切換到其它應用時,你應用的生命周期就會被打亂,但是當用戶過一會兒重新切換回來的時候,用戶卻希望你的應用程式像任何事情都沒有發生過一樣,正常運行。

在本文中,我並不會介紹內存管理的任何細節,如果你想了解它們,可以看看這篇文章。

如果有人要我說出 Android 應用程式中的複雜度和 Bug 的主要來源,我會立馬大聲告訴他是「生命周期」(然後捂住臉哭)。

Application、Activity、Fragment、Service、BroadcastReceiver、ContentProvider 和一些 Android 框架的核心組件,都擁有複雜的生命周期,並且它們的生命周期還不一樣。如果你覺得這還不夠多,Google 也一直在推出新的庫和框架,這些庫都有自己的複雜性和獨立的生命周期。Loader, ViewModel 和 LiveData 都是為了解決這些問題而推出的。

有件有意思的事情,我從來沒有看到過任何有關「生命周期「的定義。我們一直在使用它,但是它到底是什麼意思呢?據我所知,在某種程度上,你只是把一些節點串聯在一起,構建出一個生命周期的圖。我對生命周期有過很多的思考,在這裡,我將嘗試對它進行定義。

組件的生命周期是一個抽象的狀態機。這裡的抽象的意思是指,這些狀態機的狀態是預先定義好的,它們之間的轉換條件也是定義好的。但是這些定義是不完整的。你需要去實現缺少的部分,使他們可以正常工作。這些缺少的部分是這些組件方法的子集,我們稱其為「生命周期回調」,除了狀態機本身之外,這些生命周期回調中,也有很多隱式的限制和約束。這些限制有些寫在了文檔中,而有些卻並沒有記錄。

生命周期到底有多複雜?我們先來看一下這張圖 (它有點不完整,還有點過時)。這張圖,看起來有點可怕。不過,你也不要慌,大多數 Andorid 開發者都搞不明白這個圖。事實上,即使 Google 的 Android 開發者也搞不明白生命周期的問題。Google 在發布 Lifecycle 組件的時候,裡面引入了一些有關 Fragment 的 bug, 直到後續的新版本發布了才得以修復。

雖然現在你不需要完全掌握 Android 的生命周期,但是你必須要知道一些重要的細節。否則,你的代碼會變得混亂不堪,並且容易出現一系列難以解決的問題。我寫了兩篇文章 Activity 生命周期與 Fragment 生命周期 ,描述了生命周期的細節。當你不知道如何使用 onStart 和 onResume 時,你可以去看看這兩篇文章。

當你掌握了生命周期的基礎知識,你可以去看看 Gabor Varadi 寫的 Android 開發的十宗罪 ,這篇文章,列舉出了大多數開發者都會犯的錯誤。這些錯誤大多數都與生命周期有關。

順便說一下,在面試中,生命周期相關的問題也會被經常問到。這也是你必須好好學習生命周期的原因。

在每一個 Android 應用程式中,都有一個或多個上下文對象。

和生命周期一樣,它也很難被解釋。它就像是一個「上帝類「一樣,它有非常多的能力。我們很難用一兩句話就把它描述清楚。儘管如此,理解 Context 職責和不同 Context 之前的區別也是非常重要的。

本文中,沒有更多關於 Context 的內容,我建議你去讀一下 StackOverflow 中關於 《What is 'Context' on Android?》 的回答和這個回答的內容.

每一個 Android 應用程式都有一個特殊的線程 —— UI 線程。這一個線程在屏幕上繪製出 UI 頁面。如果你讓 UI 線程超負荷運行,你的應用程式將會變得卡頓,不響應。在極端情況下,UI 線程中的錯誤會導致整個應用程式出錯(至少看起來像是出錯了)。

如果你想詳細了解線程背後的機制原理,你可以去看這個視頻,視頻中詳細解釋了 Android 中的多線程,包含 UI 線程的相關細節和可能存在的問題。

從整體上說,Android 框架的代碼很不「整潔」。它包含著很多的上帝類,這些類中,每一個有數千行代碼,並且我們還必須去擴展這些類,才能讓我們的應用程式運行起來。在多數情況下,不管是 Application, Activity ,Fragments 還是 Service,我們都是在一個很大的類中,做很多的事情。

雖然在 Andorid 開發中,這是一個常見的做法,但這樣子做並不利於長期維護我們的代碼邏輯。因此我建議,要儘可能的注意這個問題,多找機會去重構代碼,將邏輯拆分到獨立的類中去。

說實話,我現在並不認為,一個初級開發者可以對架構和設計做出太多的改善工作。正確的封裝代碼邏輯,提取出有意義的類,都需要一些開發經驗。當然,我也不希望你不去思考代碼拆分,你可以做一些力所能及的事情,避免出現不可控的情況(例如,一個 Activity 中寫了超過 5000 行代碼)。

剛開始,你可以嘗試拆分這篇文章中描述的與 Context 有關的邏輯。

2-4 年開發經驗

當你在你的職業生涯中工作幾年,你變成經驗豐富的 Android 開發者,通過研究和學習,你可以很輕鬆的實現一些非專業化的功能。那下一步,你該做什麼?

我認為,在這個時候,你已經很熟悉 Android 框架的基礎知識了,可以嘗試去學習更高層次的技能。這些技能不局限於 Android,它們是一些通用的軟體開發的技能。具體來說,你可以研究以下主題:

依賴注入是一個關注結構分離的設計模式。它主要是用來進行分離應用程式的兩個功能:應用程式和核心功能、核心功能組件實現之間的連結。

從某些方面來說,實現了依賴注入的代碼庫就好你一個計算機:依賴注入的基礎庫就像是主板一樣,而其他的功能組件就好像是 CPU、內存、外設等。只要你的代碼中實現了依賴注入,你就可以很方便的插入新功能,並且可以很容易的重用其它組件的功能,也可以很方便的使用新組件的功能。雖然這個比喻有點誇張,但是在我看來,它也確實很好的反映了依賴注入背後的思想。

不幸的是,現在關於依賴注入的文章,很多都存在誤解,這給初學者帶來很多幹擾。因此,如果你想學習依賴注入,我建議你讀一下這篇文章,本文中,我分析了眾多依賴注入的「神話「。

由於 Android 框架本身的架構,造成了我們在開發的過程中,使用戶頁面與應用程式中的其它邏輯耦合在一起。幾乎所有的 Android 初學者都會這樣。這種耦合會導致我們寫一個很大的類,這個類裡面有應用程式的 UI 繪製、網絡處理、多線程處理、應用業務邏輯等。

根據我的經驗,UI 邏輯與其它邏輯耦合在一起,會導致代碼的可維護性越來越差,遲早會使用代碼變得難以理解,無法閱讀。到最後,可能會因為功能上的一點小變化,引起很大的副作用。

要將 UI 邏輯與其它邏輯進行分離,可以用使用 Model- View - X 的架構模式。例如: Model-View-Contoller(MVC)、Model-View-Presenter(MVP)、Model-View=ViewModel(MVVM)。這些架構模式都屬於同一類架構,當然,這一類架構不僅僅包含列舉的這幾個,還有其它的架構模式。在這裡,為了更方便的描述這一類架構模式,我把他們統稱為 MVx 模式。

當你在學習 MVx 模式的時候,請記住,這些都不是架構,而是一種架構模式。這些架構模式僅用於 UI 展示邏輯。因此僅僅使用 MVx 並不能給你一個好的架構,要有一個好的架構,你還需要在其它方面做出更多的努力才能實現。

有經驗的 Android 開發者都會了解多線程,並且了解他們對應用程式的影響。你也許會說,我精通 AsyncTask、RxJava、協程等。我想表達的多線程不是你理解的這個。會使用多線程框架並不等同於理解多線程。

舉個例子,眾多 Android 開發者都認為,使用 AsyncTask 會導致內存洩漏。這個觀點來自 Android Studio 默認的多線程 lint 規則中。既然如此,那這個觀點就是對的了嗎?很不幸,這個觀點是錯誤的。在這裡,我不講解它們的細節,你可以讀一下這篇文章,裡面有很多關於 AsyncTask 的內容。

我認為要理解多線程程,就必須可以使用任何多線程框架,甚至是基於基礎的 Thread ,都可以寫出正確的並發代碼。要實現這個目標,你不僅僅需要知道你喜歡的多線程庫的 API,你還需要理解多線程的細節。這些多線程庫雖然好用,但如果你不理解多線程的基礎細節,那麼你的應用程式出現多線程的問題只是時間問題。

如果你想學習多線程,從這個視頻 開始,視頻中講解了所有 Android 開發人員都需要知道的基本概念與原理。

據我所知,很多 Android 項目,都沒有使用任何的自動化測試。在使用自動化測試的項目中,大多數也是 QA 人員使用 Appium 之類的工具來完成的。這是整個 Android 行業的現狀,非常可悲。之所以沒有自動化測試,這個問題可以追溯到 Android 起源,Google 也在很長一段時間裡,沒有關注過第三方應用的自動化測試。

現如今,有單元測試和 UI 自動化測試經驗的開發者需求量很大。即使你到一家沒有使用過任何自動化測試的公司去面試,如果你說你會自動化測試,就會給你的面試加分。反之,如果你去的是一個廣泛使用自動化測試的公司,你沒有自動化測試的技能,這會給你面試減分,處於劣勢。

因此,我建議每一個 Android 開發者都去學習一下自動化測試的相關知識。就個人而言,我更喜歡單元測試。而一些開發者喜歡 UI 自動化測試。所以,可以選擇一個你更感興趣的技術,嘗試一下。

4 年以上經驗

如果你對 Android 已經有了非常豐富的開發經驗,那麼,是時候學習一些「元」技能了,並且在特定領域進行深度研究。在我看來,以下技能對專業的開發人員來說,都是非常不錯的方向。

如果你還沒有做過這件事情,那麼現在是時候開始做了。每一個重要的技術決定,都需要進行評估、權衡。有時候,這種決定帶來的結果非常好,立竿見影。但是大多數時候,並非總是能夠立竿見影,看到效果。通常情況下,需要決策的範圍越大,所涉及到的評估範圍就越大,除了可以簡單進行決策的事情,還有很多可評估項都是非常抽象,短時間內根本看不到結果的。

在自己豐富的經驗水平下,面對眾多選擇,你至少應該知道如何找到取捨。如果你能對技術方案評估提供有用的建議,你就非常優秀了。技術方案評估權衡這是一項非常複雜的技能。通常,在與其它開發者、項目經理甚至是其它部門員工討論的時候,你能找到折中方案,就能進行方案評估。因此,在大數情況下,你只需要掌握評估方案的能力就夠了。

那我們所說的「技術方案的評估」到底是什麼意思?說實話,很難具體說明它是什麼。不過,我們可以提供一些反例,來解釋為什麼不適合在開發中使用。舉個例子:

我們應該將多線程的使用遷移到 RxJava, 而不是 AsyncTask, 因為 AsyncTask 會導致內存洩漏。

正如我前面所說,AsyncTask 並不會導致內存洩漏。所以上面這句話是錯誤的。說這句話的開發者並沒有深入的研究多線程。此外,他也沒有提到 RxJava 的問題。對於一個項目中的開發人員來說,RxJava 存在一個很陡峭的學習曲線。

我們應該為我們的新代碼寫單元測試,並且設定一個長期的目標,覆蓋所有的代碼,以確保我們的代碼質量。

這句話包含幾個前提,首先,我們現在開始單元測試是不可能的,至少需要開發人員投入時間來學習這種技術。編寫單元測試是一個很明智的決定。我們不能為所有代碼編寫單元測試,因為有一些部分是不穩定的。最後,達到特定的覆蓋目標並不會自動提高「質量「。在這個例子中,開發者並不了解單元測試,他們無法確定在項目中使用單元測試所涉及的問題和影響。

我希望,你對「技術方案評估」已經有了大致的想法,如果你有一個重要的決定,你需要完成所有必要的調研,如果你依然看不到整個評估中存在的複雜網絡,那可能是你的調研沒有做好。在做決定的時候,有些事情可能超出技術範圍,你也需要考慮你的決策對其它部門同事的影響。

如何區分一個技術專家和一個普通開發者?是我們熟悉的概念的數量嗎?我認為,在技術方面,區分是否是專家主要在於知識上的深度。

作為一個技術專家,你應該有一個或者多個專業領域。你知道這些領域的詳細細節,比一般的開發者知道的要多得多。你需要持續深入的研究,來保證你的專業深度,了解專業領域的最新發展,不會對新的工具和技術感到驚訝。此外,即使你並沒有在任何項目中使用某些技術,你也需要研究這些技術使用上相關聯的各種成本。

現如今,有一個自己的專業領域很難。這不是從博客中挑選幾篇好文章進行閱讀就可以的,也不是讀完幾本好書、上完幾門好課就可以的。當然,通過這些內容進行學習,對你的專家之路都是有幫助的,但是要有自己的專業領域,唯一的方法就是積極參與其中進行學習研究並獲得大量經驗。

我很喜歡物理學家尼爾斯·玻爾說的這句話:

An expert is a man who has made all the mistakes which can be made, in a narrow field.(專家就是把領域內所有該犯的錯都犯完的人。)

我們可以在哪些領域進行深入研究呢?實際上,幾乎所有的都可以進行深入的研究,在軟體開發領域,沒有任何一個領域會因為太小而不能設置成專業目標。對此,我也有一些建議:

UI

構建系統

離線工作

並發

NDK

持續集成

性能

架構

監測

項目管理

專業知識領域

還有很多很多。需要注意的是,上面我列出來的內容,一些並不屬於嚴格的技術領域。只要你能為你的僱主產生價值,你可以選擇你喜歡的任何領域並進行深入研究。

我認為,一個 Android 技術專家,至少有 2~3 個專業領域,例如,我的專業領域是:架構、單元測試、並發、依賴注入。我相信,在不久的將來,我能夠將「重構祖傳代碼」添加我的專業技能列表裡面。

所以,如果你有 4 年以上的經驗,你的專業領域是什麼?

總結

以上,這是我建議你,作為一個專業的 Android 開發者應該具備的技能。

你可能已經發現,我的文章標題是 《Android Developer Skills for 2020(2020 年,Android 開發者需要的技能)》,但是這篇文章中沒有什麼內容是特定於 2020 年的。我可以在一兩年前寫這篇文章,因為本文內容適合所有時間,基礎和重要的概念不會經常改變。

現在,如果你對 Android 生態系統的最新發展感到好奇,你可以閱讀我的另一篇文章 ,我總結了 2019 年底 Android 發展的狀況。最後,我再重複一次,如果你想成為一個優秀的 Android 開發人員,請集中精力,對基礎和重要的事情做深度研究。

一如既往,感謝你的閱讀。你可以在下面留言評論和提問。

英文:Android Developer Skills for 2020

連結:https://www.techyourchance.com/android-developer-skills/

作者:Vasiliy Zukanov,獨立 Android 開發及軟體顧問

譯者:羅昭成,Android 開發者

【END】

熱 文 推 薦 

☞疫情嚴重,潛伏期也有傳染性?科技公司在行動

☞程式設計師談從科比的曼巴精神中,我們能學到什麼?

相關焦點

  • 一個 2 年 Android 開發者的 18 條忠告
    一年半之後,我有機會和一個真正有才而且經驗豐富的安卓開發者一起工作,他指導我,教我正確的做事方式。這期間我學到了很多東西,學會了該做什麼不該做什麼。我直接或者間接幫助其它開發者也有很長一段時間了。這裡是我的StackOverflow(注1)和Github(注2)的簡介。本文我將分享這幾年所收集的精華。
  • Android年度總結 | 安卓巴士:砥礪前行 一心一意為開發者服務
    八場活動,25位志願者,26位重量級嘉賓,14位合作夥伴,超過800位開發者來到現場互相學習交流,新的一年我們將繼續全速前進,實現突破,敬請期待。可登錄安卓巴士官網查看往期活動。2018年的Google I/O開發者大會將於5月8日至10日在美國加州山景城海岸線圓形劇場(ShorelineAmphitheatre)舉辦。讓我們靜候Android 9.0的到來!
  • 每個Android開發者必須知道的資源集錦
    來自:碼農網譯文連結:http://www.codeceo.com/article/android-resources-programmer-know.html
  • 給 Android 開發者的 Gradle 入門指南
    #掃描二維碼報名源創會#原文:Beginner’s Guide to Gradle for Android Developers連結:https://journals.apptivitylab.com/beginners-guide-to-gradle-for-android-developers
  • 阿里總結的Java成神之路 PDF 火了,完整版開放下載!
    《Java工程師成神之路(基礎篇)》介紹了普通Java工程師必須要學習的相關知識點,涵蓋基本數據類型、關鍵字、異常、I/O流、集合、反射、泛型和枚舉.另外,內附成神導圖哦~本書由阿里阿巴巴技術專家總結,並由阿里雲開發者社區整理推出。
  • 谷歌正在努力使第三方Android開發者能夠為Wear OS應用創建自己的...
    據外媒 9To5Google 報導,谷歌正在努力使第三方 Android 開發者能夠為 Wear OS 應用創建自己的自定義 Tile。IT之家了解到,一年以前,谷歌對 Wear OS 進行了一項重大更改,谷歌智能手錶獲得了 Tiles 功能,用戶可將喜歡的應用程式以類似小部件的形式添加到錶盤中。
  • 提高工作效率的Android Studio奇技
    通過右鍵斷點,可以對一個斷點加入條件。只有當滿足條件時,才會進入到斷點中。調試神技,只對自己關心的情況進行調試,不浪費時間。在vim中叫作塊編輯,同樣神技!使用方法:按住Alt加滑鼠左鍵拉框即可。看圖!
  • Android 學習資料收集
    這本書非常有利於 Android 開發者進階.在使用開源庫的同時也可以知道其中原理, 大家可以去關注一下胡凱目前就職於騰訊上海從事Android開發的工作, 發起 Google Android 官方培訓課程中文版翻譯, 這課程是學習Android應用開發的絕佳資料stormzhang博主是上海薄荷科技開發主管, 他的博客分享了他從編程白痴到自學Android一路走過的經驗, 寫了一篇 Android學習之路
  • Android Jetpack CameraX 庫 Beta 版正式發布!
    CameraX的Beta版本正式發布,我們向為此作出貢獻的全體開發者社區成員致謝,這是我們共同努力的結果。這次的版本將為開發者呈現一個基礎的相機API,未來會一如既往地提供與兼容性有關或其他bug的修復程序和解決方法,助力您在多臺設備上打造一致的開發者體驗。
  • Android 4.0新增Space及GridLayout初談
    【IT168技術】Android 4.0的SDK已經發布,在眾多的新增特性中,其中對開發者來說比較重要的特性之一,是新增的兩種界面布局方式:Space和Gridlayout,它們跟以往Android版本的sdk有什麼不同之處?它們能給Android的布局設計帶來什麼好處?
  • Android N功能:自定義快捷圖標/應用更簡潔
    Android N功能:自定義快捷圖標/應用更簡潔  據外媒androidheadlines報導稱,谷歌將為Android 7.0正式版增加一個新特性,即允許用戶自定義快速設置中心  外媒稱,此次自定義快速設置欄並不是普通意義上的自定義,而是向三方開發者開放了更多的通知欄快捷圖標權限,這意味著任何開發者都可以在快速設置中開發一些小功能,並向裡面增加新項目,甚至可以無縫集成。
  • 新課程上線 | 學習使用 Kotlin 進行 Android 開發的最佳時機!
    此後,Android 平臺發生重大變化,我們不僅發布了四個重要的 Android 版本,新增了對 Kotlin 程式語言的支持,還推出了 Jetpack,這一整套庫可幫助開發者用更少的代碼更輕鬆地編寫優質應用。有了這些最新更新,是時候為初學者發布下一代培訓內容了。
  • Python Appium開啟Android測試之路
    uiautomatorviewer是android-sdk自帶的一個元素定位工具,非常簡單好用,使用uiautomatorviewer,你可以檢查一個應用的UI來查看應用的布局和組件以及相關的屬性。  啟動uiautomatorviewer.bat  打開目錄D:\SProgram\Sdk\tools
  • 最火的Android開源項目(一)
    為此,CSDN特整理了在GitHub平臺上最受歡迎的Android及iOS開源項目,以饗開發者。下面,就讓我們一起來看看,在GitHub平臺上,究竟有哪些Android開源項目最火,也最受開發者歡迎。1.
  • Android搭建屬於自己的技術堆棧和App架構
    activeandroid:40KBgreendao:100KBormlite-android:57KBrealm-android:4.2M可以看出,前三個還是正常範圍,但Realm的大小一般項目可能無法接受。
  • 官方宣布:谷歌開發者中國網站正式發布!
    雖然搜索業務何時入華依然「沒有計劃」,但谷歌還是為中國的開發者們帶來了好消息。正於北京舉辦的谷歌開發者大會上,谷歌宣布,Google Developers中國網站 (developers.google.cn) 正式發布!
  • Android開發必備的「80」個開源庫
    Android Developerhttps://developer.android.google.cn/Android Training 中文版http://hukai.me/android-training-course-in-chinese/index.htmlMaterial Design 中文版http
  • 為什麼開發者熱衷在Stack Overflow上查閱API文檔?
    Android開發者也是如此,他們更多是到 Stack Overflow討論API相關問題,而不是訪問 developer.android.com開發者官方網站閱讀官方文檔。開發者開始間接地記錄API,這一過程我們稱之為「群眾文檔」(crowd documentation),他們在博客中推API的相關文章以及提出有關API的問答機制。
  • Android Oreo 自適應圖標 | 中文教學視頻
    自適應圖標的出現,可以說是解了很多開發者們的燃眉之急 —— 使得開發者們能夠在利用圖標展現有趣的視覺效果的同時,也兼顧到了更為一致的用戶體驗,尤其是在不同的設備上。 說到 「有趣」 ,Android Oreo 的自適應圖標因為前景和背景分離,往往可以實現很多有趣的動效,我們相信這也會給設計師們帶來更大的發揮空間。
  • Android權限機制與適配經驗
    好歹,Google還算比較明智,並不是所有的權限都需要運行時申請才能使用。Google對每個權限的隱私危害性進行了評估。將權限分為了兩大類:普通權限和危險權限。舉個例子,控制手機震動的權限對於用戶並沒有什麼危害,只要開發者聲明了這個權限,安裝後就可以一直被授權,也不能被回收,但是,像讀取sd卡數據這類權限,很顯然就是危險權限了,APP必須向用戶申請這個權限。Google還是很體貼我們開發者的,為了進一步減少開發的工作量和申請權限對用戶的騷擾,對危險權限根據各自的屬性進行了分組。