# Principles of Computer System Design ## 概要 計算機システムの設計に現れる抽象と原則を、ネットワーク・耐障害性・原子性・一貫性・情報セキュリティという横断的な主題ごとに体系化した教科書である。MIT の 6.033 *Computer System Engineering* のために40年以上にわたって書き継がれた講義ノートを出自とし、個別の技術や製品ではなく、分野をまたいで繰り返し現れる設計原則(design principle)を明示的に名前を付けて取り出す点に特徴がある。Part I(第1〜6章)は Morgan Kaufmann から印刷書籍として出版され、Part II(第7〜11章)は MIT OpenCourseWare 上で Creative Commons ライセンスの公開教育資源として提供されている。 ## 書誌情報 - 著者: Jerome H. Saltzer、M. Frans Kaashoek(いずれも Massachusetts Institute of Technology) - 版: Version 5.0(2009年) - Part I(第1〜6章): Morgan Kaufmann(Elsevier)より印刷書籍として刊行 - Part II(第7〜11章): MIT OpenCourseWare にて公開(RES.6-004 / RES.6-033, Spring 2009) - ライセンス: Creative Commons Attribution-NonCommercial-ShareAlike 3.0 United States(Part II) - 構成: 全11章 + 設計原則一覧・用語集・文献ガイド(Suggestions for Further Reading)・問題集 - URL: https://ocw.mit.edu/courses/res-6-004-principles-of-computer-system-design-an-introduction-spring-2009/ ## 構成と主要テーマ ### Part I: 印刷書籍(第1〜6章、本 wiki では未取り込み) システム・複雑性、計算機システムの構成要素、命名スキームの設計、クライアント/サービスと仮想化によるモジュール性の強制、性能を扱う。本 wiki が取り込んだのは Part II のみである。 ### Part II: 公開教育資源(第7〜11章) 分野横断的な5つの主題を、それぞれ独立した長大な章として扱う。 → [[@2009__MITOCW__Principles of Computer System Design - Chapter 7 The Network as a System and as a System Component]] — ネットワークをリンク層・ネットワーク層・エンドツーエンド層の3層に整理し、ベストエフォート契約とエンドツーエンド論を定式化する(142ページ)。 → [[@2009__MITOCW__Principles of Computer System Design - Chapter 8 Fault Tolerance - Reliable Systems from Unreliable Components]] — 障害(fault)・誤り(error)・故障(failure)を厳密に区別し、冗長性(符号化・複製・多数決・修理)を体系的に適用して信頼できない部品から信頼できるシステムを構築する(80ページ)。 → [[@2009__MITOCW__Principles of Computer System Design - Chapter 9 Atomicity - All-or-Nothing and Before-or-After]] — 原子性を「全か無かの原子性」(障害のマスキング)と「前か後かの原子性」(並行の協調)に分解し、両者を単一の定義から導いて統一的に実装する(118ページ)。 → [[@2009__MITOCW__Principles of Computer System Design - Chapter 10 Consistency]] — 一貫性を厳密一貫性と結果整合性の2モデルで整理し、キャッシュコヒーレンスから広域複製(永続性のマントラ)と調停へ展開する(40ページ)。 → [[@2009__MITOCW__Principles of Computer System Design - Chapter 11 Information Security]] — セキュリティは負の目標であるという認識を出発点に、Saltzer and Schroeder(1975)の設計原則群・完全な仲介モデル・信頼計算基盤(TCB)を軸として認証・機密性・認可・プロトコル・TLS を扱う(174ページ)。 第7章から第11章へ向かう配列には積み上げの構造がある。第7章がベストエフォート契約(パケットは失われ、重複し、順序が変わる)という不完全な土台を与え、第8章がその不完全さを冗長性で覆う一般理論を作り、第9章が原子性という形で「全か無か」の保証をその上に載せ、第10章が複数の複製へ広げ、第11章が敵対的な相手のいる環境へ拡張する。各章が前章の抽象を前提として次の保証を積むため、章は独立に読めるが順に読むと1本の議論になる。 ## 設計原則の一覧 本書は設計原則を太字の見出しで提示し、本文中で使われるたびに下線付きイタリックで参照する体裁を取る。巻頭の "Computer System Design Principles" にその一覧が置かれている。(Source: [[Principles of Computer System Design]] Design Principles(`principles_open_5_0.pdf`)) ### 計算機システムの多くの領域に適用できる原則 - **Adopt sweeping simplifications**(大胆な単純化を採用せよ)— 自分が何をしているのかが見えるように。 - **Avoid excessive generality**(過剰な一般性を避けよ)— 何にでも良いものは、何にも良くない。 - **Avoid rarely used components**(めったに使わない部品を避けよ)— 劣化と腐敗は、次に使うときまで気づかれずに蓄積する。 - **Be explicit**(明示せよ)— 前提をすべて卓上に出せ。 - **Decouple modules with indirection**(間接参照でモジュールを疎結合にせよ)— 間接参照は置換可能性を支える。 - **Design for iteration**(反復を前提に設計せよ)— 一度で正しくは作れないのだから、変更しやすくしておけ。 - **End-to-end argument**(エンドツーエンド論)— アプリケーションが最もよく知っている。 - **Escalating complexity principle**(複雑性増大の原則)— 機能を1つ足すと、複雑性は不釣り合いに増える。 - **Incommensurate scaling rule**(不均衡スケーリング則)— パラメータを10倍にすると新しい設計が要る。 - **Keep digging principle**(掘り続けの原則)— 複雑なシステムは複雑な理由で壊れる。 - **Law of diminishing returns**(収穫逓減の法則)— 良さの指標を改善するほど、次の改善に要する労力は増える。 - **Open design principle**(オープンデザインの原則)— 誰にでも設計に意見させよ。助けはいくらあっても足りない。 - **Principle of least astonishment**(最小驚愕の原則)— 人間はシステムの一部である。利用者の経験・期待・心的モデルに合うインターフェースを選べ。 - **Robustness principle**(頑健性の原則)— 入力には寛容に、出力には厳格に。 - **Safety margin principle**(安全余裕の原則)— 崖の縁までの距離を把握せよ。さもなくば落ちる。 - **Unyielding foundations rule**(揺るがぬ基礎の規則)— モジュールを変えるほうが、モジュール分割そのものを変えるより容易である。 ### 特定領域に適用される原則 - **Atomicity: Golden rule of atomicity**(原子性の黄金律)— 唯一のコピーを決して書き換えるな。 - **Coordination: One-writer principle**(単一書き手の原則)— 各変数の書き手が1つなら協調は簡単になる。 - **Durability: The durability mantra**(永続性のマントラ)— 複数のコピーを、広く離して、独立に管理せよ。 - **Security: Minimize secrets**(秘密を最小化せよ)— 秘密はおそらく長くは秘密でいられない。 - **Security: Complete mediation**(完全な仲介)— すべての操作について真正性・完全性・認可を検査せよ。 - **Security: Fail-safe defaults**(フェイルセーフなデフォルト)— ほとんどの利用者はデフォルトを変えないのだから、安全側に倒しておけ。 - **Security: Least privilege principle**(最小権限の原則)— 宝石を入れた金庫に弁当を入れるな。 - **Security: Economy of mechanism**(機構の経済性)— 機構が少ないほど、正しく作れる見込みが高い。 - **Security: Minimize common mechanism**(共通機構の最小化)— 共有された機構は望まぬ通信路を提供する。 ## 影響と位置づけ 本書の特徴は、個別技術の解説ではなく**設計原則に名前を与えて再利用可能にする**点にある。各章は原則を導入した箇所を太字で示し、その原則が再び使われるたびに下線付きイタリックで参照するという体裁を貫くため、読者は同じ原則が別の主題(ネットワーク・耐障害性・原子性・セキュリティ)で繰り返し働く様子を追跡できる。**End-to-end argument**(アプリケーションが最もよく知っている)は第7章 §7.2.5 で層モデルから導かれ、第8章 §8.6.2 で耐障害性の文脈から再検討される。(Source: [[@2009__MITOCW__Principles of Computer System Design - Chapter 7 The Network as a System and as a System Component]] §7.2.5, [[@2009__MITOCW__Principles of Computer System Design - Chapter 8 Fault Tolerance - Reliable Systems from Unreliable Components]] §8.6.2) 第11章 §11.1.4 が整理するセキュリティ設計原則は、Saltzer が Michael D. Schroeder と共著した "The Protection of Information in Computer Systems"(1975)に遡る7原則(最小権限・フェイルセーフなデフォルト・完全な仲介・オープンデザイン・機構の経済性・共通機構の最小化・秘密の最小化)であり、本書はその一次資料に最も近い教科書的整理を与えている。(Source: [[@2009__MITOCW__Principles of Computer System Design - Chapter 11 Information Security]] §11.1.4) 第9章 §9.1.6 が提示する external time consistency の定義は、Spanner(2012)が TrueTime によって実装可能にした外部一貫性と同じ内容を、その3年前に「直列化可能性より強い正しさ要件の一般形」として述べたものである。本書が扱う概念のいくつかは、後年の実装がその要件に追いついた形になっている。(Source: [[@2009__MITOCW__Principles of Computer System Design - Chapter 9 Atomicity - All-or-Nothing and Before-or-After]] §9.1.6, [[外部一貫性]]) ## 関連 - 人物: [[Jerome H. Saltzer]] / [[M. Frans Kaashoek]] / [[Michael D. Schroeder]] / [[Butler W. Lampson]] / [[Jim Gray]] - 組織: [[MIT]] - 概念(第7章): [[ネットワークアーキテクチャ]] / [[エンドツーエンド論]] / [[トランスポートプロトコル設計]] - 概念(第8章): [[フォールトトレランス]] / [[信頼性工学]] / [[システム信頼性モデル]] / [[ハードディスク信頼性]] - 概念(第9章): [[直列化可能性]] / [[バージョン履歴]] / [[クラッシュリカバリ]] / [[分散トランザクション]] - 概念(第10章): [[結果整合性]] / [[複製ステートマシン]] / [[永続性のマントラ]] / [[調停(Reconciliation)]] / [[外部一貫性]] - 概念(第11章): [[セキュリティ設計原則]] / [[信頼計算基盤(TCB)]] / [[認可モデル]] / [[情報フロー制御]] - 関連ソース: [[@1984__TOCS__End-To-End Arguments in System Design]](Saltzer らのエンドツーエンド論の原論文) ## 出典 - Jerome H. Saltzer and M. Frans Kaashoek, *Principles of Computer System Design: An Introduction*, Version 5.0, 2009. Part II は MIT OpenCourseWare(RES.6-004, Spring 2009)にて CC BY-NC-SA 3.0 US で公開。 - 原本: `.raw/books/principles-of-computer-system-design-part-ii/`