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
















 
 
 










 
 
 
 