コネヒト開発者ブログ

コネヒト開発者ブログ

Kotlin Fest 2018に行ってきました!

f:id:tommy_kw:20180830093312p:plain

こんにちは、Androidエンジニアの富田です。先日KotlinFest 2018というKotlinカンファレンスに参加してきましたので簡単に内容を共有したいと思います。

Kotlin Fest 2018とは

kotlin.connpass.com

KotlinFestとは「Kotlinを愛でる」をテーマに、Kotlinに関する知見の共有と、Kotlinファンの交流の場を提供する技術カンファレンスです。海外ではKotlinConfという約1300名規模のKotlinカンファレンスがありますが、それに負けないくらいの熱量を持ったカンファレンスでした。有難いことにこんな可愛いトートバッグも頂きました!

f:id:tommy_kw:20180826160254j:plain

発表内容

オープニングトーク(長澤太郎さん、藤原聖さん)

内容

  • Kotlinを愛でるをテーマに
    • 日々の開発、業務を楽しむ
    • Kotlinを盛り上げ
    • Kotlinは可愛い言語
    • みんなでKotlinを愛でる
  • 長澤太郎さんとKotlin
    • 6年前にKotlinと出会う
    • イベント、勉強会、執筆活動でKotlinに貢献
    • 日本Kotlinユーザグループの代表を務める
  • なぜKotlinFestを開催したのか
    • 「Kotlinのカンファレンスいつやるの?」とよく聞かれていた
    • 「俺がやらなきゃ誰がやる!!!」という思いに駆られ、昨年のDroidKaigiでKotlinFest開催をサプライズ発表した
    • 日本Kotlinユーザグループとして開催することを決定
    • コミュニティは生き物であり、スピーカー、スタッフ、運営、参加者などが支えるもの
  • Kotlinの哲学
    • 実用主義
    • 簡潔
    • 安全
    • 相互運用性
  • Kotlinを知るリソース

感想

今回のKotlinFestのテーマは「Kotlinを愛でる」。これは、Kotlin in Action本の原著に「Embracing Kotlin」と表現されていた箇所をわかりやすく日本語訳した意味になります。しかしKotlinを愛でるためには、Kotlinを知る必要があるため、KotinFestでKotlinを知って、さらに愛でようという思いが込められていました。「KotlinってAndroidで使うもの?」というイメージがあるかもしれませんが、Androidエンジニア以外の方にもKotlinを知ってもらうため、サーバサイドやKotlinを知るためのセッションが多く盛り込まれていました。昨年サンフランシスコで開催されたKotlinConfを見に行き熱量の高さに圧倒されましたが、KotlinFestもそれに負けないくらい高い熱量を持ったイベントでした。

Kotlinもう一歩(森洋之さん)

内容

  • Kotlinのタイプシステム
    • クラスとタイプがある。val s: String? = "string" // class:String、type:String?と必ずしも同じ訳ではない
    • タイプによってできる操作(例えば文字列を加算)が決まるため、val s: String? = "string"; s.hashCode() // NGとなる
    • つまり安全!
  • タイプとサブタイプ
    • あるタイプが期待される全ての箇所で使えるタイプをサブタイプ
    • Any?は全てのタイプのスーパータイプ
    • Nothingは全てのタイプのサブタイプ
  • ジェネリクス
    • 異なる型を表現するときにジェネリクスを使う
    • Type Erasureがあり型情報は実行時に消える
    • 不変、共変、反変の3種類の変位がある
  • Type Projection
    • val nums: MutableList<in Int> = mutableListOf<Number>(1.0,2.0,3.0)定義する場所ではなく、使う箇所でout/in修飾子を使う
  • Star Projection
    • ジェネリクスな型タイプが実際にわからないときに使う
    • Javaは?マーク型で、Kotlinは*を使う
    • val list: MutableList<*> = mutableListOf<Int>(1,2,3); list.add(4.0) // 追加できない 値を取り出すことはできるが安全ではないため追加できない

感想

タイトルの通りKotlinをさらに知るためのタイプシステムやジェネリクスについてのお話でした。ジェネリクスはAndroidアプリ開発だと利用する箇所が限られるため不変、共変、反変周りがちょっと難しかったです。長澤太郎さんが公開している初学者向け「Kotlinでジェネリクスを学ぼう」こちらの資料も併せて読むとスッと理解できるかもしれません。また冒頭で紹介がありました「基本からしっかり身につくAndroidアプリ開発入門」を購入しましたので、これから読んでみたいと思います!

How to Test Server-side Kotlin(鈴木健太さん、前原秀徳さん)

内容

  • レガシーシステムで試したテスト方法
    • 10年くらい前の技術スタックで実装されたレガシーシステムをサーバサイドKotlinにリプレイス。そこで培ったテスト方法を紹介
    • テーブル数は100個から200個くらい
    • 独自Javaフレームワーク、XSLT、テストなし
    • テストのあるシステムにリプレイス。フロントはRails、Nuxt.js。SprintBoot + Kotlinで実装されたAPIサーバ
    • 今回はあくまで単体テスト、DBのインテグレーションテストについて紹介
  • サーバサイドKotlinの有用なテストライブラリ
    • テスティングフレームワークは、JUnit4、JUnit5、Spek、KotlinTest、TestNG、Spock。spring-boot-starter-testのデフォルトに従い、JUnit4を採用
    • アサーションライブラリはHamcrest、AssertJ、KotlinTestなどたくさんあるが、AssertJを採用。sprint-boot-starter-testのデフォルトに従う
    • モックライブラリは、Mokito、Mokito-Kotlin、Mockkがある。Mockito-Kotlin、Mockkのany()を使えばMockito.any()問題は起きない。Mockito-Kotlinを採用
    • DBセットアップライブラリは、DBUnit、DBSetupなどがあり、DbSetup-kotlinを採用
  • サーバサイドKotlinのテスト方法
    • presentation、domain、application、infrastructure構成
    • テスト方針は基本的にapplication層のテストを書く。domain層もテストするがロジックが複雑なところに限る
    • applicationを厚めに書くことによって仕様の正しさを担保する。それによって下のdomain層のリファクタリングもしやすくなる
    • データベースはモックにしない。DbSetup-kotlinでDBのセットアップをした
    • AssertJ-DBでDB状態(DBの変更)をチェック
    • JSON APIはSpringのMockMVCを利用
  • テストツールの紹介
    • Factlin。既存のデータベーススキーマからDbSetup用のコードを生成するライブラリ
    • Kotlin Fill Class。引数の多いコンストラクタを簡単に記述できるIntelliJ Plugin

感想

知見が多く大変参考になりました。ママリで使用しているライブラリは、KotlinTestとMokitoでMockitoのwhenがKotlinの予約語と被るので紹介していただいたMockkライブラリを使ってみます。加えて単体テストに纏わるお話でしたが、機能テスト、探索的テスト、パフォーマンスなどのアジャイルテストもぜひ聞いてみたいです。最後にIntelliJ Plugin Kotlin Fill Classがとても便利で早速利用させていただきました。ソースコードも勉強になるので是非興味のある方はご覧ください。

start from Convert to Kotlin(望月美帆さん)

内容

  • AndoridプロジェクトにおいてまだJavaのアプリが多い
    • Androidは10年続いている世界だが、Kotlinは公式言語としてサポートされたのはまだ1年
    • 1年ちょいのためやはりJavaアプリの方が多い
    • 今までのJava資産を使うことが多い
  • Kotlinをプロジェクトに導入して良いことだらけなんだっけ
    • 開始3年のサービスは最初にテストから導入
    • 開始1年のサービスはKotlin Beta版だったのでJavaを選択する。新しく作る部分にはKotlinを導入
    • 開始5年のサービスは完全Javaレガシーだったので積極的にKotlinにリプレイス
    • 今までKotlinを導入しなかったことがない。Kotlinを選択しない理由がない
    • Javaのコードで不足がない、パフォーマンスをカリカリにするなどの時はJavaを選択
  • Androidアプリにて上手にKotlin化するには?
    • テストでKotlinを使う
    • 新しい機能追加などで部分的に導入する
    • 既存のJavaコードをKotlinにConvertする
  • Convert to Kotlin
    • Android Studioにて「Convert Java File to Kotlin File」で一発変換
    • Convertだけでは読みやすいコードにするのは難しい部分もあるので手動である程度直す必要がある
    • 「Kotlinらしい」だけではなく、「読みやすいコード」、「壊れないコード」を目指す

感想

セッション終了後「帰ってからKotlinしたい!」という気持ちになりました!冒頭であった「Javaのアプリの方がまだ多い」について普段Kotlinを使っていることが多いので感覚としてKotlinアプリが多いのかなと錯覚していましたが、Kotlinが正式言語採用されてまだ1年。まだまだJavaアプリが多いのでConvert to Kotlinは有用な機能だと改めて感じました。Covnert to Kotlinはママリでもよく利用していて、説明にもあった通りそれだけではまだ読みやすいコードにならないケースがあります。Covnert to Kotlinってどうやって処理しているのか気になったのでコードをみてみたいと思います!

Kotlin コルーチンを理解しよう(八木俊広さん)

内容

  • コルーチンとは?
    • メルヴィン・コンウェイの1963年の論文が初出
    • 継続状況を持つプログラムを簡単に記述できる
    • サブルーチンは普通の関数で呼び出しから最後まで実行。一方コルーチンはある途中で止まって後から再開できるインスタンス
    • コールバックスタイルと違ってフラットにかける
  • Kotlinはどのようにコルーチンを表現しているのか
    • Javaのバイトコードから実装方法を探る
    • コルーチンの中断と再開をステートマシンとして表現している
    • コルーチンを再開するためにステートマシン内でキャプチャする
    • 内部状態を変化させながら実行する
    • Kotlinではsuspend修飾子を使っていて、コンパイル時に自動で継続インターフェースの引数が付加される
    • コルーチンビルダーと継続的インターフェースを使って簡単に実装できる
  • Kotlinコルーチンの基本的な使い方
    • Kotlin1.1 experimentalでコルーチンを利用可能
    • コルーチンを利用するには、kotlinx.corutinesの各種ライブラリから利用できる
    • Kotlin1.3でStableになり、今触ってもそんなに変更はないはず
    • launch関数は、コルーチンを生成している訳ではない。JOBを返すがコルーチンではない。ちょっとコルーチンに関与できる
    • AndroidでUIを触る際にlaunch関数だけではなく、継続的インターセプターをセットする必要がある
    • async関数はDeferredを返すメソッド
  • まだまだあるKotlinコルーチンの使い方
    • Retrofitでコルーチンを利用するにはJakeWhartonさんのretrofit2-kotlin-coroutines-adapterを使うとDeferredを返してくれる
    • EventBusとしても使える
    • すでにコルーチンに対応したサードパーティ製のライブラリも増えている

感想

コルーチンはステートマシンとして表現されているんですね!内部実装までちゃんと理解されて本当に圧倒されました!さらにとてもわかりやすいコルーチンの説明でサードパーティ製のライブラリでもコルーチンサポートしているものが増えてきたので、Androidアプリでもコルーチンを使ってもいいかなと素直に思いました。あとJavaコードに変換したコルーチンのコードを読むの面白そうだったので、理解を深めるという意味でもデコンパイルを利用してコードを見てみたいと思います!

How to Kontribute (v4 JP) しらじさん

photos.google.com

内容

  • Ubieの福利厚生
    • 長澤太郎さんがいること!
  • Kontributeするための環境構築
    • JDK1.6、JDK1.7、JDK1.8、JDK9(or 10)
    • Intelij Idea Communication(or Ultimate)
    • Github Kotlin Repositoryセットアップ
    • Idea Pluginsセットアップ
  • 困った時のコミュニケーション手段
    • Slack Kotlinlang #kontributorsにジョインして分からないことがあれば質問できる
    • YoutrackでIssue管理を行い、Issueについてディスカッションできる
    • Github KotlinではPRのやり取りをする
  • 誰でも簡単に取り組めるKontribute
    • Readmeなどのタイポやコメントの修正
    • サンプルコードを提供する
  • 少しステップアップしたKontribute(IDE Plugin)
    • Inspectionファイルの作成
    • Inspectionとは特定のコードに対してワーニングやエラーとして表示してくれる機能
    • PSI(Program Structure Interface) Viewerを使うとPSI構造が可視化できる

感想

しらじさんの「How to Kontribute」はバージョンv4で、こちらの資料やしらじさんの登壇内容に感化されてKontributorになった方は20人くらいいるのではないでしょうか?(すみません、めちゃくちゃざっくりです)。現在Kontributorは248名でこの登壇をきっかけにさらにKontributorが生まれると僕も嬉しく思います。Kontributeすることによって、JetBrainsのエンジニアさんからフィードバックをいただけて学びが深いですし、PRがマージされるとKotlinブログにも名前が載るのでモチベーション向上に繋がります。しらじさんがお話していた通り、ハードルは高くないと思うので是非ご興味のある方は資料を見ながらKontributorにチャレンジしてみてください!

まとめ

初めて日本でこれほど大きな規模のKotlinカンファレンスが開催されて、本当に関係者の皆さんに感謝しております。当日「#kotlinfest」がtwitterのトレンド入りをして注目度も高く、参加者の拍手や暖かいフィードバックがとても印象的でした。さらに登壇者の皆さんの資料がとてもわかりやすく資料を見るだけでも勉強になることが多かったです。今回のカンファレンスをきっかけにKotlinを好きになった方やさらに好きになった方もたくさんいらっしゃると思います。

KotlinFest 2018は終了しましたが、Kotlinイベントはまだまだ続きます!今年の10月にKotlinConf 2018がオランダで開催されます。そこでは、KontributorのKirill Rakhmanさんによる「Kotlin JSによるWebブラウザ拡張」、KotlinFestでも少しだけ紹介があったΛrrowについて、ΛrrowメンテナーのRaúl Raja Martínezさんによる「Arrowライブラリによる関数プログラミング」、GoogleのKevin Mostさんによる「Kotlinコンパイラプラグイン作り」など面白いセッションが盛りだくさんです!気になるセッションがあれば資料など公開されると思いますのでチェックしてみると良いかもしれません。来年もKotlinFestが開催されるのを心待ちにしております!!