はじめまして、ビズリーチにてエンジニアをしています、清水といいます。普段はHRMOSという戦略人事クラウドサービスの開発をサーバサイドKotlinでやっています。
今回、日本初のKotlinカンファレンス、Kotlin Fest 2018を弊社でスポンサーさせていただきましたので、そのイベントリポートをさせていただきます! できるだけリアルタイム性を重視するため乱文になってしまいますが、どうぞお付き合いください。
会場
弊社含むことりスポンサーの各社はスポンサーブースを出展しています。各社かなり気合入ってます。
弊社では、エンジニアに支給しているiMacProをただ動画を流すためだけに持ち込んでみました。(スペックの無駄遣い)
参加者にはKotlin Festのトートバッグが配られてました。可愛い。
個人的にはメルカリさんが配布しているKotlinチートシートが最高でした!
オープニングセッション
まずは日本Kotlinユーザグループ代表の長澤太郎さんより、Kotlinの歩みとコミュニティについてのオープニングセッション。
チケットは完売!
スポンサーの導入事例では弊社もご紹介いただきました!
続きまして、同じく日本Kotlinユーザグループの藤原さんより、今回のイベントについての紹介。
-
「Kotlinを愛でる」という言葉、Kotlinイン・アクションの原著だと「Embracing Kotlin(Kotlinを抱きしめる)」だったとのこと。国内ではどんどん定着している言葉が、翻訳の悩みの中で生まれたものだったとは、なかなか趣深いです。
-
Kotlinの哲学の紹介。実用主義/簡潔/安全/相互運用性の4つの哲学をもとに開発されている。
-
Kotlinを知るリソースについて。
大体のことは公式リファレンスでわかる。あとはKotlin Koans。Android開発ならKotlin Guidesがいい道標になる。
日本語リソースならKotlinイン・アクションや赤べこ本、黒べこ本など、書籍が充実している。 -
その後、イベントに関する各種注意事項などがあり、オープニングセッションは終了。
(以下、8月25日15:30追記) ## Kotlin もう一歩
-
Yahoo!の森さん。Kotlin初学者に向けた、基本的な文法についての説明です。
-
Int型はInt型のサブタイプでもありスーパータイプでもある。なんだかちょっと哲学っぽい。
-
Any型はnull非許容型の全てに使うことができる。すべてのnull非許容型はAnyのサブタイプである。
-
Nothing型。あらゆる型のサブタイプ。
-
null非許容型は同じ型のnull許容型のサブタイプ。
-
List
はList のサブタイプだが、MutableList はMutableList のサブタイプではない。安全ではないから。 -
不変、共変、反変の話。
感想:多くの時間をジェネリクスの不変・共変・反変に割いていただいてました。個人的にも理解しているようでいて混乱しやすい箇所だったので、知識を整理するのにとてもいい時間になりました。
How to Test Server-side Kotlin
-
エムスリーの鈴木さん、前原さんによる共同発表。共同発表って割と珍しいですね。
-
10年前のレガシーシステム2つをサーバサイドKotlinでリプレイス。それぞれテーブル数150〜200程度の規模。
-
Kotlin + Spring Boot、フロントはRailsとVue.js。サーバ側はREST APIサーバ。
Server-Side Kotlin testing libraries
- Kotlinで使えるライブラリの一覧。
■ テスティングライブラリ
-
JUnit4。@RuleをKotlinのプロパティにつけるとエラーになる。Kotlinではprivateなフィールドが生成されるが、@Ruleはpublicフィールドを期待されるため。対策としては@JvmFieldをつけるか、@get:Ruleにする。@get:Ruleとするとgetterへのアノテーションであることが明示できる。こういった対策によってKotlinでもJUnit4は問題なく使える。
-
JUnit5。JUnit4の後継だが全く異なる。Kotlin用のヘルパーを提供している。
-
Spek。Kotlinで書かれていて、BDDスタイルで書ける。2.xが出るまで待ったほうがよさそう。
-
KotlinTest。いろんな書き方を選べる。アサーションも含んでいるので、テスティングフレームワークはJUnit、アサーションライブラリとしてKotlinTestみたいな書き方もできる。現状クラス単位での実行はできるがテストケース単位での実行はできない。
■ アサーションライブラリ
-
Hamcrest、AssertJ。
-
Kotlin製のものもたくさんあるが、実際にはAssertJを使っている。
■ モックライブラリ
-
Mockito。finalクラスをモックできない。Kotlinはdefaultでfinal。愚直にopenにしていく、allopenプラグインを使う、Mockitoのmock-maker-inlineを有効化するなどの対策がある。
-
もうひとつ、NotNullな引数にMockito.any()を使うとランタイムエラー。ランタイムでnullを返す仕様のため。独自ヘルパーを作るか、mockito-kotlinというラッパーを使う
-
MockK。Kotlin製モックライブラリ。
■ DBセットアップライブラリ
-
DBUnit。定番。重複記述は多くなる。
-
DbSetup。コードでテストデータを書けるし、Kotlin用のDSLも提供されている。
-
DbSetup-Kotlinを使用。DomaのEntityをJavaで書いているため、相性がよかった。
How do we test Server-side Kotlin
-
DDD + オニオンアーキテクチャで実装。
-
presentation層、application層、domain層、infrastructure層で構成。各レイヤの責務が明確なので変更に強い。ただし、記述量は増える傾向になる。レガシーなデータ構造などはinfrastructure層でラップして、domain層には影響させないようにする。
-
テスト対象はapplication層よりも上の層。domain層はロジックの複雑なものだけ。
-
アプリケーションサービスのテスト方針。DBアクセスはモックにしない。Kotlinでは実行時例外なども起きやすいため、データを入れてテストしたい。DbSetup + Factlin(独自ライブラリ)を使ってデータを投入し、AssertJ-DBを使ってDBの状態をテスト
-
JSON APIテスト。SpringのMockMVCを使用。MockHttpServletRequestBuilderにKotlinの拡張関数を追加することでリクエストを宣言的に記述できる。
Our test tools for Kotlin
-
Factlin。既存のDBスキーマから、DbSetup用のコードを生成できる。
-
Kotlin Fill Class。コンストラクタを作るのが少しだけ楽に。IntelliJプラグインとして、コンストラクタ引数をデフォルト値で生成できる。
感想:Kotlinで使える各種ライブラリが整理して紹介されていてとてもわかりやすい!また、レガシーシステムをリプレイスする中での生々しいテスト戦略やノウハウについても詳しく解説されていて、大変勉強になりました。
(以下、8月25日16:30追記) ## Kotlin linter
-
DMMの釘宮さんからの発表。会場満席のため地面に座って聴講。
-
ktlint, detect, android-lintという3つのlintについて説明。
ktlint
-
カスタムlintの作り方。まずASTを知る必要がある。コードを書くとツリー構造で解釈される。
-
PsiViewerを使うと、コードがどうツリー構造になるのか確認できる。
-
カスタムルールの作成手順の話(頭に入ってこなくなったので、このあたりでちゃんとメモするのを諦めた・・・)
-
フォーマットも可能。
detect
-
標準で用意されているルールがいっぱいある
-
configファイルを作成して個別にルール設定する
-
カスタムルールの作成手順の話。ほぼktlintと一緒。
-
混乱を避けるためフォーマット機能はなくしたが、カスタムルールでフォーマットをすることは可能。
android-lint
-
androidプロジェクトを作ればできる。lintタスクを実行するだけ。
-
これも標準のルールがいっぱいある。
感想: 今までlintについてはIDEのformatterに任せきりであまり積極的に使ってこなかったんですが、新しい世界の扉を開いた気持ちになれました。(あと、一部ちゃんとメモできなかったけど、最後のまとめがすべて集約してくれている気がした)
(以下、8月25日21:30追記)
Kotlin コルーチンを理解しよう
- Lang-8八木さんによる発表。今回一番楽しみにしていた発表の一つ。こちらも満員です。
コルーチンとはなにか
-
一時停止可能な計算のインスタンス。サブルーチンは開始からリターンまでが一つの流れ。コルーチンは途中で一時停止可能。
-
スレッドのように動作するが特定のスレッドに束縛されない。
-
FutureやPromiseのように値や例外を返す場合がある。
-
「継続状況を持つプログラム」を容易に記述可能。
-
継続状況が増えても、コルーチンだとフラットに記述できる。
Kotlinはどのようにコルーチンを実現しているのか?
-
KotlinコンパイラはJavaバイトコードを出力する。コルーチンもJavaで実装できる形になっているはず。
-
どうやっている?コルーチンをステートマシンに変換している。中断と再開を状態遷移と見立てている。
-
変換のためにsuspend修飾子を継続を導入
-
継続インターセプターにより、実行のスレッドを限定しない
コルーチンの基本的な使い方
-
ライブラリになっているのでそれを使用。特定の環境向けのライブラリもある(継続インターセプターの実装)
-
1.3でstableになる
launch関数
-
結果を持たないコルーチンを作成するコルーチンビルダー関数。引数の最後でsuspendラムダを受け取る
-
context: 共有データは継続インターセプターの指定。DefaultDispatcherがdefaultで入る。
-
start: コルーチンの開始方法を指定。defaultでは即座に開始。
-
parent: 親Job。複数のコルーチンを一括でキャンセルしたい場合などに使用。
-
onCompletion: 完了したら呼び出される。
async関数
-
結果を持つコルーチンを作成するコルーチンビルダー関数。非同期っぽいけど、中身はlaunchと一緒。
-
async関数の後ろでawait()を呼ぶと結果を戻す
-
書き方によって直列実行、並列実行、Jobを使って途中キャンセル、ループ処理でのリトライなどが可能。
感想: コルーチンが裏側ではステートマシンに変換しているというのは目から鱗でした。ちょっとメモには書ききれませんでしたがかなり詳しく・平易なコードで解説されていてこれぞコルーチン入門の決定版という感じでした。
How to Kontribute (v4 JP)
-
Ubieの@shirajiさん
-
git使えて、GitHubのアカウントがあって、Kotlin書ければKontributorになれる!
開発環境のセットアップ
-
JDK9 or JDK10のインストール
-
JDK1.8、1.7,1.6のインストール(4つのバージョンが必要!)
-
それぞれを環境変数に設定
-
kotlinをFork→ForkしたリポジトリをClone→Branch作成→マージコミットは入れないようにする→git remote add upstream https://….
-
IntelliJ IDEA v2017.3以上が必要
-
IDEAでいくつか設定
開発者とのコミュニケーション
- Slack
- YouTrack: ここですべてのissueが見られる(up-fo-grabsタグが付いているものが外部Kontributorに依頼されているもの)
- GitHub: Kotlinに関してはほとんどここではコミュニケーションしない。PR送るだけの場所
最初のおすすめのKontribution
-
READMEの修正
-
ドキュメントやコメントの記述:ドキュメントがないメソッド、めっちゃたくさんある。
-
サンプルコードの提供(KT-20357がKontribute初心者用のissue)
Kotlin-pluginを作ってみる
- Inspectionを作ってみる:Psi Viewerを使う
ここから具体的なKotlin-plugin作成方法のコード
感想: Kontribuorになりたい。なれそう。なってみよう。あとshirajiさんプレゼン能力超高い。
懇親会
そして全セッション終了後は懇親会。
「パックマンルール」という、常に他の人が会話の輪に入れるよう隙間を空けておくというルールを周知してくれていたおかげで、人見知りの僕も楽しくいろんな方とお話することができました。
あと、食事も一流ホテルのビュッフェのようなクオリティで、非常においしかったです。イベントリポート執筆でお昼食べる暇がなかったので、一気にがっつかせてもらっちゃいました。
そして、食事と会話に夢中になって懇親会の様子を撮り忘れるという致命的ミス・・・!
最後に
日本初のKotlinカンファレンスに参加させてもらって、改めてKotlinerのもつ熱量や盛り上がりを感じられて、本当に有意義な一日でした。
発表の質も全体を通して非常に高く、純粋にいろいろな知見と刺激をいただくことができました。
また、会社としてもサーバサイドKotlinを導入していることを参加者の皆さんに知っていただけて、とてもよかったです。(ブースに遊びにきていただいた方からも「使ってるのはJavaとScalaだけだと思ってました」というお話を複数いただきました)
次回の開催は未定とのことですが、ぜひ来年も参加したい!
運営・スピーカーの皆さん、素晴らしいカンファレンスを作っていただきどうもありがとうございました!