Kotlin vs Flutter,我到底應(yīng)該怎么選?
正文
在移動應(yīng)用開發(fā)方面,Kotlin和Flutter是目前比較火熱的兩門技術(shù)。其中,Kotlin是由Jetbrains研發(fā),后被Google大力扶持,F(xiàn)lutter則是由Google自己獨(dú)立研發(fā)的。從目前Google官方的態(tài)度來看,這兩門技術(shù)都被無限看好,Google也是在它們身上投入了大量的資源。但也正是由于Google的這種態(tài)度,導(dǎo)致很多開發(fā)者變得迷茫了:我到底是應(yīng)該學(xué)習(xí)Kotlin還是Flutter呢?
關(guān)于這個(gè)問題,我也是被問了無數(shù)次,但每次回答都只能簡單回復(fù)幾句,無法全面概括,可能也做不到直至要害。因此一直以來,我都準(zhǔn)備專門寫一篇文章來詳細(xì)對比Kotlin和Flutter,幫助大家答疑解惑。
巧合的是,前段時(shí)間瀏覽網(wǎng)頁,無意看到了一篇英文文章專門對這個(gè)問題進(jìn)行了深度分析,我閱讀完之后深感自己寫不出比這更好更全面的文章了,因此決定直接將這篇文章翻譯并分享出來,相信一定會對大家有所幫助。
本篇文章的英文原文地址是:
https://goobar.io/2019/06/13/kotlin-vs-flutter-are-you-comparing-them-fairly/
我到底應(yīng)該學(xué)Kotlin還是Flutter呢?
這個(gè)問題要視情況而定。
不過在展開討論具體的情況之前,我們更應(yīng)該先來審視一下,這是否是一個(gè)恰當(dāng)?shù)膯栴}。因?yàn)?,拿Kotlin和Flutter來進(jìn)行比較,在一定程度上就好像是在拿蘋果和橘子來進(jìn)行比較。
從概念上講,Kotlin是一門編程語言,而Flutter是一個(gè)跨平臺的UI工具集。
不過,由于這兩門技術(shù)之間的差異太過巨大,導(dǎo)致這個(gè)問題本身其實(shí)就是一個(gè)龐大的問題,因此要想很好地回答這個(gè)問題,我們必須得要先去了解一些其他相關(guān)的問題。
為什么你想要學(xué)習(xí)Kotlin或Flutter?
首先,你要問自己的第一個(gè)問題就是:“我為什么要學(xué)習(xí)Kotlin或Flutter?學(xué)會之后可以用來做什么?” 這個(gè)問題又可以展開為以下3點(diǎn):
- 你想要學(xué)習(xí)移動開發(fā)嗎?
- 你想要得到一份移動開發(fā)者的工作嗎?
- 你想要以個(gè)人開發(fā)者或小型團(tuán)隊(duì)來開發(fā)一款自己的移動產(chǎn)品嗎?
關(guān)于這幾點(diǎn)我們逐個(gè)來進(jìn)行分析。
1. 你想要學(xué)習(xí)移動開發(fā)嗎?
如果你的首要目標(biāo)是對移動開發(fā)有所涉獵,并且能夠構(gòu)建出一個(gè)小型的業(yè)余項(xiàng)目,那么選擇Kotlin還是Flutter其實(shí)是沒有什么太大區(qū)別的。
然而,需要謹(jǐn)記的是,當(dāng)你在Flutter和Kotlin之間做選擇的時(shí)候,其實(shí)你也是在選擇:
- Flutter/Dart
- iOS/Swift/Objective-C
- Android/Kotlin/Java
Flutter是一個(gè)完整的應(yīng)用開發(fā)工具集,其中包括了使用Dart來作為編程語言,以及一系列的UI組件,還有一些獨(dú)有的編程模式、最佳實(shí)踐技巧、調(diào)試方法、工作流程等。
要想將Flutter和其他的平臺工具集進(jìn)行對比,你還需要對它們所處的生態(tài)有比較完整的了解才行。
2. Kotlin和Flutter哪個(gè)更容易獲得一份工作?
如果你的首要目標(biāo)是得到一份移動開發(fā)者的工作,那么比較好的一種選擇方式就是看哪種技能的需求量更高一些。
在LinkedIn上搜索與Kotlin和Flutter相關(guān)的工作崗位,得到的結(jié)果如下(數(shù)據(jù)限定在美國區(qū)域,時(shí)間截止到2019年6月):
- Flutter:315份結(jié)果
- Kotlin:3342份結(jié)果
Flutter畢竟還是一門比較新的技術(shù),并且它對于一位移動開發(fā)者而言,學(xué)習(xí)成本是比較巨大的。相比之下,Kotlin對于Android開發(fā)者而言則非常容易上手??赡芤彩且?yàn)檫@些原因,F(xiàn)lutter的工作崗位相對少了許多。
而工作崗位數(shù)量上的差別,可能同時(shí)意味著這兩件事情:
在你所在的地區(qū),想要找一份Flutter相關(guān)的工作會相對比較困難。
如果你對Flutter已經(jīng)有了足夠多的了解,將更容易在一些對Flutter需求量比較高的地區(qū)獲得一份工作。
這看上去有一些自相矛盾,并且這個(gè)方案的可實(shí)施性還要視你目前的生活狀況、找工作的緊急程度等條件因素而定。
而從另一方面來看,現(xiàn)在仍然有大量的需求招聘Android原生開發(fā)者,并且Kotlin對于更多人來說也是更加簡單易學(xué)的。當(dāng)然,大量的工作崗位意味著將會有更多的選擇機(jī)會,同時(shí)也意味著會有更多的競爭者。
3. Kotlin和Flutter哪個(gè)更適合個(gè)人或小型團(tuán)隊(duì)來開發(fā)產(chǎn)品?
如果你是想要使用Kotlin或Flutter來開發(fā)一款自己的應(yīng)用程序,并投入商業(yè)運(yùn)作,那么剛才所討論的那些你可以全部忘記,我們來重新思考一張更加完整的版圖。
如果你正在開發(fā)一款移動產(chǎn)品,那么你非常有可能希望它能夠同時(shí)運(yùn)行在iOS和Android這兩大平臺上。
使用Flutter你可以輕松做到這一點(diǎn),而使用Kotlin則非常困難。
如果你想使用Kotlin來進(jìn)行跨平臺開發(fā),可以構(gòu)建一個(gè)Kotlin多平臺項(xiàng)目,也可以分別單獨(dú)開發(fā)一套iOS和Android的項(xiàng)目工程,但是不管使用哪種方式,你都必須同時(shí)對iOS和Android的原生開發(fā)有足夠多的了解才行。
所以,如果你的目標(biāo)非常明確,就是要以低成本的方式開發(fā)一款跨平臺應(yīng)用程序,那么Flutter無疑是更加合適的選擇。我們稍后會針對這一點(diǎn)進(jìn)行更加詳細(xì)的討論。
你想要開發(fā)的到底是什么?
關(guān)于這個(gè)問題,也可以更加詳細(xì)地將它展開成以下5點(diǎn):
- 你想要開發(fā)一款出色的Android應(yīng)用嗎?
- 你想要開發(fā)一款出色的iOS應(yīng)用嗎?
- 你想要開發(fā)一款可以同時(shí)運(yùn)行在iOS和Android平臺上的應(yīng)用嗎?
- 你希望你的應(yīng)用程序不僅僅運(yùn)行在移動平臺嗎?
- 你需要自己來編寫后臺服務(wù)器程序嗎?
這些問題我們還是逐個(gè)進(jìn)行討論。
1. 你想要開發(fā)一款出色的Android應(yīng)用嗎?
如果你的目標(biāo)是開發(fā)一款出色的Android應(yīng)用,并且使用Android平臺提供給我們的各種最新特性,那么請選擇原生Android開發(fā)。
當(dāng)然,這并不意味著你就必須要使用Android+Kotlin的組合模式,Android+Java的組合在未來很長一段時(shí)間內(nèi)仍然是可以完美工作的。不過,我堅(jiān)信學(xué)習(xí)Kotlin能夠讓你更加享受代碼的開發(fā)過程。
2. 你想要開發(fā)一款出色的iOS應(yīng)用嗎?
類似地,如果你的目標(biāo)是開發(fā)一款出色的iOS應(yīng)用,并且使用平臺提供的各種最新特性,那么我的建議是使用Swift語言來進(jìn)行原生iOS開發(fā)。
3. 你想要開發(fā)一款可以同時(shí)運(yùn)行在iOS和Android平臺上的應(yīng)用嗎?
如果你想要開發(fā)的是一款能夠同時(shí)運(yùn)行在移動雙平臺的應(yīng)用程序,這個(gè)問題就變得有趣了,因?yàn)樵贙otlin和Flutter的選擇上面你將會有3種選項(xiàng):
- Android和iOS應(yīng)用都使用原生的開發(fā)方式。
- 開發(fā)兩個(gè)原生應(yīng)用程序,但使用Kotlin多平臺項(xiàng)目來共享代碼。
- 開發(fā)一個(gè)Flutter應(yīng)用。
同時(shí)使用原生開發(fā)的方式要求你或你的團(tuán)隊(duì)在雙平臺之間各自實(shí)現(xiàn),且沒有任何代碼共享。如果你是位個(gè)人開發(fā)者,這可能會是最為低效的一種選項(xiàng),除非你對iOS和Android的原生開發(fā)都非常精通。但同時(shí)這也會是最為安全的一種選項(xiàng),因?yàn)樵_發(fā)是最成熟的一種開發(fā)方式,不管蘋果還是Google,未來都不可能放棄對原生開發(fā)的支持,并且你還能盡快使用到各種平臺的最新特性。
而如果你想開發(fā)兩個(gè)原生的應(yīng)用程序,但是要盡可能多地共享兩個(gè)平臺之間的代碼,那么可以考慮構(gòu)建一個(gè)Kotlin多平臺項(xiàng)目。不過這對于缺少經(jīng)驗(yàn)的開發(fā)者而言應(yīng)該不是最佳的選項(xiàng),因?yàn)镵otlin多平臺功能還很新,能夠使用的工具和第三方庫也非常少。
而開發(fā)一個(gè)Flutter應(yīng)用應(yīng)該是讓你的應(yīng)用程序能夠同時(shí)運(yùn)行到iOS和Android平臺上最快速的方式了,尤其當(dāng)你是一位個(gè)人開發(fā)者,使用Flutter將可以節(jié)省大量的開發(fā)時(shí)間。另外,由于你并不需要接觸多少系統(tǒng)底層的API,也不用在乎不同平臺之間的視覺體驗(yàn)和用戶體驗(yàn)差異,因此可以省去很多編寫平臺專屬優(yōu)化代碼的時(shí)間。
4. 你希望你的應(yīng)用程序不僅僅運(yùn)行在移動平臺嗎?
Flutter團(tuán)隊(duì)并沒有僅僅只是把功能限定在了移動平臺上,而是將它進(jìn)一步延伸到了網(wǎng)頁平臺,當(dāng)然這個(gè)功能目前還在開發(fā)當(dāng)中。Flutter給我們提供的便利性就是可以使用同一份代碼來讓應(yīng)用程序運(yùn)行到不同的平臺上面,而且隨著Flutter支持的平臺越多,使用Flutter的性價(jià)比就會越高。
當(dāng)然你也可以考慮使用Kotlin多平臺項(xiàng)目來支持網(wǎng)頁平臺的開發(fā),但是始終要記得,Kotlin多平臺項(xiàng)目的核心思路是共享代碼,因此你還是要為每個(gè)平臺去編寫原生的代碼,比如開發(fā)UI界面,以及對共享代碼進(jìn)行調(diào)用等。注意,隨著你要支持的平臺越多,這種方案的成本也會越大。
5. 你需要自己來編寫后臺服務(wù)器程序嗎?
另外可能還有一種比較少見的場景,你需要自己來編寫后臺服務(wù)器程序嗎?一般的公司都會有專門的服務(wù)器人員來開發(fā)后臺服務(wù)器程序,而如果你需要自己來編寫服務(wù)器程序的話,Kotlin是值得進(jìn)行研究的,因?yàn)榻柚鶮tor框架可以輕松實(shí)現(xiàn)服務(wù)器端程序的編寫,而掌握Kotlin語言則是使用Ktor框架的前提條件。
你是否已經(jīng)是一名移動開發(fā)者?
關(guān)于到底是選擇Kotlin還是Flutter,我們還需要將一個(gè)重要的因素考慮在內(nèi),就是你當(dāng)前的開發(fā)經(jīng)驗(yàn)以及技術(shù)能力在什么層次。這里討論以下兩種可能:
- 你已經(jīng)是一名Android開發(fā)者了?
- 你已經(jīng)是一名iOS開發(fā)者了?
1. 你已經(jīng)是一名Android開發(fā)者了?
如果你已經(jīng)非常熟悉Android原生開發(fā)了,學(xué)習(xí)Kotlin將會比學(xué)習(xí)Flutter快上許多倍。Kotlin會在你當(dāng)前已掌握的知識基礎(chǔ)上迭代累加,并且能讓你的Android程序開發(fā)變得更有效率。
另外,學(xué)習(xí)Kotlin還可以讓你擁有開發(fā)后臺服務(wù)器程序的能力,只需要借助Ktor框架就能快速地開發(fā)出一個(gè)簡單的后臺服務(wù)器程序,從而讓你的工作流程變得更加簡單。
而學(xué)習(xí)Flutter則需要你去掌握一門新的語言(Dart),并且還要去了解一個(gè)全新的開發(fā)生態(tài),這將需要花費(fèi)比學(xué)習(xí)Kotlin多上許多倍的時(shí)間。
如果你并不是想要享受Flutter跨平臺特性所帶來的便利性,僅僅使用Flutter來開發(fā)Android平臺專屬的應(yīng)用程序是一件沒有意義的事情。
2. 你已經(jīng)是一名iOS開發(fā)者了?
而如果你是一名iOS開發(fā)者,現(xiàn)在想要了解應(yīng)該學(xué)習(xí)Flutter還是Kotlin,情況就有點(diǎn)不同了。
如果你希望繼續(xù)使用原生的方式來開發(fā)iOS程序,不管Kotlin還是Flutter其實(shí)都起不到什么太大的作用。不過Kotlin至少可以給你提供一種編寫后臺服務(wù)器程序的能力。
而如果你想要開發(fā)跨平臺的應(yīng)用程序,那么就需要在Kotlin多平臺項(xiàng)目和Flutter之間做選擇了。
正如前面所討論的,F(xiàn)lutter是將一套獨(dú)立的開發(fā)流程應(yīng)用到了兩個(gè)移動平臺上面,而Kotlin多平臺項(xiàng)目則需要你對Kotlin和每個(gè)平臺的原生開發(fā)都有一定的了解才行。
所以在這種情況下,不論如何你都必須學(xué)習(xí)一門新語言(Dart或Kotlin),以及一套新的開發(fā)框架(Flutter或Android)。
你考慮過選擇Kotlin或Flutter的風(fēng)險(xiǎn)嗎?
每當(dāng)你準(zhǔn)備學(xué)習(xí)一項(xiàng)新技術(shù)時(shí),都會伴隨著一定的風(fēng)險(xiǎn)。在Kotlin和Flutter的選擇上面,有一些風(fēng)險(xiǎn)是值得考慮的。
Kotlin已經(jīng)是一門相當(dāng)穩(wěn)定的技術(shù),并且支持Android平臺開發(fā)已經(jīng)有超過兩年的時(shí)間了。它可以和現(xiàn)有的Android工程代碼完全兼容,是一種風(fēng)險(xiǎn)非常低的方案,基本不會影響到你當(dāng)前項(xiàng)目的穩(wěn)定性。
相比較而言,F(xiàn)lutter則是一門風(fēng)險(xiǎn)相對較高的技術(shù),因?yàn)樗呀?jīng)完全脫離了應(yīng)用程序的原生開發(fā)方式。目前使用Flutter技術(shù)的成功項(xiàng)目案例比較少,對這項(xiàng)技術(shù)非常熟悉的開發(fā)者也比較少,這在招聘方面會造成一定的難度,可能需要現(xiàn)有的團(tuán)隊(duì)都去學(xué)習(xí)這門新技術(shù)才行。
此外,Google曾經(jīng)有過在不進(jìn)行任何通知的情況下就將一個(gè)項(xiàng)目停掉的歷史,所以有些人或許會擔(dān)心Google未來是否會有可能放棄對Flutter或Kotlin的支持。
事實(shí)上,不管是Flutter還是Kotlin,目前都已經(jīng)具備一定的規(guī)模,Google在短期內(nèi)是不太可能放棄這兩項(xiàng)技術(shù)的,因此不管你的選擇是什么,都不必在這一點(diǎn)上擔(dān)心。
所以,你會學(xué)習(xí)Kotlin還是Flutter呢?
看到這里,或許本篇文章在Kotlin和Flutter的選擇上面已經(jīng)給你帶來了一些靈感,但它最終是沒有標(biāo)準(zhǔn)答案的。所以如果你想要讓我給出一個(gè)結(jié)論的話,我的回答仍然還是:這要視情況而定。
具體的情況最后再來簡單概括一下吧:
如果你想要快速找到一份移動開發(fā)者的工作,建議學(xué)習(xí)Kotlin來進(jìn)行原生的Android開發(fā)(或Swift來進(jìn)行iOS開發(fā))。
如果你想要快速構(gòu)建自己的跨平臺應(yīng)用,建議嘗試Flutter。
如果你們的團(tuán)隊(duì)想要構(gòu)建跨平臺應(yīng)用,可以考慮使用Flutter,原生開發(fā),以及Kotlin多平臺項(xiàng)目。這三種選項(xiàng)其實(shí)都是可行的,具體的選擇要取決于你們團(tuán)隊(duì)的規(guī)模、結(jié)構(gòu)、以及項(xiàng)目本身。
如果你或你們團(tuán)隊(duì)想要將一些重要的功能邏輯在多個(gè)平臺上面重用的話,建議了解一下Kotlin多平臺項(xiàng)目。
本文轉(zhuǎn)載自微信公眾號「郭霖」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系郭霖公眾號。