ソフトウェア開発の技術
抽象化・形式化・進化

[著者]山村吉信 

日本アイ・ビー・エム、SE研究所主任研究員であった著者が、抽象化・形式化・進化をキーワードに、ソフトウェア開発に関わる、すべての技術を紹介、解説。

定価=本体 4,157円+税
1993年10月15日/
A5判並製/296頁/ISBN978-4-88303-017-0



[目次]

0 前書き
 0.1 ソフトウェア開発の特徴 18
     0.1.1 対象ソフトウェアそのもの 18
     0.1.2 かかわる人たち 18
     0.1.3 時間 18
 0.2 技術 19
     0.2.1 抽象化 19
     0.2.2 形式化 20
     0.2.3 進化 21
     0.2.4 固有ソフトウェア技術 21
 0.3 本書の構成 23
     0.3.1 章立て 23
     0.3.2 注意と限界 23
 0.4 謝辞 25

1 要件定義
 1.1 要件定義とは何か? 28
 1.2 時・動・人・物 29
     1.2.1 時 29
     1.2.2 動 29
     1.2.3 人 29
     1.2.4 物 29
 1.3 なぜ、要件定義が必要なのか? 30
 1.4 問題解決と目標達成 32
     1.4.1 問題解決型の要件の出し方 32
     1.4.2 目標達成型の要件の出し方 33
 1.5 要件を出す技術 36
     1.5.1 学習型要件獲得 36
     1.5.2 発見型要件獲得 37
 1.6 要件を書き留め、まとめる技術 39
     1.6.1 形式的要件仕様 40
     1.6.2 非形式的要件仕様 41
 1.7 要件を分析する技術 42
     1.7.1 要件のもつべき望ましい性質 42
     1.7.2 特定の分析方法 43
     1.7.3 制約 45
 1.8 要件を検査する技術 47
     1.8.1 検査と検証 47
     1.8.2 点検とウォークスルー 47
     1.8.3 ラピッド・プロトタイピング 48
     1.8.4 レビュー 48
 1.9 他の工程との関係 49
     1.9.1 設計 49
     1.9.2 作成 49
     1.9.3 テスト 50
     1.9.4 導入 50
     1.9.5 保守 50
     1.9.6 プロジェクト管理 50
 1.10 まとめ 51
 1.11 参考文献と学習の手引き 52
     1.11.1 ソフトウェア開発全般 52
     1.11.2 要件を出す 52
     1.11.3 要件仕様 52
     1.11.4 要件分析 53
     1.11.5 要件検査 53 

2 設計
 2.1 設計とは何か? 56
 2.2 時・動・人・物 57
     2.2.1 時 57
     2.2.2 動 57
     2.2.3 人 57
     2.2.4 物 57
 2.3 なぜ、設計が必要か? 58
 2.4 分割統治 59
     2.4.1 構造化設計 59
     2.4.2 データ中心設計 62
     2.4.3 オブジェクト指向設計 63
 2.5 データベースとの関連 66
     2.5.1 プログラミングが主、データベース作成が従 66
     2.5.2 データベース作成が主、プログラミングが従 68
     2.5.3 プログラミングとデータベース作成が対等・独立 69
     2.5.4 プログラミングとデータベース作成が同時・協調 70
 2.6 利害の調整 72
     2.6.1 モデル 73
 2.7 試行錯誤 75
     2.7.1 設計環境 75
     2.7.2 負担 75
     2.7.3 エキスパート(専門家) 75
     2.7.4 逆説の効用 75
 2.8 再利用 76
 2.9 他の工程との関係 77
     2.9.1 要件定義 77
     2.9.2 作成 77
     2.9.3 テスト 77
     2.9.4 保守 77
     2.9.5 プロジェクト管理 78
 2.10 まとめ 79
 2.11 参考文献と学習の手引き 80
     2.11.1 分割統治 80
     2.11.2 利害の調整 81
     2.11.3 試行錯誤 81
     2.11.4 再利用 81

3 プログラミング
 3.1 プログラミングとは何か? 84
     3.2 時・動・人・物 85
     3.2.1 時 85
     3.2.2 動 85
     3.2.3 人 85
     3.2.4 物 85
 3.3 抽象化86
     3.3.1 なぜ、抽象化が必要か? 86
     3.3.2 機械語 88
     3.3.3 記号名──名前の導入 89
     3.3.4 サブルーチン──手続きの抽象化 90
     3.3.5 構造化プログラミング 91
     3.3.6 抽象データ型 91
     3.3.7 オブジェクト指向 93
 3.4 具体化 103
 3.5 アルゴリズム 104
     3.5.1 複合アルゴリズム 104
     3.5.2 アルゴリズムとプログラミング技法 106
 3.6 標準化 108
     3.6.1 プログラミング言語の標準化 108
     3.6.2 環境の標準化 108
     3.6.3 解法の標準化 108
 3.7 難しい問題 109
     3.7.1 NP-完備 109
     3.7.2 決定不能 111
 3.8 他の工程との関係 112
     3.8.1 要件定義 112
     3.8.2 設計 112
     3.8.3 テス ト112
     3.8.4 保守 112
     3.8.5 プロジェクト管理 112
 3.9 まとめ 113
 3.10 参考文献と学習の手引き 114
     3.10.1 プログラミング言語 114
     3.10.2 アルゴリズムとプログラミング技法 115
     3.10.3 プログラムの理論 115
     3.10.4 計算の理論  116

4 データベース作成
 4.1 データベースとは何か? 118
 4.2 データ独立とデータモデル 121
     4.2.1 ファイル・システム 121
     4.2.2 構造型データモデル 122
     4.2.3 関係型データモデル 123
     4.2.4 オブジェクト指向データモデル 125
 4.3 関係型データモデルの例 126
     4.3.1 エンティティからのリレーション 126
     4.3.2 リレーションシップからのリレーション 126
     4.3.3 IS-A関係 127
     4.3.4 正規化 128
 4.4 データベース・システム 131
     4.4.1 完全性拘束条件 131
     4.4.2 同時並行性と直列化 131
     4.4.3 一貫性と同期処理 132
 4.5 他の工程との関係 133
     4.5.1 要件定義 133
     4.5.2 設計 133
     4.5.3 作成 133
     4.5.4 テスト 133
     4.5.5 保守 134
 4.6 まとめ 135
 4.7 参考文献と学習の手引き 136

5 通信
 5.1 通信とは何か? 138
 5.2 時・動・人・物 139
     5.2.1 時 139
     5.2.2 動 139
     5.2.3 人 139
     5.2.4 物 139
 5.3 時空間の中での同一性 140
 5.4 ソフトウェアにおける通信 141
     5.4.1 データの受け渡し 141
     5.4.2 プログラムとプロセス 142
 5.5 同時並行性と同期 144
     5.5.1 同期 144
     5.5.2 同期の仕組み 144
 5.6 故障 147
     5.6.1 二将軍の問題 147
     5.6.2 ビザンチンの問題 148
     5.6.3 障害回復 149
 5.7 永続性 150
 5.8 まとめ 151
 5.9 他の工程との関係 152
     5.9.1 設計 152
     5.9.2 作成 152
     5.9.3 テスト 152
 5.10 参考文献と学習の手引き 153

6 インターフェース作成
 6.1 インターフェースとは何か? 156
 6.2 時・動・人・物 157
     6.2.1 時 157
     6.2.2 動 157
     6.2.3 人 157
     6.2.4 物 157
 6.3 使用者のためのインターフェース 158
     6.3.1 先天的能力・才能──五感 158
     6.3.2 先天的訓練・経験 158
     6.3.3 適応可能インターフェース 159
 6.4 受益者のためのインターフェース 160
     6.4.1 社会制度・慣習 160
     6.4.2 移植性と標準化 162
     6.4.3 再び、性能評価モデル 163
 6.5 開発者のためのインターフェース 165
     6.5.1 開発者の仕事のためのインターフェース 165
     6.5.2 開発者の通信のためのインターフェース 168
 6.6 顧客のためのインターフェース 171
     6.6.1 実績主義 171
     6.6.2 提案主義 171
 6.7 まとめ 172
 6.8 他の工程との関係 173
     6.8.1 要件定義 173
     6.8.2 設計 173
     6.8.3 作成 173
     6.8.4 テスト 173
 6.9 参考文献と学習の手引き 174

7 テスト
 7.1 テストとは何か? 176
 7.2 時・動・人・物 177
     7.2.1 時 177
     7.2.2 動 177
     7.2.3 人 177
     7.2.4 物 177
 7.3 単体テスト 178
     7.3.1 ブラック・ボックス・テスト 178
     7.3.2 ホワイト・ボックス・テスト 178
 7.4 統合テスト 180
     7.4.1 トップ・ダウン・テスト 180
     7.4.2 ボトム・アップ・テスト 182
     7.4.3 オブジェクト指向 182
 7.5 受け入れテスト 185
 7.6 システム・テスト 186
     7.6.1 回帰テスト 186
 7.7 テスト・ケース管理 187
     7.7.1 プログラム・ミューテーション 187
     7.7.2 エラー・シーディング 188
 7.8 信頼度成長曲線 189
 7.9 まとめ 190
 7.10 他の工程との関係 191
     7.10.1 要件定義 191
     7.10.2 設計 191
     7.10.3 作成 191
     7.10.4 導入 191
     7.10.5 保守 191
  7.11 参考文献と学習の手引き 192

8 導入
 8.1 導入とは何か? 194
 8.2 時・動・人・物 195
     8.2.1 時 195
     8.2.2 動 195
     8.2.3 人 195
     8.2.4 物 195
 8.3 さまざまな立場からの切り換え 196
     8.3.1 使用者の立場 196
     8.3.2 受益者の立場 197
     8.3.3 開発者の立場 198
     8.3.4 顧客の立場 198
 8.4 切り換えの問題 200
 8.5 学習・訓練 201
 8.6 保守要求 202
 8.7 新システムが使用されないことによる新旧システムの共存 204
     8.7.1 版管理 204
 8.8 切り換えの方法 206
     8.8.1 段階的切り換え 206
     8.8.2 一斉切り換え 206
 8.9 他の工程との関係 207
     8.9.1 要件定義 207
     8.9.2 設計 207
     8.9.3 テスト 207
     8.9.4 保守 207
     8.9.5 プロジェクト管理 208
     8.10 参考文献と学習の手引き 209

9 保守
 9.1 保守とは何か? 212
     9.1.1 保守の原因別分類 212
     9.1.2 保守工程による分類 212
 9.2 時・動・人・物 213
     9.2.1 時 213
     9.2.2 動 213
     9.2.3 人 213
     9.2.4 物 213
 9.3 保守の原因別分類 214
     9.3.1 完全化保守 214
     9.3.2 適応保守 216
     9.3.3 修正 216
 9.4 保守の原因の相関 219
     9.4.1 完全化保守 219
     9.4.2 適応保守 220
     9.4.3 テスト 220
     9.4.4 修正 222
 9.5 保守の工程別分類 223
     9..5.1 前方向開発 223
     9.5.2 逆方向開発 223
     9.5.3 再工学 225
 9.6 保守の活動 226
     9.6.1 認識 226
     9.6.2 実施 226
     9.6.3 分析 227
     9.6.4 検証 227
 9.7 保守の例 228
     9.7.1 乱れた地番 228
     9.7.2 営業と開発 228
 9.8 他の工程との関係 229
     9.8.1 要件定義 229
     9.8.2 設計 229
     9.8.3 作成 229
     9.8.4 テスト 229
     9.8.5 導入 229
     9.8.6 保守 229
     9.8.7 プロジェクト管理 229
 9.9 まとめ 230
 9.10 参考文献と学習の手引き  231

10 プロジェクト管理
 10.1 プロジェクト管理とは何か? 234
 10.2 時・動・人・物 235
     10.2.1 時 235
     10.2.2 動 235
     10.2.3 人 235
     10.2.4 物 235
 10.3 人の管理 236
     10.3.1 チーフ・プログラマ制度 236
     10.3.2 エゴレス・プログラミング 237
 10.4 モノの管理 238
     10.4.1 プログラムにまつわる管理 238
     10.4.2 管理対象物の構成要素間の関係 239
     10.4.3 文書 239
     10.4.4 構成管理 239
     10.4.5 工程管理 240
 10.5 金の管理 242
     10.5.1 開発コストの管理 242
     10.5.2 エコノミー? ディスエコノミー? 244
 10.6 時間の管理 246
     10.6.1 目標時間の管理 246
     10.6.2 経過時間の管理 246
     10.6.3 スケジュールの管理 246
 10.7 他の工程との関係 249
     10.7.1 要件定義 249
     10.7.2 設計 249
     10.7.3 作成 249
     10.7.4 テスト 249
 10.8 まとめ 250
 10.9 参考文献と学習の手引き 251

付録A 後書き 252
 A.1 執筆経過 252
 A.2 今後の執筆予定 252
 A.3 社会情勢の変化 253
 A.4 技術の変化 253
付録B 時・動・人・物 255
付録C 形式システム 256
 C.1 論理学 256
 C.2 形式理論 258
 C.3 λ計算 260
付録D チューリング・マシン 261
 D.1 チューリング・マシン 261
 D.2 計算パラダイム 261
付録E 計算量 263
 E.1 アルゴリズムの複雑性 263
 E.2 漸近表示 263
付録F スタックとデック 266
 F.1 スタック 266
 F.2 キュー 267
 F.3 デック 267
付録G 開発工程 268
 G.1 開発工程 268
付録H 参考文献での略 271
 H.1 ACM 271
 H.2 IEEE 271

参考文献 272
図索引 279
表索引 282
索引  283


HOME