コードクローンと品質

コードクローンと品質について話題になっている。元ネタはこちら。

ソースコードの品質についても、みずほ証券は問題を指摘している。今回のバグがあったプログラム全体について、「ソースコードの著しい重複が見られるなど、エラーの潜在する率が極めて高い作り方をされており、品質が極めて低い」と主張。これに対して東証は「コードクローン(記述の重複)を含むプログラムは、含まないプログラムと比較して信頼性が高いことが定量的な研究で裏付けられている」と反論した。

[論点3]どんな開発手法を適用すべきか | 日経 xTECH(クロステック)

この「コードクローンを含むプログラムのほうが信頼性が高い」というのはどこからきた話題なのかという話。

僕が昔読んだ論文で似たような話があったなと思って探してみた。

コードクローンに基づくレガシーソフトウェアの品質の分析(PDF)

本論文では,20年以上前に開発され,拡張COBOL言語で記述されたある大規模なレガシーソフトウェアを題材とし,代表的なソフトウェア品質である信頼性・保守性とコードクローンとの関係を定量的に分析した

なお、この論文は平成14年受付と書かれているから2002年の時点なので、対象となったソフトウェアというのは2013年現在だと30年以上前のソフトウェアだということになる。

この論文の面白いところは

5.2コードクローンと信頼性の関係
Non-cloneモジュールとclone-includedモジュールの1行あたりのフォールト数の平値を図7に示す.図より,clone-includedモジュールは,non-cloneモジュールよりも信頼性が平均的に約40%高い(有意水準5%で有意差あり).1章では,1つのコードクローン列に変更を加える際に,同一のすべてのコードクローン列にも同様の変更を行わなければならないことが多く,変更し忘れや見逃しが生じるとフォールト混入の原因となりうると述べたが,その逆の結果が得られたことになる

図は単純な棒グラフなので値だけ引用する。値は1行あたりのフォールト数の平値である。

Non-clone modules 0.000432
Clone-included modules 0.000255

つまり、「コードクローン多いほうが信頼性低いに決まってんだろJKと思って20年保守されてるソフトウェアを実際に分析してみたら逆の結果になったよ、うわお」ってところで、これは「起承転結」の「転」であって「結」じゃないのでせっかちな人は落ち着いて続きを読んで貰いたい。

このソフトウェアの保守関係者へのインタビューで判明したこととして,コードクローンが生成される1つのケースに,変更のリスクが高い部分のコード列に対して機能追加を行う際,変更したい部分のコード列からコピー&ペーストしてコードクローンを生成し,コピー元のコード列からペースト後のコード列へと処理を分岐させたうえで,ペースト後のコード列に変更を加えるというものがあった.

十分に枯れたプロダクトにおいて、こうした対応をするとコードクローンは多いけども信頼性が高くなるシチュエーションがあるみたいだよ、って話だと思えばよいのではないかしら。

これは決して「コードクローンを増やせば信頼性が高くなる!」という意味ではない。この辺を曲解しちゃったのかなーと思ってるが、真意は東証の担当者に聞いてみないとわからない。

おまけ

コードクローンは信頼性を高めるか - ぱと隊長日誌 では コードクローンの長さとソフトウェア信頼性の関係の分析(PDF)という論文を挙げて

『優良なコードをコピーすることによって発生したコードクローンはソフトウェアの信頼性を向上させることがある』
という記載がありました。

これらの主張・記載が本当に正しいのか、改めて考察してみました。

といっているのだけど、多分その元ネタが本稿で挙げた論文。この論文、同じ執筆者が二人入っていて、文献のところに

門田暁人,佐藤慎一,神谷年洋,松本健一,“コードクローンに基づくレガシーソフトウェアの品質の分析,”情報処理学会論文誌, Vol.44, No.8, pp.2178-2188,2003.

と本稿で挙げた論文を取り上げている。こっちの論文があったうえでそう言ってるんじゃないかな。