第1部 コードと向き合う
第1章 守りを固める
1.1 優れたコードを目指して
1.2 最悪を想定する
1.3 防御的プログラミングとは何か
否定論の論拠
肯定論の論拠
1.4 広大で邪悪な世界.
1.5 防御的プログラミングの技法
望ましいコーディングスタイルと適正な設計を採用する
コーディングを急がない
誰も信用しない
簡潔性よりも明瞭性を重視してコードを書く
内部的な要素をユーザーに触らせない
すべての警告をオンにしてコンパイルする
静的解析ツールを使用する
安全なデータ構造を使用する
すべての戻り値をチェックする
メモリ(およびその他の貴重なリソース)を注意深く扱う
すべての変数は宣言時に初期化する
変数の宣言はできるだけ変数を使用する直前に行う
言語の標準機能を使用する
有用な診断ログの機能を活用する
キャストは慎重に行う
その他の細かい注意点
1.6 制約
制約の対象
制約の除去
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第2章 見事に描かれた設計図
2.1 なぜ表記スタイルは重要なのか
2.2 コードを書き示す相手を知る
2.3 優れた表記スタイルとは何か
2.4 さまざまな中カッコスタイル
K&Rの中カッコスタイル
中カッコを逆インデントするスタイル
中カッコをインデントするスタイル
その他の中カッコスタイル
2.5 1つのスタイルですべてを規定する
2.6 社内スタイル(およびそれを適用すべき対象)
2.7 コーディング規約を定める
2.8 正義の戦い?
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第3章 名前の意義
3.1 適切な名前を付けることの重要性
3.2 名前を付ける対象
3.3 名前ゲーム
説明的である
技術的に正しい
イディオムに従っている
適切である
3.4 実践的な名前付けの要点
変数の名前付け
関数の名前付け
型の名前付け
名前空間の名前付け
マクロの名前付け
ファイルの名前付け
3.5 バラの香りも名前次第
一貫性を保つ
コンテキストを利用する
自分の目的に合わせて名前を活用する
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第4章 必要な情報を余さず書く
4.1 自己解説的コード
4.2 自己解説的コードを書くための手法
適切な表記スタイルで単純なコードを書く
意味のある名前を選ぶ
コードをアトミックな関数に分解する
制約や振る舞いを表す説明的な型を選ぶ
定数に名前を付ける
重要なコードを強調する
関連のある情報をグループ化する
ファイルヘッダを記述する
エラーを適切に処理する
意味のあるコメントを書く
4.3 自己解説的コードの実践的方法論
文芸的プログラミング
ドキュメント作成ツール
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第5章 的確なコメント
5.1 コードコメントとは何か
5.2 コメントはどのように記述・表示されるか
5.3 どのくらいの数のコメントを書くべきか
5.4 コメントの内容として何を書くべきか
方法ではなく理由を説明する
コードの内容を言い換えただけの説明は避ける
コメントをコードの代用にしない
役に立つコメントを書く
コードの理解に不要な要素を排除する
5.5 コードの改善例
5.6 コメントの表記に関する留意点
一貫性
明瞭なブロックコメント
コメントのインデント
行末のコメント
コードを読みやすくする
保守の負担が軽いスタイルを選ぶ
防波堤
フラグ
ファイルヘッダとしてのコメント
5.7 コメントを活用するための注意
ルーチンを書くためのコメント
バグ修正の通知
コメントの劣化
保守段階のコードの無意味なコメント
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第6章 過ちは人の常
6.1 エラーは何から生まれるのか
6.2 エラー通知機構
通知なし
戻り値
エラーステータス変数
例外
シグナル
6.3 エラーを検出する
6.4 エラーを処理する
いつエラーを処理すべきか
可能な対処
エラー処理がコードに及ぼす影響
6.5 エラーを発生させる
6.6 エラーに対処する
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第2部 コードの秘められた生活
第7章 プログラマーの道具箱
7.1 ソフトウェアツールとは何か
7.2 なぜツールのことを気にするのか
7.3 パワーツール
何ができるのかを把握する
操作方法を学ぶ
どんな作業に適しているのかを見極める
きちんと機能しているかをチェックする
詳しい情報のソースを突き止める
新しいバージョンのリリース時期を知る
7.4 どのツールにするか
ソース編集ツール
コード構築ツール
デバッグツールと調査ツール
言語サポートツール
その他のツール
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第8章 テスト
8.1 現実性チェック
8.2 誰が、何を、いつ、なぜ
なぜテストするのか
誰がテストするのか
テストに何が必要か
いつテストするのか
8.3 テストは難しくない……
8.4 テストの種類
8.5 単体テストケースの選択
8.6 テストを考慮した設計
8.7 ほら、両手放しだよ!
8.8 障害の外観
8.9 欠陥を管理できるか
フォールトトラッキングシステム
バグレビュー
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第9章 誤りの検出
9.1 避けがたい現実
9.2 野獣の本性
1,000フィートからの眺め
地上からの眺め
塹壕からの眺め
9.3 害虫駆除
横道
正道
9.4 バグハンティング
コンパイルエラー
ランタイムエラー
9.5 欠陥の修正方法
9.6 予防策
9.7 スズメバチスプレー、ナメクジ除け、ハエ取り紙
デバッガ
メモリアクセスバリデータ
システムコールトレース
コアダンプ
ロギング
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第10章 アイツがビルドしたコード
10.1 言語の壁
インタープリタ言語
コンパイル言語
バイトコンパイル言語
10.2 ちょっと大げさな話ですが
10.3 ビルドをビルドする
10.4 良いビルドシステムの条件
単純
統一性
反復可能で信頼できる
アトミック
エラーへの対処
10.5 仕組み
ターゲットの選択
ハウスキーピング
依存関係
自動化されたビルド
ビルド設定
再帰make
10.6 リリース
10.7 ビルドマスターのお仕事
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第11章 速さを追い求める
11.1 最適化とは何か?
11.2 最適ではないコードが生じる原因
11.3 最適化を行うべきではない理由
最適化に代わる手段
11.4 最適化を行うべき理由
11.5 実践的な最適化のアプローチ
最適化の必要性を証明する
最も低速なコードを特定する
コードをテストする
コードを最適化する
最適化の効果を検証する
11.6 最適化の手法
設計の変更
コードの変更
11.7 効率的なコードを書く
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第12章 不安の固まり
12.1 リスク
12.2 敵を知る
12.3 戦況
12.4 脆弱性の種類
セキュアではない設計とアーキテクチャ
バッファオーバーラン
クエリ文字列の埋め込み
競合状態
整数オーバーフロー
12.5 保護の手段
システムのインストール環境での対策
ソフトウェア設計での対策
コード実装での対策
使用手順による対策
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第3部 コードの形態
第13章 グランドデザイン
13.1 プログラミングの設計としての側面
13.2 何を設計するのか?
13.3 どうしてそんなに騒ぐのか?
13.4 優れたソフトウェア設計
単純であること
エレガントであること
モジュール性
優れたインターフェイス
拡張性
重複の回避
移植性
慣用語法
文書化
13.5 コードの設計方法
設計のための手法やプロセス
設計の道具
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第14章 ソフトウェアアーキテクチャ
14.1 ソフトウェアアーキテクチャとは?
ソフトウェアの青写真
視点
いつどこに記述するか?
何のために使うのか?
コンポーネントと接続について
14.2 優れたアーキテクチャとは?
14.3 アーキテクチャのスタイル
アーキテクチャなし
階層アーキテクチャ
パイプとフィルタを使ったアーキテクチャ
クライアント/サーバアーキテクチャ
コンポーネントベースのアーキテクチャ
フレームワーク
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第15章 進化か革命か?
15.1 ソフトウェアの老朽
15.2 警告のサイン
15.3 コードはどう成長するか?
15.4 そんなことあり得ないのに
15.5 これに関して何ができるか?
コードを新規に書く場合
既存のコードを保守する場合
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第4部 プログラマーの群れ
第16章 コードモンキー
16.1 モンキービジネス
直情的プログラマー
コードモンキー
グル
似非グル
高慢な秀才
カウボーイ
プランナー
古株
狂信者
一意専心プログラマー
サボり屋
メランコリックチームリーダー
あなた
16.2 理想的プログラマー
16.3 それで?
16.4 最も愚かな者
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第17章 チームの力
17.1 チームの概略
17.2 チーム編成
管理手法
責任分担
編成とコードの構造
17.3 チームワークのためのツール
17.4 チームを襲う病魔
バベルの塔
独裁制
民主主義型開発
サテライトステーション
グランドキャニオン
泥沼
レミングス
17.5 優れたチームワークのための個人のスキルと特質
コミュニケーション
謙虚さ
対立への対処
習得と適応性
自分の限界の把握
17.6 チームワークの基本原則
コードの共同所有
他人のコードに対する尊敬の念
コーディングガイドライン
成功の定義
責任の定義
燃え尽きの回避
17.7 チームの一生
チームの誕生
チームの成長
チームワーク
チームの終焉
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第18章 ソースを安全に扱う方法
18.1 私たちの責務
18.2 ソース管理
リビジョン管理
アクセス制御
リポジトリの扱い方
ブランチの活用
ソース管理の略歴
18.3 構成管理
18.4 バックアップ
18.5 ソースコードのリリース・公開
18.6 ソースの置き場所
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第5部 ソフトウェア開発プロセス
第19章 仕様の具体化
19.1 具体的に言うと何?
19.2 仕様書の種類
要求仕様書
機能仕様書
構造仕様書
ユーザーインターフェイス仕様書
設計仕様書
テスト仕様書
19.3 仕様書に盛り込むべき内容は?
19.4 仕様書執筆手順
19.5 なぜ仕様書を書かないのか?
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第20章 美しき獲物たちか?
20.1 コードレビューとは
20.2 いつレビューするか
レビューするかどうか
どのコードをレビューするか
20.3 コードレビューの実施
コードレビューミーティング
統合レビュー
20.4 心構えをレビューする
作者の心構え
レビュー担当者の心構え
20.5 完全なるコード
20.6 コードレビューの向こうにあるもの
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第21章 完了日は未定
21.1 暗闇での一突き
21.2 見積もりが難しい理由
21.3 プレッシャー
21.4 見積もりの実際的な方法
21.5 計画ゲーム
21.6 間に合わせる
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第6部 頂上からの眺め
第22章 プログラムのレシピ
22.1 プログラミングスタイル
構造化プログラミング
オブジェクト指向プログラミング
関数型プログラミング
論理型プログラミング
22.2 レシピ:方法と目的
22.3 開発プロセス
アドホック
ウォーターフォールモデル
SSADMとPRINCE
Vモデル
プロトタイピング
イテレーティブおよびインクリメンタル開発
スパイラルモデル
アジャイル手法
その他の開発プロセス
22.4 もう十分!
22.5 開発プロセスの選択
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第23章 アウターリミッツ
23.1 アプリケーションプログラミング
パッケージソフトウェア
カスタムアプリケーション
23.2 ゲームプログラミング
23.3 システムプログラミング
23.4 組み込みプログラミング
23.5 分散プログラミング
23.6 Webアプリケーションプログラミング
23.7 エンタープライズプログラミング
23.8 数値計算プログラミング
23.9 まとめ
一言で言えば
関連項目
考えてみよう
熟考しよう
我が身を振り返ってみよう
第24章 次の行き先は?
24.1 これからどうするか
答えと解説