功能更强,代码和错误更少!Duolingo 和 Google Home 的 Kotlin 之旅

功能更强,代码和错误更少!Duolingo 和 Google Home 的 Kotlin 之旅

应用大受欢迎,团队肯定备受鼓舞,于是决定把最棒的创意和功能添加进应用中,然后用户们会更加满意,如此循环……然而如此美妙的图景在现实中会遇到 "现实的问题":

  • 代码量陡增,以及随之而来的开发和维护成本
  • 代码中的错误也随之增加,进而造成应用的崩溃数量增加

让我们看看 Duolingo 和 Google Home 是如何解决这些问题的。

从 Kotlin "检查员" 到 "专家"

Duolingo 是世界上最受欢迎的语言学习平台之一,也是 Google Play 上下载量最高的免费教育应用之一 (已突破 2 亿),为超过 3 亿名学习者提供可免费使用的语言学习服务。

随着应用自身的演进,Duolingo 的 Android 开发者发现代码库的代码行数每年增长 46% 之多!为彻底解决这个问题,团队最终一致决定从 Java 迁移至 Kotlin。

该团队发扬了真正的 Duolingo 风格,通过开展每日排行榜竞赛并鼓励学习,让迁移过程充满游戏乐趣 (没错,和他们在 Duolingo 应用中引入的游戏化思想如出一辙)。该团队中经验丰富的 Kotlin 开发者担任 "Kotlin 检查员" 角色,并分享代码审核方面的最佳做法,最终该团队的所有 Android 开发者都成为了 Kotlin 专家。

代码量平均减少 30%

两年后,Duolingo 团队完成了迁移工作,代码的可维护性得到显著提升。他们发现, 将 Java 文件转换为 Kotlin 文件后,代码行数平均减少了 30%,某些情况下高达 90%

△ Duolingo 代码量随时间的变化,绿色为 Kotlin

△ Duolingo 代码量随时间的变化,绿色为 Kotlin

总体而言,在迁移到 Kotlin 后,我们非常满意,也很高兴看到 Kotlin 在我们公司和整个软件行业中的使用率不断增长!

—— Art Chaidarun,资深高级软件工程师

尽管有了新的产品功能,活跃贡献者的数量增加了一倍以上,但他们的代码库规模几乎与两年前未迁移时一样,这证明这一决策带来了不错的投资收益。此外,内部问卷调查显示他们的  NPS 提升了 129 个点,开发者满意度跃升 ,开发者认为是采用 Kotlin 起到了主要作用。现在,他们的 Android 应用完全使用 Kotlin 代码库,这让他们可以更加放心、高效地开展工作。

Google Home 逐步引入 Kotlin

Google Home 应用 可帮助您设置、管理和控制您的 Google Home、Google Nest 和 Chromecast 设备以及数千种智能互联家居产品 (如灯具、摄像头、恒温器等等)。其背后的工程团队使用 Kotlin 和 Android Jetpack 库来提升工程生产力和开发者满意度,这让他们受益良多。

团队决定将 Kotlin 整合到代码库中,以提升编程效率,并使用现代语言功能 (如 var/val、智能投射、协程等)。 截至 2020 年 6 月,30% 左右的代码库是使用 Kotlin 编写的 ,且建议使用 Kotlin 来开发所有新功能。

该团队还采用 Jetpack 库来提高开发者的速度、降低对样板代码维护的需求并减少代码量。Jetpack 库还有助于提高代码的可测试性,因为有更清晰的功能边界和 API。

最常见的崩溃直降 33%

Kotlin 可助您提高工作效率,让您编写更少的代码来实现更多的功能,这就是您可实现的 "速度" 提升。

—— Jared Burrows,Google Home 的软件工程师

与等效的现有 Java 代码相比,改用 Kotlin 可以减少所需的代码量。例如,使用数据类和 Parcelize 插件:  一个在使用 Java 时需要手动编写 126 行代码的类,现在使用 Kotlin 只需编写 23 行,代码量减少了 80% 。此外,还可以自动生成并及时更新均衡和解析方法。使用 Kotlin 中提供的实用方法,还可以简化许多嵌套循环和过滤检查。

由于 Kotlin 可以将是否可为 null 作为语言的一部分,因此可以避免棘手的情况,例如在 Java 中不一致地使用是否可为 null 注释可能会导致遗漏错误。实现 Kotlin 后,Google Home 应用团队遇到的 NullPointerExceptions 减少了 33%。这是 Google Play 管理中心中最常见的崩溃类型,因此减少此类崩溃可以显著提升用户体验。

对于 Google Home 这样的大型成熟应用 (代码超过数百万行),能够逐步添加 Jetpack 库会很有帮助。纳入这些库后,该团队可以整合并替换量身定制的解决方案,有时甚至只需要一个库。Jetpack 库可帮助工程师遵循最佳做法,并且编写更简洁的代码 (例如,使用 Room 或 ConstraintLayout),因此可读性也有所提高。该团队将许多新的 Jetpack 库视为 "必备库",包括 ViewModel 和 LiveData,它们在 Google Home 代码库中得到广泛使用。

Google Home 应用团队发现将 Jetpack KTX 与 Kotlin 协程集成特别有用。该团队现在可以将协程与生命周期感知型组件 (如 ViewModel) 结合使用,从而避免复杂的异步编程错误。

上手 Kotlin,现在就是最佳时机

正如 Google Home 团队所说的,Kotlin 可以逐步添加进现有的项目,并带来更简洁的代码和更少的错误。由于 Jetpack 中诸如 Paging 3 等开发库已经优先使用 Kotlin 进行了重写,再加上正在如火如荼开发的 Jetpack Compose,开发者们在为应用构建界面、实现功能的时候会愈发事半功倍。

我们最近刚刚发布了 Kotlin 1.4,其中引入的诸多全新语言特性改善了编写 Kotlin 代码的 "人机工程学",更通过对编译器的改进提升了其整体质量和性能。

现在就是上手 Kotlin 的最佳时机,我们已经为您准备了 全新的课程,助力您开启 Kotlin 开发之旅。

版权声明

禁止一切形式的转载-禁止商用-禁止衍生 申请授权

脉脉不得语
脉脉不得语
Zhengzhou Website
Android Developer | https://androiddevtools.cn and https://androidweekly.io WebMaster | GDG Zhengzhou Funder & Ex Organizer | http://Toast.show(∞) Podcast Host

你已经成功订阅到 Android 开发技术周报
太棒了!接下来,完成检验以获得全部访问权限 Android 开发技术周报
欢迎回来!你已经成功登录了。
Unable to sign you in. Please try again.
成功!您的帐户已完全激活,您现在可以访问所有内容。
Error! Stripe checkout failed.
Success! Your billing info is updated.
Error! Billing info update failed.