干了十年 Android 開(kāi)發(fā),為什么我再也不想繼續(xù)了(干了十年 android 開(kāi)發(fā),為什么我再也不想繼續(xù)了呢)
本文最初發(fā)布于 Level Up Coding 博客。
在這篇文章中,我將談?wù)劄槭裁次以谶@個(gè)行業(yè)工作了近十年之后,永遠(yuǎn)地離開(kāi)了 Android 開(kāi)發(fā)。在開(kāi)始之前,讓我簡(jiǎn)單介紹下自己在這個(gè)領(lǐng)域的職業(yè)生涯。
美好時(shí)光
我從 2013 年開(kāi)始接觸 Android 開(kāi)發(fā),在當(dāng)時(shí) Android 4.4 還是熱門的新事物。AsyncTasks 還是標(biāo)準(zhǔn),還有 OttoEventBus 和其他令人討厭的東西。我見(jiàn)證了架構(gòu)演進(jìn)的過(guò)程,從 MVC 到 MVP/MVI,然后轉(zhuǎn)向 MVVM,最后是 MVVM 和 MVI 的混合。
我記得,當(dāng) RxJava 出現(xiàn)時(shí),一切都突然變成了反應(yīng)性的,變成了流。我記得,l33t Android Devs(Hi Jake Wharton)在談?wù)撃莻€(gè)新出現(xiàn)的黑馬 Kotlin。我記得,Kotlin 興起并接管了 Android 行業(yè)。我記得,Coroutines 出現(xiàn)了,并且起初被認(rèn)為是“RxJava”的殺手(嘿,你現(xiàn)在可以用同步方式編寫所有異步代碼了!不需要流了?。?。這個(gè)理念很吸引人,但很快就被證明,那僅僅是一個(gè)好主意而已,因此,像 Channels 這樣的底層異步原語(yǔ)成為 Kotlin 的 Rx-Way。不過(guò)事實(shí)證明,很多使用 Channels 的人都是自斷雙臂。不得已,精益冷流(Cold Streams)和熱流(Hot Streams)的概念被重新引入,請(qǐng)?jiān)试S我向你介紹:StateFlows 和 SharedFlows,最后,我們得到了一個(gè)輕量級(jí)的、支持 Coroutines 的 Kotlin 版 RxJava2。
我記得,我和同事 David 圍繞狀態(tài)和事件展開(kāi)的所有有趣的對(duì)話,到底什么是狀態(tài),什么是事件?事件對(duì)狀態(tài)有什么作用,反之亦然?我記得,在 Dagger 2 被 Koin 和 Dagger Hilt 取代之前的幾年,我熬夜學(xué)習(xí) Dagger 2。我還記得,第一次閱讀 Uncle Bob 的《架構(gòu)整潔之道》,這是我在 Android 開(kāi)發(fā)生涯中最開(kāi)闊眼界的時(shí)刻之一?,F(xiàn)在,我能夠設(shè)計(jì)和編寫幾乎所有應(yīng)用程序,而不需要考慮 MVVM/MVP/MVC 或任何其他特定于平臺(tái)的細(xì)節(jié)。我知道為什么測(cè)試很重要,我嘗試了 TDD,對(duì)它是又愛(ài)又恨,我還學(xué)習(xí)了 DDD 和 BDD。
我的火車到達(dá)終點(diǎn)站了嗎?
(我選擇這個(gè)副標(biāo)題是因?yàn)槲椰F(xiàn)在正在從瑞士到德國(guó)的火車上寫這篇文章。)
后來(lái),我加入了保時(shí)捷和 IBM 等大企業(yè)的領(lǐng)導(dǎo)團(tuán)隊(duì),這是一段很好的旅程,經(jīng)過(guò) 6-7 年的經(jīng)驗(yàn)積累,我達(dá)到了目標(biāo)。我曾開(kāi)發(fā)過(guò)復(fù)雜的應(yīng)用程序,涉及大量的 E2E 加密、傳感器通信、NFC 芯片、BLE Beacon、高流量聊天應(yīng)用,還有非常有名的待辦事項(xiàng)應(yīng)用,等等。
大約 6 年后,我開(kāi)始以首席 Android 開(kāi)發(fā)人員的身份參與項(xiàng)目。我學(xué)會(huì)了識(shí)別所參與的大多數(shù)項(xiàng)目的核心技術(shù)問(wèn)題(架構(gòu)和團(tuán)隊(duì)成員對(duì)某些模式有不同的理解),我還學(xué)會(huì)了如何指導(dǎo)團(tuán)隊(duì)解決這些問(wèn)題,以及如何成功地完成項(xiàng)目。對(duì)我而言,現(xiàn)在新東西僅僅是學(xué)習(xí)新的 API 變化 / 框架,目的是解決我們已經(jīng)解決了很多年的問(wèn)題,只是新的框架 /API 做了更好的處理(不用再手動(dòng)處理生命周期、Fragment Transaction、XML 布局等)。
我以前的后端經(jīng)驗(yàn)
很幸運(yùn),在過(guò)去的 4-5 年里,我在客戶項(xiàng)目中從事后端工作(根據(jù)要求)。我花了很多時(shí)間去了解后端開(kāi)發(fā)的來(lái)龍去脈,編寫并發(fā)代碼,創(chuàng)建分布式系統(tǒng),縱向和橫向擴(kuò)展,處理分布式事務(wù),編寫可配置的代碼,在不同階段的環(huán)境表現(xiàn)出預(yù)期的效果。我研究了不同類型的數(shù)據(jù)庫(kù)(圖、關(guān)系、文檔),以及什么樣的數(shù)據(jù)應(yīng)該使用什么樣的數(shù)據(jù)庫(kù),我學(xué)習(xí)了 Docker 和 K8s,我用 Go 重構(gòu) Java EE 系統(tǒng)??粗?Go 編譯出來(lái)的二進(jìn)制文件,它的內(nèi)存使用率和幾乎為零的內(nèi)存占用,我明白了為什么 Go 如此令人驚嘆。作為后端開(kāi)發(fā)人員,我所解決的問(wèn)題與我在 Android 開(kāi)發(fā)中遇到的挑戰(zhàn)無(wú)法相提并論(我很快就會(huì)講到),作為后端開(kāi)發(fā)者,我所解決的問(wèn)題比在 Android 上推敲像素影響更大、更深遠(yuǎn)。
Android 真的就那樣嗎?
最終,我厭倦了與 UI/UX 設(shè)計(jì)師的所有會(huì)議,厭倦了向他們解釋 Material Design 的基本原理,或者為什么我們不能觸發(fā)應(yīng)用程序 Y(不是我們開(kāi)發(fā)的)中那樣的行為 X,我記得,好幾個(gè)小時(shí)的設(shè)計(jì)討論都讓我的大腦直接宕機(jī)了。不少項(xiàng)目都會(huì)出現(xiàn)這種情況,其中一些項(xiàng)目具有一定的復(fù)雜性,一旦團(tuán)隊(duì)理解了整潔架構(gòu)和領(lǐng)域驅(qū)動(dòng)開(kāi)發(fā),我們就能在很短的時(shí)間內(nèi)寫出領(lǐng)域 數(shù)據(jù)層。一旦你向團(tuán)隊(duì)解釋清楚了各種身份認(rèn)證流程,恰當(dāng)處理令牌刷新邏輯就變成小菜一碟了。主要的挑戰(zhàn)幾乎總是出現(xiàn)在 UI 層,由于框架 API 不斷發(fā)展變化,UI 層也在不斷變化。在很大程度上,UI 層受 UI/UX 設(shè)計(jì)師和 PO 影響。最近,幾乎所有的項(xiàng)目都變成了日常工作,對(duì)工程的關(guān)注少,對(duì)業(yè)務(wù)、實(shí)施的關(guān)注多,幾乎一直在擺弄 Android API。在最好的情況下,會(huì)有一個(gè)令人耳目一新的任務(wù),如編寫一個(gè)自定義視圖,并使用一些線性代數(shù)的知識(shí)。但通常情況下,幾乎總是一些無(wú)聊的事情,反思這一切,我問(wèn)自己:這對(duì)我有什么好處?當(dāng)然我賺了很多錢,但我馬上就要 30 歲了,幾年后,我將在哪里?
作為一名經(jīng)驗(yàn)豐富的 Android 開(kāi)發(fā)人員,我只適合 Android 職位。我所有的技能都是為了能開(kāi)發(fā)出可維護(hù)的、整潔的、能在 Android 平臺(tái)上正常工作的代碼。有些代碼會(huì)被垃圾收集器如期殺死,而有些代碼能在垃圾收集器中存活下來(lái),因?yàn)樗驹撊绱恕H绻?Android 很快消失了怎么辦?看著像 Flutter 這樣優(yōu)秀的技術(shù),人們已經(jīng)用它開(kāi)發(fā)出了一些很棒的應(yīng)用,我不會(huì)再把任何新項(xiàng)目作為單獨(dú)的原生 iOS 和原生 Android 應(yīng)用來(lái)啟動(dòng)。老實(shí)說(shuō),你的 Android 技能對(duì)于大多數(shù)公司的首席 / 資深軟件工程師職位來(lái)說(shuō)價(jià)值并不高。
Android 開(kāi)發(fā)日薄西山
我成功地完成了自己的最后一個(gè)項(xiàng)目。現(xiàn)在是時(shí)候做一些改變了。我不想再花幾天的時(shí)間討論 CardView 的邊框或反復(fù)出現(xiàn)的毫無(wú)意義的問(wèn)題,比如是使用單選按鈕還是復(fù)選框。我不想再為了更好地處理 Android 生命周期或?qū)Ш蕉鴮W(xué)習(xí)新的 Android 庫(kù),然后在未來(lái) 12 個(gè)多月內(nèi)看它們?cè)俅伪惶鎿Q,在過(guò)去的 10 年里,這種事我已經(jīng)做過(guò)好多次了。開(kāi)發(fā)人員一代接一代,每一代中都會(huì)有人覺(jué)得自己有權(quán)力編寫一個(gè)新的庫(kù)來(lái)處理 UI 狀態(tài),或者編寫一個(gè)新的導(dǎo)航庫(kù)。測(cè)試?不,沒(méi)有。可悲的是,有很多開(kāi)發(fā)者會(huì)使用這些庫(kù)。Android 開(kāi)發(fā)正慢慢被吞噬 Web 開(kāi)發(fā)的混亂所吞噬(你試過(guò)安裝 create-react-app 嗎?你會(huì)下載數(shù)以千計(jì)的庫(kù),包括一些易受攻擊的庫(kù))。
幸運(yùn)的是,在過(guò)去幾年里,我曾在幾個(gè)項(xiàng)目中從事后端工作,這使我有機(jī)會(huì)過(guò)渡到后端開(kāi)發(fā),徹底離開(kāi)安卓,專注于開(kāi)發(fā)每秒處理數(shù)十萬(wàn)用戶請(qǐng)求的系統(tǒng),這對(duì)我來(lái)說(shuō)非常有吸引力?,F(xiàn)在,路線圖上有一些我作為 Android 開(kāi)發(fā)者不了解的新東西:獲得 K8s 認(rèn)證,掌握多個(gè)云,深入學(xué)習(xí)特定數(shù)據(jù)庫(kù),深入理解 DevOps。我感覺(jué),編程的神秘性再次激發(fā)了我,有復(fù)雜的工程問(wèn)題需要處理,這讓人興奮。
讓人難過(guò)的是,對(duì)于一個(gè)純粹的 Android 開(kāi)發(fā)者來(lái)說(shuō),架構(gòu)師或首席 / 資深工程師的道路是封閉的。純粹的 Android 開(kāi)發(fā)人員根本不具備履行這些職位所需的技能。對(duì)我來(lái)說(shuō),這是一次很棒的旅程,但我再也不會(huì)以 Android 開(kāi)發(fā)人員的身份參與項(xiàng)目了。
英文原文:
https://levelup.gitconnected.com/why-i-left-android-development-after-10-years-and-became-a-backend-developer-86ebf3595d43