ぱと隊長日誌

ブログ運用もエンジニアとしての生き方も模索中

コードクローンは信頼性を高めるか

[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さんが裁判での東証の主張に似た論文について解説されています。
コードクローンと品質 - プログラマーの脳みそ
当エントリで引用した論文の基になった論文のようです。
ぜひご参照ください。

当ブログでも、もう一度この論文についてまとめたいと考えています。
⇒まとめました。以下をご参照ください。
信頼性と保守性はトレードオフか - ぱと隊長日誌