2024年10月30日
Java Champion
EverforthとAcroquestの2社で正社員として働くエンジニア。仕事のかたわらでコミュニティ活動も行っており、日本Javaユーザーグループの代表を務めるほか、アメリカで開催されたJavaOneやSpringOneなど国内外のイベントで登壇。その実績から日本で3人目の「Java Champion」に任命された。著書に『Java本格入門』(技術評論社)。趣味は対戦格闘ゲームと、BABYMETALを追いかけて世界中を旅すること。
X: @cero_t
Blog: https://cero-t.hatenadiary.jp/
こんにちは、Java Championの谷本心 (@cero_t) です。これまでの2回の書籍紹介では主に今の私の技術力を培ってきた書籍を紹介したため、古いものや絶版になったものなども多く含まれていました。それに対して今回紹介するアーキテクチャ関連の書籍は、現在でも入手可能なもの、あるいは最近出版されたものとなっています。
アプリケーションアーキテクチャやシステムアーキテクチャは、本質的に変わらない部分もあれば時代とともにトレンドが変わる部分もあります。古典の良著を読むだけでは最近のトレンドを捉え損ねかねないため、比較的新しい書籍を紹介したいと思います。
Webアプリケーションを開発する場合、まずは何から設計するでしょうか。画面でしょうか、それともデータベース(データストア)からでしょうか。
2000年代(00年代)にWebアプリケーションを開発していた頃、私は画面から設計するタイプでした。画面設計をして顧客と合意を取り、その画面を永続化するためだけにデータベース(RDB)の設計をするという方式です。
ごく簡単なWebアプリケーションではこの方法でも問題なく開発できましたが、少しでもアプリケーションが複雑になると、途端にパフォーマンスが低下したり、画面の仕様変更に無理やり合わせるようにカラムを追加したり、複雑なクエリを書いてよりパフォーマンスを悪化させることになりました。
そのため、まずはデータベースから設計するように考えを改めました。データベースを自然な形で設計し、それに合うように画面仕様を決めることで、パフォーマンスやメンテナンス性を維持できるようにするためです。
ここで「自然な形で」と言いましたが、何が自然かを判断するためにはデータベースのお作法をよく理解する必要があります。
そのためにオススメの書籍が2つあります。
データベースの設計について学びたい初学者〜初級者にオススメの書籍です。データベース設計の基本から、正規化やインデックス、レプリケーションやバックアップの考え方、また開発方法論やRAIDなどの周辺部分まで、初級者の方にも分かりやすく説明されています。
留意したいのは初版は12年前であり、第2版は今年(2024年)出版されたものとはいえ、内容やポリシーに関してほんの少し古い部分があるということです。ただしデータベースそのものの考え方についてはこの10年、20年で大きく変わってはいないため、問題なく読み進められるでしょう。
まずデーターベースの設計知識とその周辺の必要な知識を身に付けたいという人にオススメです。
中級者以上の方にオススメしたいのがこの書籍です。リレーショナルモデルとは何かというテーマから始まり、それを正しく理解することで効率的なテーブル設計やSQLの作成ができるようになるという内容です。
単に「こういうテーブルを作ってこういうSQLを発行すれば動く」という使い方ありきではなく、データベースやSQLをリレーショナルモデルという文脈で本質的に理解することを本書は促します。その分、特に導入部から前半にかけて理論的な説明が多いですが、後半は履歴データや、インデックスの設計、Webアプリケーションにおけるキャッシュとしてのデータベース利用、またNULLやグラフへの挑み方など、データベースを扱う上で必要となるさまざまな事柄を丁寧に説明しています。
データベースの概念を本質的に理解し、適切な設計手法や使い方を習得したいという方にオススメです。
冒頭で「画面」か「データベース」のいずれから設計するか、という問いかけをしましたが、私は現在、そのいずれでもなく「Web API」から設計しています。
以前の書籍紹介で私はマイクロサービスに取り組んでいたと書きました。マイクロサービスのようにAPI経由で連携するスタイルで開発するようになると、関心の中心はデータベースからAPIに移っていきました。
データベースを開発の中心に置き、データの連携などにもデータベースを使っていた頃は、データベースの設計こそが重要なものでした。しかし、データも含めてAPIで連携するようになると、入り口となるAPIの方がデータベースより重要になり、データベースはAPIを提供するために永続化するような位置付けとなっていきました (※1)。またデータベースの選択肢もRDBだけではなく、KVSやドキュメントストアなどのいわゆるNoSQLなども含め、マイクロサービスを実現するために適したものを選択するようになっていきました。
(※1)もちろんデータベースを中心に置いて設計した経験があったおかげで、データベースに無理をさせないAPIの設計ができるのは確かです。
そのようなAPI中心の設計を進めるうえで紹介したいのが、こちらの書籍です。
こちらはAPI仕様を起点に開発することを薦める書籍です。本書では次の内容がカバーされています。
Go言語とgRPCが中心となっているため、異なる言語を使っていたり、HTTP(REST)APIを設計したりする場合は方法論が少し異なります。しかし本質的に必要な情報などは変わりませんし、私自身、Web APIを開発する際にはRESTfulなAPIを構築するというよりも、HTTPを使ったRPC(リモートプロシージャコール)に近い形で設計するため、本書の考え方には大いに賛同しています。
また本書はAPI仕様ファーストを薦めることと同じくらい、API単体でのE2Eテスト (※2) をすることに主眼を置いており、半分くらいはE2Eテストの手法や設計について述べられているため、その方法論を知りたい方にもオススメです。
(※2) E2Eテストは言葉の定義が広く、一般的には関連するサービス全てを立ち上げたうえでテストする手法を意味することが多いですが、本書ではWeb API単体をテストするという位置付けとして説明しています。
何度も覆してばかりで申し訳ないのですが、上で「Web API」から設計していると書いたものの、私は本当にWeb APIをおもむろに設計し始めているわけではありません。その前に業務要件や業務仕様を把握して、適切なモデリングをするというプロセスを踏んでいます。
モデリングと言うと、オブジェクト指向などを用いたモデリングや、RDBを想定したデータモデリングなど、さまざまなモデリングのアプローチや手法があり、どういう図でアウトプットすべきかなどについても、たくさん議論されています。しかしモデリングにおいて、アウトプットと同等以上にインプットが重要です。つまり、モデリングの対象をどの観点から見てどう捉えるか、そしてそれらをきちんと議論して皆の共通認識を取るか、というものです。
このモデリングのためのインプットについて紹介したいのが、この書籍です。
本書はデータモデリングとは何か、どうあるべきかを捉えたうえで、基幹系システムを題材にしてデータモデリングの具体的な考え方について説明しています。
前半では基幹系システムをSoA(現場に近い「活動のシステム」)とSoM(管理者の立場に近い「経営管理のシステム」)の2つに整理したうえで、それぞれの特性の違いを捉えてデータモデリングの観点やポイントを紹介しています。また、アーキテクトとはユーザーとの対話をして問題領域を理解し、解決するための方法を描く立場であるとし、技術的関心ごとにばかり終始してしまわないよう何度となく注意を促しています。
何よりも本書において優れているのは、著者の物事の捉え方や洞察力、観察眼、そしてその言語化力です。たとえば本書では「道具」と「用途」という用語を分けて説明しています。「スプレッドシート」という「道具」が「住所録管理」という「用途」に利用されるというものです。ここで道具が用途に特化した狭いものであれば、道具と用途のデータモデルはほぼ同じ形になるものの、一般的には道具と用途(スプレッドシートと住所録管理)のデータモデルは異なるものである、と指摘しています。
この説明だけであれば、ほとんどの方が「当たり前だ」と感じると思いますが、これがいざモデリングの話になると、その境界が曖昧なものとなってきます。モデリングの対象が「捉えようとする対象そのもの」なのか、それとも「その解決方法」なのか、それを見失いがちだという指摘です。
また本書はエリックエヴァンスのドメイン駆動設計についても言及しており、ドメインモデルついて本書は明確に「ドメインモデルはドメイン自体のモデルではありません。そうではなく、実のところそれは、そのドメインの問題を解決するための道具のモデルです」と述べています。そしてユーザーとの対話でドメインモデルを描く過程や、ドメインそのもののモデルを描こうとすることの問題について共感しながらも、ドメインモデルと実装を過度に一致させようとするプラクティスに対しては異を唱えています。この辺りの説明にも読む価値が大いにあると感じました。
一方で本書はアウトプット、つまりモデリングをどのような図で表すか、あるいはそれらを実装する際にどのようなコードにすべきかはほとんど論じていません。アウトプットのためのプラクティスを知りたいのであれば別の書籍にあたる必要があります。
いずれにせよ本書は非常に密度の濃い書籍となっており、ただ一読しただけではもったいない、エンジニアのキャリアを歩む中で何度となく読み返す価値のある書籍であると確信しています。むしろ私の紹介や引用の稚拙さが本書の良さを損なってしまわないかを危惧するくらいです。皆さんにも、ぜひ読んでいただきたいです。
今回は私が現実的な最適解だと考えるアーキテクチャの形に近い書籍や、共感する内容が多い書籍を紹介しました。特に『理論から学ぶデータベース実践入門』と『データモデリングでドメインを駆動する』の2冊は内容が平易ではない箇所もあります。ただ、書籍というのは一読しただけでは理解できず、数年後に再訪して初めて理解できることや気づくことがあるものだと思います。
この3回の連載で紹介した書籍のいずれかが、皆さんにとってそんなふうに長く付き合うことになる書になれば幸いです!
関連記事
人気記事