ニュースパスでのKotlinの導入

この記事はGunosy Advent Calendar 2017の19日目の記事です。
昨日は記事は @ysekkyさんの [自然言語処理×ジャーナリズムな研究まとめ ~ EMNLP2017 Workshopより ~](http://data.gunosy.io/entry/nlp-for-journalism-17) でした。

こんにちは。ニュースパス開発部の@kazuhiro23です。

ニュースパスではAndroidを担当しています。
Android歴は２年ほどになります。
フジロックとキャンプとスノボとうまいものとお酒が好きです。

この記事ではニュースパスでのKotlinの導入について紹介したいと思いますが、ゆるふわな内容です。

## Kotlin
もはや説明も不要かと思いますが、簡単に説明します。

KotlinとはJetBrainsが中心となって開発したJVM上で動くプログラミング言語です。
2011年に発表され、2017年のGoogle I/OでKotlinをAndroidアプリ開発言語に選定されました。

特徴として

- JVM上で動く
- Javaよりも簡潔に書ける
- Null参照に対する安全性
- 静的型付けかつオブジェクト指向

といったところがあります。

## ニュースパスでKotlinを導入する前の状況
ニュースパスは2016年６月にリリースされたのですが、当時Kotlinの導入は見送られJavaで開発されました。
私がニュースパスにジョインしたのが2016年12月で当時からまわりのAndroidエンジニアでKotlinを使ってる人も増えてきていました。
自分もKotlinには興味があったにですが、まだ実務での経験はありませんでした。
グノシーではぼくが入社したときからKotlinがすでに導入されていて、「ニュースパスでもKotlin入れてみたいね。」みたいな話は出たりしていました。

## ではどうやって導入したのか
入社（2016/12/16）から３ヶ月経ってだいぶ慣れてきた段階で、ちょっとした簡単な修正のPRでしれっとKotlinを導入しました。
これがそのときのコミット↓2017/3/16なのでちょうど３ヶ月後（これはたまたま）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/46681/36f53935-a10f-fb3b-3628-db97bee882a4.png)

既存のJavaプロジェクトにKotlinを使えるようにするには `app/build.gradle` と `build.gradle` にこんな感じに追加してあげれば使えるようになります。

```app/build.gradle
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'

sourceSets {
    main.java.srcDirs += 'src/main/kotlin'
}

dependencies {
    kapt 'org.parceler:parceler:{latest_version}'
    kapt 'com.android.databinding:compiler:{latest_version}'

    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
```

```build.gradle
buildscript {
    ext.kotlin_version = 'x.x.x'
    dependencies {
       
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
```
グノシーではすでにKotlinが導入されている状況もありましたし、なにかあったらJavaに戻せばいいやという感じで、「Kotlin入れてみました！レビューお願いします！」って感じでPRを出しました。
もちろん当時はそんなにもKotlinの知識がなかったのでグノシーチームのAndroidエンジニアにもレビューしてもらってKotlin的な書き方を覚えていきました。

## 現在のニュースパスでのKotlin
22%ほどがKotlinになっています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/46681/919ad31f-a5c3-95bb-38c9-c95b34203bfb.png)

ニュースパスチームではKotlin化のルールとして

- 新規クラスはKotlinで書く
- あまりに大きくないクラスはKotlinに置き換えてもOK

といった感じで進めていっています。
しかしやはり既存のクラスをKotlinに書き換えて機能の追加を入れるとレビューがしにくくなると思うので、Kotlin化したいときは一旦Kotlinに変換しただけのPRを出してから他の部分を修正 or 新機能の追加をするようにしています。

## Kotlinの勉強会に参加しよう
社内に他にAndroidのエンジニアがいなかったり、Kotlinが書ける人がいないとKotlin力をあげるには、ネットか技術書に頼るしかありません。

そこで、勉強会です。日本Kotlinユーザグループの勉強会やCA.ktなどがあるのでそこでトレンドや今まで知らなかったことが知れたりするので積極的に参加していくのがいいと思います。
またKotlinはAndroidだけでなく、サーバーサイドでも使われているので、Kotlinの勉強会にいくと様々なエンジニア参加しているので、そういうところも面白いコミュニティだと思います。

## Kotlinを導入してよかった点
特徴としてあげた

- Javaよりも簡潔に書ける
- Null参照に対する安全性

この２つがやはり大きいです。 

```Hoge.java
if (hoge != null) {
    hoge.getXX();
}
for (Foo foo: fooList) {
    if (foo.flag) {
        barList.add(foo);
    }
}
```
と書いていたのがKotlinだと

```Hoge.kt
hoge?.getXX()
fooList.filter { it.flag }.map { barList.add(it) }
```
みたいにこんなにすっきりになったりします
ニュースパスでKotlinで書かれてるところはfor文は使ってないです。（たぶん）

あとは私はずっとJavaで開発していたこともあり、新しい言語で書くのは新鮮で楽しいです。

## Kotlinを導入してわるかった点
あまりわるかったところはないのですが、JavaとKotlinが混在してるので変数と型の書き方が逆だったりして、「そういえばこっちKotlinだった。。。」、「そういえばこっちJavaだった。。。」みたいなところで疲弊することはあります笑
これは早く全部Kotlinで書き換えれば問題ないのですが、人が足りないのでしばらくはこの状況が続きそうです。

## GunosyでのKotlin
Androidアプリのあるグノシー、ニュースパス、LucraはすべてKotlinが使われています。
Lucraは100%Kotlinで開発されていて、これからの新規プロジェクトはKotlinで進めていきます。
また一部サーバサイドKotlinも使われ始めていて、この前弊社のGitHubリポジトリでTop LanguagesにKotlinが入りました！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/46681/cdf83f53-9218-794d-e1b2-21721092e60d.png)

GunosyではKotlinのリポジトリがいま12個ほどあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/46681/9e2e6413-8c5c-7e02-922e-6e6bb118ca30.png)


## まとめ
Androidのいろんな勉強会でもどうやって導入したのかみたいなネタは多いかと思いますが、結構エイヤーで導入してるところが多いかと思います。
会社によってはいろんなプロセスを経ないと導入できないみたいなとこもあるかもしれませんが、そうじゃないところはサクッとKotlin導入しちゃいましょう！
Kotlin楽しいですよ！！