2024/06/22 Kotlin Fest 2024に行ってきました!
奇しくもこの日はカンファレンスの特異日で、『スクラムフェス大阪2024』、『Hono Conference 2024 』、『Developers Boost 2024』、『PHPカンファレンス福岡2024』など、多くのITイベントが開催されました。
イベント被りでいけなかった人のためにも、良かったところを共有(自慢)していきます。
軽く自己紹介
私はKotlinについてはホビープログラマーで、現在業務ではRubyを使っています。一番書き慣れている好きな言語はJavaです。
趣味で書く範囲はサーバーサイドKotlinであるため、モバイルのセッションはちょっと避けています。
また、ここ数年はKotlin自体の新機能はある程度確認していましたが、周辺環境までは追えていませんでしたので、そこを補うようなセッションを選択しています。
セッション
今回聴講したセッションは以下の6つです。
- 2024年版 Kotlin サーバーサイドプログラミング実践開発
- KotlinのLinterまなびなおし2024
- Kotlin Coroutinesで共有リソースに正しくアクセスする
- 例外設計について考えて Kotlin(Spring Boot&Arrow)で実践する
- まだ JUnit を使ってるの? kotest を使って快適にテストを書こう
- Jetpack Compose: 効果的なComposable関数のAPI設計
2024年版 Kotlin サーバーサイドプログラミング実践開発
『Kotlin サーバーサイドプログラミング実践開発』の著者のセッションで、今Kotlinでサーバーサイドプログラミングを行うならどんなライブラリを選定するか、という話でした。
Kotlinの言語機能との親和性をもとにKotlin製のライブラリを優先的に採用しているように思えました。また選定時にライブラリの更新状況も考慮していたのは、業務で使うことを見据えた現実的な選定だと感じました。
今回のセッションではO/RマッパーにJOOQを選択していましたが、私個人としてはSQLを書くほうが好みなので、Doma2推しです。
DBへの問い合わせを書くときに、私は発行したいSQLをまず思い浮かべます(多くのエンジニアもそうだと思っているのですが、ActiveRecordに育てられるとそうでもないらしい?)。そのためDSL形式でクエリを発行するORMは「SQLを考える」=>「DSLに変換する(場合によっては、どう書くのか調べる)」=>「発行されるSQLを検証する」というフローをたどってしまいます。Doma2では2WaySQLを使い、DBクライアントでそのまま実行できるSQL文をKotlinの世界で使うことができ、バインド変数のチェックも実施してくれます。
Doma2のウィークポイントとしてはリレーションのあるレコードの取得に工夫が必要であるので大規模なアプリケーションだと少し厳しいところもあるのと、正直情報がまだまだ少ないなーって思っています。
そのほか、Webフレームワーク、DIライブラリ、テスティングライブラリとオススメを共有していただきました。
Javaエンジニアをしていると、ついKotlinでも勝手を知っているJavaのライブラリを使いたくなってしまうので、この共有は非常にありがたかったです。
KotlinのLinterまなびなおし2024
Kotlinで使えるLinterを3つ紹介していただきました。
冒頭で「なんとなく選択」から「意識的な選択」をして欲しいという目標が語られて、非常に耳が痛かったです......。
今回紹介されていたのは次の3つのライブラリです。
- ktlint
- detekt
- konsist
聞いていて「ためになった」と感じたことが2点あります。まず1点目はそれぞれのライブラリの目的の違いが端的に説明されていたことです。
「ktlint」は標準コーディングスタイルへの準拠、「detekt」はコード品質向上や潜在的なバグの検出、「konsist」はアーキテクチャや内部的なコーディングルールへの準拠と説明がありました。
意識的な選択をするためには、そのライブラリの目的の理解が必須となります。目的の理解を促す発表であり、この基準でLinter選定を行えば良いということが非常にわかりやすかったです。サンプルケースでの選定で考えることをまとめていたのも、知識が具体化されて良かったと感じました。
2点目に「ためになった」と感じたことは「konsist」というライブラリの存在を知ることができたという点です。
前述の通り「konsist」は内部的なコーディングルールへの準拠を目的としています。具体的に紹介があった例で言うと、UseCase層のネーミングルール、依存関係が正しいか、保持するメソッドの制限にあっているかなどです。
内部的なコーディングルールはレビューで確認することが多く、新規メンバー参入時には暗黙知として伝えられないこともよくあります。それが「konsist」によって形式知になるため、ルール整備と一石二鳥で実施することができ、効率的だと感じました。
Kotlin Coroutinesで共有リソースに正しくアクセスする
並列化で生じる共有リソース問題への対応方法について、まとめたセッションでした。
このセッションで最も勉強になった点はMutex
とSynchronized
の使い分けです。
端的にはCoroutinesを使っている場合はMutex
、suspendではない場合はSynchronized
を使えば良いということでした。
他にもAtomicIntegerなどスレッド安全な型を使う説明やDispatcherによる利用スレッドの違いの説明もあり、基本を抑えつつも網羅的に紹介されたセッションだと感じました。
一方でセッションの最後にもありましたが、根本として「共有リソースを少なくする(なくす)」というところが一番楽な解決なんだろうなーとも感じるセッションでした。
例外設計について考えて Kotlin(Spring Boot&Arrow)で実践する
例外について、広範な話題を扱ったセッションでした。単に例外ハンドリングの話にとどまらず、ビジネス的な影響とエンジニアリング的な影響を俯瞰的に見て説明しており、例外設計を「なぜ」実施する必要があるのかということが良く伝わってきました。
例外について4象限で考えるという発想はなかったので、自分の設計にも活かしていきたいと感じました。
メソッドのシグネイチャに例外が現れずわかりにくいから関数型のパラダイム(Arrow-kt)を使って、呼び出し元に例外ハンドリングを強制するという話がありました。これはKotlinにはチェック例外という概念がなく、Javaだとそこまで悩まないところで、ちょっと新鮮でした。とは言え、JavaでもGolangのようにEither型的なの使ってシュッと例外ハンドリングしたいことはあるので、あったらあったで便利な気がします。
まだ JUnit を使ってるの? kotest を使って快適にテストを書こう
『2024年版 Kotlin サーバーサイドプログラミング実践開発』のセッションでも取り上げられていたkotest
についての導入セッションでした。
よりKotlinらしくテストが書けるということで非常に興味をそそるセッションで、konsist
とともに話を聞いて使ってみたくなったライブラリになりました。
Kotlinらしく書けるだけではなく、データクラスの検証で、検証対象のフィールドを型安全に限定したり、非同期テストをサポートしたりとJavaではできない表現でKotlinらしくアサーションできるようになっており、美しいライブラリだと感じました。
他にもClueという失敗時にログっぽいものを出力させる機能や、プロパティベーステストをサポートしており、しかもランダム値は境界値を含むように設定してくれるなど、より効果的なテストを支援するような使い方もできるので、かなり魅力的に映りました。
Jetpack Compose: 効果的なComposable関数のAPI設計
このセッションだけモバイル依りの話で、コンポーネント分割時の引数をどう考えていくかという話でした。
余談ですが「あ、『ShootingStar』の人だー」って勝手に感動していた私は古の「Twitter」民です。
モバイルの話でしたが、最近のWebフロントエンドの潮流もコンポーネント指向となっており、かなり応用できる内容だなと思いました。引数にあたる部分はフロントエンド(主にReactやVueを想定して書いています)ではpropsとなり、親コンポーネントにあるべきか子コンポーネントにあるべきかみたいなのは共通した悩みポイントかと思います。
デフォルト値への考え方で、「デフォルト値があることにより、調査がおざなりになり問題になる場合がある」というのはちょっと新鮮な考えで、デフォルト値のあり方を考え直すきっかけになりました。
スポンサーブース
スポンサーブースは各社とても気合いが入っていたように思えます。
けっこうな会社でKotlinクイズをやっており、ホビープログラマーにはちょっと難しい問題が多かったですが、大変勉強になりました。
LINEヤフーさんの「同様の処理を行っている2つの実装を見て、良いと思ったほうを理由をつけて答える」という企画はコードレビューにも通じるものがあり、面白かったです。ユースケースを読み切れてなかった部分もあり、表面的な回答しかできなかった問題が多く、もっと勉強しないとなと思いました。
それはそれとしてノベルティ豪華すぎ......。ティーポットやスマホスタンドなどあまり見ない「大物」がゴロゴロあって驚きました。
その他、個人的な話
会場にWiFiあるのめっちゃありがたかったです!X実況はWiFiあるとはかどります。
ランチはJJUG CCC 2024 Springでお話させていただいたじゃがさんとその同僚のSawadaさんとORM談義や言語選定のモチベーション、ツラみなんかを話してとても有意義な時間になりました。
懇親会ではエンジニアアニメLTで話したにしこりさんや前述JJUG CCC 2024 Springで知り合ったがらさん、OOCのときに一緒にスタッフをやったクッキーさんなど、繫がった縁を継続できている感があって、 オフラインでのカンファレンスの嬉しいポイントだなーって感じました。
おわりに
5~6月にそこそこのカンファレンスに参加しましたが、どれもカンファレンスの色があって面白かったですし、自分とは違った視点がたくさん得られました。
大きめのイベントだと次は開発生産性カンファレンスで、その後は大吉祥寺.pmに参加します。
最後になりますが、Kotlin Fest開催にあたり、スポンサー様、登壇者様、会場スタッフのみなさん、コアスタッフ/当日スタッフのみなさん、そして一般参加者の方々、すばらしいイベントをありがとうございました。