[年収1200万エンジニアが教える]オススメ技術書6選
冒頭
エンジニアとして成長していくためには現場での経験が一番大事です。
しかしエンジニアが技術書を読むべき重要性は以下の点にあるかなと考えています
信頼性の高い情報源
技術書は出版前に厳しいレビューを経ており、内容の正確性や信頼性が高い
インターネット上の記事やフォーラムと比べて、情報が古い場合もありますが、基礎や概念は普遍的で役立つものが多い
深い理解を得られる
技術書は著者の深い経験と知見に基づいて書かれており、表面的な内容ではなく、本質的な理解を得られる情報が多い
特にアルゴリズム、設計パターン、アーキテクチャのような深い知識が求められる分野では、技術書が役立つ
基礎知識の習得と再確認
技術書は基礎から応用まで体系的に整理された情報を提供している
Web記事やブログでは断片的な情報が多いですが、技術書は一貫性のある内容で基礎を固めるのに適している
既に知っていることでも、改めて読むことで理解が深まり、忘れていた知識を再確認できる
なので、実際に僕自身も読んだ中で良かったものをここで紹介していこうと思います。
オススメ1. ソフトウェアアーキテチャーの基礎
ソフトウェアアーキテクチャは、ソフトウェアシステムの成功に欠かせない重要な土台です。効果的なアーキテクチャを設計、構築、維持するためには、以下の基本的な要素を理解することが重要です。
アーキテクチャの構成要素
アーキテクチャ特性の分類
アーキテクチャスタイル
アーキテクトの役割
その中でも特にアーキテクチャースタイルには勉強になると思います。
実際僕もアーキテクチャースタイルはこの本で学びました。
レイヤードアーキテクチャ: システムを層(レイヤー)に分割し、各層が特定の責任を持つ構造です。例えば、プレゼンテーション層、ビジネスロジック層、データアクセス層などに分かれます。
マイクロサービスアーキテクチャ: システムを小さな独立したサービスの集合として構築し、各サービスが特定の機能を担当します。これにより、スケーラビリティや柔軟性が向上します。
イベント駆動アーキテクチャ: システム内のコンポーネントがイベントを生成し、それに応答する形で動作する構造です。非同期処理やリアルタイム性が求められるシステムで有効です。
などなど。
システムアーキテクチャーとは何なのかを知りたい
面接試験でシステム設計の問題が問われるのでその対策をしたい
など、教養の基盤となる教科書的存在と言っても過言ではないです。
オススメ2. エリックエヴァンスのドメイン駆動設計
エリック・エヴァンスの著書『ドメイン駆動設計』は、複雑なソフトウェア開発において、ドメイン(業務領域)の深い理解とそれに基づくモデルの構築を中心に据えた設計手法を提唱しています。
また、特にクリーンアーキテクチャー設計下での実装をしたことがある方はよくrepository層などの名前を聞くことがあると思います。
実際に僕自身もrepositoryの概念や本質をこの本を参考にしています。
ソフトウェアの柔軟性、保守性、拡張性を高め、ビジネス要件の変化に迅速に対応できる設計がとても重要です。
そのためには下記の知識が必要だと考えています。
ユビキタス言語(Ubiquitous Language):開発チームとドメインエキスパートが共有する共通の言語を指します。この言語を用いることで、コミュニケーションの齟齬を減らし、モデルと実装の整合性を高めます。
モデル駆動設計(Model-Driven Design):ドメインモデルを中心に設計と実装を進める手法です。モデルはコードと直接対応し、継続的なリファクタリングを通じて洗練されます。
エンティティ(Entity)と値オブジェクト(Value Object):エンティティは識別子を持ち、ライフサイクルを通じて一貫した同一性を保つオブジェクトです。一方、値オブジェクトは属性を表し、不変で交換可能なオブジェクトです。
サービス(Service):エンティティや値オブジェクトに属さない操作や振る舞いをカプセル化したものです。状態を持たず、特定の機能を提供します。
リポジトリ(Repository):エンティティや値オブジェクトの永続化を管理するオブジェクトです。データベースなどのストレージとのやり取りを抽象化し、ドメインモデルの純粋性を保ちます。
集約(Aggregate):関連するエンティティや値オブジェクトを一つの単位としてまとめたものです。集約は一貫性を保つための境界を定義し、外部からはルートエンティティを介してアクセスされます。
などなど。
この本を熟読することで学ぶことができます。
オススメ3. Docker実践ガイド
『Docker実践ガイド 第3版』は、Dockerの導入から運用までを包括的に解説した書籍です。技術者だけでなく、IT基盤の戦略立案や意思決定を行う方々にも役立つ内容となっています。
本書では、コンテナの特徴や導入時の検討項目、注意点などをチェックリスト形式で整理し、システム構成例を解説図で示すことで、要点を把握しやすくしています。また、Docker(v20.10系)のインストール手順や使用方法を具体的に記載し、実践的な解説として以下のトピックを網羅しています。
Docker Composeによるコンテナの連携
Swarmモードによるコンテナのクラスタ化
GUI管理ツールによる管理手法
コンテナ基盤における仮想ネットワークの構築
Kubernetesを用いた複数コンテナのオーケストレーション
第3版では、Rootless Docker、Ipvlanネットワーキング、認証付きプライベートレジストリ、K3sなど、最新のDockerエコシステムに関する内容が追加されています。さらに、商用版コンテナ管理基盤であるEzmeral Runtime Enterpriseの構築手順や使用方法についても新たに取り上げられています。
本書は、Dockerの基礎から高度な運用までをカバーし、実際のIT基盤の提案、構築、日常の運用業務など、さまざまなシーンで役立つ情報を提供しています。
オススメ4. Webを支える技術
未経験からエンジニアを目指す方々などにオススメしたい本でもあり、全Webエンジニアのバイブルと言っても過言ではないかなと思っています。
『Webを支える技術』は、Webの基盤となる技術やその歴史、設計思想を詳しく解説した書籍です。主な内容は以下の通りです。
1. Webの基本技術
Webは主に以下の3つの技術で構成されています。
URI(Uniform Resource Identifier): Web上のリソースを一意に識別するための識別子です。
HTTP(Hypertext Transfer Protocol): クライアントとサーバー間でデータをやり取りするためのプロトコルです。
HTML(Hypertext Markup Language): Webページの構造や内容を記述するマークアップ言語です。
これらの技術により、Webは情報を相互にリンクさせる「ハイパーメディアシステム」と、世界中のサーバーとクライアントが相互作用する「分散システム」という2つの側面を持っています。
2. Webの歴史
初期のインターネットにはWebは存在せず、情報の共有や取得は限られた手段で行われていました。1990年、ティム・バーナーズ=リー氏がCERNでWebの概念を提案し、最初のブラウザとサーバーを開発しました。その後、1993年に登場したブラウザ「Mosaic」により、Webは急速に普及しました。
3. RESTの誕生
2000年、ロイ・フィールディング氏は自身の博士論文で、Webのアーキテクチャスタイルとして「REST(Representational State Transfer)」を提唱しました。RESTは、以下の6つの制約から構成されます。
クライアント/サーバ: クライアントとサーバーを明確に分離し、役割を分担します。
ステートレス: 各リクエストは独立しており、サーバーはクライアントの状態を保持しません。
キャッシュ: レスポンスはキャッシュ可能であり、効率的なデータ再利用を促進します。
統一インターフェース: リソースへの操作は統一されたインターフェースを通じて行われます。
階層化システム: システムは階層化され、各層が独立して機能します。
コードオンデマンド(オプション): 必要に応じて、サーバーからクライアントにコードを送信し、実行させることができます。
これらの制約により、シンプルで拡張性の高いシステム設計が可能となり、現在のWebサービスの多くがRESTの原則に基づいて構築されています。
4. URIの設計
URIはリソースを識別する重要な要素であり、設計時には以下の点に注意が必要です。
一貫性と予測可能性: URIは論理的で予測可能な構造を持つべきです。
永続性: 可能な限り変更されないように設計し、変更が必要な場合はリダイレクトなどの対策を講じます。
意味的な命名: リソースの内容を反映した意味のある名前を付けることで、理解しやすくなります。
適切なURI設計は、システムの拡張性や保守性に大きく寄与します。
『Webを支える技術』は、これらのトピックを通じて、Webの基盤技術とその設計思想を深く理解するための貴重な書籍となっています。
オススメ5. Web API The Good Parts
こちらの書籍は、HTTPプロトコルを利用したWeb APIの設計と実装に関するベストプラクティスをまとめた書籍です。
本書では、Web APIを「HTTPプロトコルを利用してネットワーク越しに呼び出すAPI」と定義しています。これは、人間がブラウザを使って直接アクセスするのではなく、プログラムがデータを取得し、他の目的に利用するためのものです。例えば、Twitterのエンドポイントhttps://api.twitter.com/1.1/statuses/user_timeline.jsonにアクセスすると、HTMLではなくJSON形式でレスポンスが返されます。このように、Web APIはブラウザで直接表示することを前提としていません。
良いURIの設計は、覚えやすく、どんな機能を持つURIなのかが一目でわかることが重要です。具体的には、以下の点が挙げられます。
短く入力しやすいURI: 不要な情報や意味の重複を避け、シンプルで理解しやすいものにします。
人間が読んで理解できるURI: 略語や英語以外の単語を使わず、一般的に使用される単語を選びます。
大文字小文字が混在していないURI: 基本的にはすべて小文字を使用し、混乱を避けます。
改造しやすい(Hackableな)URI: エンドポイントを見て他のエンドポイントを想像できるように設計し、ドキュメントを見なくても理解できるようにします。
サーバ側のアーキテクチャが反映されていないURI: サーバの技術的な詳細をURIに含めず、利用者に不要な情報を与えないようにします。
ルールが統一されたURI: 一貫性のある命名規則を採用し、クライアントが混乱しないようにします。
また、APIのエンドポイント設計では、リソースにアクセスするためのエンドポイントの設計の注意点として、複数形の名詞を利用することが推奨されています。例えば、ユーザー情報を取得する場合、/usersのように複数形を使用します。さらに、検索や絞り込みのためのクエリパラメータの設計や、ページネーションの実装方法についても詳しく解説されています。
などなど。
APIを実装することがあるバックエンドエンジニアの方などには必読書となりうるのではないかと考えています。
オススメ6. Good Code, Bad Code
『Good Code, Bad Code ~持続可能な開発のためのソフトウェアエンジニア的思考』は、GoogleのテックリードであるTom Long氏が、堅牢で信頼性が高く、保守しやすいコードを書くための概念と実用的な手法を解説した書籍です。
本書では、コード品質の4つのゴールとして以下を挙げています:
正しく動作すること:バグがなく、パフォーマンスやセキュリティの観点も考慮されている。
正しく動作し続けること:他のコードや環境の変更があっても動作が維持される。
要件の変更に対応しやすいこと:予期しないビジネス上・機能上の変化にも適応できる。
車輪の再発明をしないこと:既存の解決策やライブラリを活用し、時間・労力やバグのリスクを減らす。
これらのゴールを達成するための6つの基本戦略として、以下が示されています:
可読性を高める:他の人が読みやすく理解しやすいコードを書く。変数や関数の命名には意味のある名前を使用し、複雑なロジックにはコメントを付ける。
想定外の事態をなくす:ユーザーや開発者が予期しない挙動を避け、デバッグしやすくする。
誤用しにくいコードを書く:他の開発者が誤って使用しにくい設計を心がける。
コードをモジュール化する:要件の変更やメンテナンスを容易にするため、コードを適切に分割する。
コードを再利用・汎用化しやすくする:複数のシナリオや問題に対応できるよう、汎用性の高いコードを書く。
テストしやすいコードを書き、適切にテストする:バグを早期に発見し、品質を維持するために、テストしやすい設計と十分なテストを行う。
ソフトウェアエンジニアとして働く上で、コードを書くことは必要不可欠であるので、この本書はそのような方々にとって「コードの書き方」を教えてくれる良い書籍だと考えています。
また、主に1~3年目の初学者を対象としていますが、チーム開発時のリファレンスとしても活用できる内容となっています。