この記事はWano Group Advent Calendar 2025の11日目の記事です。
0. はじめに
WEBサービスバックエンド8年目のブックトークという名のもとに行う棚卸エッセイです。
1. ソフトウェア設計関連
ソフトウェア設計は難しい。何をどこに置くべきか、システム化の対象のどこをキャプチャしどこをオミットすべきか、将来の変更を困難にしていないか、自分の作ったモジュールは利用者が使いやすいものとなっているか、あらゆるものが釘に見えていないか等々。そんな悩みをいつでも百発百中で一掃できる銀の弾丸は無いので、日々カードプールを増やし、個々のトレードオフを正しく理解し、盤面に応じて適切なカードを適切な組み合わせで出せるようになる必要があると感じています。ここでは、そのようなカードの補充と理解の役に立ったと感じる書籍をいくつか挙げさせてもらいます。
A Philosophy of Software Design
この手の本の中では間違いなく一押しです。特定の設計フレームワークに偏ることなく、様々な角度からソフトウェアの複雑性と向き合うためのHow-toを説いてる書籍です。どのセクションも捨てるところが無い本書ですが、よいコメント (ドキュメント) の書き方についての一連のセクションが特に印象に残っています。コメントは文章として書く、利用者の立場を考えて役に立つ内容を書くという当たり前のことから、コメントの対象 (moduleなのか、interfaceなのか、implementationなのか) によって何を強調して書き残すべきかなど、テクニカルライティングの基礎基本が学べるのでプログラマ経験のあるマネージャー等の立場の人も興味深く読めるかと思います。おそらく邦訳書は今後も出ないと思われるので原著で読むしかないですが、比較的薄手の本なのでそこまで負荷なく読めるかと思います。
同種の書籍としてはルールズ・オブ・プログラミングもおすすめです。こちらも、特定のフレームワークに偏ることなく普遍性の高い内容となっているので、どのようなバックグラウンドのプログラマでも参考になる部分が多いかと思います。
ドメイン駆動設計をはじめよう
数年前にドメイン駆動設計という言葉が再び掘り起こされ、自分の出歩くインターネット圏内でもしばしば目にするなと感じる時期がありました。ただ、自分としてはどうにも人によってドメイン駆動設計というものに対しての味付けが異なり、一体ドメイン駆動設計とは何なのか…という感覚がぬぐい切れませんでした。エリック・エヴァンスのドメイン駆動設計も読みはしたが、戦略部分については非常に納得できるものの、戦術部分については愚直に従うにはやや重厚すぎはしないか (いわゆるFizzBuzzEnterpriseEditionを感じる) と十分に咀嚼しきれずにいました。
それからある程度の時がたってこの本を読んだところ、自分にとっては非常に腹落ちする内容でした。Evansのドメイン駆動設計を下地に、過度な拡大解釈を加えることなく丁寧に現代的な視点からまとめあげられていると感じました。特に、戦略部分と戦術部分をきちんと切り離して考える、そして、戦術にはグラデーションがあるということがしっかりと書かれている点が非常によいと感じました。
2. データベースマネージドシステム (DBMS) 関連
仕事をはじめて1、2年たった頃だったかと思います。色々と実務を経験する中で、ぜんぜんわからない俺は雰囲気でデータの出し入れをやっているという感覚が拭えずにいました (今考えるとなかなかに恐ろしいことです)。その感覚を払拭するために、基礎固めとして読んだ本をいくつか上げていきます。
リレーショナルデータベース入門
きちんとデータベースについて勉強しようと思い立ってから最初に読んだ本です。扱われているトピックスも非常にベーシックなもので、後にさらに厚手の書籍を読む際にも本書を読んでいたおかげで迷子にならず済みました。初めて読んだときは全体としてやや駆け足な印象を感じましたが、後で改めて読むと限られた紙面の中でデータベースという分野全体のアウトラインと各トピックのエッセンスに触れることができるようになっているなと思わされます。
同じ入門書というくくりであれば、データベースの仕組みもよいかと思います。こちらは、リレーショナルデータベース入門よりさらに薄手なので、より手を出しやすいかと思います。ただし、物理層の各種トピックが少なめとなっているので、他の物理層について力の入ってる書籍 (詳説 データベース等) を続けて読むことが前提となるかと思います。
Database System Concepts
前出のリレーショナルデータベース入門のFurther Readingで強く推薦されていたので手に取ってみた本です。個人的にDBMSの教科書で何か一冊と言われたら、おそらくこの本を上げることになると思います。扱われているトピックスは先のリレーショナルデータベース入門と同様にベーシックなものですが、それらの内容について十分かつ丁寧に深堀されており、しっかりと納得感を持って知識として落とし込めました。ファイル編成法、同時実行制御、オプティマイジングあたりの基礎知識は実務上でも特に日々お世話になっています。おそらく邦訳書はなかったかと思うので原著を読むしかないですが、実務上役に立つレべルまでDBMSの基礎知識をしっかりと固めたい人にはお勧めできる一冊です。
類似の書籍で、Fundamentals of Database Systemsもよいかと思います。扱っているトピックスの広さと深さは概ね同じなので、どちらを読むかは好みで選んでもよいかと思います。ただ、同じトピックでも著者によって切り口や強調される点が違っていたりするので、両方を読むことでより理解が深まるかと思います。
データ指向アプリケーションデザイン
トラディショナルな集中型のRDBMS、分散DBMS、HadoopのようなMap-Reducer関連の3つトピックスについてバランスよく取り扱っているのが特徴です。先に紹介した一般的なデータベースの教科書とはやや異なるトピックス構成になっているので、DBMSの基礎知識を固める目的としては最初の一冊にお勧めするのはやや難しいかもしれとは感じています。しかし、データの保存からETLまで、現代のサービスにまつわるデータエンジニアリングの諸問題と各種戦術が有するトレードオフについて一通り学ぶことができるため、システムアーキテクトのような立場の人であれば是非一読をお勧めします。また、来年には、原著の第二版が出版されるようなので楽しみですね。
3. オペレーティングシステム関連
データベース同様、色々と実務を経験する中で時々サーバのプロファイリングをしたりする機会も出てくるのですが、ぜんぜんわからない俺は雰囲気でサーバの様子を見にいっているという感覚がありました。その感覚を払拭するために、基礎固めとして読んだ本をいくつか上げていきます。
[試して理解]Linuxのしくみ
Linuxと銘打たれていますが、実質オペレーティングシステムという分野のよい入門書だと思います。プロセススケジューリングから仮想化まで、他のスタンダードなオペレーティングシステムの教科書で扱われているトピックスについて一通り触れられるような構成になっており、分野全体のアウトラインを掴むことのできる一冊だと思います。図表も豊富で理解の助けになります。また、細かく説明しないと理解が難しい性質の話題には割り切って踏み込みすぎない形になっているので、初学者でもつまずくことなく最後まで読み通すことできると思います。
他には、オペレーティングシステムの仕組みも入門書としてはおすすめです。こちらも分野のアウトラインを掴めるような構成になっており、初学者にとって身になる書籍だと思います。
Modern Operating Systems
オペレーティングシステムの教科書としては鉄板であるタネンバウム本です (原著は現在5版が最新ですが、自分の手元にあるのは4版なので本稿では4版を前提とした紹介になっています)。先に紹介した入門書で学べる内容をより丁寧に深堀出来ます。入門書だとオミットされがちな平行並列にまつわる諸問題 (レースコンディションやデッドロック等)、スレッドという概念、マルチコアプロッセサやセキュリティに関する話題もあるので、入門書でアウトラインを学んだあとに、こちらを使って知識を深めることをお勧めします。邦訳書は古い版のものしかなかったと思うので原著で読むことをお勧めします…と思ったら、最新の5版は邦訳書が出てるみたいです。大変ありがたいことです。
同種の書籍としては、Database System Conceptsの著者でもあるSilberschatz先生によるOperating System Conceptsもお勧めです。扱っているトピックスは概ね同じなので、どちらを読むかは好みに任せてもよいかと思います。もちろん、両方読むことでより理解が深まるかと思います。
4. プログラミング言語関連
最近はオフィシャルのコミュニティがWEB上で十分にまとまった資料を公開していることが多いので、特定の言語を名を冠した書籍を手に取ることは少なくなった気がします。従って、少し古い思い出枠の本が多いです。枝葉の内容は今となっては古くなってしまったかと感じる部分もありますが、各書籍にある哲学は今でも役に立っていると感じる。そのような書籍をいくつか挙げていきます。
Effective C++
初めて触れたプログラミング言語がC++であり、特にこの本は当時何度も読み返した思い出深い本なので上げさせてもらいます。C++からはリソースの確保と解放の重要性、オブジェクト指向の基本的な概念、テンプレートによるメタプログラミングと様々なことを教えてもらったので大変お世話になった言語です。
C++関係の書籍でいえば、Exceptional C++も印象に残っています。この書籍で深堀されている、例外安全という例外の取り扱いに対する原理原則は、言語関係なく今でも役に立つ考え方だと思っています。
プログラミングPerl
通称ラクダ本です。仕事でPerlを書き始めた当初は、どうにも馴染めなくて苦労しました。やはり日々扱う言語なので何とか友好的な感情を持てないものかと思い色々書籍をザッピングする中で、本書に出会ったことで和解に至りました。ラクダ本はラリーウォール直筆ということもあって、とにかくPerlという言語のコンセプトについて理解が深まるような作りになっているなと感じます。特に緒言にある
ひとことで言えば、Perlは、難しい仕事を不可能にすることなしに、簡単な仕事を簡単にできるように設計されている。
という一文は非常に印象に残っています。
Perlに限らず、特定の言語とうまくやっていくには、その作者やコミュニティは言語にどのようなコンセプトを課したのか、どういう思想で特定の機能を設けたのかということを理解し、それらに乗っかるよう心掛けるとするとストレスなくやれる気がするのかなと思っています。なので、自分はPerlを書く時は自認Perl MongerとなりPerlらしいコードをかく、Goを書く時は自認GopherになりGoらしいコードを書くということを心がけています。
時の流れとともに少しずつPerlを書く機会は減ってきてはいますが、何だかんだで多くのLinuxディストリビューションにデフォルトで入っているという点に都合のよさを見出すタイミングというのは多々あったりするので、自分にとってはちょっとした仕事をこなすためのアーミーナイフとして、今後ともお世話になる予定ではあります。
5. その他
特定のカテゴリとしてまとめた上で紹介できるほど同分野の本を読んだわけでは無いけど、自身の血肉にはなってくれたなという感触がある書籍たちを少しばかし置いておきます。
理科系の作文技術
ドキュメントの作成だったり、プログラムのコメントを書いたり、プログラマという仕事は何かと人に理解してもらうための技術文章を書く機会が多いです。広義の意味でいえばソースコードも人に読まれる技術文章といえるかと思います。正確で伝わりやすい文章を書くためには、正しい技術的な知識だけではなく、それを適切に文章として構築する力も必要です。本書ではそのような文章力、いわゆるテクニカルライティングの基礎基本を学べる書籍となっています。他人に見せる技術文書を書く機会がある全ての人とって身になる本かと思います。
定本 Cプログラマのためのアルゴリズムとデータ構造
何かしら特定の分野の書籍を読んでいると、読者は基本的なアルゴリズムとデータ構造については知っているだろうという前提のもとに話が展開されるということはよくあるので、この書籍でなくとも何か一冊アルゴリズムとデータ構造の基礎を学べる一冊に目を通しておくと、様々な分野の教科書を読む際の助けになってくれるかと思います。
6. おわりに
まだまだ、ネットワークやセキュリティ、ソフトウェアテスティング関係と紹介したい書籍は思い当たるのですが、そろそろ〆切が近いので今回はこのあたりでお開きとさせていただきます。
最後に、本稿でも紹介したデータベースの仕組みの緒言より、自分が印象に残っている一説を引用させていただきます (文意を損なわない範囲で一部省略を挟んでいます)。
最近は書店のコンピューターコーナーに行くとデータベースを取り扱った本を数多く見かける。それはとても喜ばしいことだが、そのほとんどは特定のデータベースソフトウェアの使い方を解説したものである。
(中略)
これに対して本書は、大学の学部においてデータベース技術を初めて学ぶ学生や、データベースソフトウェアを利用しているのだがまだデータベース技術を学んだことのない技術者を対象として、特定のデータベースソフトに依存しないデータベースシステムの基礎となる諸概念をできるだけ丁寧に解説する。このような基礎知識は、個々のソフトウェアの使い方に関する知識よりも普遍性を持つので、特定のソフトウェアの流行廃りはもちろん、技術の進歩に対してさえも十分に耐えうる応用力を与えてくれるものと信じている。
今後とも、上記のような技術の進歩に対しても耐えうる普遍的な知識を与えてくれ、長く付き合える技術書と出会えるといいなと思いつつ、定期的に読書はしていきたいですね。
7. Reference
本稿で紹介した書籍を改めてまとめておきます。
- J. K. Ousterhout: A Philosophy of Software Design (2nd Edition), Yaknyam Press, 2021
- C. Zimmerman (著), 久富木 隆一 (訳): ルールズ・オブ・プログラミング―より良いコードを書くための21のルール, オライリー・ジャパン, 2023
- V. Khononov (著), 増田 亨, 綿引 琢磨 (訳): ドメイン駆動設計をはじめよう―ソフトウェアの実装と事業戦略を結びつける実践技法, オライリー・ジャパン, 2024
- E. Evance (著), 今関 剛 (監訳), 和智 右桂, 牧野 祐子 (訳): エリック・エヴァンスのドメイン駆動設計, 翔泳社, 2011
- 増永良文: リレーショナルデータベース入門 (第3版), サイエンス社, 2017
- 福田 剛志, 黒澤 亮二: 情報科学こんせぷつ 12 データベースの仕組み, 朝倉書店, 2009
- A. Petrov (著), 小林 隆浩 (監訳), 成田 昇司 (訳): 詳説 データベース ―ストレージエンジンと分散データシステムの仕組み, オライリー・ジャパン, 2021
- A. Silberschatz, H. F. Korth, S. Sudarshan: Database System Concepts (7th Edition), McGraw-Hill, 2019
- R. Elmasri, S. B. Navathe: Fundamentals of Database Systems (Global Edition, 7th Edition), Pearson, 2016
- M. Kleppmann (著)、斉藤 太郎 (監訳), 玉川 竜司 (訳): データ指向アプリケーションデザイン―信頼性、拡張性、保守性の高い分散システム設計の原理, オライリー・ジャパン, 2019
- 武内 覚: [試して理解]Linuxのしくみ―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】, 技術評論社, 2022
- 河野 健二: 情報科学こんせぷつ 5 オペレーティングシステムの仕組み, 朝倉書店, 2007
- A. Tanenbaum, H. Bos:Modern Operating Systems (Global Edition, 4th Edition), Pearson, 2014
- A. Silberschatz P. B. Galvin, G. Gagne: Operating System Concepts (10th Edition), John Wiley & Sons, Inc.,
- S. Meyers (著), 小林 健一郎 (訳): Effective C++ 第3版, 丸善出版, 2014
- H. Sutter (著), 浜田 光之 (監修), 浜田 真理 (訳):Exceptional C++: 47のクイズ形式によるプログラム問題と解法, 桐原書店, 2000
- L. Wall, T. Christiansen, J. Orwant (著), 近藤 嘉雪 (訳): プログラミングPerl 第3版, オライリー・ジャパン, 2002
- 木下是雄: 理科系の作文技術, 中央公論新社, 1981
- 近藤 嘉雪: 定本 Cプログラマのためのアルゴリズムとデータ構造, ソフトバンククリエイティブ, 1998