この章では、大規模なソフトウェアの構成やテクニックを、作る側の視点から解説している。
6.1 大規模プロジェクトで使われそうな設計や実装のテクニックのあらまし
「オプジェクト指向の利用」のようなコードレベルのことも挙げられているが、特に次の点が目を引いた。
- nontrivial architecture
- libraries, components, and processes
- domain-specific and custom languages and tools
- aggressive use of preprocessing
6.2 ソースコードのディレクトリ構造を見てプロジェクトの構成を把握する
構成方針を把握すれば、目的のソースコードを探し当てることは易しい。(例: FreeBSDのユーザランドを含む全ソースコード)
大規模プロジェクトでは、ソースコードには単に実行ファイルを構成することになる命令だけでなくずっと多くの情報が含まれている。
6.3 ビルドプロセスの概略
オブジェクトファイル(*.o)→ライブラリ・コンポーネント→実行ファイル、というファイルが構成される関係の説明。
ビルドプロセスで使われるツールとして、makeの解説、antとjamの紹介。
6.4 configuration (ビルドの条件の変更や、ソースコードの修正など)
ビルド時: makefileの変数、antのbuild.propertiesファイルによる設定。GNU configureの紹介。
実行時: 設定ファイル、環境変数、Javaのプロパティ、Windowsのレジストリから情報を読み込んで動作に反映。
6.5 Revision control
RCSやCVSの使い方。cvs logの例とその見方。
6.6 Project-Specific tools
例としてUNIXのconfig(8)を挙げている。プロジェクト固有のツールは回帰テストの処理にも使われる(例: perl/t/TEST)。また、javadocやperlのpodのような言語固有のドキュメント生成ツールもこの類として紹介。
6.7 Testing
ソースコードを読むときには、作業の一部としてまずテストコードやテストケースを調査して、それらを残りのコードを理解する役に立てるべき、との由。
ソースコードを読む際にはテストケースは機能仕様を部分的に代替したものといえる。
またデバッグのために使われるコーディングについても解説。
- #ifdef DEBUG 〜 #endif
- ロギング機能 (syslog, ReportEvent)、ロギングのデバッグレベル
- assert (3通りの用法: コードの理解が正しいことのチェック、引数のチェック、戻り値の検証)
テストとして、JavaではJUnitによるユニットテスト、Cでは#ifdef DEBUG 〜 #endifで囲まれた簡単なmain()関数によるテストプログラムを紹介。
面白そうな練習問題
exercise 6.19: カーネルのconfigプログラムを読んでシステムのそれが設定できる側面を文書化せよ。
exercise 6.22: Perlの自動テストプロセッサTESTとテストケースを調査せよ。テストケースはどのように書き、回帰テスト中にどのように処理されるか説明せよ。