「科技小辛辛」30-90%!多邻国从 Java 迁移到 Kotlin 的奇妙体验,代码行数减少

英文学习AppDuolingo(多邻国)的Android版最初是使用Java开发的 , 并一直沿用了5年 。 两年后 , 它变成了100%的KotlinApp!从代码可维护性和开发者满意度方面来看 , 这次迁移是一个巨大的成功 。 网上已经有很多Kotlin的学习资源 , 所以在这篇文章中 , 我们将重点介绍如何将一个有百万用户的App迁移到Kotlin 。
「科技小辛辛」30-90%!多邻国从 Java 迁移到 Kotlin 的奇妙体验,代码行数减少
文章图片
为什么选择Kotlin
2018年初 , 我们开始考虑使用Kotlin , 当时Android对Kotlin的支持还不到一年时间 , 而且不知道Kotlin会像现在这样流行 , 也不知道它会取代Java成为Android的开发首选语言 。
我们当时的主要预期:
生产力 。 Kotlin比Java要简洁得多 , 编写Kotlin代码速度更快 , 维护起来也更容易 。 它与Java的无缝互操作性以及添加语言新特性的方式让Android开发者可以轻松上手 。 稳定性 。 我们的代码库历史记录中有100多次提交都与“修复NullPointerException问题”有关 , 这些问题都来自Java代码 。 Kotlin的Null安全特性避免了大部分NullPointerException , 让我们在代码评审期间可以更多地关注其他问题 。 开发者满意度 。 StackOverflow发布的2018年度开发者编程语言报告表明 , Kotlin是开发者最喜爱的编程语言之一 , 仅次于Rust 。 我们的开发人员已经对公司内部另外两个主要平台的语言升级做出了积极的反应:在iOS应用程序中使用Swift , 以及使用TypeScript完全重写了duolingo.com 。当然 , 迁移也存在一些风险 , 主要是开发人员的时间成本问题 。 另一个担忧是Kotlin是否会像CoffeeScript一样 , 最后可能会被它的“影子”语言打败 。
最后 , 我们的Android开发人员一致认为 , Kotlin的好处很有价值 , 足以证明使用Kotlin开发新代码是合理的 , 尽管我们还没有准备好全面迁移所有的代码 。
让开发人员跟上进度
Duolingo的所有Android开发人员每两周开一次例会 , 讨论最近和即将做出的平台变更和非正式的事后分析 , 并进行问答 。 前期的会议专门介绍Kotlin , 内容主要基于Kotlin官方语言指南、KotlinKoans、Android官方文档和MindOrks备忘单 , 等等 。
然后 , 每个Android开发人员都分配到一些Java代码 , 负责将它们迁移到Kotlin 。 我们让相对有Kotlin经验的开发人员担任“Kotlinchecker”角色 , 让他们在代码评审期间分享最佳实践 。 这个角色的人数逐步增加 , 直到所有的Android开发人员都包含在内 。
Kotlin相关的开发工具
从一开始 , 我们就对Kotlin工具进行容器化 , 并在代码预提交和GitHub拉取请求状态检查中强制使用 , 以此来确保代码的一致性 。
我们使用detekt、IntelliJInspection、Androidlint和我们自己开发的基于正则表达式的Splinter来检查所有的Kotlin代码 。
在代码自动格式化方面 , 我们在公司范围内使用了ktlint , 将其作为代码预提交hook的一部分 。 另一个工具是IntelliJFormatter , 不过我们发现它在Docker中运行会慢一些 。
在将Java代码减少到只有10%的时候 , 我们从CI管道中移除了PMD、SpotBugs和大部分检查工具 。 继续使用这些Java工具将会降低我们的开发速度 , 而且不会为我们提供太多的价值 。
转换Java代码
为了让代码转换的评审工作尽可能轻松 , 我们建议每个源文件的拉取请求至少包含三个单独的提交:
运行IDE的自动转换器 。 这个提交会造成代码行错乱 , 但不需要仔细检查 , 因为对于运行时来说通常是安全的 , 尽管可能会引入编译时错误 。 修复编译错误 。 这些修复通常很容易进行 , 例如 , 在必要时添加@JvmStatic注解 。 重构 。 开发人员需要重构代码 , 让代码更符合Kotlin的习惯 , 例如使用sumBy而不是for循环 。我们发现 , 将Java文件转换成Kotlin后 , 行数平均减少了30%左右 , 在某些情况下甚至减少了90%!


推荐阅读