SREやクラウドエンジニアが読むと良さげな本まとめ

一年半ぐらい前にアプリケーションエンジニアからSREにコンバートした筆者が、いま役に立ってるなぁっていう本を紹介します。アプリケーションコードを書いてるときは下のレイヤの技術に興味なかったんですが、改めて勉強してみると楽しいです。


## コンピュータシステム

クラウド全盛とはいえ、コンピュータの仕組みはおさえておくと役立ちます。コレ系の本はわりと小難しいものが多いですが、個人的に楽しく読めた本を紹介します。

### [Raspberry Piで学ぶコンピュータアーキテクチャ](https://www.amazon.co.jp/dp/4873118654/)

Raspberry Piと銘打たれてますが、コンピュータアーキテクチャの歴史的な背景も踏まえて解説されています。プロセッサ・メモリ・ストレージ・ネットワーク・OS・プログラミングなど、コンピュータ単体の基本的な知識を学べます。　歴史をあわせて知ることができるため、知的好奇心がおおいに刺激され、楽しく読むことができます。この本が難しく感じられる場合は、「[プログラムはなぜ動くのか](https://www.amazon.co.jp/dp/4822283151/)」もオススメです。


## Linux

コマンドの使い方は入門書片手に実践すると早いですが、仕組みを知るにはやはり本がてっとり早いです。

### [[試して理解]Linuxのしくみ](https://www.amazon.co.jp/dp/477419607X/)

Linuxカーネルの全体像を知るのに最適な本です。プロセススケジューラ・メモリ管理・記憶階層・ファイルシステムなど、Linuxがどのように動いているか解説しています。図解が豊富で非常に分かりやすいです。Linuxに限らずOS周りは小難しい本や分厚い本が多いですが、この本は浅すぎず深すぎずという絶妙な塩梅になっています。もっと早く出会いたかった！

### [詳解 Linuxカーネル](https://www.amazon.co.jp/dp/487311313X/)

少し古いですが、日本語でLinuxカーネルについて詳述した貴重な書籍です。いきなり通読するのはちょっとキツいので、最初は興味のあるところだけつまみ食いでもよいでしょう。筆者の場合はプロセスやシグナルについて詳しく知りたかったので、その部分だけ読みました。そのうち通読チャレンジしたいところです。なお本棚に飾ってあるとカッコいい書籍のひとつだと、勝手に思っています。


## ネットワーク

ネットワークは分かりやすい入門書がいくつも出版されています。

### [マスタリングTCP/IP―入門編―](https://www.amazon.co.jp/dp/4274224473/)

TCP/IPについて入門するならこの本、という定番書です。それほど詳細に深入りしているわけではありませんが、とっかかりとしては十分な情報が提供されています。ネットワーク周りのプロトコルは最終的にRFCを読むことになりますが、いきなりRFCを読むのはキツいので、まずはこの本で概要をつかむのがオススメです。つい最近、第6版が出版されました。

### [DNSがよくわかる教科書](https://www.amazon.co.jp/dp/479739448X/)

なんとなくとっつきずらいDNSについて学び直そうと手にとった本です。非常にわかりやすく書かれており、スラスラと読みすすめることができます。DNSの動作原理を知れるのもよいのですが、個人的にはサイバー攻撃とその対策がとても面白かったです。DNSってキーワードは知ってるけど、実はよくわかってないんだよな〜という人にオススメです。


## インフラ基礎

一言でインフラと言っても幅広いですが、特にクラウドメインのエンジニアに役立ちそうな本を集めました。

### [インフラエンジニアの教科書2](https://www.amazon.co.jp/dp/4863541864/)

インフラの基本が幅広く網羅されており、OS・ネットワーク・データベース・セキュリティ・障害対応の基本を学べます。この本では運用時に起こりやすい問題もまとめられており、実践的なノウハウが満載です。インフラの本としては珍しく薄いので、挫折しづらいのもポイントが高いです。アプリケーションエンジニアにも読んでほしいオススメの一冊です。クラウドではなく自身でハードウェアの選定を行う人は「[インフラエンジニアの教科書](https://www.amazon.co.jp/dp/4863541333/)」もあわせてどうぞ。

### [絵で見てわかるITインフラの仕組み](https://www.amazon.co.jp/dp/4798158461/)

システム設計で必要になる知識が平易な言葉で解説されています。同期／非同期・キュー・排他制御・キャッシュ・レプリケーションなど、説明なしで使われることの多い用語を丁寧に説明しています。また3層アーキテクチャのWebシステムやシステムの冗長化、パフォーマンスチューニングの基礎などを図解もふんだんに交えて解説します。システム設計においては基本的なことばかりですが、意外とこのレベルのことを分かりやすく解説した本は少ないので貴重です。書籍ではないですがGitHubで公開されている「[システム設計入門](https://github.com/donnemartin/system-design-primer/blob/master/README-ja.md)」もあわせてどうぞ。

### [Infrastructure as Code](https://www.amazon.co.jp/dp/4873117968/)

いまや基礎教養といえるInfrastructure as Codeについてガッツリ学べます。ツールの使い方ではなく、思想や設計について体系化されています。便利なツールは世の中にいろいろありますが、それらがどのような課題を解決しているのか、全体像を知るのにピッタリです。Infrastructure as Codeのアンチパターンやベストプラクティスが一気に学べる、密度の濃い書籍です。


## AWS

パブリッククラウドの代表格といえばAWSです。ユーザーが多いだけあって、本もたくさん出版されています。GCPやAzureは触っていないので、本記事では紹介しませんｗ

### [Amazon Web Services パターン別構築・運用ガイド](https://www.amazon.co.jp/dp/4797392576/)

AWS入門者向けの本で、AWSを網羅的に学べます。AWS初学者にオススメの本はありますかと聞かれたら、この本を推すことにしています。AWSアカウントを作成したけど、なにしたらいいか分からん！という人はこの本からはじめてみましょう。セキュリティに不安な人は、筆者が昔書いた「[AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ](https://qiita.com/tmknom/items/303db2d1d928db720888)」もあわせてご覧ください。

### [Amazon Web Services 業務システム設計・移行ガイド](https://www.amazon.co.jp/dp/4797392568/)

AWS本としてはめずらしく中級者向けです。AWSのマルチアカウント管理やネットワーク設計、AWSにおけるシステム設計パターンなどがまとめられています。初学者には向きませんが、会社でAWSを本番運用しているようなエンジニアであれば、手元においておく価値があります。


## システム運用

ソフトウェア開発の本は山ほどありますが、意外とデプロイ・運用・監視まわりの本は希少です。形式知化がされづらい領域ですが、その中でも良い本をピックアップしてみました。

### [継続的デリバリー](https://www.amazon.co.jp/dp/4048930583/)

今でこそCI/CDは当たり前になりましたが、この本ではCI/CDの基本原則を網羅しています。バージョン管理や継続的インテグレーションからはじまり、デプロイメントパイプラインの設計・データベースや依存ライブラリの管理、はてはコンプライアンスと監査まで非常に幅広い内容を扱っています。さすがに少し古さを感じますが、なぜCI/CDが重要なのかをじっくり学べる書籍です。

### [入門 監視](https://www.amazon.co.jp/dp/4873118646/)

システムの運用において重要な要素にもかかわらず、あまり形式知化されてない領域が監視です。監視の基本原則にはじまり、フロントエンド監視やアプリケーション監視・サーバ監視など技術レイヤごとに監視戦略が説明されます。これを読むだけでいきなり正しい監視設計ができるわけではないですが、スタートを切るには必要十分な情報がコンパクトに提供されます。

### [SRE サイトリライアビリティエンジニアリング](https://www.amazon.co.jp/dp/4873117917/)

すっかり有名となったSite Reliability Engineeringについて書かれた本です。障害対応や手作業による運用を50%以下に抑え、ソフトウェアエンジニアリングの活動に注力するべし説かれているのが特徴です。特に9章までの原則では、SLO・エラーバジェット・リリースエンジニアリング・トイル・モニタリングなどの実践的な考え方が目白押しです。


## システムアーキテクチャ

アーキテクチャ設計はある程度経験がないとよく分からんってなりますが、自分で試行錯誤したあと読むと一気に腹落ちします。

### [クラウドネイティブアーキテクチャ](https://www.amazon.co.jp/dp/4295007757/)

クラウドを前提にシステムを設計する際に、どういう観点を大事にすればいいかを教えてくれます。スケーラビリティやセキュリティ、コスト最適化などはオンプレでも重要ですが、クラウドを前提にした場合の指針を与えてくれます。すでにクラウドで本番運用している人には当たり前のことばかりですが、その当たり前を言語化していることはまさに値千金といえます。

### [マイクロサービスアーキテクチャ](https://www.amazon.co.jp/dp/4873117607/)

マイクロサービスを設計するために必要な観点が網羅されている本です。いきなりドメイン駆動設計の境界づけられたコンテキストの話が登場し、デプロイ・テスト・監視・セキュリティなどの技術的なトピックスを説明しています。またアーキテクトの役割やコンウェイの法則といった組織に与える影響まで議論されており、コンパクトながら濃密な情報が提供されています。

### [ソフトウェアシステムアーキテクチャ構築の原理](https://www.amazon.co.jp/dp/4797376724/)

システムアーキテクチャを設計するうえで、どのような観点を網羅すればよいかを体系化した野心的な書籍です。コンテキスト・機能・開発・デプロイメント・運用など、各観点の設計プロセスが詳細に記述されています。あわせてパフォーマンス・スケーラビリティ・可用性・セキュリティなどの品質特性についても解説されます。決して初級者向けではありませんが、アーキテクチャ設計の能力を高めたいのであれば、ぜひとも読破したい一冊です。


## ソフトウェア設計

Infrastructure as Codeに代表されるように、インフラメインの人がコードを書くのは当たり前になりました。そんなコードを書く人たちにオススメの二冊を紹介します。

### [A Philosophy of Software Design](https://www.amazon.co.jp//dp/1732102201/)

本記事では数少ない洋書です。この本ではソフトウェアの複雑さについて説明し、その複雑さを最小限に抑えるテクニックを提示してくれます。個人的に感動したのは複雑性の症状として、変更の増幅・認知的負荷・未知の未知という3つに整理している点です。平易な英語で書かれていて読みやすいので、英語に苦手意識がある人もぜひチャレンジしてほしい一冊です。

### [Clean Architecture](https://www.amazon.co.jp/dp/4048930656/)

プログラミングパラダイムからはじまり、モジュール設計・コンポーネント設計について整理したあとに、ソフトウェアシステムのアーキテクチャ設計について解説されます。ビジネスルールを中核に、いかに境界線を引くか、という技芸はアプリケーションレベルではもちろん、システムレベルの設計でも示唆を与えてくれます。


## 教養

すべてのソフトウェアエンジニアにオススメしたい、そんな名著を集めてみました。普遍的な考え方が学べるので、未読ならぜひ読んでみてほしい本ばかりです。

### [達人プログラマー](https://www.amazon.co.jp/dp/427421933X/)

20年もの歳月を生き抜いた名著です。ソフトウェアエンジニアとしてキャリアを積むにあたって知るべき考え方がたくさん散りばめられています。難しいことは書かれていませんが、ある程度の期間、ソフトウェア開発の経験があるほうが心にしみるかもしれません。筆者が技術書の中でもっとも好きなのはこの本で、今でもたまに読み返しています。

### [ライト、ついてますか](https://www.amazon.co.jp/dp/4320023684)

ソフトウェアエンジニアの人は問題解決が得意な人も多いでしょう。しかし、この本のテーマは問題発見です。どれだけ問題解決の能力が高くても、正しい問題を定義できなければ価値を生みません。ウィットに富んでおり、問題の捉え方を見つめなおすキッカケをくれるワインバーグの名著です。

### [UNIXという考え方](https://www.amazon.co.jp/dp/4274064069/)

「[UNIX哲学](https://ja.wikipedia.org/wiki/UNIX%E5%93%B2%E5%AD%A6)」という言葉を聞いたことがあるかもしれません。UNIX哲学では「ひとつのことを、うまくやれ」など、現在のソフトウェア開発にも大きな影響を与えている考え方が散りばめられています。技術書というよりは読み物に近く専門知識が不要なので、気分転換に読むのもよいでしょう。


## チーム開発

仕事のジャンルに関わらずチームで活動している人は多いでしょう。ここでは楽しく成果が出せるチームづくりに役立つ本を紹介します。

### [Team Geek](https://www.amazon.co.jp/dp/4873116309/)

この本では最初に有名な、謙虚（Humility）・尊敬（Respect）・信頼（Trust）の三本柱HRTを説明します。そして、あらゆる人間関係はHRTの欠如によるものだ、という立場でチーム・コミュニティ・社内組織での立ち回り方を解説していきます。ただの精神論ではなく、実践的なプラクティスが散りばめられており、チームで活動しているなら読んでおきたい一冊です。

### [エクストリームプログラミング](https://www.amazon.co.jp/dp/4274217620/)

達人プログラマー同様に20年前に初版が発売された書籍です。昔は先進的だったTDDやリファクタリング、継続的インテグレーションなどのプラクティスはすでに当たり前になってしまいました。しかしこの本の真価は4章と5章の価値と原則にあります。普遍的な考え方は長く通用するので、ぜひとも血肉にしておきたいものです。

### [ピープルウエア](https://www.amazon.co.jp/dp/4822285243/)

「実際のところ、ソフトウェア開発上の問題の多くは、技術的というより社会学的なものである。」という一節からはじまる、エンジニアリングマネジメントの名著です。名言のオンパレードであんまり書くとネタバレになるので書きませんが、チームリーダーやマネージャーなら一度は読んでほしい一冊です。ここに書いてあることを頭に入れておくだけでも、かなりよいチームにできるでしょう。


## あわせて読みたい

本当はもっともっと紹介したいんですが、あとはタイトルだけ並べておきます。絶版の本も混じってますが、ご愛嬌ということで。

- コンピュータシステム
    - [プログラムはなぜ動くのか](https://www.amazon.co.jp/dp/4822283151/)
    - [コンピュータシステムの理論と実装](https://www.amazon.co.jp/dp/4873117127/)
    - [コンピュータの構成と設計 上](https://www.amazon.co.jp/dp/4822298426/)／[下](https://www.amazon.co.jp/dp/4822298434)
    - [モダンオペレーティングシステム](https://www.amazon.co.jp/dp/4894715376/)
- Linux/Unix
    - [Linuxシステム[実践]入門](https://www.amazon.co.jp/dp/4774158135/)
    - [詳解 システム・パフォーマンス](https://www.amazon.co.jp/dp/4873117909/)
    - [Unixシステムパフォーマンスチューニング](https://www.amazon.co.jp/dp/4873111528/)
- ネットワーク
    - [コンピュータネットワーク](https://www.amazon.co.jp/dp/482228476X/)
    - [詳解TCP/IP](https://www.amazon.co.jp/dp/4894713209/)
- セキュリティ
    - [この一冊で全部わかるセキュリティの基本](https://www.amazon.co.jp/dp/4797388803/)
    - [プロフェッショナルSSL/TLS](https://www.amazon.co.jp/dp/4908686009/)
- クラウドネイティブ
    - [実践Terraform](https://www.amazon.co.jp/dp/4844378139/)
    - [Kubernetes実践ガイド](https://www.amazon.co.jp/dp/4295006637/)
    - [Cloud Native Infrastructure](https://www.amazon.co.jp/dp/1491984309/)
    - [Cloud Native DevOps With Kubernetes](https://www.amazon.co.jp/dp/1492040762/)
- システム運用
    - [ソフトウェアエンジニアのための ITインフラ監視[実践]入門](https://www.amazon.co.jp/dp/4774178659/)
    - [The Site Reliability Workbook](https://www.amazon.co.jp/dp/1492029505/)
    - [Release It!](https://www.amazon.co.jp/dp/4274067491/)
    - [データベース・リファクタリング](https://www.amazon.co.jp/dp/4894715007/)
    - [ウェブオペレーション](https://www.amazon.co.jp/dp/4873114934/)
- システムアーキテクチャ
    - [Design It!](https://www.amazon.co.jp/dp/4873118956/)
    - [分散システムデザインパターン](https://www.amazon.co.jp/dp/4873118751/)
    - [データ指向アプリケーションデザイン](https://www.amazon.co.jp/dp/4873118700/)
    - [ビッグデータ分析のシステムと開発がこれ1冊でしっかりわかる教科書](https://www.amazon.co.jp/dp/429710881X/)
    - [データマネジメント知識体系ガイド](https://www.amazon.co.jp/dp/4296100491/)
- ソフトウェア設計
    - [C++のためのAPIデザイン](https://www.amazon.co.jp/dp/4797369159/)
    - [エリック・エヴァンスのドメイン駆動設計](https://www.amazon.co.jp/dp/4798121967/)
    - [．ＮＥＴのエンタープライズアプリケーションアーキテクチャ](https://www.amazon.co.jp/dp/4822298485/)
    - [現場で役立つシステム設計の原則](https://www.amazon.co.jp/dp/477419087X/)
- 教養
    - [人月の神話](https://www.amazon.co.jp/dp/4621066080/)
    - [リーダブルコード](https://www.amazon.co.jp/dp/4873115655/)
    - [プリンシプル オブ プログラミング](https://www.amazon.co.jp/dp/4798046140/)
    - [問題発見プロフェッショナル](https://www.amazon.co.jp/dp/4478490341/)
- チーム開発
    - [小さなチーム、大きな仕事](https://www.amazon.co.jp/dp/4150504814/)
    - [レガシーコードからの脱却](https://www.amazon.co.jp/dp/4873118867/)
    - [アジャイルな見積りと計画づくり](https://www.amazon.co.jp/dp/4839924023/)
    - [アジャイルサムライ](https://www.amazon.co.jp/dp/4274068560/)
- 組織
    - [Effective DevOps](https://www.amazon.co.jp/dp/4873118352/)
    - [LeanとDevOpsの科学[Accelerate]](https://www.amazon.co.jp/dp/4295004901/)
    - [エンジニアリング組織論への招待](https://www.amazon.co.jp/dp/4774196053/)
    - [学習する組織](https://www.amazon.co.jp/dp/4862761011/)


## おわりに

おそらくこのリストにあの本がねーじゃねーか！とご立腹の方もいるでしょう。ぜひ、あなたのオススメも教えてください。

ちなみに本記事では[Webシステムアーキテクチャの地図を描く構想](https://blog.yuuk.io/entry/2019/map-of-web-systems-architecture)を参考に体系化を試みたんですが、ムリ！ってなったため、カテゴリは結構適当です。もう少し体系的に学べるといいんですが、体系化は今後の宿題ということで筆を置きます。