Kotlin vs Flutter,我到底應該怎麼選?

本文同步發表於我的微信公衆號,掃一掃文章底部的二維碼或在微信搜索 郭霖 即可關注,每個工作日都有文章更新。

在移動應用開發方面,Kotlin和Flutter是目前比較火熱的兩門技術。其中,Kotlin是由Jetbrains研發,後被Google大力扶持,Flutter則是由Google自己獨立研發的。從目前Google官方的態度來看,這兩門技術都被無限看好,Google也是在它們身上投入了大量的資源。但也正是由於Google的這種態度,導致很多開發者變得迷茫了:我到底是應該學習Kotlin還是Flutter呢?

關於這個問題,我也是被問了無數次,但每次回答都只能簡單回覆幾句,無法全面概括,可能也做不到直至要害。因此一直以來,我都準備專門寫一篇文章來詳細對比Kotlin和Flutter,幫助大家答疑解惑。

巧合的是,前段時間瀏覽網頁,無意看到了一篇英文文章專門對這個問題進行了深度分析,我閱讀完之後深感自己寫不出比這更好更全面的文章了,因此決定直接將這篇文章翻譯並分享出來,相信一定會對大家有所幫助。

本篇文章的英文原文地址是:
https://goobar.io/2019/06/13/kotlin-vs-flutter-are-you-comparing-them-fairly/

我到底應該學Kotlin還是學Flutter呢?

這個問題要視情況而定。

不過在展開討論具體的情況之前,我們更應該先來審視一下,這是否是一個恰當的問題。因爲,拿Kotlin和Flutter來進行比較,在一定程度上就好像是在拿蘋果和橘子來進行比較。

從概念上講,Kotlin是一門編程語言,而Flutter是一個跨平臺的UI工具集。

不過,由於這兩門技術之間的差異太過巨大,導致這個問題本身其實就是一個龐大的問題,因此要想很好地回答這個問題,我們必須得要先去了解一些其他相關的問題。

爲什麼你想要學習Kotlin或Flutter?

首先,你要問自己的第一個問題就是:“我爲什麼要學習Kotlin或Flutter?學會之後可以用來做什麼?” 這個問題又可以展開爲以下3點:

  • 你想要學習移動開發嗎?
  • 你想要得到一份移動開發者的工作嗎?
  • 你想要以個人開發者或小型團隊來開發一款自己的移動產品嗎?

關於這幾點我們逐個來進行分析。

你想要學習移動開發嗎?

如果你的首要目標是對移動開發有所涉獵,並且能夠構建出一個小型的業餘項目,那麼選擇Kotlin還是Flutter其實是沒有什麼太大區別的。

然而,需要謹記的是,當你在Flutter和Kotlin之間做選擇的時候,其實你也是在選擇:

  • Flutter/Dart
  • iOS/Swift/Objective-C
  • Android/Kotlin/Java

Flutter是一個完整的應用開發工具集,其中包括了使用Dart來作爲編程語言,以及一系列的UI組件,還有一些獨有的編程模式、最佳實踐技巧、調試方法、工作流程等。

要想將Flutter和其他的平臺工具集進行對比,你還需要對它們所處的生態有比較完整的瞭解才行。

Kotlin和Flutter哪個更容易獲得一份工作?

如果你的首要目標是得到一份移動開發者的工作,那麼比較好的一種選擇方式就是看哪種技能的需求量更高一些。

在LinkedIn上搜索與Kotlin和Flutter相關的工作崗位,得到的結果如下(數據限定在美國區域,時間截止到2019年6月):

  • Flutter:315份結果
  • Kotlin: 3342份結果

Flutter畢竟還是一門比較新的技術,並且它對於一位移動開發者而言,學習成本是比較巨大的。相比之下,Kotlin對於Android開發者而言則非常容易上手。可能也是因爲這些原因,Flutter的工作崗位相對少了許多。

而工作崗位數量上的差別,可能同時意味着這兩件事情:

  1. 在你所在的地區,想要找一份Flutter相關的工作會相對比較困難。
  2. 如果你對Flutter已經有了足夠多的瞭解,將更容易在一些對Flutter需求量比較高的地區獲得一份工作。

這看上去有一些自相矛盾,並且這個方案的可實施性還要視你目前的生活狀況、找工作的緊急程度等條件因素而定。

而從另一方面來看,現在仍然有大量的需求招聘Android原生開發者,並且Kotlin對於更多人來說也是更加簡單易學的。當然,大量的工作崗位意味着將會有更多的選擇機會,同時也意味着會有更多的競爭者。

Kotlin和Flutter哪個更適合個人或小型團隊來開發產品?

如果你是想要使用Kotlin或Flutter來開發一款自己的應用程序,並投入商業運作,那麼剛纔所討論的那些你可以全部忘記,我們來重新思考一張更加完整的版圖。

如果你正在開發一款移動產品,那麼你非常有可能希望它能夠同時運行在iOS和Android這兩大平臺上。

使用Flutter你可以輕鬆做到這一點,而使用Kotlin則非常困難。

如果你想使用Kotlin來進行跨平臺開發,可以構建一個Kotlin多平臺項目,也可以分別單獨開發一套iOS和Android的項目工程,但是不管使用哪種方式,你都必須同時對iOS和Android的原生開發有足夠多的瞭解才行。

所以,如果你的目標非常明確,就是要以低成本的方式開發一款跨平臺應用程序,那麼Flutter無疑是更加合適的選擇。我們稍後會針對這一點進行更加詳細的討論。

你想要開發的到底是什麼?

關於這個問題,也可以更加詳細地將它展開成以下5點:

  • 你想要開發一款出色的Android應用嗎?
  • 你想要開發一款出色的iOS應用嗎?
  • 你想要開發一款可以同時運行在iOS和Android平臺上的應用嗎?
  • 你希望你的應用程序不僅僅運行在移動平臺嗎?
  • 你需要自己來編寫後臺服務器程序嗎?

這些問題我們還是逐個進行討論。

你想要開發一款出色的Android應用嗎?

如果你的目標是開發一款出色的Android應用,並且使用Android平臺提供給我們的各種最新特性,那麼請選擇原生Android開發。

當然,這並不意味着你就必須要使用Android+Kotlin的組合模式,Android+Java的組合在未來很長一段時間內仍然是可以完美工作的。不過,我堅信學習Kotlin能夠讓你更加享受代碼的開發過程。

你想要開發一款出色的iOS應用嗎?

類似地,如果你的目標是開發一款出色的iOS應用,並且使用平臺提供的各種最新特性,那麼我的建議是使用Swift語言來進行原生iOS開發。

你想要開發一款可以同時運行在iOS和Android平臺上的應用嗎?

如果你想要開發的是一款能夠同時運行在移動雙平臺的應用程序,這個問題就變得有趣了,因爲在Kotlin和Flutter的選擇上面你將會有3種選項:

  1. Android和iOS應用都使用原生的開發方式。
  2. 開發兩個原生應用程序,但使用Kotlin多平臺項目來共享代碼。
  3. 開發一個Flutter應用。

同時使用原生開發的方式要求你或你的團隊在雙平臺之間各自實現,且沒有任何代碼共享。如果你是位個人開發者,這可能會是最爲低效的一種選項,除非你對iOS和Android的原生開發都非常精通。但同時這也會是最爲安全的一種選項,因爲原生開發是最成熟的一種開發方式,不管蘋果還是Google,未來都不可能放棄對原生開發的支持,並且你還能儘快使用到各種平臺的最新特性。

而如果你想開發兩個原生的應用程序,但是要儘可能多地共享兩個平臺之間的代碼,那麼可以考慮構建一個Kotlin多平臺項目。不過這對於缺少經驗的開發者而言應該不是最佳的選項,因爲Kotlin多平臺功能還很新,能夠使用的工具和第三方庫也非常少。

而開發一個Flutter應用應該是讓你的應用程序能夠同時運行到iOS和Android平臺上最快速的方式了,尤其當你是一位個人開發者,使用Flutter將可以節省大量的開發時間。另外,由於你並不需要接觸多少系統底層的API,也不用在乎不同平臺之間的視覺體驗和用戶體驗差異,因此可以省去很多編寫平臺專屬優化代碼的時間。

你希望你的應用程序不僅僅運行在移動平臺嗎?

Flutter團隊並沒有僅僅只是把功能限定在了移動平臺上,而是將它進一步延伸到了網頁平臺,當然這個功能目前還在開發當中。Flutter給我們提供的便利性就是可以使用同一份代碼來讓應用程序運行到不同的平臺上面,而且隨着Flutter支持的平臺越多,使用Flutter的性價比就會越高。

當然你也可以考慮使用Kotlin多平臺項目來支持網頁平臺的開發,但是始終要記得,Kotlin多平臺項目的核心思路是共享代碼,因此你還是要爲每個平臺去編寫原生的代碼,比如開發UI界面,以及對共享代碼進行調用等。注意,隨着你要支持的平臺越多,這種方案的成本也會越大。

你需要自己來編寫後臺服務器程序嗎?

另外可能還有一種比較少見的場景,你需要自己來編寫後臺服務器程序嗎?一般的公司都會有專門的服務器人員來開發後臺服務器程序,而如果你需要自己來編寫服務器程序的話,Kotlin是值得進行研究的,因爲藉助Ktor框架可以輕鬆實現服務器端程序的編寫,而掌握Kotlin語言則是使用Ktor框架的前提條件。

你是否已經是一名移動開發者?

關於到底是選擇Kotlin還是Flutter,我們還需要將一個重要的因素考慮在內,就是你當前的開發經驗以及技術能力在什麼層次。這裏討論以下兩種可能:

  • 你已經是一名Android開發者了?
  • 你已經是一名iOS開發者了?

你已經是一名Android開發者了?

如果你已經非常熟悉Android原生開發了,學習Kotlin將會比學習Flutter快上許多倍。Kotlin會在你當前已掌握的知識基礎上迭代累加,並且能讓你的Android程序開發變得更有效率。

另外,學習Kotlin還可以讓你擁有開發後臺服務器程序的能力,只需要藉助Ktor框架就能快速地開發出一個簡單的後臺服務器程序,從而讓你的工作流程變得更加簡單。

而學習Flutter則需要你去掌握一門新的語言(Dart),並且還要去了解一個全新的開發生態,這將需要花費比學習Kotlin多上許多倍的時間。

如果你並不是想要享受Flutter跨平臺特性所帶來的便利性,僅僅使用Flutter來開發Android平臺專屬的應用程序是一件沒有意義的事情。

你已經是一名iOS開發者了?

而如果你是一名iOS開發者,現在想要了解應該學習Flutter還是Kotlin,情況就有點不同了。

如果你希望繼續使用原生的方式來開發iOS程序,不管Kotlin還是Flutter其實都起不到什麼太大的作用。不過Kotlin至少可以給你提供一種編寫後臺服務器程序的能力。

而如果你想要開發跨平臺的應用程序,那麼就需要在Kotlin多平臺項目和Flutter之間做選擇了。

正如前面所討論的,Flutter是將一套獨立的開發流程應用到了兩個移動平臺上面,而Kotlin多平臺項目則需要你對Kotlin和每個平臺的原生開發都有一定的瞭解才行。

所以在這種情況下,不論如何你都必須學習一門新語言(Dart或Kotlin),以及一套新的開發框架(Flutter或Android)。

你考慮過選擇Kotlin或Flutter的風險嗎?

每當你準備學習一項新技術時,都會伴隨着一定的風險。在Kotlin和Flutter的選擇上面,有一些風險是值得考慮的。

Kotlin已經是一門相當穩定的技術,並且支持Android平臺開發已經有超過兩年的時間了。它可以和現有的Android工程代碼完全兼容,是一種風險非常低的方案,基本不會影響到你當前項目的穩定性。

相比較而言,Flutter則是一門風險相對較高的技術,因爲它已經完全脫離了應用程序的原生開發方式。目前使用Flutter技術的成功項目案例比較少,對這項技術非常熟悉的開發者也比較少,這在招聘方面會造成一定的難度,可能需要現有的團隊都去學習這門新技術才行。

此外,Google曾經有過在不進行任何通知的情況下就將一個項目停掉的歷史,所以有些人或許會擔心Google未來是否會有可能放棄對FLutter或Kotlin的支持。

事實上,不管是Flutter還是Kotlin,目前都已經具備一定的規模,Google在短期內是不太可能放棄這兩項技術的,因此不管你的選擇是什麼,都不必在這一點上擔心。

所以,你會學習Kotlin還是Flutter呢?

看到這裏,或許本篇文章在Kotlin和Flutter的選擇上面已經給你帶來了一些靈感,但它最終是沒有標準答案的。所以如果你想要讓我給出一個結論的話,我的回答仍然還是:這要視情況而定。

具體的情況最後再來簡單概括一下吧:

如果你想要快速找到一份移動開發者的工作,建議學習Kotlin來進行原生的Android開發(或Swift來進行iOS開發)。

如果你想要快速構建自己的跨平臺應用,建議嘗試Flutter。

如果你們的團隊想要構建跨平臺應用,可以考慮使用Flutter,原生開發,以及Kotlin多平臺項目。這三種選項其實都是可行的,具體的選擇要取決於你們團隊的規模、結構、以及項目本身。

如果你或你們團隊想要將一些重要的功能邏輯在多個平臺上面重用的話,建議瞭解一下Kotlin多平臺項目。


關注我的技術公衆號,每天都有優質技術文章推送。

微信掃一掃下方二維碼即可關注:

發佈了120 篇原創文章 · 獲贊 2萬+ · 訪問量 1031萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章