MVVM と Jetpack ライブラリを使用して Android で Duolingo をリファクタリング

Duolingo は、世界で最も人気のある言語学習アプリです。Duolingo は、過去に不可能だと思ったことを簡単で楽しいものにすることが可能でした。この心地よい言語体験を実現するには、新しい機能と実験が絶えず与えられることと、そのすべてを提供できるスムーズ実行アプリが必要です。Duolingo で、世界中のどのデバイスでもアプリが反応しないというのは、学習者のやる気を失うことになりかねません。これにより、学習者の 60% が使用している Android デバイスで優れたアプリを提供できるようになります。CEO はエントリー レベルのスマートフォンからアプリを追跡しています。そこで、Duolingo の Android 開発チームは、「アプリから応答しない」エラーの増加に気づき、フレームを落とし、さらには手書きの苦情を受け付けて、ただちに対策を講じました。

すぐにアプリのパフォーマンスの問題の原因が明らかになりました。既存のソフトウェア アーキテクチャがチームの成長に合わせてうまくスケーリングできていないというものでした。必要な更新がアプリのパフォーマンス低下を引き起こしました。開発者は、バグ修正に多くの時間を費やし、収益を生み出す新機能のリリースに多くの時間を費やしていました。同社の古いソフトウェア アーキテクチャは、自分たちにとっても、チームのスピードと、そして何よりもユーザー エクスペリエンスにとって、受け入れがたい抵抗になり始めていました。コードベースを一から再構築する必要がありました。

実現手法

最初はチームが混乱し、本件を現時点で唯一の優先事項とするべきでしょうか?一方のグループは、新機能を継続的にリリースして収益を上げることのほうが重要であると感じ、もう 1 グループは、Android の再起動に全力を注ぐべきだと考えていました。最終的には、回帰対策の取り組みの増大が、ロードマップを完全に逸脱するリスクがあるというコンセンサスにたどり着きました。全力を尽くさなければなりませんでした。

そして、人気が高まっているソリューションに決着しました。そこで、Model-View-ViewModel を使用してアプリを書き換えることにしました。このソフトウェア パターンは Google がサポートするソフトウェア パターンで、これによりデベロッパーは懸念事項を明確に分離することで、アプリのアーキテクチャを効率化できます。MVVM を使用すると、グラフィカル ユーザー インターフェース(ビュー)の開発とビジネス ロジック(モデル)の開発を分離できます。明確で合意されたパターンを確立できるため、新機能に対するアプローチの調整と今後のデベロッパーのオンボーディングの両方が容易になります。

各機能を個別のモジュール方式にしたことで、少人数のグループを割り当てて各機能を並行して作業できるようになったため、チームは迅速に生産性を取り戻すことができました。その結果、作業速度が向上し、エラーが減少しました。

そこで、Android の Jetpack ライブラリ(DaggerHilt など)を使用してこの新しいアーキテクチャを実装し、Android のバージョンやデバイスを問わず一貫して動作するコードを記述できるようにしました。この 2 つの追加により、カプセル化された機能を改善し、Android の組み込みモジュールをより効率的に活用できるようになりました。

結果

これらのパフォーマンスにより、Android、特にエントリレベルのデバイスでの学習者のエクスペリエンスは大幅に向上します。また、主力デバイスでは、アプリの応答性が向上し、アニメーションがより滑らかになりました。1 日の「アプリから応答なし」または ANR 発生率が 41% 低下しました。アプリが目標フレームレートを下回った時間の割合が 28% 減少しました。特に重要なのは、主要な画面をスクロールする際の速度が 40% 上昇したことです。

持ち手のメモでの ANR が 41% 減少し、フレームレートが 28% 向上し、エクスペリエンスが 40% 高速化。


全体の再起動は 8 週間で完了し、Duolingo の学習者全員にとって、アプリの魅力と満足度が大幅に高まりました。それ以来 6 か月間、大きなパフォーマンスの低下は見られず、収益を生み出す機能の開発に再び注力できるようになりました。品質に重点を置くという決断は実を結び、

その使命を果たすための Duolingo は、言語学習分野で世界最高のアプリになりました。ユーザー補助を犠牲にすることなく最先端の教育体験を生み出すという、優れたアプリへの取り組みが、同氏を支えています。

始める

Duolingo で Jetpack のライブラリを統合した方法や、Model-View-ViewModel がアプリをどのように改良したかについて詳しく知りたい場合は、デベロッパー向けの技術的な事例紹介をご覧ください。