Duolingoは2年間にわたって、Javaで記述されたAndroidアプリの100パーセントKotlinへのマイグレーション作業を続けてきた。このマイグレーションによるおもなメリットは、開発者の生産性と幸福度の向上に加えて、Duolingoアプリがnullポインタ例外(NPE)からほぼ解放されることにある。DuolingoのAndroidおよびWeb開発リーダであるArt Chaidarun氏に、同社の経験について詳しく聞いた。
GoogleがKotlinをAndroid開発の推奨言語にしたことから、JetBrainsのこの言語は、その現代的な機能セットとも相まって、ますます多くの開発者の関心を集めるようになっている。言語学習プラットフォームの開発で成功を収めたDuolingoは、2018年に、生産性、安定性、開発者の幸福感の向上を目標として、Android開発をKotlinに移行する決定を下した。
同社でAndroidとWeb開発のリーダを務めるArt Chaidarun氏の説明によると、Kotlinへの移行は、個々の開発者がJavaコードをKotlinに移植し、Kotlinを経験した開発者をメンターシップの役割にアサインすることから始まった。注目に値するのは、Kotlinへの転換をできる限り管理の容易なものにするためにDuolingoのエンジニアが定義した、プルリクエストワークフローだ。具体的には、変換するソースファイル毎に、開発者は少なくとも3つのプルリクエスト(PR)を発行する必要がある — IntelliJの自動変換の結果を収めたひとつめのPR、自動変換で発生したコンパイルエラーを修正したふたつめのPR、よりKotlinらしいコードに変更した3つめのPRだ。
Chaidarun氏の説明では、Kotlinに変換することによってソース行数を平均30パーセント、最大では90パーセント、削減することができたという。その結果、Duolingoアプリの安定性は大幅に向上し、NullPointerException
やIllegalArgumentException
のほとんどは、Kotlinコンパイラのnullabilityアノテーションを適用していないサードパーティ製の依存関係からのものになった。Chaidarun氏に、同社の経験について詳しく聞くことにした。
InfoQ: アプリケーションを別の言語に移行するのは、あらゆる面から大変な作業です。今回の取り組みの成功に最も貢献したプラクティスは何だったと思いますか?
Chaidarun: 最大かつ唯一の成功要因は、選択した言語です。KotlinのJavaとの親和性には、開発者が容易に学べたこと、IDEAによるJavaからの自動変換が簡単であったこと、という2つの意味がありました。JavaからScalaへの変換やObjective-CからSwiftへの変換では、こうは行かないでしょう。JavaからKotlinに変換するためのツーリングパーティ(フォーマッタやリンタ)が最初から揃っていたことも重要でした。これによって一貫性が保てましたし、切り替えコストを削減することができました。
InfoQ: JavaからKolinへの自動変換については、使い心地はどうでしたか?一番多く発生したのは、どのような問題だったのでしょう?
Chaidarun: IntelliJの自動変換は今回の作業で重要な働きをしました — これがなければ、変換しようとは思わなかったかも知れません。驚くほど安全で、問題が発生したのはリフレクションに関する極めてレアなケースだけでした。最も共通的な問題は、Javaによる呼び出し側との互換性を確保するために、変換後のコードに
@JvmField
と@JvmStatic
というアノテーションを手作業で付けなければならなかったことです。ただし、作業としては単純でした。
InfoQ: 開発者の満足度を向上できたおもな要因について、概要を教えて頂けますか?
Chaidarun: プロパティやデータクラスなどの機能、標準ライブラリの拡張メソッドは、Javaに比較して、KotlinのSN比を非常に高いものにしてくれています。コード作成も容易ですし、書くのも、レビューするのも早くなります。
詳細な内容に興味があるならば、DuolingoブログのChaidarun氏のレポートを読んでほしい。