Android 開發者怎麼成神?一文告訴1-5年的開發該怎麼做!
一個 Android 技術專家,至少有 2~3 個專業領域。
連結: https://www.techyourchance.com/android-developer-skills/
作者:Vasiliy Zukanov,獨立 Android 開發及軟體顧問
許多 Android 開發者經常會問我,要學會哪些東西才能成為一個優秀的 Android 工程師?對於這個問題,他們的描述或多或少都有些差異,但是,總體來說,我們都需要學習一系列的技能,才能成為一個優秀的 Android 工程師。
在我看來,存在這樣的困惑是正常的。Android 是一個巨大並且動態的生態系統,你可能需要花好幾周時間去了解並學習它相關的一些工具和概念,但是最後你會發現,它們有好多都不是很重要,或者說並不是非常有用。因此,在本文中,我將分享我在 Android 開發中所使用到的重要技能,希望能夠幫到你,讓你把你的精力集中到重要的事情上。
當然,如果你是一個經驗豐富的 Android 開發者,這些知識可能你都知道。有很多技能和觀點都需要很多基礎知識的沉澱,當你沒有足夠的經驗的時候,很難看到這些技能點。文中,我不可能列出所有 Android 開發者都需要的技能。所以,我根據不同的經驗,將這些知識點進行了粗略分組。請注意,這只是一個粗略的分組,並不一定是很精確的。
寫在前面
如果你只是一個想成為 Android 開發者的人,並且還沒有寫過任何應用,那麼這篇文章對你來說,還有點太早。本文主要是為了幫助開發者成為一個更專業的人。
本文,我會給你很多建議,不會讓你空手而歸。文章中列出瞭如何在短時間成為一個專業的開發者。讀完文章,需要你自己去練習,並時常回來看看這些技能。
在本文開始之前,我就當你已經在 Google Play 釋出過 Android 應用並且使用 GitHub 來進行原始碼管理。
0-2 年開發經驗
Android 是一個非常複雜的框架,它擁有陡峭的學習曲線。有一些複雜的概念的確是 Native 的 Android 開發者需要學習的,但另一部分卻是由於 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 開發的十宗罪 ,這篇文章,列舉出了大多數開發者都會犯的錯誤。這些錯誤大多數都與生命週期有關。
順便說一下,在面試中,生命週期相關的問題也會被經常問到。這也是你必須好好學習生命週期的原因。
- Context
在每一個 Android 應用程式中,都有一個或多個上下文物件。
和生命週期一樣,它也很難被解釋。它就像是一個“上帝類“一樣,它有非常多的能力。我們很難用一兩句話就把它描述清楚。儘管如此,理解 Context 職責和不同 Context 之前的區別也是非常重要的。
本文中,沒有更多關於 Context 的內容,我建議你去讀一下 StackOverflow 中關於 《What is 'Context' on Android?》 的回答和這個回答的內容.
- UI 執行緒
每一個 Android 應用程式都有一個特殊的執行緒 —— UI 執行緒。這一個執行緒在螢幕上繪製出 UI 頁面。如果你讓 UI 執行緒超負荷執行,你的應用程式將會變得卡頓,不響應。在極端情況下,UI 執行緒中的錯誤會導致整個應用程式出錯(至少看起來像是出錯了)。
如果你想詳細瞭解執行緒背後的機制原理,你可以去看這個影片,影片中詳細解釋了 Android 中的多執行緒,包含 UI 執行緒的相關細節和可能存在的問題。
- 邏輯拆分
從整體上說,Android 框架的程式碼很不“整潔”。它包含著很多的上帝類,這些類中,每一個有數千行程式碼,並且我們還必須去擴充套件這些類,才能讓我們的應用程式執行起來。在多數情況下,不管是 Application, Activity ,Fragments 還是 Service,我們都是在一個很大的類中,做很多的事情。
雖然在 Andorid 開發中,這是一個常見的做法,但這樣子做並不利於長期維護我們的程式碼邏輯。因此我建議,要儘可能的注意這個問題,多找機會去重構程式碼,將邏輯拆分到獨立的類中去。
說實話,我現在並不認為,一個初級開發者可以對架構和設計做出太多的改善工作。正確的封裝程式碼邏輯,提取出有意義的類,都需要一些開發經驗。當然,我也不希望你不去思考程式碼拆分,你可以做一些力所能及的事情,避免出現不可控的情況(例如,一個 Activity 中寫了超過 5000 行程式碼)。
剛開始,你可以嘗試拆分這篇文章中描述的與 Context 有關的邏輯。
2-4 年開發經驗
當你在你的職業生涯中工作幾年,你變成經驗豐富的 Android 開發者,透過研究和學習,你可以很輕鬆的實現一些非專業化的功能。那下一步,你該做什麼?
我認為,在這個時候,你已經很熟悉 Android 框架的基礎知識了,可以嘗試去學習更高層次的技能。這些技能不侷限於 Android,它們是一些通用的軟體開發的技能。具體來說,你可以研究以下主題:
- 依賴注入
依賴注入是一個關注結構分離的設計模式。它主要是用來進行分離應用程式的兩個功能:應用程式和核心功能、核心功能元件實現之間的連結。
從某些方面來說,實現了依賴注入的程式碼庫就好你一個計算機:依賴注入的基礎庫就像是主機板一樣,而其他的功能元件就好像是 CPU、記憶體、外設等。只要你的程式碼中實現了依賴注入,你就可以很方便的插入新功能,並且可以很容易的重用其它元件的功能,也可以很方便的使用新元件的功能。雖然這個比喻有點誇張,但是在我看來,它也確實很好的反映了依賴注入背後的思想。
不幸的是,現在關於依賴注入的文章,很多都存在誤解,這給初學者帶來很多干擾。因此,如果你想學習依賴注入,我建議你讀一下這篇文章,本文中,我分析了眾多依賴注入的“神話“。
- UI 分離
由於 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程式設計師,要學的東西有太多太多了,對於進階這條路而言,學習是會有回報的!
你把你的時間投資在學習上,就意味著你可以收穫技能,更有機會增加收入。
分享我的Android學習PDF大全來學習,這份Android學習PDF大全真的包含了方方面面了,內含Java基礎知識點、Android基礎、Android進階延伸、演算法合集等等
我的這份學習合集,可以有效的幫助大家掌握知識點。
總之也是在這裡幫助大家學習提升進階,也節省大家在網上搜尋資料的時間來學習,也可以分享給身邊好友一起學習
獲取方式:關注我看個人介紹,或直接 點選我免費領取
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69952849/viewspace-2685505/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 集合:安卓開發中怎麼注意細節?一文告訴你四十個安卓
- python怎麼做web開發PythonWeb
- 用Python實現類FaceID的人臉識別?一文告訴你該怎麼做Python
- 獨立開發該做什麼,該不做什麼
- chrome開發者模式怎麼開啟 chrome開發者模式在哪開啟Chrome模式
- 一文告訴你全世界最頂級的開發者都在使用什麼資料庫資料庫
- 開發要不要自己做測試?怎麼做?
- 10年網際網路開發者告訴你自學 Java 怎麼入門?Java
- 遊戲開發者怎麼做出一個成功的demo?遊戲開發
- 軟體開發公司的專案管理怎麼做專案管理
- ThinkSNS:軟體二次開發怎麼做?
- 一個NB的web前端開發者,是怎麼學習的?Web前端
- 開發者怎麼看待寫攻略“劇透”的玩家
- 小程式怎麼開發?具體怎麼操作
- 做Python開發工程師怎麼樣?python入門Python工程師
- 虐狗警告!法國遊戲開發者是怎麼做情侶RPG的?遊戲開發
- 怎麼註冊App Store開發者賬號?APP
- 0219 - 怎麼才能成為獨立開發者?
- 轉行做Java開發應該怎樣學習?Java
- 用半勵志的方式告訴你,怎麼學習Python開發Python
- onethink開發版,怎麼關閉開發模式模式
- 關於成都哪裡有開發具票#怎麼開如何開#
- 茶葉生意批發怎麼做,初做茶葉生意怎麼做?
- 後端開發怎麼學?後端
- 怎麼用手機開發pythonPython
- 轉行做IT,你是怎麼找到第一份開發工作?
- 鴻蒙OS揭面紗,開發者怎麼看鴻蒙
- 小米5X怎麼開啟USB調式 小米5X開發者選項怎麼開啟?
- win10開發者選項有什麼用 win10電腦開發者選項怎麼開啟Win10
- 一個開發者的使命感究竟應該是什麼?
- [譯] 為什麼每個 Android 開發者都應該嘗試 FlutterAndroidFlutter
- 杭州開廣告發票“怎麼開如何開”
- 深圳開廣告發票“如何開怎麼開”
- 成都開廣告發票“怎麼開如何開”
- 直播系統的開發中怎麼樣做才會更好的引流
- setState是如何知道該怎麼做的?
- web前端開發怎麼入門?Web前端
- Linux開發工程師怎麼樣?Linux工程師