本書はどのように構成されているか?
結論から言うと、本書は大規模なプロジェクトを段階的な足場かけに沿って進めることで、専門性を身につける助けになります。 そのため、大半の読者にとっては、本書全体を順番に読むのが最善です。
しかし現実的には、誰もが教科書を最初から最後まで読む時間や気力を持っているわけではありません。 また、一部の読者はすでに特定のトピックに精通しています。 そこで、5種類の読者(いずれもすでに経験豊富なプログラマー)に対応するため、以下の内訳を用意しました。
| 読者 | 推奨される使い方 |
|---|---|
| 非常に忙しい人: 時間がなく、すぐに価値を得る必要があり、本を丸ごと読むことはできない。 | 第1章から第4章まで取り組んでください。いつか戻ってきてもよいでしょう。 |
| 事前経験がない人: Rust/システム/セキュリティが初めて。 | 第1章から第15章、および言及が出てきたときに付録「基礎」に取り組んでください(つまり本書全体)。 |
| セキュリティ担当者: システムセキュリティのバックグラウンドはあるが、Rust は初めて。 | 第1章、第3章、第5章から第15章まで取り組んでください。必要に応じて付録を参照してください。 |
| セキュリティ Rustacean: システムセキュリティのバックグラウンドがあり、以前に別の Rust の本を読んだことがある。 | 第1章、第6章、第7章、第9章から第15章まで取り組んでください。必要に応じて付録を参照してください。 |
| 上級セキュリティ Rustacean: システム/セキュリティ/Rust についてすでに非常に詳しく、上級トピックのリファレンスを探している。 | 第11章、第12章、第14章、第15章。 |
推進モデル
本書では幅広い範囲を扱います。 そもそも「保証」とは何を意味するのかから、最先端技術の限界まで。 それらを貫く統一的な筋道は、段階的な集大成プロジェクト、つまり高度なライブラリを構築することです。
その筋道は、古典的な軸に巻きついています。それが、スキル習得のドレイファスモデル1です。 この発達モデルは、正式な教育と実践的な練習がスキル開発においてどのように絡み合うかを説明します。 これはもともと、米空軍の研究イニシアチブの一環として資金提供を受け、1980年に UC Berkeley で開発され、現在でも妥当性を保っています。
ドレイファスの考えの核心は、複雑なタスクを意図的に上達させようとする人は誰でも、5つの明確な段階、すなわち Novice、Advanced Beginner、Competent、Proficient、Expert を通過できるというものです。
学習者の熟練度が高まるにつれて、抽象的な原則から得るものは少なくなり、具体的な経験から得るものが多くなります。 その結果、認知的注意(例: 負荷の高い集中)から自動処理(例: 「第二の天性」)へと移行します。
本書の内容は、5段階のうち最初の3段階を反映するようにおおまかに構成されています。 更新された(2004年頃の)定義2を使用しています。 各段階を説明し、関連する章を概観しましょう。
ドレイファスモデルの段階別の章
段階1 - Novice: システムセキュリティ
Novice は、ルール、すなわち特定の状況にかかわらず適用される「全体像」の原則を学び、手順に従います。
Novice 段階の章では、中心となる概念、定義、言語構文に焦点を当てます。
-
第2章 - ソフトウェア保証: セキュアで堅牢なソフトウェアを開発するためのツールとプロセスの全体像を理解します。最初の Rust プログラムを書きます!
-
第3章 - Rust ゼロ速習コース: Rust の機能と構文を巡り、借用チェッカーと調和して生き、コードを整理します。セキュリティと信頼性に関する業界のベストプラクティスガイドラインの文脈で扱います。さらに、プロフェッショナルなソフトウェアプロジェクトを維持するためのツール群のサンプルも示します。
-
第4章 - メモリを理解する: プログラムを「制御」するため、メモリ安全でないプログラムを悪用するため、そして Rust のメモリ安全性保証を機械的なレベルで本当に理解するために、メモリについて知っておくべきことを扱います。
段階2 - Advanced Beginner: コアプロジェクト
Novice とは異なり、Advanced Beginner は繰り返し現れるパターンを認識し始めます。 彼らは「格率」(緩やかで状況依存のルール)を見つけ、経験を積むことで自分独自の創造的な戦略を適用します。
Advanced Beginner 段階の章では、ライブラリのコア実装を開始します。 焦点は、これまで学んだ保証の概念を、自明でないコードに対応づけることです。
-
第5章 - 二分探索木(BST)の基礎: 基本的な探索アルゴリズムとソートアルゴリズム、木データ構造がその両方をどのように可能にするか、そしてこれらのアルゴリズムを Rust に移植する際の課題を扱います。
-
第6章 - アリーナアロケーターの構築: メモリ管理を制御することで、一般的なアルゴリズムを慣用的で安全な Rust コードに変換します。
-
第7章 - 自己平衡 BST: メモリ効率の高い自己平衡二分探索木を構築するため、高度なアルゴリズムを実装します。
-
第8章 - デジタルツインテスト: システム全体のエミュレーションと組み込みセミホスティングの入門です。リモートコマンドを受け取る小さな仮想マイクロコントローラー上で、私たちのライブラリを実行します!
-
第9章 - マップとセットの構築: 素朴な木を、Rust 標準ライブラリのコレクションに対する、おおむね API 互換の差し替え可能な代替に変換します。
-
第10章 - イテレーターの実装: Rust の中核的な抽象化の1つである安全なイテレーターをサポートすることで、ライブラリの有用性を大幅に高めます。
段階3 - Competent: 検証とデプロイ
Competent な学習者は、自分が何を知らないのかを認識できるほどニュアンスのある理解を発達させます。 それに対処するため、Competent な学習者は自己専門化を始めます。 彼らは、スキル領域のどの要素が自分の長期的なニーズにより役立つのか、そしてどの要素を優先度を下げるか、あるいは無視できるのかを判断します。
Competent 段階の章では、蓄積した教訓を実世界のプロジェクトに適用する準備をします。 セキュリティテストと機能検証のために高度なツールを使用する方法を学びます。 また、別の言語で書かれたより大きなソフトウェアプロジェクトの中に Rust コードを統合する方法も学びます。
-
第11章 - 静的検証: 演繹的検証(コンパイル時に定理証明器によって証明される仕様注釈)を使用して、コアコードが機能的に正しいことを示します。また、網羅性のために、
unsafeコードのモデル検査も扱います。 -
第12章 - 動的テスト: 本番レベルおよび実験的なツールの両方を使用して、ライブラリとそのすべての依存関係にストレステストを実施します。ベンチマークと最適化も扱います。
-
第13章 - 運用デプロイ: ライブラリに CFFI バインディングを追加することで、現実世界の多言語プロジェクトにおける Rust の利点を引き出します。
unsafeの徹底的な探究も行います(私たちのライブラリでは使用していませんが、多くのプロジェクトでは使用されています)。 -
第14章 - 保証の最大化: 一歩引いて Rust をより広い文脈で評価し、制限、ベストプラクティス、最先端の研究を見ていきます。
ステージ4と5(熟達者とエキスパート)はどうでしょうか?
熟達者のステージでは、学習者は概念、規則、スキルから目標へと移行します。 経験を身につけた彼らは、新しい状況において適切な目標を判断できます。たとえそれを達成する能力を常に持っているとは限らなくてもです。
エキスパートは、目標を判断し、それを効率的な手段で達成できます。 彼らは最先端をさらに進め、次世代の初心者のための新しい規則を作り出すことさえあります。
1冊の本を読むだけで、あなたがエキスパートになるわけではありません。 それは、キャリアを通じて現実世界の戦場で苦労して勝ち取る称号です。
とはいえ、最後の章はあなたへの餞別です。
- 第15章 - レビュー: 本書全体を密度の高いノート群へと凝縮したものです。理解を定着させるためにも、将来のクイックリファレンスとしても使えます。
熟達を経てエキスパートの地位へ向かう道は、舗装されていません。 進路を描くのはあなた次第です。 この本がその始まりとなることを願っています。
-
指示されたスキル習得に関与する精神活動の5段階モデル。Stuart E.Dreyfus, Hubert L. Dreyfus (1980)。 ↩
-
成人のスキル習得の5段階モデル。Stuart E.Dreyfus (2004)。元の論文とこの改訂版の両方について、提案された分類を正当化するために経験的・実験的データを用いていないとの批判があることに注意してください。 ↩