Java Champion

谷本 心

EverforthとAcroquestの2社で正社員として働くエンジニア。仕事のかたわらでコミュニティ活動も行っており、日本Javaユーザーグループの代表を務めるほか、アメリカで開催されたJavaOneやSpringOneなど国内外のイベントで登壇。その実績から日本で3人目の「Java Champion」に任命された。著書に『Java本格入門』(技術評論社)。趣味は対戦格闘ゲームと、BABYMETALを追いかけて世界中を旅すること。
@cero_t
Blog: https://cero-t.hatenadiary.jp/

書籍リスト
  1. 『Googleを支える技術 ……巨大システムの内側の世界』西田圭介著
  2. 『マイクロサービスアーキテクチャ 第2版』Sam Newman著、佐藤 直生監訳、木下哲也訳
  3. 『プロダクションレディマイクロサービス ―運用に強い本番対応システムの実装と標準化』Susan J. Fowler著、佐藤 直生監訳、長尾 高弘訳
  4. 『モノリスからマイクロサービスへ ―モノリスを進化させる実践移行ガイド』Sam Newman著、島田浩二訳
  5. 『入門 監視―モダンなモニタリングのためのデザインパターン』Mike Julian著、松浦 隼人訳

はじめまして、日本JavaユーザーグループのリーダーでJava Championの谷本 心(@cero_t)です。今回から2回にわたり「プロフェッショナルの技術書本棚」というコーナーで、私の技術力を培ってきた書籍や、オススメしたい書籍を紹介します。

私もこの業界に入って20年を超えましたので、紹介する書籍の中には新旧さまざまなものが混ざっています。技術とそのトレンドは変化していたとしても、本質的な考え方や構造はあまり大きく変化していない部分もあり、過去の良著が現在でも役立つことは少なくありません。そのため古い書籍については「あの書籍は本当に良かった」と思える、強い印象を与えた書籍たちを紹介します。

さてJavaのコミュニティリーダーの私が選ぶ書籍なのですから、まず初回はJavaの書籍から……とはならず、まずは私自身の技術に対する考え方に大きな影響を与えた書籍から紹介します。

サービスに必要なプラットフォームを自分たちで開発する、Googleの姿勢

新卒社員としてIT企業に入り、いくつかの開発案件を終えた後に思うことがありました。

「なぜWebアプリケーションの開発では、データストアにRDBMS(リレーショナルデータベースシステム)を使うことになっているんだろう。なぜ他の選択肢がないんだろう。本当にRDBMSはすべての用途に合うのかな?」

当時は2000年代(00年代)後半で、現在のようにKVSやドキュメントデータベースなどの、いわゆるNoSQLと呼ばれるさまざまなデータストアがまだ普及しておらず、実質的にRDBMS以外の選択肢はありませんでした。加えて言えば、当時はWebアプリケーションを開発するためのフレームワークや、RDBMSにアクセスするためのO/Rマッパーなどに注目が集まっていて、多くの選択肢がありましたし、もちろんプログラミング言語も現在と同じく選択肢がありました。しかしながらデータストアはRDBMSの一択で、OracleやSQL Server、DB2、あるいはMySQL、PostgreSQLなどからどれを使うか選択していました。当時の私には、その状況が不自然に感じてならなかったのです。

前置きが長くなりましたが、そのようなモヤモヤを抱えていた際に出会ったのが『 Googleを支える技術』です。

▲『 Googleを支える技術 ……巨大システムの内側の世界』(技術評論社)

本書には次の内容などがカバーされています。

  1. 検索サーバの仕組み(インデックス作成やスコアリング)
  2. 分散システムによる耐障害性向上と負荷分散
  3. 分散データストアによる耐障害性向上と負荷分散
  4. 分散データ処理による性能向上
  5. Googleの開発体制

16年前の書籍ですから、今となっては古くなって内容が異なっている部分もありますし、HadoopやRedis、Kafkaといった分散システム開発のためのミドルウェアの台頭や、何よりAWS(Amazon Web Service)やGCP(Google Cloud Platform)などのクラウドサービスの普及により分散技術がより身近になり、私たちエンジニアの分散システムに対する理解も増したため、いまでは当時とは違った受け止め方になることは想像に難くありません。しかし分散システムの本質そのものや抱える課題は変わっていないため、本書で分散システムの背景にある仕組みを理解することは現代でも十分に役立ちます

そして何よりこの書籍で当時の私が感銘を受けたのは「Googleが自分たちのサービスを提供するために技術を作っていること」そのものでした。もちろんいまとなっては常識かもしれませんが、16年前の私にとって、サービスプロバイダがそのプラットフォームまで開発してサービスを提供していることは驚きだったのです。自分たちのサービスをより高速に、より堅牢に、より高品質に提供するために、RDBMSを使わずに(もちろん使える部分には使ったでしょう)、ファイルシステムから見直し、その上に独自のデータストアなどのプラットフォームを構築する。そんなGoogleの姿勢は、データストアにRDBMSしか使わない状況に疑問を抱いていた私のモヤモヤを払拭するものでした。「あぁ、やっぱりミドルウェアだってプラットフォームだって、必要であれば開発すべきなんだ!」と興奮していたことを今でも思い出します。

それで本書を読むまでは「すでにあるフレームワークやミドルウェアから選択してシステムを開発する」という姿勢だったのですが、本書を読んだ後は「サービス提供における課題や、自分が捉える開発の課題感を解決できる技術を採用する。必要であれば自力で開発する」という姿勢に変わりました。それほどに大きな影響を与えてくれた書籍でした。

なお最後にひとつ言っておかなくてはいけないことは、私はいまでもRDBMSを愛しながら利用しているということです。

「マイクロサービス」その言葉を聞いただけで取り組み始めた

▲『マイクロサービスアーキテクチャ 第2版』(オライリー・ジャパン)

ちょうどこの書籍が出版される頃、私はWebフロントエンド + サーバサイドAPIの構成でWebアプリケーションを開発していました。開発や運用のすべてが順調だったとはいえないものの、システムは無事に稼働し続けていました。ただ、開発したAPIを別の目的で再利用しようとした際に大きな問題に直面したのです。開発したWebアプリケーションはAPIベースだったとはいえ、APIが画面とのやりとりに特化した項目や構造になっていて、API単体として利用することはほとんど不可能だったのです。それで悩んでいた際に出会った言葉が「マイクロサービス」でした。内容などはほとんど分かっていませんでしたが、これがいま自分の抱えている課題を解決する技術だと認識して、すぐにマイクロサービス化に取り組み、本書が発売されたらすぐに購入したのです。

本書は次のような内容をカバーしています。

  1. マイクロサービスとは何か、利点や欠点は何なのかという概説
  2. ITアーキテクトの取るべきアプローチや標準化についての概要
  3. モデル化の方法
  4. サービス間の結合やデプロイの手法
  5. マイクロサービスならではの監視、セキュリティ
  6. コンウェイの法則など含む組織論

端的にいえばこの書籍は「マイクロサービスに必要な考え方」を整理したものです。マイクロサービス開発に取り組むにあたって欠かせない視点や心構え、注意点などをいくつかの技術と共に説明しています。もちろんマイクロサービス開発の話では9割がた登場する組織論やコンウェイの法則、逆向きコンウェイの法則などについても本書はカバーしています。特に印象深かったのは2章の「進化的アーキテクト」で、ITアーキテクトをよくいわれる「建築家」にたとえるのではなく「都市計画家」にたとえるとことで、見事にマイクロサービス開発におけるITアーキテクトの役割を整理しています。初めて読んだ当初は「そんなものか」くらいの感想でしたが、いま改めて読んでみて自分の役割はこれであると再認識しています。

その一方で、個別の技術要素やツール、プラクティスなどについては概要の説明と選択肢の列挙くらいに留めています。たとえば非同期処理でよく使われるアーキテクチャであるCQRSや、サービスディスカバリなどに利用できるConsulなどのツールについては、それぞれ1ページ未満の説明しかありません。ただ、逆にいえばそれぞれの技術要素を深掘りするよりも、マイクロサービス開発に必要な前提知識を網羅的にカバーしているといえます。

本書を読んだうえで、より実践的な作り方を知りたい方には次の書籍をオススメします。

より実践的な学びを得るのにオススメな書籍2冊

▲『プロダクションレディマイクロサービス ―運用に強い本番対応システムの実装と標準化』(オライリー・ジャパン)

内容的に「マイクロサービスアーキテクチャ」とかぶるところが多いものの、よりプラクティスの説明を重視した書籍となっています。また、マイクロサービス開発において多くの場合に直面しがちなモノリスからの移行について知りたい方には、次の書籍がオススメです。

▲『モノリスからマイクロサービスへ ―モノリスを進化させる実践移行ガイド』(オライリー・ジャパン)

モノリスからの移行に特化した書籍で、たとえばストラングラーパターンのようにアプリケーションを少しずつ置き換えてマイクロサービス化していくような手法などを紹介しています。

ところで、SNSやブログなどでマイクロサービスについて話題にあがる際、そのだいたいは「マイクロサービス不要論」のように見えます。そのこと自体は別に構わないのですが、私が残念に思うことは「マイクロサービス開発を経験したことがないまま、ネットの評判を真に受けてマイクロサービス不要派になる」人が少なからずいるようだ、ということです。有り体な言い方ですが「できるけどやらない」ことと「できない」ことは大きく異なります。

実は冒頭で書いた「APIを単体で再利用しづらい」問題そのものはマイクロサービスとは本質的には関係なく、ただただAPIの設計がマズかっただけなのです。しかしマイクロサービス化を通じてドメインの分割を行い、設計や構造を見直すことでAPIは飛躍的に改善されました。またマイクロサービス化の取り組みそのものも、IPAが発行する文書でも取り上げられるなど、成功といって差し支えない形になりました。

新しい技術を導入して問題が起きる場合、たいていは技術ではなくそれを使った設計に問題があります。たとえマイクロサービスではないとしても、モダンな分散アプリケーション開発において本書で網羅されている考え方や、技術要素を学ぶことは非常に役立つため、食わず嫌いをしている方はぜひ学んでみてほしいです。

監視を生業にしてきたからこそ共感しかない

私は監視やトラブルシュートを行うためのツールを業務で開発しており、監視も好きな分野のひとつです。ひと口に監視といってもその内容や取り組み方は多岐に分かれているのですが、大体は「著名なツールを導入すればOK」となりがちです。そして目的が曖昧なまま監視やログ収集が行われた結果、問題が起きた時にはエンジニアが「とりあえず手持ちの情報から、何とか頑張って問題対応する」となります。良くないですね。

▲『入門 監視 ―モダンなモニタリングのためのデザインパターン』(オライリー・ジャパン)

本書はまずそのようなツール主導の監視を「間違っている」と一刀両断にするところから始まります。つづいて列挙されているアンチパターンは思い当たる節があるものばかりで、いままで何となくやっていた監視とは何だったのかという気持ちにさせてくれます。身につまされる思いもありながら、非常に痛快です。

本書ではその他にも次のような内容がカバーされています。まずは監視全体の考え方として

  1. 監視データの収集、保存、可視化、分析、アラートなどの監視デザインパターン
  2. アラートへの対応をどう行うべきか
  3. データの平均値、中央値、パーセンタイル、周期性、標準偏差などを用いた分析

そして個別の監視対象について

  1. ビジネスのKPIを監視データと結びつける
  2. フロントエンドの監視(主にRUMとシンセティック監視)
  3. サーバサイドアプリケーションの監視(分散トレーシング)
  4. サーバOS、Webサーバ、DBサーバなど、各種サーバの監視
  5. SNMPを用いたネットワーク監視
  6. auditdのログや監査証跡を用いたセキュリティ監視

などの内容をカバーしています。

クラウドプラットフォームやIaC(Infrastructure as Code)ともに流行したDevOpsという言葉が指すように開発者が監視や運用の分野を考える機会が多くなりました。そして上に書いたマイクロサービスのように、アプリケーションをモノリシックではなくいくつかに分散させて稼働させることが増えた結果、監視が必要なサーバ・サービス数が増えて、ますます適切に監視を行うことは重要になりました。

本書は監視の考え方や手法について網羅的に整理されており、読みながら首がもげそうなくらい頷いてしまうものばかりです。これから監視を始める人にも、既に監視業務に携わっている人にもオススメしたい一冊です。

最後に

今回は私が過去に読んだ書籍の中でも、特に印象が深かった5冊を紹介しました。次回はJavaのコミュニティリーダーらしく、Javaを学べる書籍を紹介したいと思います。