Kotlin vs Flutter,我到底应该怎么选?

  • 2020 年 2 月 14 日
  • 笔记

在移动应用开发方面,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多平台项目。