写点什么

Duolingo 如何将 Android App 全部迁至 Kotlin

  • 2020-04-24
  • 本文字数:1171 字

    阅读完需:约 4 分钟

Duolingo如何将Android App全部迁至Kotlin

在过去的两年中,Duolingo将其全部Java Android App无缝地迁移到Kotlin。它带来的主要好处包括提高了开发人员的工作效率和幸福感,而 Duolingo App 几乎再也没有出现空指针异常(NPE)问题了。为了了解他们的迁移经验,InfoQ 与 Duolingo Android 和 Web 开发负责人 Chaidarun 进行了交流。


自从谷歌宣布将Kotlin作为Android开发首选语言后,得益于其现代化的特性集,JetBrains的这门语言吸引了越来越多的开发商。2018 年,为了提高生产率、稳定性和开发人员的幸福感,Duolingo(语言学习平台开发商)决定将 Android 开发迁移到 Kotlin。


正如 Duolingo Android 和 Web 开发负责人 Art Chaidarun 所解释的那样,向 Kotlin 的转换始于每个开发人员将一些 Java 代码移植到 Kotlin,并由更有经验的 Kotlin 开发人员承担导师角色。特别值得注意的是,Duolingo 工程师定义了 pull 请求工作流,尽可能简化转换过程中的管理工作。具体来说,对于每个转换后的源文件,开发人员需要生成至少三个 pull 请求:第一个 PR 包含 IntelliJ 自动转换的结果;第二个 PR 包含对自动转换所引入的编译错误的修复;第三个 PR 包含使代码更符合习惯的更改。


根据 Chaidarun 的说法,转换到 Kotlin 后,代码行数减少了约 30%,最多的减少 90%。最终,Duolingo App 的稳定性得到了极大改善,大多数 NullPointerExceptions 和 IllegalArgumentExceptions 都来自第三方依赖项,它们没有采用 Kotlin 编译器的可空注解。为了了解他们的迁移经验,InfoQ 采访了 Chaidarun。


InfoQ:将 App 迁移到另一种语言需要付出巨大的努力。您认为使这一努力获得成功的关键实践是什么?


Art Chaidarun:最重要的一个因素是语言的选择:Kotlin 与 Java 非常相似,也就是说,它既便于开发人员学习,也便于 IDE 自动转换 Java 代码。然而,将 Java 转换成 Scala 或将 Objective-C 转换成 Swift 时,情况就不太一样了。同样重要的是,我们从一开始就对照 Java 工具准备好了相应的 Kotlin 工具(格式化器和代码分析器),这加强了一致性并降低了切换成本。


InfoQ:请您介绍下从 Java 自动转换到 Kotlin 的经验?您最常遇到的问题是什么?


Chaidarun:IntelliJ 的自动转换器是这项工作的关键——如果没有它,我们甚至都不会尝试迁移。它非常安全,只在与反射相关的非常罕见的情况下才会导致运行时问题。最常见的问题是,为了兼容 Java 调用程序,我们必须手动将 @JvmField 和 @JvmStatic 注解添加到转换后的代码中,但这个事情做起来不难。


InfoQ:您能总结一下提高开发人员满意度的主要因素吗?


Chaidarun:与 Java 相比,属性、数据类和标准库扩展方法等特性极大地提高了 Kotlin 的信噪比,使得编写和检查代码变得更容易、更快速。


如果你对细节感兴趣,可以看下 Chaidarun 在 Duolingo 博客上的报道。


原文链接:


How Duolingo Migrated its Android App to 100% Kotlin


2020-04-24 09:002070

评论

发布
暂无评论
发现更多内容

2021年Android程序员职业规划,Android开发技巧

android 程序员 移动开发

linux之xargs使用技巧

入门小站

Linux

Zookeeper 客户端错误:Packet len8854970 is out of range!

看山

zookeeper 10月月更

第 22 章 -《Linux 一学就会》- 跳出循环-shift参数左移-函数的使用

学神来啦

Linux linux运维 linux云计算 linux一学就会

解密诡异并发问题的幕后黑手:可见性问题

华为云开发者联盟

并发编程 线程 并发 可见性 单核CPU

Python代码阅读(第43篇):构造组合函数

Felix

Python 编程 Code Programing 阅读代码

2021年GitHub上那些优秀Android开源库总结,花2万块买的教程

android 程序员 移动开发

央行数字货币已落地,来的太快,机遇在哪?

CECBC

看了CopyOnWriteArrayList后自己实现了一个CopyOnWriteHashMap

root

Java 程序员 CopyOnWrite;

Prometheus 内置函数(一)

耳东@Erdong

Prometheus 10月月更

你真的会 Prometheus 查询吗?--PromQL 合集

耳东@Erdong

Prometheus PromQL 10月月更

在 pygame 中好好玩玩精灵,滚雪球学 Python 游戏番

梦想橡皮擦

10月月更

Apache APISIX 助力有赞云原生 PaaS 平台,实现全面微服务治理

API7.ai 技术团队

云原生 PaaS API网关 Apache APISIX

2020-2021蚂蚁金服Android面试真题解析,使用指南

android 程序员 移动开发

2021年Android大厂面试分享,实战篇

android 程序员 移动开发

Java8 Lambda表达式与Stream

风翱

Lambda 10月月更

Vue进阶(幺肆伍):Vue-elementUI实现操作栏位更多效果

No Silver Bullet

Vue 10月月更

DeFi智能合约DAPP系统开发公司(现成)

2021年Android春招面试经历,阿里秋招面试真题解析

android 程序员 移动开发

2021年Android高级面试题,成功入职字节跳动

android 程序员 移动开发

2021年大厂程序员进阶宝典,Android开发基础面试题

android 程序员 移动开发

在线字符串长度计算,字符串统计工具

入门小站

工具

全球6G专利独占4成,中国能否借此“制霸”元宇宙?

海比研究院

架构实战营-模块一

瓜子葫芦侠

「架构实战营」

谈 C++17 里的 Chain of Responsibility 模式

hedzr

设计模式 Design Patterns 职责链模式 c++17 消息分发

Vue进阶(幺肆肆):(window,parent,opener,top).location.reload方法分析

No Silver Bullet

Vue 页面刷新 10月月更

Go 中如何使用结构体标签

baiyutang

golang 10月月更

Defi挖矿系统开发简介(现成案例)

Groovy动态添加方法和属性及Spock单测

FunTester

Java 动态 spock Groovy FunTester

阿里云边缘云ENS再升级 产业数字化落地向何方?

阿里云Edge Plus

REST API 设计:过滤、排序和分页

devpoint

REST API 10月月更

Duolingo如何将Android App全部迁至Kotlin_移动_Sergio De Simone_InfoQ精选文章