「バイテンポラルデータモデル」という言葉を聞いたことがあるでしょうか?ビジネス時間と処理時間の2つの時間軸でデータを管理する概念で、時制を扱う必要があるシステムを設計するにあたって非常に有用なデータモデルです。Reladomoは、これを透過的に扱える稀有なORMですが、残念ながらKotlinから使うには多くの壁がありました。
本セッションでは、バイテンポラルデータモデルの概要を説明するとともに、Claude Codeをペアプログラミングパートナーとして、Kotlinを用いた型安全な設計、拡張関数、DSL等を活用してReladomoをKotlin with Spring Boot で簡単に扱えるようにしたお話をします。
このセッションでは、実際のコードとデモに加え、Claude Codeとの対話ログも一部お見せし、AIエージェントとのリアルなものづくりの実態もお伝えします。
多くのプログラミング言語には、言語仕様書が用意されています。
言語仕様書を読むことで、その言語に対する理解を深めるのみならず、知らなかった機能を発見することもあります。
しかし、言語仕様書を読みたいと思う一方で、とっつきにくいと感じている人も多いのではないでしょうか。
本発表では、型システムや継承など普段からよく使用する機能を取り上げて、言語仕様の観点から解説します。
日頃何気なく書いているコードを体系的に理解することで、次の2点の達成を目指します。
・Kotlinのより深い理解: 表層的な使い方から一歩踏み込み、Kotlinの本質的な理解につなげる
・言語仕様書を読む意義の理解: 「なぜコードがそのように動くのか」の答えが見つかる仕様書の意義・魅力を知り、読んでみたいと思ってもらう
想定聴講者: Kotlinを業務・個人開発で使用し、より深く理解したい方(脱初級者を目指す方)
一部の言語では文字列補間をカスタマイズすることで、リッチな体験を実現することができます。
例えばScalaのdoobieでは、SQLに値を埋め込むように書いても、実際には安全なplaceholder構文に変換することができます。
https://typelevel.org/doobie/
残念ながらKotlinにはこの仕組みはありませんが、Kotlin Compiler Pluginを使えば実現可能です。
そこで、Kotlin Compiler Pluginを活用することで前述したScalaのdoobieのようにSQLを書くことができる「kuery-client」というライブラリを開発してみました。
https://github.com/be-hase/kuery-client
このライブラリを題材に、Kotlin Compiler Pluginの開発事例をご紹介したいと思います。
「プログラムで音を生成したいけど、何から始めればいいかわからない」「サウンドプログラミング始めるには数学的敷居が難しそう」— そんな風に感じたことはありませんか?
実は、Kotlinの表現力豊かな文法と標準ライブラリを活用すれば、数学的な複雑さを抽象化しながら、驚くほどシンプルに音声が出せるアプリケーションを作成することができます。
本セッションでは、「Hello, World!」ならぬ「Hello, Sound!」的な内容・知識から始まり、最終的には美しいドレミ音階を奏でるまでの道のりを、紹介していきます!
書籍『ThoughtWorksアンソロジー』には「オブジェクト指向エクササイズ」(Object Calisthenics)と呼ばれる、手続き型プログラミングからオブジェクト指向プログラミングのコード設計の発想に親しむための訓練方法として(少々大胆で今や古めかしい?)ルール集が登場します。
関数型言語使い/関数型プログラミング実践者の立場から、静的型付きオブジェクト指向言語Kotlinに無理なく馴染み現実的にメリットのある形で関数型プログラミングを実践するための「関数型エクササイズ」(Functional Calisthenics)をご提案します。
▪️背景
「CoroutineやFlowのテストがうまく書けない」「期待した値が取れない」「テストが安定して成功しない」、これらはCoroutine・FlowのUnitテストに挑んだ開発者なら誰もが1度は直面する課題ではないでしょうか?
実際のコードでは、リトライ処理、Exception、複数Flowの合成といった、テストには複雑なケースが数多く存在します。
本セッションでは、プロダクション開発でよくある複雑な非同期処理を例に、安定したテストを書くための実践的な手法を紹介します。失敗するテストを出発点に、失敗の原因分析から修正方法までを解説します。
▪️具体的な内容:
・よくある失敗パターンから学ぶ
・時間を制御するテクニック
・Flowテストの基本と応用
・複雑な非同期ロジックに挑む
・MockK×Coroutineの活用法
・テストしやすい設計へのリファクタリング
KoogはAIエージェントを構築するためのライブラリです。
シンプルにLLMにアクセスできる一方、複雑なワークフローを構築することもできます。
Kotlin愛好者はKotlinの知識を活かせるほか、KMPの資産を活用して様々なアプリケーションを開発できます。
実際、私はKoogを利用して作業効率化のためのデスクトップアプリやCLIツールを開発しています。
いまこそKotlinの知識を活かしてAIエージェントを構築するチャンスです。
本セッションでは、まず基本的な概要と使い方をご紹介します。
その後、Koogの最大の特徴であるエージェントワークフローの構築方法を解説し、
その設計の考え方を具体的な事例を交えてご紹介します。
内容
・基本的な概要、他のフレームワークとの比較
・基本機能の使い方
・Strategy Graphsで複雑なワークフローを構築する方法
・ワークフローの設計の考え方
Kotlin Compiler Pluginはコード中間表現の改変によって新しい言語パラダイムをもたらし、IntelliJ Pluginはツール拡張によって開発者を支援します。両者を組み合わせれば、もう1段階上の開発体験を作り出すことができます。
本セッションでは、IDEを経由してアプリ状態を巻き戻す、back-in-time-pluginを題材に、コンパイラ拡張とIDE拡張を組み合わせて、ユニークなToolingシステムを構築する実践的な例を紹介します。
アジェンダ:
・back-in-time-pluginのアーキテクチャ
・FIR/IR拡張による状態の追跡・巻き戻し
・IDEとアプリの連携方法
・Compiler PluginのIDEサポートの現在地
一見魔法に見える機能も、分割してみると単純な機能の組み合わせです。皆さんも大好きなKotlinで、魔法使いになってみませんか?
data classがネストすればするほど、copy()関数の呼び出しは複雑になり、コードの可読性は著しく低下します。この、多くのKotlin開発者が直面したことがあるであろう「copy()地獄」を、関数型プログラミングライブラリArrowのOpticsが解決します。
本セッションでは、まず中核概念であるLensの使い方から、その仕組みを自作するライブコーディング風の解説を通して深く理解します。さらに、Lensだけでは扱いきれないコレクションやsealed classを華麗に操作するTraversalやPrismといったOpticsの世界へご案内します。セッションを終える頃には、あなたのイミュータブルデータ操作は、より宣言的でシンプルで安全なものへと進化しているはずです。
Android 15で進化したADPFは、CPUとGPUの協調的管理を可能にし、パフォーマンス管理に革命をもたらします。
しかし、その強力なAPIはC/C++製であり、Kotlinから安全に利用するにはJNIの壁が立ちはだかります。
本セッションでは、このネイティブAPIをKotlinのFlowや型安全なDSLを用いて、いかにクリーンで宣言的に抽象化するかを解説。
複雑なJNIコールを隠蔽し、パフォーマンスの未来を設計するための実践的テクニックをコードと共に提示します。
トーク予定内容
・ Android 15におけるADPFの進化やAPIについて
・ callbackFlowを用いたリアクティブな熱監視の実装手法
・ 型安全ビルダーによる宣言的なJNIラッパーの設計
株式会社asken では、バックエンドもモバイルもKotlinで統一した開発に挑戦してきました。
PHPからKotlinへのリプレイスを経て、KMP(Kotlin Multiplatform)導入、
iOS先行・Android後追いという試行錯誤、そしてKMPで職能の壁を越えて協業する開発体制へ。
ついにはBFFやAIネイティブな世界まで踏み込もうとしています。
Kotlinで広がる開発の可能性と、その奮闘の歴史を一緒に覗いてみませんか?
私たちのリアルな軌跡を紹介します。
kintoneのAndroidアプリは2019年にリニューアルして以来、技術の進化に伴い様々な変更が必要となりました。とくに問題となっていたのはデータフローの高い複雑性で、新機能の開発を阻害したり、新規加入者の学習負荷を高くしていました。
そこで、私たちのチームはアプリの保守性と再利用性を向上させる大規模なリファクタリングを実施しました。
具体的には、Googleのアプリアーキテクチャに基づきマルチモジュール化を行い、RxをCoroutinesに置き換え、シングルトンインスタンスを削減し、独自ユーティリティクラスの使用を最小限に抑えました。さらに、一部のViewをComposeに移行しました。手動テストと自動テストの使い分け方も見直しました。これらの変更を、段階的に実施しました。
このセッションを通じて、大規模リファクタリングの具体的な進め方、チーム開発のヒントを得ることができます。
KMPやサーバーサイドKotlinも台頭する中で、Coroutinesの利用者は最近も増え続けています。
シンプルな文法から「簡単」と称される一方、ブラックボックス化されているが故に、実際には「難しい」と感じる方も多いです。
この課題を解決すべく、私はCoroutinesを内部実装から解読し、知見を発信してきました[1-3]。
本発表では、Coroutinesの理解に役立つ、3つの仕組みを解説します。
1.中断・再開を可能とするContinuation[1]
2.制御・キャンセル・例外処理を支えるStructured Concurrency[2]
3.タスクスケジューリングを担うCoroutineDispatcher[3]
[1] https://bit.ly/3FZyjFG
[2] https://bit.ly/4ndeNpT
[3] https://bit.ly/45toABP
Dependency injection (DI) は保守性の高いアプリケーションを開発するために必須と言っても過言ではない設計パターンではないでしょうか。
Kotlinで開発をするときのDI手法として、言語機能を利用した手動DIや、KoinやDagger等のライブラリやSpring DIのようなサーバサイドのフレームワークに組み込まれたものを利用するなど、様々なアプローチが存在します。
このセッションでは、DIの目的や原則などについておさらいをしながら、各アプローチについて具体的なコードとともに触れつつ、それらを利用するメリットとどのような場合に使うのが良いかの解釈についてお話していきます。
また、それらの特徴を踏まえたうえで、私がDDD x クリーンアーキテクチャなアプリケーションを開発するうえでDIを使い分けている背景などについてもお話できればと考えております。
Kotlin Multiplatform(KMP)はiOSとAndroid間でビジネスロジックを共有できる強力な手段ですが、導入初期にはライブラリ選定でつまずくことが少なくありません。本セッションでは、ネットワーク(Ktor)、DI(Koin)、DB(SQLDelight/Realm)、非同期処理・状態管理(StateFlow)など主要ライブラリの特徴と選定基準を、コード例を交えて解説します。さらにiOS/Android連携時のFlowの橋渡し、初期化タイミング、プラットフォーム固有処理の分離など、開発初期に陥りやすい設計上の落とし穴を紹介し、KMP新規開発におけるスムーズな立ち上げをサポートする実践的ノウハウを提供します。KMPは正しく設計すれば保守性と開発速度を向上させます。本セッションで開発初期の不安を乗り越え、「信頼できるスタートセット」を手に入れましょう。