2024年9月5日
Kotlinエバンジェリスト
長澤 太郎
Ubie株式会社のソフトウェアエンジニア。「テクノロジーで人々を適切な医療に案内する」をミッションに、日々開発に勤しむ。
本業のかたわら、自称Kotlinエバンジェリストとして、講演や執筆などを通じて啓蒙活動に尽力。国内最大のKotlin技術カンファレンス「Kotlin Fest」の代表を務める。
X: @ngsw_taro
こんにちは!Kotlin Festのオーガナイザーを務めている長澤太郎と申します。
今回は、普段Kotlinを使って開発していて、もっと使いこなせるように理解を深めたいというエンジニアの方を対象に、私がお勧めするKotlinの技術書について、いくつか紹介したいと思います。
しかし、その前にお伝えしたいことがあります。近年の技術の公式ドキュメントは、Kotlinに限らず、非常に読みやすく理解しやすいものになってきているように感じています。英語で書かれたものであれば、ブラウザの翻訳機能を使うだけで、かなり自然な日本語に翻訳されます。理解が難しい箇所があれば、LLM・生成AIに気軽に質問ができます(正確性には気を付けたいところではありますが)。
もちろん私自身、書籍から技術の知識を得ることは現在でも習慣のひとつです。ディスプレイをじっと見つめるよりも、紙というインタフェースの方を好むということも理由のひとつです。ただ、公式ドキュメントという最新で正確な情報リソースがあるということを常に頭の片隅に置いておきたいです。
それでは、始めましょう。
▲『Kotlinイン・アクション』Dmitry Jemerov 著、Svetlana Isakova 著、長澤 太郎 監修・翻訳、 藤原 聖 監修・翻訳、山本 純平 監修・翻訳、 yy_yank 監修・翻訳、マイナビ出版
『Kotlinイン・アクション』は2017年に出版された古い書籍ではありますが、Kotlinへの理解を深めるという意味では、極めて貴重な日本語リソースです。本書は、Kotlinの開発に早くから参画していたJetBrainsのメンバーによって執筆されたものです。そのため、文法や言語機能などの単なる解説にとどまることなく、設計の背景にある思想や哲学などを踏み込んで解説し、内部的な仕組みについても言及されているのが大きな魅力です。
いくつか具体的な例を見てみましょう。
Kotlinのクラスは、デフォルトで継承が禁止されています。継承を許可するには明示的にopen修飾子を記述する必要があり、これはJavaとは対称的です。すなわち、Javaのクラスは、デフォルトで継承が許可されています。final修飾子を付けることで、継承を禁止することができます。
Kotlinはどのような意図で、デフォルトで継承禁止という選択をしたのでしょうか。本書では、これを「壊れやすい基底クラス」という言葉で説明しています。基底クラスの実装者が予期せぬ方法で、サブクラスがメソッドをオーバーライドする可能性があり、容易に挙動が破壊されてしまいかねません。継承を前提として設計されているクラスであれば問題ありませんが、多くの場合はそうでありません。それであれば、継承禁止を基本とし、継承の許可は意図的に行った方が安全であるという考え方です。
ご存知のとおりKotlinでは、nullを許容する型と許容しない型があります。nullを許容する型の参照に対して、そのメンバーを呼び出す際には、nullでない確信を得るためのnullチェックであったり、安全呼び出し演算子であったり、NullPointerExceptionを発生させないための一手間を強いられます。
nullを許容する型をnullを許容しない型に強制的に変換する方法が提供されています。びっくりマークを2つ重ねる記法です。User?型の変数userがあったとき、このuserをUser型にしたいときには user!! と記述します。この「!!」を見ると少しぎょっとしますが、それは意図されてのことです。その違和感を危険信号として、より安全な方法(前述のようなnullチェックなど)を検討してもらうよう誘導している
というわけです。
実は、nullの扱いに関して甘い部分もKotlinにはあります。それがプラットフォーム型と呼ばれるものです。JavaのコードをKotlinから参照したとき、nullの許容・非許容がアノテーションによって明確になっているものに関しては、Kotlinでも同様の扱いとなります。一方、Javaのコードで null の許容・非許容が明らかになっていない場合、「プラットフォーム型」と呼ばれる特別な扱いとなります。これは nullの許容型・非許容型のどちらか一方としてみなすことができるようになる仕組みです。NullPointerExceptionの発生を防ぐという目的に立ち返れば、null を許容する型として扱うのが正しいように思えます。にもかかわらずプラットフォーム型を導入したのは、記述の容易さや可読性など現実的な折り合いを付けた結果といえます。すなわち、Javaコードのすべてを null 許容型として扱うと、特にジェネリクス、List<String> のような型が List<String?>? となり、その複雑さによるデメリットが null 安全のメリットを超えてしまうということです。
本書はKotlinの開発者たちが執筆したと前述しましたが、原著からの翻訳を行った4人のうちの1人が実は私です。4人での翻訳作業では、トンマナを揃えることを重視していました。私は直訳気味の文章を好むのですが、この翻訳では自然でなめらかな日本語になるように努めました。訳書であることを感じさせない、読みやすい文章になっていると自負しています。
ただ、ここまで紹介してきて申し訳ないのですが『Kotlinイン・アクション』は絶版となっています。入手が困難です。ただ、原著はまだ入手可能ですし2024年4月に出版された『Kotlin in Action, Second Edition』は新しいバージョンですので、英語で読むという方はこちらをお勧めします。
▲『 Kotlinスタートブック』長澤 太郎 著、リックテレコム
『Kotlinスタートブック』は日本で最初に登場したKotlinの技術書で、Kotlinの機能・文法を、細かく丁寧に解説しています。豊富なサンプルコードを通じて、Kotlinのスキルを身につけることができるでしょう。
手前味噌で恐縮なのですが、私の著書でもあります。前半がKotlinの言語解説、後半がKotlinによるAndroidアプリ開発ハンズオンという内容になっています。2016年出版というこれまた少し古い本でKotlinのバージョンは1.0を対象としており、現在までに追加された文法や機能、エコシステムは扱っていません。
また、Android開発のパートは、さすがに今では参考にならない内容です。それでも、前半のKotlin言語解説は、Kotlinの理解を深めることに役立つかもしれません。今からKotlinを始めようと思っている人や、Kotlinをなんとなくの感覚で使っている人にはお勧め
できると思います。
本書の特徴は、前から順に読み進めることで、読者の中でのKotlinの姿が徐々に拡張されていくように構成されていることです。原則として、後の章で登場する概念や文法を、前の章のサンプルコードで使わないようになっています。よりプリミティブで質素な文法から始まるので、その後に登場するシンタックスシュガーや高度な機能・文法の価値が伝わりやすいと思います。
また、必要最小限のシンプルな形でサンプルコードを、頻度高く掲載しています。REPL(対話型環境)での例示を基本としており、サンプルコードとともにその評価結果をセットで確認できます。
文法や言語機能の詳細な解説が始まる第4章のタイトルは「基本的な文法」ということで、最初のトピックはリテラルについてです。プログラミングの学習に慣れてくるとスキップしがちな項目かもしれませんが、すでに知っているプログラミング言語との共通点や相違点を意識してみると新しい発見があるかもしれません。ちなみに、Kotlinでは32ビット浮動小数点数のFloat型のリテラルは、必ず f あるいは F を数字末尾に置く必要があります。
他の書籍ではあまり見られないアプローチかもしれませんが、オブジェクト指向における「クラス」の登場を意図的に遅らせています。実際のKotlinプログラミングでは活用するシーンがあまりありませんが「オブジェクト式」が最初に登場します。これはプロパティやメソッドを持ったオブジェクトを生成するものですが、名前で参照可能な型を提供しません。
そこで次に登場するのが「インタフェース」です。型に名前を与えてくれるので、オブジェクトが他のオブジェクトと協調することができるようになります。ある型のオブジェクトを返す関数を定義し、その中でオブジェクト式によってインタフェースを実装すれば、それは、クラスの定義とコンストラクタの呼び出しとほとんど同じといえそうです。そこで満を持して「クラス」の登場です…というような順番で解説をしています。これは私が昔、Javaの入門書を読んでオブジェクト指向の考え方に挫折したことが原体験としてあり、このようなスタイルの解説に挑戦してみたものです。
他にも、いくつか著者としてのこだわりがあります。例えば、第3章「Kotlinガイドツアー」は、Kotlinの特徴的な機能や文法を紹介するために、有理数クラスの実装例を示しています。これは「Scalaスケーラブルプログラミング」というScalaの書籍を参考にしています。Kotlinの表現力の高さと、新しいプログラミング言語に触れるワクワク感を1章の中に詰め込んでみました。
出版社から出る私にとって最初の書籍ということで、自分のこだわりをガッツリ反映できたんじゃないかなと思う意欲作です。前述のとおり、古い本ではありますが、Kotlinのパートにおいては現在でも多くのヒントを与えてくれる内容だと自信をもっていえる内容になっています。
▲『Kotlin サーバーサイドプログラミング実践開発』竹端 尚人 著、技術評論社
KotlinはGoogleの後押しもあり、Androidアプリ開発で使われることが多いという印象をお持ちかもしれません。しかし、サーバーサイドでの利用も決して少なくありません。Kotlin Multiplatformが台頭してきて、クライアントもサーバーサイドもKotlinで記述し、コードの共有・再利用を加速させていく未来がすぐそこに来ているかもしれません。
このような背景にもかかわらず、サーバーサイドでのKotlinの活用を解説する書籍は少ないという実情があります。その中で『Kotlin サーバーサイドプログラミング実践開発』は、近年注目を集めているサーバーサイドKotlinの開発に必要な知識を広く解説した書籍です。貴重な一冊だといえます。REST APIの実装解説を通じ認証・認可、ロギング、テストまで、実践的な内容を学ぶことができます。
著者はKotlinのスペシャリストである竹端尚人さん。今年2024年に開催されたKotlin FestでもサーバーサイドKotlinをテーマとして発表をしてくださっています。長年の実務に裏打ちされた、より実践的な知見が本書へと反映されています。
Kotlinをただサーバーサイドアプリケーションの開発に適用するだけ、という話に留まらず、本書のタイトルのとおり「実践」として重要な要素の学習にも役立ちます。
フレームワークとしてSpring BootやKtorなどを採用し、データベースと通信して、REST APIなどをクライアントサイドに提供するようなアプリケーションをKotlinで記述する。何かしらのインタラクションが得られてクライアントと協調できれば、けっこうそれだけで面白くもあるのですが、実用に耐えるものではないということは明白かと思われます。サーバーサイドアプリケーションで重要になってくる、よくある機構として認証・認可、ロギングが挙げられます。
また、どのようにユニットテストを行うのかであったり、データベースのアクセスにはいわゆるO/Rマッパーの選定と実装であったり、必要になってくる知識・技術が多岐にわたります。そういった部分も本書ではしっかりサポートしています。Spring BootとMyBatisによるREST APIを開発する中で、Spring Securityによる認証・認可やJUnitによるユニットテストの解説がなされています。
これらの技術が話題の中心ではありますが、第3部では他のフレームワークについても知ることができます。KotlinのWebアプリケーションフレームークとしてJetBrains製のKtor、同じくJetBrains製のO/RマッパーであるExposedの紹介もあったり、KotlinでgRPCを実装してみるという章もあります。
サーバーサイドでのKotlin活用を主題としているため、当然といえば当然なのですが、Kotlinというプログラミング言語そのものを詳細に解説しているとはいえません。しかし、第2章ではKotlinの特徴的な機能や文法に絞って解説がなされています。これは、他のプログラミング言語でサーバーサイド開発を行ったことのある方であれば、十分 Kotlinの理解を促し、すぐにでもKotlinでの開発を始められるでしょう。
KotlinはJVM言語としての用途が出発点であったため、Javaのエコシステムとの相性がよいということはご存知かと思います。そのためKotlinでのサーバーサイド開発ではSpring Bootが使われることがよくあります。Spring側としても、Kotlinをサポートしています。しかし、元々Java向けのフレームワークであったということもあり、KotlinとJavaの相互運用性を意識すべきシーンがほんの少しあります。第3章では、このことについてしっかり解説がなされているので、Javaを知らない読者でも問題なく読み進められると思います。
今回はKotlinの理解を深めたいエンジニアの方に向けて、おすすめの書籍を3冊紹介しました。
紹介した書籍がみなさまのお役に立てれば幸いです。また、冒頭でも申し上げたとおりですが、Kotlinの学習リソースは書籍だけではありません。Webの情報やコミュニティ、勉強会なども併せて利用すると学習の効果が高まるでしょう。それでは、よいKotlinライフを!
関連記事
人気記事