Kotlin による生産性の高いサーバーサイド開発: 採用事例

Elizaveta Semakova

Kotlin は Java の代替言語として作成され、JVM エコシステム内における使用可能な領域は Java と同じであることが期待されています。 当然ながら、サーバーサイド開発も対象としています。


私たちは Kotlin を用いたサーバーサイドアプリケーションの開発体験に関する皆様の声を募集し、コミュニティに共有したいと考えています。

こちらから皆様の体験談をお聞かせください!


Kotlin は近年、Android エコシステムで驚異的な成長を遂げました。 サーバーサイド開発での Kotlin の採用も徐々に進んでいます。 しかしながら、サーバーサイド開発への Kotlin の採用をお考えの企業様からは「他に同じ目的で Kotlin を使用している企業は存在するのか?」というご質問を多くいただいています。

企業はテクノロジーの選定に際し、確実に適切な判断を下したいと考えるものです。 また、他社がまったく同じ目的でそのようなテクノロジーの導入に成功していることを確かめたがっています。

この記事では、サーバーサイド開発に Kotlin を採用したいくつかの企業を簡単に紹介します。 Kotlin を同じ目的で採用しようとお考えの皆様は、この投稿を判断材料として役立ててください。

このブログ記事は、Kotlin 1.4 オンラインイベントでの発表内容に基づいています。 動画の全編は当社 YouTube チャンネルでご覧いただけます。

Kotlin を選択すべき理由

私たちは Kotlin を使用している開発者に対するインタビューを定期的に実施し、Kotlin をサーバーサイド開発に使用している大小さまざまな企業について調査を行っています。 特に、企業が Kotlin を選択している理由や、Kotlin から享受しているメリットに常に注目しています。

Kotlin には多くの優れた特徴がありますが、インタビューにおいて特に好評だった以下の特徴について記載します。

  • 構文の簡潔さ。言語の表現力が高いため、コードを簡潔に記述できます。 コードの記述量が少ないほど、最終的なアプリケーションに紛れ込むバグの数も少なくなり、最終的なコードのメンテナンス性が向上します。
  • Null 安全機能。これは、開発者から最も評価の高い Kotlin の特徴です。 Kotlin の型システムは、Billion Dollar Mistake(10億ドルにも相当するの誤り)とも呼ばれるコードからの null 参照が発生するリスクを排除することを目的としています。 Kotlin のコンパイラーにはこの特別な安全機能が組み込まれているため、null 値の逆参照に関する問題が少なくなっています。
  • Java との相互運用性。ホストプラットフォームとの相互運用性を確保することで、生産性を大幅に向上させています! Kotlin では、フレームワークとライブラリを含む Java エコシステムを活用できます。 また、Java のコードをすべて Kotlin に変換することなく Kotlin を徐々に既存の Java プロジェクトに導入することもできます。
  • Kotlin コルーチン。コルーチンは命令型プログラミングモデルを使用して非同期なコードを簡単に制御する手段を提供します。 コルーチンは多くのシステムリソースを節約するため、大量のIO操作が発生する高負荷のサーバーサイドアプリケーションを開発する際に特に役立ちます。 コルーチンのサポートが Spring Framework に追加されたため、サーバーサイド開発者がさらに簡単にこの機能を活用できるようになりました。
  • Kotlin Multiplatform。Kotlin では各種プラットフォーム(JVM / JavaScript / Android / iOS)のほか、ネイティブアプリケーションもターゲットにすることができます。 異なるプラットフォームで実行される別々のアプリケーション間でコードを共有する機能は、非常に役に立っていることが分かりました。

次に、Kotlin の採用によって開発レベルが向上している事例をいくつか紹介します。

JetBrains Space: コードを最大限に再利用

皆さんは JetBrains が Kotlin を社内で使用していることを知っても驚かないでしょう。 私たちは Kotlin をツールだけでなく、サービスにも使用しています。 KotlinConf 2019 で発表されたチームコラボレーションプラットフォームである JetBrains Space は、Kotlin と Ktor フレームワークを使用して作成されています。 JVM 上で実行するサーバーサイドサービス、Android アプリケーション、iOS アプリケーション、Web アプリケーション、IDE プラグインなど、Space ではあらゆる部分に Kotlin を使用しています。

Kotlin Multiplatform を使用することで、これらすべての異なるアプリケーション間でコードの大部分を共有しています。 UI とサーバーサイドコード全体でデータモデルを共有するだけでなく、Space ではビューモデル、検証ロジック、共通ライブラリも共有しています。 ただし、UI コンポーネントはプラットフォームに固有であるため、Kotlin コードがターゲットとする各プラットフォームの相互運用性も重要です。

Kotlin Multiplatform

Kotlin がマルチプラットフォーム開発にどのように役立っているかを理解するには、次の例をご覧ください。 次のデータクラスを複数のプラットフォーム(JVM、JavaScript、iOS)に使用する場合を考えてみましょう。

class Holiday {
   val name: String,
   val date: LocalDate
}

String クラスは Kotlin の標準ライブラリに属していますが、LocalDate はそうではありません。 アプリケーションがターゲットとする各プラットフォームに対し、どのクラスを LocalDate として使用するかを指定することができます。 そのためには、異なるプラットフォーム間で共有される共通モジュールの中で expect キーワードを使用して LocalDate クラスを宣言し、異なるモジュールが実際の実装を提供すると仮定します。 actual キーワードは、プラットフォーム固有のコードで使用すべき型を指定しています。

//commonMain
expect class LocalDate()

//jvmMain
actual typealias LocalDate = org.joda.time.LocalDate

//jsMain
actual typealias LocalDate = Moment

//iosMain
actual typealias LocalDate = NSDate

プラットフォーム固有ではないコードは、プロジェクトの共通モジュール内で一度だけ記述できます。 この共通コードはその後、特定のプラットフォームをターゲットとする別々のモジュールによって再利用されます。

Kotlin のマルチプラットフォーム開発対応は、Android および iOS アプリケーション間でコードを共有しているモバイル開発者に特に好評です。 詳細については Kotlin Multiplatform Mobile の Web サイトをご覧ください。また、他社による同テクノロジーの使用体験も併せてお読みください。

Jira Software: Kotlin と Spring Boot を使用したマイクロサービスの実装

その他の興味深い事例には、Atlassian 社の Jira があります。 Atlassian 社では Kotlin を Jira Software クラウド製品の開発に使用しています。

かつての Jira は、サーバーにインストールするスタンドアロン型のモノリシックな Java アプリケーションでした。 しかし、Jira クラウドの導入と共にアプリケーションを複数のサービスに分解し、スケーラビリティを高める必要性が急激に増加しました。

クラウドへの移行によってテクノロジースタックを刷新する機会が生まれ、Kotlin の採用が視野に入ってきました。 開発者は同言語の採用に満足し、生産性を高めることができました! 現在では Kotlin と Spring Boot を併用してマイクロサービスを実装し、ユーザーエクスペリエンスを大幅に向上させています。 Kotlin と Spring は Jira クラウドファミリー全体(Jira Software、Jira Service Desk、Jira Core)で使用されています。

Adobe: Kotlin コルーチンにより高負荷サービスの制約を解放

Adobe Experience Platform チームは、サーバーサイド開発に Kotlin を使用するのが望ましいと考えている理由について記事を公開しています。

同チームは、アプリケーションのバックエンドがモノリシックな Web コンテナーから分散メッシュ構造のデータ駆動型アプリケーションに進化したことを指摘しています。 このようなアプリケーションでは大量のデータを処理し、メッセージの送受信を行う必要があるため、レイテンシが何よりも重要になります。

記事の中では、Kotlin をサーバーサイド開発に使用する主なメリットが掲載されています。 また、非同期プログラミングのサポートが最も有益な Kotlin の特徴として挙げられています。 Kotlin コルーチンは「習得が容易」で、単純明快かつメンテナンス性に優れたコードを生成できると述べられています。

“Kotlin では、ほぼブロッキングな命令型コードのように読める「直接スタイル」でコードを記述できます。”

アプリケーションの I/O は非常に多く、キューや各種データベースなどの外部サービスや他のサービスを利用しなければなりません。 また、このようなネットワーク呼び出しによってアプリケーションのスループットが容易に低下する可能性があります。 そのため、Kotlin コルーチンはすぐに同社のユースケースにとって魅力的に映りました。 非同期化することで全体的なスループットが改善され、結果的にハードウェアリソースを節約することができます。

その他、Kotlin の主な言語機能であるデータクラス、安全な型システムnull 安全機能関数型プログラミングのサポートにもメリットがあります。 Kotlin の構文は非常に柔軟性が高いため、内部 DSL を簡単に作成することができます。 この事は Adobe のエンジニアにとっても非常に好都合だったようです。 また、Kotlin を使用した DSL の作成経験に関する記事も公開されています。

Expedia Group: Kotlin による GraphQL API の作成

Expedia は null 安全が保証されたコンパイラー、言語の簡潔さ、完全な Java との相互運用性を理由に Kotlin を採用しました。 Java との相互運用性が確保されているため、アプリケーションを完全に書き換えることなく徐々に Kotlin を取り込むことができました。 また、Java との相互運用性により、Expedia は Kotlin アプリケーションと Java ライブラリを容易に連携させ、既存の JVM エコシステムをフル活用することができました。

Kotlin コルーチンは、Kotlin を幅広く採用するうえで重要な役割を果たしていました。 開発者はコルーチンを使用して完全に非同期なコードを命令的な方法で記述できるため、コードの可読性とメンテナンス性が向上します。 Expedia では Spring Framework が多用されており、バージョン 5.2 以降では WebFlux とコルーチンとの相互運用性が確保されています。 これは、Expedia のエンジニアにとって画期的な変化であり、結果として Spring および Reactive スタックをより命令的な方法で活用できるようになりました。

最近、Expedia は GraphQL に移行し、すべてのフロントエンドアプリケーションを強化する単一の API ゲートウェイを構築することを決定しました。 この目標を達成するため、同社は Kotlin の強力なリフレクションライブラリを利用してソースコードから直接 GraphQL のスキーマを生成しました。 その成果物であるライブラリのセット graphql-kotlin は非常に有益なものとなりました。 このライブラリはオープンソース化され、現在は GitHub で公開されています。

KotlinConf 2019 では、Dariusz Kuc 氏と Guillaume Scheibel 氏が Spring Boot の能力を graphql-kotlin と共に活用する方法について発表しました。 こちらの動画をご覧ください。

まとめ

この記事では、サーバーサイド開発での Kotlin の採用事例をいくつかご紹介しました。 Kotlin は、パフォーマンス指標が非常に重要視される JetBrains / Adobe / Expedia / Atlassian のビジネスクリティカルなアプリケーションを強化しています。 この事実は、Kotlin が Web アプリケーションやサービスの開発に適している成熟したプログラミング言語であることを示しています。