[update]
2013/04/05 22:10頃、id:Nagiseさんのエントリへのリンクを追加しました。
はじめに
ツッコミどころ満載の
緊急特集!みずほ証券-東証裁判の争点を洗い出す - [論点3]どんな開発手法を適用すべきか:ITpro
ですが、なかでも
『コードクローンを含むプログラムは、含まないプログラムと比較して信頼性が高い』
とする東証の主張が気になりました。
なにか同じような論調の論文(かそれに類するもの)が無いか探したところ、
「コードクローンの長さとソフトウェア信頼性の関係の分析」
http://www.stage-project.jp/kanri/data/ronbun/mk9.pdf
『優良なコードをコピーすることによって発生したコードクローンはソフトウェアの信頼性を向上させることがある』
という記載がありました。
これらの主張・記載が本当に正しいのか、改めて考察してみました。
考察
まず、用語の定義から。ここでは以下のようにします。
コードクローン=コードのコピー(重複)
信頼性=残存バグの少なさ
保守性=コード修正のしやすさ
ここではコードクローンが信頼性と保守性に対して及ぼす影響を考察します。
コードクローンと信頼性
ある2人のプログラマがいました。
Aさん:100行当たり5件のバグを作り込む(5%)
Bさん:100行当たり10件のバグを作り込む(10%)
とします。
まず、Aさんが200行のコードを書きました。
200 * 0.05 = 10
で10件のバグが含まれます。
次にBさんが
・先のAさんのコードから100行コピーした。
・Bさん自身で100行のコードを書いた。
とします。このとき
100 * 0.05 + 100 * 0.1 = 15
ということで15件のバグが含まれます。
Bさんだけで全てのコードを書いたら20件のバグが含まれるところでした。
コピーすることで信頼性が上がったように見えます。
また、コードの共通部分を共通化したとしても同じ結果となります。
⇒ツッコミどころなのですが、もう少しだけお待ちを…。
なので、これだけを見ると先の主張や記述と一致するように見えます。
コードクローンと保守性
以下の2パターンを考えてみましょう。
・コードをコピーした場合
・共通部分を共通化した場合
保守性が高いのはどちらか?明らかに共通化した場合です。
コードクローンと信頼性(保守性も含め再考)
先の考察ではコードをコピーした場合でも共通化した場合でも信頼性に差はないとしました。
でも、先の考察には大きな考慮漏れがあります。
それはコードは書かれた後に修正を繰り返すということです。
例えば、先の例の時点では実装が終わっただけです。
そのままリリースされることはあり得ず、必ずテストと修正が行われます。
またこの先には機能追加もあるでしょう。
この過程において、コピーもしくは共通化したコードは繰り返し修正されます。
保守性の低い(コピーした)コードを修正すれば、信頼性は著しく下がります。
つまり、コードクローンの有るコードを修正すれば信頼性は下がるのです。
となると、先の主張や記述の根拠はどこにあるのか?ということになります…。
最後に
当たり前の話ではあるのですが、あえてまとめてみました。
もし
・考察のこんなとこ間違えてるよ!
・こんな資料あるよ!
・実はこんなケースで信頼性上がるよ!
等々ありましたら、コメントなどで教えていただけると幸いです。
参考
id:Nagiseさんが裁判での東証の主張に似た論文について解説されています。
コードクローンと品質 - プログラマーの脳みそ
当エントリで引用した論文の基になった論文のようです。
ぜひご参照ください。
当ブログでも、もう一度この論文についてまとめたいと考えています。
⇒まとめました。以下をご参照ください。
信頼性と保守性はトレードオフか - ぱと隊長日誌