1. [概要](#概要)
CPUは「フェッチ→デコード→実行→ライトバック」を1秒間に数十億回繰り返す、計算の心臓部である。命令セットアーキテクチャ(ISA)の設計思想からキャッシュ階層、分岐予測、アウトオブオーダー実行まで、現代プロセッサの動作原理を体系的に理解することは、高性能ソフトウェアを書くための土台となる。
「メモリは速いが小さく、ストレージは大きいが遅い」--- この制約がコンピュータアーキテクチャの全てを支配する。
データの永続化はコンピューティングの根幹であり、ストレージ技術の進化がデジタル社会を支えている。
マザーボードはコンピュータの「神経系」であり、全てのコンポーネント間の通信を司る。
GPUは「一つの命令を数千のコアで同時実行する」— CPU的な逐次処理とは根本的に異なるアプローチである。
I/O(入出力)はコンピュータと外部世界をつなぐ窓であり、多くのアプリケーションのボトルネックはCPUではなくI/Oにある。バス、割り込み、DMA、デバイスドライバ、I/Oスケジューリングを体系的に理解することが高性能システム設計の第一歩となる。
「NANDゲートひとつから汎用コンピュータを組み上げられる」という事実は、
「ムーアの法則は物理法則ではなく経済法則である。」半導体の微細化が物理限界に近づく今、ソフトウェアエンジニアが理解すべきは「壁の正体」と「壁を回避する設計戦略」である。
コンピュータの世界では全てが0と1で表現される。この「制約」こそが、デジタル技術の信頼性と普遍性を生み出す源泉である。
文字化けの原因は常に「エンコーディングの不一致」であり、UTF-8の仕組みを理解すれば根本的に予防できる。
コンピュータが負の数を表現する方法は「2の補数」という天才的な仕組みであり、加算器1つで加算も減算もこなせる。
0.1 + 0.2 !== 0.3 という事実は、浮動小数点数の内部表現を理解しなければ永遠にプログラマを悩ませ続ける。本章では IEEE 754 規格の構造から精度問題の本質、丸め誤差の蓄積メカニズム、数値計算における典型的な落とし穴、そして実務での対策までを体系的に解説する。
データ圧縮の本質は「冗長性の除去」であり、情報理論のシャノン限界が圧縮可能な理論的下限を定める。ハフマン符号は統計的冗長性を、LZ 系は辞書的冗長性を、DEFLATE はその両方を同時に排除する。これらの原理を理解し、用途に応じた圧縮手法を正しく選択できることは、ソフトウェアエンジニアにとって不可欠な素養である。
「ギガバイト」と「ギビバイト」の違いを正確に説明できないエンジニアが、ペタバイト規模のシステムを設計することはできない。
人間の脳は約86兆のシナプス結合を持つ超並列コンピュータだが、コンピュータとは根本的に異なるアーキテクチャで動作する。
アルゴリズムとは「問題を解くための明確な手順」であり、プログラミングの本質はアルゴリズムの設計と実装である。
「動く」コードと「速い」コードの違いは計算量にある。O(n²) と O(n log n) の差は、データが大きくなるほど致命的になる。
ソートはコンピュータサイエンス最古にして最重要の問題の一つである。比較ベースのソートには Omega(n log n) の理論的下限が存在し、この限界を理解することがアルゴリズム設計全般の深い洞察につながる。本章では、基本的なソートから高度なソートまでを網羅的に解説し、理論と実装の両面からソートの全体像を把握する。
「データを見つける」ことはコンピューティングの最も基本的な操作であり、探索の効率がシステム全体の性能を左右する。
SNSの友達関係、地図の経路探索、Webのリンク構造——世界はグラフで満ちている。
動的計画法の本質は「同じ計算を2度しない」。重複する部分問題の結果を記憶することで、指数時間を多項式時間に削減する。
貪欲法は「今この瞬間の最善手」を選び続ける楽観的戦略。バックトラックは「全ての可能性を試し、失敗したら引き返す」慎重な戦略。
テキスト検索は最も身近なアルゴリズムの1つ。ブラウザのCtrl+F、grepコマンド、IDEの検索——全てが文字列マッチングに依存している。
配列はメモリ上の連続した領域であり、そのシンプルさゆえにCPUキャッシュと最も相性が良いデータ構造である。
連結リストは「ポインタ」の概念を学ぶ最良の教材であり、多くのデータ構造の基盤となる。
スタック(LIFO)は関数呼び出しと括弧の対応を、キュー(FIFO)はタスクスケジューリングとBFSを支える。
ハッシュテーブルは「期待O(1)の探索」を実現する、実務で最も頻繁に使用されるデータ構造である。
木は階層関係を表現する最も自然なデータ構造であり、ファイルシステム、DOM、データベースインデックスの基盤である。
グラフはノードとエッジの集合であり、木、リンクリスト、さらには配列までもがグラフの特殊ケースである。
Bloom Filter は「存在しない」ことを100%保証し、Skip List はリンクリストにO(log n)探索を与える。
適切なデータ構造を選ぶことは、適切なアルゴリズムを選ぶことと同等に重要である。
正規表現、コンパイラ、プロトコル検証——オートマトン理論はCSの理論的基盤であり、実務にも深く浸透している。DFA/NFA の等価性、正規言語のポンピング補題、文脈自由文法の構文解析力、そしてチョムスキー階層による言語クラスの体系的分類を理解することで、計算の本質に迫ることができる。
「全ての問題がコンピュータで解けるわけではない」——この事実はCS最大の発見の一つであり、停止問題の決定不能性がその象徴である。
P ≠ NP 問題はCS最大の未解決問題であり、その答えは暗号、最適化、AI の基盤を根本から変える可能性がある。
シャノンの情報理論は、データ圧縮の限界と通信の信頼性の限界を数学的に明らかにした。
現代の暗号はCSの計算複雑性理論に基づいており、「解くのが困難な問題」の存在が安全性を保証する。暗号技術は情報化社会の根幹を支えるインフラであり、通信の秘匿性、データの完全性、そして本人性の検証を可能にする。
ラムダ計算はチューリングマシンと等価な計算モデルであり、関数型プログラミングの数学的基盤である。3つの構文要素(変数・抽象・適用)だけで、あらゆる計算可能な関数を表現できる。
命令型プログラミングは「コンピュータに手順を指示する」最も直感的なパラダイムであり、フォン・ノイマンアーキテクチャと直接対応する。本章では、命令型プログラミングの本質から、構造化プログラミング、手続き型プログラミング、そして現代言語における命令型スタイルまでを体系的に解説する。
OOPの本質は「カプセル化」「継承」「ポリモーフィズム」「抽象化」の4本柱であり、大規模ソフトウェアの複雑さを管理する手法である。適切に使えばコードの再利用性・保守性・拡張性が飛躍的に向上するが、乱用すると逆に複雑さを増す諸刃の剣でもある。
関数型プログラミング(FP)は「副作用のない純粋関数の合成」を基本とするパラダイムであり、並行処理への安全性とテスタビリティに優れる。数学的な関数の概念に基づき、状態変化ではなくデータの変換としてプログラムを記述する。
並行性は「構造」の問題であり、並列性は「実行」の問題である。——Rob Pike
優れたソフトウェアは優れたプロセスから生まれる。ウォーターフォールからアジャイル、DevOps への変遷は、不確実性への適応力の進化そのものである。
テストのないコードはレガシーコードである。——Michael Feathers, *Working Effectively with Legacy Code*
デザインパターンは「先人の知恵の結晶」であり、共通の問題に対する再利用可能な解決策である。
コードは書く時間より読む時間の方が10倍長い。読みやすいコードは正しいコードへの最短距離である。
システム設計は「正解のない」問題であり、トレードオフの中で最善の選択をする技術である。
Git を使いこなすことは現代のソフトウェアエンジニアにとって「読み書き」と同じレベルの基本スキルである。
「分散システムとは、あるマシンの障害によって、あなたが存在すら知らなかった別のマシンが使えなくなるシステムのことである」——Leslie Lamport
「機械学習とは、明示的にプログラムすることなく、コンピュータに学習する能力を与える研究分野である」——Arthur Samuel (1959)
ブロックチェーンは「信頼の問題」をテクノロジーで解決する分散台帳技術である。中央管理者を必要とせず、参加者全員が合意形成によって取引の正当性を担保する。本章ではハッシュチェーンの構造、合意メカニズム(コンセンサスアルゴリズム)、スマートコントラクトの仕組みを基礎から体系的に解説する。
「未来を予測する最善の方法は、それを発明することだ」——Alan Kay