4: 欠陥とフェーズ
PSPでいう「欠陥」とは、『製品が完成するまでの間に修正されていなければならないあらゆること(要件定義、設計、実行時なども対象となる)』です。具体的には、各種設計ミス(ロジック設計ミス、変数設定ミスなど)、コーディングの誤植、バグ、実行結果が違う、などが挙げられます。
「欠陥=バグですか?」と聞かれますが、単にコーディング時のバグだけを指すのではなく、要件定義や設計など、PSP開発の全6フェーズにおいて「修正しなければいけないこと」が対象です。
「フェーズ」とは、「時間の流れ」だと思ってください。フェーズを考える上でのポイントは、「時間は巻き戻らない」ということです。つまり、一度設計を終えたぞ、と思ってストップウォッチを止め、時間を記録したら、もう設計フェーズは終了しているということです。
言い方を変えます。実装中に「あ、じゃあここの設計をこう変えよう」と思っても、その再設計作業は「コーディングフェーズ」です。「実装」の「中」だからです。
実行してみたら結果が課題と違った。このための再設計は、「テストフェーズ」です。
自分は実装→コンパイル→直し、実装→コンパイル→直し、と考えている、と言いたい方がたくさんおられるでしょう。でも、ここは頑張って、このフェーズ定義の通りに、プログラミングしてみてください(ちなみにこの場合、最初にコンパイルした瞬間から、実行テストの瞬間まではずっとコンパイルフェーズです)。
5: フェーズの規定にしばられること
この手法、「パーソナル・ソフトウェア・プロセス」(PSP)という名前がついています。ここでいうプロセスとは「仕事の仕方」くらいに考えてください。このPSPエクササイズが大変なのは、プログラミング課題を行うにあたって、この「仕事の仕方」を規定されることです。
はっきり言って窮屈で仕方がない方もいらっしゃるかもしれません。しかし、いったん「毎回同じフェーズの定義で仕事をする」ことが身につくと、作業計画が飛躍的に正確になり、楽になります。私は3~4回目で慣れました。では挑戦してみてください。
ある技術者が開発したプログラムの規模とそれにかかった時間が以下の通りだった時、それぞれ平均値と標準偏差を計算するプログラムを設計、実装しなさい。
キーボード入力、ファイル、その他のソースから、実数n個を読み込み計算します。必要であれば、配列、データベース、その他のデータ構造を使って、読み込んだデータを保管しなさい。
開発プログラムの規模が確定するたびに、このデータは増え続けます。そのため、データが何行になっても、その都度平均値と標準偏差を算出することができるようなプログラムを開発してください。
その際、PSP のフェーズ定義と欠陥定義にしたがい、別途添付するチャートに自分の実績を記録すること。
| プログラムID | 見積もりサイズ(KLOC) | 実際の開発時間(H) |
| A | 429 | 25.5 |
| B | 1586 | 140.3 |
| C | 227 | 20.8 |
| D | 98 | 5.2 |
| E | 3212 | 459.1 |
| F | 250 | 32.1 |
| G | 486 | 45.9 |
| H | 626 | 73.4 |
| I | 275 | 67.1 |
| J | 132 | 20.6 |
平均値 標準偏差
------ --------
見積もりサイズ(KLOC) 732.1 971.91
実際の開発時間(H) 89.0 135.73
「標準偏差」とは、平均だけでは表せない、データの散らばり具合を示す数値のことです。対象となるデータの平均値と各値の差を求めて二乗し(これを「分散」と呼ぶ)、それらの平均の平方根を取って求めます。標準偏差の詳細などについては、参考文献などを参照してください。
6: ヒント
先ほどの表1の見積り規模(真ん中の列)において、分散を求めると次のようになります。
| プログラムID | 分散(KLOC) |
| A | 303.1 |
| B | 853.9 |
| C | 505.1 |
| D | 634.1 |
| E | 2479.9 |
| F | 482.1 |
| G | 246.1 |
| H | 106.1 |
| I | 457.1 |
| J | 600.1 |
できましたか? では下記に、筆者がJavaで書いた解答の一例を掲載します。
