Duolingo 使用 MVVM 和 Jetpack 库在 Android 上进行重构

Duolingo 是世界上最受欢迎的语言学习应用程序,因为它成功地使过去人们认为令人生畏的事情变得轻松有趣。这种轻松的语言体验需要源源不断的全新功能和实验,以及能够交付所有这些功能的流畅运行的应用程序。对于 Duolingo 来说,任何地方的设备上的无响应应用程序都可能意味着潜在的学习者会感到沮丧。这使他们致力于应用程序卓越,特别是在 Android 设备上,这些设备被他们 60% 的学习者使用,包括他们的首席执行官,他一直在跟踪来自入门级手机的应用程序。因此,当 Duolingo 的 Android 开发团队注意到“应用程序无响应”错误增加、帧速率下降,甚至收到手写投诉时,他们立即采取了行动。

他们很快发现了应用程序性能问题的根源:现有的软件架构无法随着团队的壮大而扩展。必要的更新导致应用程序出现了令人痛苦的性能倒退。他们的开发人员将更多时间花在修复错误上,而不是发布新的创收功能。他们过时的软件架构开始成为不可接受的拖累——对他们自己、团队速度,最重要的是对用户体验。他们需要从头开始重建他们的代码库。

他们是怎么做到的

一开始,团队很矛盾。现在这应该是他们的首要任务吗?一组人认为继续发布新功能和推动收入更为重要,而另一组人则认为将所有注意力集中在 Android 重启上才是前进的道路。最终,他们达成共识,认为对抗倒退的不断增加的努力可能会完全破坏他们的路线图。他们必须全力以赴。

团队决定采用一种越来越流行的解决方案。他们决定使用 模型-视图-视图模型 (Model-View-ViewModel) 重写他们的应用程序,这是一种由 Google 支持的软件模式,允许开发者通过创建清晰的分层结构来简化应用程序的架构。通过 MVVM,他们可以将图形用户界面 (视图) 的开发与业务逻辑 (模型) 的开发分离。他们可以建立清晰且一致的模式,从而更容易地协调他们对新功能的方法,并让新加入的开发者快速上手。

将每个功能分解成独立的模块化部分,使团队能够快速恢复生产力,因为他们可以分配小团队并行地处理每个功能,从而提高速度并减少错误。

他们使用来自 Android 的 Jetpack 的库来实现这种新的架构,包括 DaggerHilt,帮助他们编写在 Android 版本和设备之间始终如一的代码。这两个新增功能使他们能够创建更好的封装功能,并 更有效地利用 Android 的内置模块

结果

这些性能提升显著改善了学习者在 Android 上,特别是入门级设备上的体验。它们还使应用程序响应速度更快,在旗舰设备上动画更流畅。应用程序每天的“应用程序无响应”或 ANR 率下降了 41%。应用程序低于目标帧速率的时间百分比下降了 28%。最重要的是,用户在滚动关键屏幕时速度提高了 40%。

手持笔记显示 ANR 减少了 41%,帧速率提高了 28%,体验速度提高了 40%。


整个重启过程耗时八周,使应用程序对于所有 Duolingo 学习者来说更具吸引力和愉悦感。在过去六个月中,团队没有记录到任何重大性能倒退,这使他们能够重新专注于发布创收功能。将团队的精力集中在质量上的决定得到了回报。

Duolingo 对其使命的奉献使他们成为全球语言学习领域的顶级应用程序。他们对应用程序卓越的承诺——在不影响可访问性的情况下创造尖端的教育体验——是他们保持领先地位的原因。

开始

如果您想深入了解 Duolingo 如何集成 Jetpack 的库以及 Model-View-ViewModel 如何改进他们的应用程序,请阅读我们的 技术案例研究,该研究面向开发者。