自プロダクトにKotlin導入するためにやったことの紹介です。(LT用資料も兼ねてます)
主にマネージャー層(技術リーダーやPMなど)に説明するときに用意した資料の一部+αになります。
はじめに
チーム、プロダクトの規模や文化などによってやり方も変わってくるので、この内容やればうまくいくという話ではないです。
導入の流れ
- PJメンバーにやっていき度合いをヒアリング
- 説明(今日話すところ)
- 背景説明
- 技術説明
- 質疑応答
- 規約整備など
- PR
Kotlinとは
KotlinはIntelliJを作っているJetBrainsが開発したオブジェクト指向プログラミング言語。
package hello
fun main(args: Array<String>) {
println("Hello World!")
}
(Javaの場合)
package hello;
public class Foo {
public static void main(String[] args){
System.out.println("Hello, world.");
}
}
背景説明
Google I/O 2017でKotlinがAndroid開発言語として発表(First Class Language)
Keynoteの言及されていた内容抜粋
- 開発者の生産性を高めることが出来る
- Androidのランタイムとの完全な互換性があり、既存のコードと相互運用可能
- IDEによるサポート
- 言語が成熟し製品版としてリリース可能な状態
KeynoteのKotlin発表時の盛り上がりを見せて感情に訴えかける
技術説明(どういったメリットがあるか)
- メリットその1
- Androidの開発言語の標準としてKotlinが採用されている
- 公式の開発環境(IDE)であるAndroidStudioもKotlinをサポートしている
- 既存のJavaプロジェクトと共存が可能(部分的なKotlin導入が可能)
- Android Studio上でのKotlinを用いたアプリ開発は十分生産的
- メリットその2(言語的な特徴)
- Stream的なリスト操作が容易
- Optionalが使える
- Javaよりもコードが簡潔
- Null Safety
- デメリット
- 学習コスト
- ビルド時間が少し増える(型推論のコードが増えてくるとビルド時間も増えてくらしい)
- APKサイズが少し増える(大体0.5MBくらい)
想定問答(学習コスト)
Q. 学習コストどうするの?
A. 個人アプリ開発でカバーします。
Q. 新規メンバーきたときの学習どうするの?
A. https://try.kotlinlang.org/ などをやってもらいます。
公式リファレンスが詳しいですが、Kotlin入門までの助走読本 という無料公開されている日本語のドキュメントもあります。
想定問答(移行)
Q. 具体的にどうやって移行していくの?
A. 既存コードの移行はせずにまずはテストコードのみKotlinで書いていきます。その後慣れてきたら適用範囲を広げるかを再検討します。
(現在は新規部分もKotlinで書いてます)
Kotlinへの移行方法とメリットデメリットについてはKotlin入門までの助走読本 のp.60の「2.3 Java から Kotlin への移行」の項目に詳しく書いてあります。
- 混在させるパターン(新しいコードをKotlinにする)
- 境界を設けるパターン(テストから導入する、ライブラリーを Kotlin で書いて導入する)
- 置き換えるパターン(プロジェクト全体を一気に Kotlin に置き換える)
以下、Kotlin入門までの助走読本から一部引用 & 整形
- 新しいコードをKotlinにするパターン
- メリット
- 追加や変更のほとんどを Kotlin で行うことになるので、チームは常に Kotlin に触れ続けることになる。
- Kotlin でどのように書くかについて考えたり議論したりしやすいので、学習の効率は良い。
- また、プロダクションコードにおいて Kotlin の価値をすぐに享受でき、変更すればするほどKotlin 化が進んで移行の負担が下がっていく。
- デメリット
- 変更対象を Kotlin 化することで影響を受ける箇所が多数存在する場合、コンフリクトのリスクが高まり並行作業に影響が出やすい。
- またJava との連携部分についても意識を向ける必要があるため、壊れないようにメンテナンスするコストが増大する。
- レビューにおいて Kotlin と Java の両方を読むことになるのでレビュアーの負担は増大する。
- また Kotlin 化を進めるなかで複雑過ぎて Kotlin 化できない領域が発生し、完全な Kotlin 化になかなか至らない可能性が高い。
- メリット
- テストから導入するパターン
- メリット
- プロダクションコードに Kotlin を含めないので、もし壊れたとしても安全。
- 大胆に導入が可能となり、学習の効率は良い。
- テストコードにおいて Kotlin の価値をすぐに享受でる。
- デメリット
- プロジェクト全体で見ると Java と Kotlin が混在していることに変わりはなく、レビューの負担は高まる。
- また、テストとプロダクションコードで Kotlin と Java をスイッチして考える必要があるので負担が高く、だんだんテストを書かなくなってしまうといったリスクが考えられる。
- いきなり混在して書くアプローチよりは大分まとも。
- テストの他に分割したモジュールを Kotlin で書くといったことも考えられる。
- どちらかというと学習が主な目的となり、置き換えは別のアプローチを検討することになる。
- メリット
- ライブラリーを Kotlin で書いて導入するパターン
- メリット
- 独立して開発をするので、テストから導入するケースに比べてさらに自由度が増す。
- プロジェクト全体が Kotlin なので、開発中は Kotlin に集中できる。
- デメリット
- ライブラリー化すべきテーマを適切に探すのは簡単ではない。
- ライブラリーを利用するプロダクションコード側は Java なので、Java からKotlin を利用する際の注意点に対処する必要がある。
- ライブラリーが完成するまでにある程度時間がかかるので、プロダクション側で恩恵を受ける距離は少し遠い。
- ライブラリーを一部の人が書くといった状態になると学習に偏りが生じる。
- メリット
- プロジェクト全体を一気に Kotlin に置き換えるパターン
- メリット
- 他の方法に比べると最短で Kotlin への移行ができる。
- Java と混在するケースのように Java から Kotlin を呼び出すケースを考える必要がないので、その分のメンテナンスコストはなくなる。
- デメリット
- 学習を想定していないので、チームがすでに Kotlin を使いこなせるか、圧倒的にリードする人間が必要になる。
- 現実的には、テストやライブラリーに Kotlin を導入して学習をし、その後一気にプロダクションコードを置き換えるという戦略が一番コストが低そう。
- メリット
想定問答(コーディング)
Q. コーディング規約どうするの?
A. FRESHのコーディング規約 を参考にさせていただく。
また、色々な書き方ができるため Idiomatic Kotlin. Best Practices. を参考にしつつ都度話し合って決めます。
まとめ
開発者としては最終的には品質の高いプロダクトを早くリリースすることが目的の一つなので、それを実現するためにKotlin導入することによる効果が伝われば納得してもらいやすいです。
参考
Kotlin Programming Language
https://kotlinlang.org/
Google I/O Keynote (Google I/O '17) - YouTube
https://www.youtube.com/watch?v=Y2VF8tmLFHw
Developer Keynote (Google I/O '17) - YouTube
https://www.youtube.com/watch?v=EtQ8Le8-zyo
Kotlin and Android | Android Developers
https://developer.android.com/kotlin/index.html
Kotlin on Android. Now official | Kotlin Blog
https://blog.jetbrains.com/kotlin/2017/05/kotlin-on-android-now-official/
openfresh/android-kotlin-style-guide: Kotlin style guide of FRESH! since April, 2015.
https://github.com/openfresh/android-kotlin-style-guide