「Step数を報告して」と言われると「Step数(笑)ですか」と言いたくなる今日この頃、
みなさん、いかがお過ごしでしょうか。
ところで、Step数って何が悪いのかを説明できますか?
その数字の示すところを知った上で正しく使うには問題ないのですが…。
Step数は規模に対して正の相関関係を持つ
まず、Step数と規模にはなんらの関係もないわけではありません。
Step数は確かに規模と正の相関性を持っています。
ただし、誤差があまりに酷いというだけのことです。
Step数という指標の誤差には以下のような原因が考えられます。
- コードのフォーマットによる誤差
- マルチステートメントなどの記法による誤差
- ロジックによる誤差
- 冗長性による誤差
他にもあると思いますが、挙げ始めるときりがありませんね…。
コードのフォーマットによる誤差
コードのフォーマットによる誤差は
for (int i=0; i<100; i++) {
// ...
}
for (int i=0; i<100; i++)
{
// ...
}
といったところで出てきます。仮にfor文やif文が平均して100 Stepに
1回の頻度で出てくるのであればこのフォーマットの違いによって1%の誤差が出ます。
感覚的にはfor文やif文の頻度はもっと高いですから、数%の誤差にはなることでしょう。
これらの誤差は機械的なフォーマッタで変換するなどすれば排除できます。
JavaでEclipseを用いている場合、
CheckStyle
などのプラグインを用いればコンパイルの際に添削して警告を出してくれます。
コーディング規約など作っても、チェックする人がいなければ絵に描いた餅。
こういうことは機械にやらせるのが一番です。
マルチステートメントなどの記法による誤差
Javaなどでは1行に複数のコードを記述するマルチステートメントが可能です。
int a, b;
int c=0, d=0;
int e=0; int f=0;
また、メソッドの連鎖的な呼び出しもできますね。
StringBuilder sb = new StringBuilder();
sb.append(1).append("+").append(1).append("=");
このような記法を展開して記述すれば1行が2行以上に増えてしまいます。
これらの頻度によりますが、こういった記法の差が数%~十数%程度の誤差になるのではないでしょうか。
このあたり、以前に
関連アイデア
を出しているのですが、Step数なんていうソースコード上での行数ではなく、
構文解析木にした上での要素でカウントすればもっとマシな指標になりそうです。
ロジックによる誤差
同じI/Oのロジックをプログラムさせても人によって記述するロジックはさまざまです。
そして、採用するロジックによってプログラムは短くも長くもなります。
同じI/Oのプログラムをいろんな人に書かせてみると面白いかもしれません。
その際、Step数の分布は
正規分布
をとるかもしれません。
私の勘では縦軸に人数、横軸にStep数のlogをとると、正規分布になるんじゃないかと思います。
分散がどの程度になるのかは実際の統計を取ってみなければわかりませんが、
統計的には±2σの範囲に95.44%で収まるとされます。
経験則からすれば中央値が100Stepのプログラムだと
50~200ぐらいの幅に収まるのではないでしょうか?
この場合、Step数は10^(2±0.3)ぐらいということになりますね。
(10^1.7≒50.12、10^2.3≒199.53)
Step数の10を底とするlogに対して2σは0.3を超えないとしますと、μ=1、σ=0.15となります。
この推計値がそれほど正しいとは思いませんが、ロジック次第で
Step数の中央値に対して-50%~+100%程度の幅が出ることは経験則とはさほど外れていないことでしょう。
冗長性による誤差
論外なのでロジックによる誤差の項では考慮していませんが、構造化プログラミングができていなくて
コードクローンが散らばっている状況下では数百%程度のStep数の違いは不思議なことではありません。
簡単なコードレビューでもこういった酷いコードは排除できます。
一応、コードクローンを探すようなツールもありますから、そういったもので検出を試みるのも手です。
誤差の大きなStep数から算出される指標もまた誤差が大きい
ここまでの考察で、Step数の値は誤差が非常に大きく、±50%程度は平気でずれることを指摘しました。
では、1000Stepあたりn件のテストケース、とかn件のバグ検出といった指標はどうでしょうか?
そもそものStep数が±50%程度の誤差を含んでいるのであれば、
これらの数値も当然±50%程度の誤差を含みます。
仮に1000Stepあたり50件のテストケースを出せと言われたならば、
25~75件ぐらいまでの誤差があるはずです。
50に満たないからダメなどという人がいたりしますが、
その人は数字というものが理解できていないだけです。
誤差の程度がどのぐらいかを踏まえた上で、目安として用いるのであればこれらの指標は
それなりの意味があります。意味を考えずに、「そういうルールだから」と思考停止して
数値を適用しようとするとむしろ足を引っ張るだけですね。
投稿日時 : 2008年3月4日 11:20