1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        我為什么放棄移動(dòng)開發(fā)

        共 4911字,需瀏覽 10分鐘

         ·

        2021-11-13 20:08

        ????關(guān)注后回復(fù) “進(jìn)群” ,拉你進(jìn)程序員交流群????
        作者丨Niklas Klein
        譯者丨朱琪珊
        策劃丨蔡芳芳
        來源丨前端之巔(ID:frontshow)
        當(dāng)我還在上大學(xué)的時(shí)候,Android 和 iOS 還是新興的平臺(tái),每個(gè)人都對(duì)這兩項(xiàng)技術(shù)很感興趣。如果你參加一些當(dāng)時(shí)的編程研討會(huì),最后總會(huì)寫一個(gè)小型的 Android 應(yīng)用。這就是我向 Android 生態(tài)系統(tǒng)邁出的第一步,也可能是我隨后成為了一名移動(dòng)開發(fā)者的原因。

        本文由原作者發(fā)表在 medium.com,經(jīng)原作者授權(quán)由 InfoQ 中文站翻譯并分享。

        在這篇文章中,我想要分享我關(guān)于 Android SDK 和 Flutter 的糟糕體驗(yàn)。我提到的某些要點(diǎn)也適用于 iOS SDK。我已經(jīng)在幾年前放棄了移動(dòng)開發(fā)的工作,希望后來許多事情已經(jīng)在朝好的方向改進(jìn)。但在當(dāng)時(shí),我發(fā)現(xiàn)移動(dòng)生態(tài)系統(tǒng)是如此的令人感到困惑和挫敗,以至于我選擇了一條不同的職業(yè)路徑。

        設(shè)備的碎片化

        對(duì)開發(fā)者而言,Android 開發(fā)的最大痛點(diǎn),就是設(shè)備配置的巨大差異。我一直都未能理解為什么 SDK 中大部分功能(尤其是用戶交互界面的部分)取決于設(shè)備,而不是我的應(yīng)用。這從根本上導(dǎo)致我必須使用支持庫(kù),針對(duì)每個(gè)目標(biāo) API 級(jí)別調(diào)試我的應(yīng)用。除此之外,我還經(jīng)常遇到在仿真器或者測(cè)試設(shè)備上好好的代碼,卻在某個(gè)三星或者華為的設(shè)備上崩潰的情況。

        質(zhì)感設(shè)計(jì)(Material Design)

        當(dāng)我在 HackerNews 或者 Reddit 上讀到關(guān)于谷歌的 Material Design 的評(píng)論時(shí),某些時(shí)刻會(huì)感到我是唯一真正喜歡它的人。我覺得它在視覺上很具吸引力,我通常很享受這樣的用戶體驗(yàn)。官方的文檔網(wǎng)站發(fā)展得很快,也非常成功,我覺得這是優(yōu)秀文檔的典范。當(dāng)它被宣布用于 Android 時(shí),我感到非常興奮!

        話雖如此,在 Android 平臺(tái)上從 Holo 過渡到 Material Design 并非一帆風(fēng)順。因?yàn)樗孟袷潜患贝掖野l(fā)布出來似的。在接下來的幾年之中,官方的 Material Design 支持庫(kù)一直缺少一些非?;镜慕M件。雖然你有時(shí)可以在谷歌自有的應(yīng)用上看到這些組件,但是它們并沒有真正被納入到支持庫(kù)中。開發(fā)者不得不構(gòu)建自己的組件,或者使用 GitHub 上質(zhì)量無(wú)法保證的實(shí)現(xiàn)作為替代品。這次使用 Material Design 支持庫(kù)的經(jīng)歷,再加上大量的不一致的視覺設(shè)計(jì)和實(shí)現(xiàn)錯(cuò)誤,讓我第一次停下來真正地思考和質(zhì)疑這個(gè)生態(tài)系統(tǒng)。

        無(wú)人理會(huì)的最佳實(shí)踐

        構(gòu)建一個(gè)可靠的 Android 應(yīng)用,是一項(xiàng)充滿挑戰(zhàn)的任務(wù)。這主要是因?yàn)?SDK 對(duì)開發(fā)者并不友好。理論上,一個(gè) Android 應(yīng)用程序可以永遠(yuǎn)掛在后臺(tái)不使用任何系統(tǒng)資源,然后在用戶需要時(shí)立即回到先前的狀態(tài),這實(shí)在是令人驚訝。不過前提是開發(fā)者正確地實(shí)現(xiàn)了這個(gè)應(yīng)用的狀態(tài)和生命周期管理機(jī)制。

        開發(fā)者:你好,互聯(lián)網(wǎng)!我的應(yīng)用在改變屏幕方向時(shí)崩潰了,該如何解決?互聯(lián)網(wǎng):這很簡(jiǎn)單!禁止改變屏幕方向即可。

        ——啊哦,不幸的是,這種回復(fù)很普遍。

        你是否曾經(jīng)使用過 Java 中的線程(Threads)?在可變變量隨處可見的的命令式代碼庫(kù)中,這件事變得非常困難。但你猜怎么著?在 Android SDK 中使用線程更加困難。如果你想要在一個(gè) Activity 中管理 Thread,那你就只能自求多福了。幸運(yùn)的是,我們最終保留了 Fragments,這最終讓這件事變得容易了一些。但代價(jià)是在一開始就需要使用 Fragments。

        在我作為一名移動(dòng)開發(fā)者的職業(yè)生涯中,我面試了一些高級(jí) Android 開發(fā)者。他們幾乎無(wú)一例外,都很難給出這些話題的正確答案。

        我一直希望谷歌能更坦然地承認(rèn)這些問題,并且和社區(qū)一起解決。這些問題可能隨著 Kotlin 的發(fā)布有所改善,但 Android 生態(tài)系統(tǒng)的根基仍然存在很多潛在的問題。

        無(wú)效的設(shè)計(jì)模式和對(duì)抽象的注解

        開發(fā)者很快就意識(shí)到,在 Android SDK 提供的抽象之上,構(gòu)建一個(gè)真實(shí)世界的應(yīng)用是不可能的。對(duì)此的解決方案是層出不窮的設(shè)計(jì)模式,甚至每周可能都會(huì)出現(xiàn)新的設(shè)計(jì)模式,我記得的包括:MVC、MVP、MVVM 和 MVI。而且由于無(wú)法使用普通的構(gòu)造函數(shù)調(diào)用來管理依賴項(xiàng),我們不得不在代碼庫(kù)的每個(gè)地方使用注解。這些本來并沒有必要。Java,甚至 Kotlin,本來就有足夠的能力可以對(duì)這些東西建模,更何況是以一種透明而直接的方式。但 Android 更喜歡 XML 定義和反射式實(shí)例化,因此開發(fā)者不得不在代碼中使用注解和各種設(shè)計(jì)模式。實(shí)話實(shí)說,我真的無(wú)法形容這到底有多麻煩。

        從未利用過的平臺(tái)優(yōu)勢(shì)

        在某種程度上,原生 iOS 和 Android 開發(fā)都是作為平臺(tái)在與網(wǎng)頁(yè)端競(jìng)爭(zhēng)。但 iOS 和 Android 擁有只屬于一家企業(yè)的巨大的平臺(tái)優(yōu)勢(shì),相比之下,網(wǎng)頁(yè)端有許多利益相關(guān)者,這些利益相關(guān)者都想要根據(jù)他們的需要來影響網(wǎng)頁(yè)端的開發(fā)。

        然而,網(wǎng)頁(yè)端擁有更加活躍和創(chuàng)新的生態(tài)系統(tǒng)。只需要想想 React 的成功故事:基于組件的用戶界面,是我們目前提出的最簡(jiǎn)潔的抽象方法,這是無(wú)可否認(rèn)的。多年以來,Android 并不理會(huì)這一趨勢(shì),直到最近才宣布推出“Jetpack Compose”,但是這仍然僅支持在開發(fā)者預(yù)覽模式下使用。同樣的事情也出現(xiàn)在 iOS 開發(fā)中。

        所以,現(xiàn)狀是我們?nèi)匀恍枰^承 android.view.View 類,這個(gè)類有 1.5 萬(wàn)行代碼,和數(shù)十個(gè)生命周期函數(shù),但同時(shí)我們還要嘗試注入自己的 merge XML 文件。iOS 和 Android 本來可以成為這個(gè)競(jìng)爭(zhēng)中的引領(lǐng)者,但實(shí)際上,它們已經(jīng)被遠(yuǎn)遠(yuǎn)甩在了后面。

        請(qǐng)不要對(duì) UI 開發(fā)抱以希望

        一個(gè)精美的應(yīng)用的關(guān)鍵在于用戶界面(UI)。我在上文已經(jīng)吐槽了不少關(guān)于組件的問題,但這些還不是最嚴(yán)重的。你是否曾經(jīng)調(diào)試過網(wǎng)站上的故障?通常的操作是:打開瀏覽器的開發(fā)工具,點(diǎn)擊有問題的元素,然后使用 CSS 和 HTML 的屬性來調(diào)試。與此相比,Android 是一個(gè)無(wú)法訪問的黑盒。老實(shí)說,我一直沒有完全理解 Android 的主題和樣式機(jī)制,并且與 Web 相比,Android 的工具顯得毫無(wú)用處。

        想要在這個(gè)框周圍添加陰影嗎?沒問題,請(qǐng)使用這個(gè)奇怪的.9.png 文件,或者依靠 API Level 21,你就可以正確渲染陰影了(盡管只有凸形陰影)。不好意思,你忘記實(shí)現(xiàn)自定義視圖四個(gè)構(gòu)造函數(shù)的其中一個(gè)了。但我不會(huì)拋出編譯錯(cuò)誤,我只會(huì)在運(yùn)行時(shí)崩潰!現(xiàn)在有支持超高屏幕密度的手機(jī)了。可以在應(yīng)用里添加 xxxhpi 的 assets 嗎?不行,不支持矢量圖,我們做不了這個(gè)。

        ——來自 Android SDK 的深夜獨(dú)白

        矢量圖 

        在 Android 21(5.0)之前,Android 平臺(tái)根本不支持正確的矢量圖。這背后的原因是,多樣的 Android 設(shè)備導(dǎo)致了多種不同的屏幕密度,這要求圖像針對(duì)每種屏幕密度都做仔細(xì)的調(diào)整。務(wù)實(shí)的開發(fā)者自然而然地開發(fā)了轉(zhuǎn)換矢量圖的工具,將 logo.svg 轉(zhuǎn)換成 ldpi/logo.png,mdpi/logo.png,hdpi/logo.png,xhdpi/logo.png,xxhdpi/logo.png 以及 xxxhdpi/logo.png。幸運(yùn)的是,最終谷歌改變了它們的想法,并提供了 VectorDrawble 來支持部分可縮放矢量圖形(SVG)。的確,這足夠減輕當(dāng)時(shí)的痛苦。但仍然令我困惑的是,一個(gè)以能夠在任何設(shè)備配置上運(yùn)行為優(yōu)勢(shì)的開發(fā)環(huán)境,是如何在這么長(zhǎng)時(shí)間都不支持矢量圖的情況下活下來的?

            死局    

        這些年,我開始越來越擔(dān)心我的知識(shí)會(huì)在不遠(yuǎn)的將來過時(shí)。我學(xué)到的大多數(shù)知識(shí)都是 Android 開發(fā)所特有的,很少適用于更廣泛的軟件開發(fā)領(lǐng)域??紤]到這些方面,我不認(rèn)為原生的移動(dòng)開發(fā)會(huì)一直存在,所以我開始擔(dān)心所學(xué)到的技能的實(shí)用性。

         Flutter 

        當(dāng) Flutter 發(fā)布時(shí),我非常激動(dòng)。它承諾將解決一些主要的 Android SDK 的缺陷,同時(shí)無(wú)償提供跨平臺(tái)支持。所以在我上一份工作中,我們開始從原生 Android 遷移到 Flutter 上。我必須承認(rèn),F(xiàn)lutter 信守了它的承諾:

        • Flutter 內(nèi)置的渲染流水線完全解決了 Android 的碎片化問題。

        • 從一開始,它就提供了詳盡的高質(zhì)量的 Material Design 組件庫(kù)。

        • 熱重載功能的靈活性完全顛覆了我的認(rèn)知。

        • 你能獲得前所未有的高質(zhì)量界面外觀的跨平臺(tái)體驗(yàn)。

        但不幸的是,它也不完美。而且有點(diǎn)可惜的是,F(xiàn)lutter 遇到的問題本可以通過一個(gè)全新的項(xiàng)目輕松避免。

        • Dart 很糟糕:它還是一門相對(duì)年輕的語(yǔ)言,但它重蹈了不少它的前輩的覆轍(錯(cuò)誤的類型系統(tǒng),Null,使用語(yǔ)句而不是表達(dá)式,等等)。

        • Flutter SDK 中讓人不解的設(shè)計(jì)決策:它們本應(yīng)創(chuàng)造一個(gè)更好的 React,但卻創(chuàng)造了一個(gè)更糟糕的。本可以通過簡(jiǎn)單的函數(shù)調(diào)用解決的問題,往往需要通過有狀態(tài)的面向?qū)ο缶幊蹋∣OP)機(jī)制才能解決。(我記得對(duì)話框的路由和處理在這個(gè)方面尤為痛苦)

            結(jié)論    

        在某一時(shí)刻,我清楚的意識(shí)到,我不想在這種技術(shù)上傾注心血了。我向自己許諾,絕不再在移動(dòng)平臺(tái)上編程。一個(gè)設(shè)計(jì)精美的、響應(yīng)式的網(wǎng)站在今天已經(jīng)可以給你足夠好的體驗(yàn),所以這是我的不二之選。只需要一個(gè)代碼庫(kù),它就能適用于每個(gè)客戶端。如果我還是不得不構(gòu)建一個(gè)移動(dòng)應(yīng)用程序,我仍然會(huì)選擇 Flutter,甚至是在我僅針對(duì) Android 的情況下。我絕對(duì)不會(huì)再使用 Android SDK。

        話雖如此,但要澄清一點(diǎn),我還是非常喜愛和欣賞精心制作的原生應(yīng)用的(無(wú)論是在移動(dòng)設(shè)備上還是桌面上)。我對(duì)那些使用現(xiàn)有工具就能創(chuàng)建出這樣的應(yīng)用的開發(fā)者,致以崇高的敬意。只是,我不想再成為他們中的一員。

        原文鏈接

        https://medium.com/swlh/9-reasons-why-i-gave-up-on-being-a-mobile-developer-795f5fb37c1e

        -End-

        最近有一些小伙伴,讓我?guī)兔φ乙恍?nbsp;面試題 資料,于是我翻遍了收藏的 5T 資料后,匯總整理出來,可以說是程序員面試必備!所有資料都整理到網(wǎng)盤了,歡迎下載!

        點(diǎn)擊??卡片,關(guān)注后回復(fù)【面試題】即可獲取

        在看點(diǎn)這里好文分享給更多人↓↓

        瀏覽 41
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            国产伦子沙发午休 | 成人无码免费一区二区三区视频 | 啊灬啊灬啊灬快灬高潮了电影片段 | 熟女性爱偷窥 | 国产婬语对白在线视频露脸 | 国产精品久久久久久久下载地址 | 国产成人精品免费看在线播放 | 欧美在线一区二区 | 国产激情艳情在线看视频 | 又大又粗出白浆少妇毛片 |