适用于Android的英语学习应用程序Duolingo(Duolingo)最初是用Java开发的,已经使用了5年。两年后,它变成了一个100%的KotlinApp!在代码可维护性和开发人员满意度方面,迁移取得了巨大成功。网上已经有很多Kotlin学习资源,所以在这篇文章中,我们将重点介绍如何将一个拥有数百万用户的应用程序迁移到Kotlin。1.WhyKotlin我们在2018年初开始考虑使用Kotlin,当时Android支持Kotlin还不到一年,并不知道Kotlin会变得像现在这样流行,或者说它会取代Java成为Android开发的首选。我们当时的主要期望:生产力。Kotlin比Java简洁得多,编写Kotlin代码也更快,更易于维护。它与Java的无缝互操作性以及它向该语言添加新功能的方式使Android开发人员可以轻松上手。稳定。我们的代码库历史记录中有超过100次提交与Java代码中的“修复NullPointerException问题”有关。Kotlin的NullSafety特性避免了大部分的NullPointerException,让我们在codereview的时候更专注于其他问题。开发商满意度。根据StackOverflow的2018年开发者编程语言报告,Kotlin是开发者最喜欢的编程语言之一,仅次于Rust。我们的开发人员对公司内其他两个主要平台的语言升级做出了积极回应:在iOS应用程序中使用Swift,以及在TypeScript中完全重写duolingo.com。当然,迁移也存在一些风险,主要是开发者的时间成本。另一个担忧是,Kotlin是否会像CoffeeScript一样,最终被其“影子”语言打败。最后,我们的Android开发人员一致认为,Kotlin的好处足以证明在Kotlin中开发新代码是合理的,尽管我们还没有准备好完全迁移所有代码。2.让开发人员了解最新信息Duolingo的所有Android开发人员每两周开会一次,讨论最近和即将发生的平台变化、非正式事后分析和问答。早期的会议基于官方Kotlin语言指南、KotlinKoans、官方Android文档、MindOrks备忘单等专门针对Kotlin。然后,每个Android开发人员都会被分配一些Java代码,并负责将其迁移到Kotlin。我们让具有相对Kotlin经验的开发人员担任“Kotlin检查员”的角色,以在代码审查期间分享最佳实践。这个角色的人数逐渐增加,直到包括所有Android开发人员。3.Kotlin相关开发工具从一开始,我们就将Kotlin工具容器化,并在代码预提交和GitHubpullrequest状态检查中强制使用它们,以确保代码的一致性。我们使用detekt、IntelliJInspection、Androidlint和我们自己的基于正则表达式的Splinter检查所有Kotlin代码。在自动代码格式化方面,我们在公司范围内使用ktlint作为代码预提交挂钩的一部分。另一个工具是IntelliJFormatter,但我们发现它在Docker中运行速度有点慢。在将Java代码减少到仅10%的同时,我们从CI管道中删除了PMD、SpotBugs和大部分检查工具。继续使用这些Java工具会减慢我们的开发速度,并且不会为我们提供太多价值。4.转换Java代码为了尽可能轻松地审查代码转换,我们建议每个源文件的拉取请求至少包含三个单独的提交:运行IDE的自动转换器。此提交会混淆代码行,但不需要仔细检查,因为它通常在运行时是安全的,尽管可能会引入编译时错误。修复编译错误。这些修复通常很容易进行,例如,在必要时添加@JvmStatic注释。重构。开发者需要重构代码,让代码更符合Kotlin的惯用语,比如使用sumBy而不是for循环。我们发现,将Java文件转换为Kotlin后,行数平均减少了30%左右,在某些情况下甚至减少了90%!移植代码对我们Android平台工程师来说不是问题,但对我们产品团队来说可能比较困难。我们鼓励产品团队的开发人员在空闲时间迁移经常修改的代码,并通过每日排行榜比赛将这一过程游戏化。最后,产品团队的开发人员完成了一半的工作。5.绊脚石Kotlin的工具生态系统比Java小得多。不过,它足以满足我们的需求。我们仍然偶尔会遇到NullPointerException和IllegalArgumentException,这些异常来自于第三方Java依赖库(比如Android框架本身),它们不遵循最佳实践,不使用nullable注解,使得Kotlin编译器无法知道参数有些方法或者返回值可以为空。随着Google向其公共API添加注释,这种情况有所改善。然而,Kotlin仍然缺乏对某些Java特性的原生支持,包括不太常见的对超类静态保护方法的调用和神秘的超类构造函数调用,但这些问题很容易解决。6.结果在2018年初引入Kotlin之前,我们Android代码库中的代码行数每年增长46%。两年过去了,我们添加了许多新功能,活跃贡献者的数量增加了一倍多,我们的代码库现在几乎和以前一样大!根据NPS数据,这一次,Android开发人员的满意度提高了129分,其中Kotlin(和我们的工具)被大多数开发人员采用并称其做出了重大贡献。NPS的具体数据是:https://en.wikipedia.org/wiki/Net_Promoter我们现在也使用Python和Java作为后端服务开发语言,这几乎不需要额外的工作,因为我们可以复用现有的服务Java代码in和Android代码库中的Kotlin工具。总的来说,迁移到Kotlin后我们非常高兴。我们也很高兴看到它在我们公司和整个软件行业中得到越来越多的采用!
