当ページはハンズオンにご協力いただいた方向けのハンズオン結果の報告ページです.当ハンズオンへの御協力,誠にありがとうございました. 当ページは,これまでに結果を送付いただいた方の結果を元にした分析結果を報告するものです.
当ページはソースコードリーディングワークショップ2010(共催 日本IBM、メディア協賛 @IT), オンラインハンズオン, ソースコードリーディングワークショップ in デブサミ2010(協力 日本IBM), その他ご協力企業の皆様により,実際にソースコードを読解いただき,その読解時間を計測したものです.
ハンズオンでは,保守・派生開発プロジェクトを模した形式でソースコードの読解を行って頂きました.既存システムにあたるバージョン1ソースコード,そして保守・派生開発プロジェクトでの開発部分にあたる差分(パッチファイル)を,ハンズオンの題材として用意しました.今回用意したソースコードは,Javaで書かれたペイントアプリケーションです.これにはバージョン1ソースコードの時点で,鉛筆で線を引く,消しゴムで線を消すなどの基本的な機能が備わっています.ここに,塗りつぶしの機能を追加する,コードにリファクタリングを施すなどの13種類の変更を加える差分を用意しました.
<イベント協力者のタスク>
上記の各項目で得られた結果を分析することで,”慎重に判断を下す必要のある変更の種類”や”特定のスキルがあると短時間で読解できるソースコードの特徴”,”読解時間の見積もりのために計測すべきコードメトリクス”などを明らかにすることが,当ハンズオンの目的です.
ハンズオンの題材を作成するにあたり,事前に予備実験を行うことにより読解時間を大きくする要因を洗い出しました.予備実験では,いくつかのオープンソースソフトウェアの開発過程で記録された様々な種類の差分のコード読解を行いました.そして,コード読解に時間を要した差分に対して,なぜ時間を要したのか,その原因を差分の内容や特徴量の中から洗い出しました.差分のコード読解を行った結果,読解時間に影響を与えている要因として以下の5つの要因を洗い出しました.

図1. 読解時間を大きく左右する五つの要因
[E.B. Swanson, 1976]*1は,ソフトウェアの変更を修正と適応,強化の三種類に分け,それぞれの変更コストについて考察を行っています.[H.C. Benestad, 2010]*2は,ソフトウェアが進化していく様子からその変更コストの要因を探っており,変更されるコンポーネントの数,追加される制御文の数などが変更コストに大きな影響を与えていると述べています.
差分は,上で述べた五つの要因に関して互いに違いが出るように作られています.差分同士で読解時間を比較することで,読解コストの大きい差分の特徴や,特定のスキルがあれば短時間で読解できる差分の特徴を明らかにします.これを用いれば,ソースコードの特徴を基にした読解時間の予測や,ひいては保守・派生開発コストの見積もり精度の向上に役立てることができると考えています.
結果の分析作業を進めやすくするため,一部の差分には対となる差分が用意されており,その組み合わせの中で結果を比べることでも何らかの知見が得られるように設計されています.
予備実験の結果に基づいて差分を用意しました.以下に各差分の変更の特徴を示します.
上記の差分のメトリクスを計測した結果は以下の通りです.各メトリクスは,値の大きいものから3分の1を2,次の3分の1を1,残りを0として三値化してあります.行が各差分,列がメトリクスを示しています.

図2. 差分のメトリクス
図3は,各差分の読解時間の分布を示したグラフです.
グラフは,横軸に差分,縦軸に読解時間をとった箱ひげ図になっています.横軸には差分01から13までの13個の差分が並んでいます.
箱の下端は第1四分位点(25パーセンタイル),上端は第3四分位点(75パーセンタイル)です.
ひげの末端は5パーセンタイルと95パーセンタイルであり,それよりも外側の点は外れ値としています.

図3. 各差分の読解時間の分布
(グラフの読み方はこちらのページ(群馬大学 青木研究室のWeb)をご覧ください)

図4. 全協力者を対象にしたアンケートの結果(4つのスキル・経験)

図5. 全協力者を対象にしたアンケートの結果(プログラミングの経験年数)

図6. 全協力者を対象にしたアンケートの結果(それまでに携わったソフトウェアの中で最も規模の大きいもの)
図7に,バージョン1ソースコードの読解時間と差分の総読解時間の散布図を示します.ただし,全てのバージョン1ソースコードと差分について読解時間の回答があった読解者のみを抽出し,グラブス・スミルノフ棄却検定(有意水準α=0.01)により外れ値の除去を行っています.図の各点は読解者を示しており,横軸はバージョン1ソースコードの読解時間(分),縦軸は差分の総読解時間(分)です.図7より,読解者間で読解時間に大きな差が生じていることが確認できます.バージョン1ソースコードの読解時間は,最小が16.5分,最大が284分,平均が68.7分でした.差分の総読解時間は,最小が44分,最大が268分,平均が117.7分でした.また,両者の間の相関係数は0.525でした.

図7. バージョン1ソースコードの読解時間と差分の総読解時間の散布図
変更対象メソッド/変数がpublicで定義されている場合,読解時間が長くなるのではないかという仮説を立て,その検証を行いました.まず規模の影響を排除するため,ほぼ同規模の差分を集めたグループをいくつか作り,その中から読解時間に大きな差のあるグループを選びました.結果,差分06,差分09,差分12のグループが残りました.ただし,差分09は中身が全てコメントであるため,今回の比較からは除外します.
差分06と差分12に関して,変更行数と読解時間の間に正の相関関係はありません.まず,差分12は,差分06に比べて約25パーセント,変更行数が多くなっています(表1).しかし図8をみると,差分12に比べて差分06の方が読解に時間がかかっています.差分06と差分12の読解時間の分布を比較したところ,統計的に差があるという結果が得られました(T検定によって有意水準1パーセントで統計的有意差を確認).よってこの二つの差分の間においては,差分の変更行数が長ければ読解時間が長くなる,という関係は成り立っていないことが分かります.
表1. 追加・削除行数(差分06,12)


図8. 差分読解時間の分布(差分06,12)
次に,変更対象メソッド/変数のアクセス修飾子の違いと,読解時間の関係について述べます.図9は,差分06と差分12の,publicメソッド/変数およびprivateメソッド/変数に関する変更箇所数を示したグラフです.差分06の変更は主にpublic,すなわち定義クラス外から参照されるメソッドや変数に関する変更であるのに対して,差分12の変更はほぼ全てprivate,定義クラス外からは参照されないメソッドや変数に関する変更で占められています.ここで,メソッドの処理内容に変更を加え,それによる副作用の有無を確認する場合を考えてみます.一般的にはまずメソッドの中身を調べ,次にメソッドの呼び出し箇所を探してその周辺のコードを読み,影響があるかを調べます.変更されたメソッドの呼び出し箇所を探す際,privateメソッドであれば同じクラス内だけを探せば十分ですが,publicメソッドの場合はその探索範囲がクラスの外にまで広がることになるため,副作用の有無の確認にかかるコストがprivateメソッドの場合よりも大きくなる傾向にあると考えられます.すなわち,publicメソッド/変数に関する変更が多く,副作用の有無の確認により長い時間をかけたことが,差分06の読解時間が差分12のそれよりも長くなった原因であった可能性があります.
以上のことを一般化できれば,”変更対象メソッド/変数がpublicで定義されている場合,読解や修正に充てる時間を多めに見積もっておく”,”変更規模の割に修正コストが高い場合,副作用の有無の確認に時間が割かれている場合がある”などの根拠とすることができます.

図9. 変更対象メソッド/変数のアクセス修飾子
GUIプログラミング経験,レビュー経験の長さとコード読解時間の関係について,ハンズオン結果から得られた傾向を示します.図10は差分1,3,4,5,7,12(GUIに関する変更が施される差分)の読解時間を経験の異なる協力者毎に比較するための箱髭図です.図10では横軸を差分,縦軸を読解時間としています.また,協力者のグループ分けの基準は以下の通りです(協力者のプロフィールに関するアンケート結果よりグループ分けを行いました).
| 両方少 | :GUIプログラミング経験なし,レビュー経験なしと回答された協力者. |
| GUIのみ多 | :GUIプログラミング経験が豊富,レビュー経験なしと回答された協力者. |
| レビューのみ多 | :GUIプログラミング経験なし,レビュー経験豊富と回答された協力者. |
| 両方多 | :GUIプログラミング経験豊富,レビュー経験豊富と回答された協力者. |
図10より,差分01,03,04,07についてみるとGUIプログラミング経験のみ多くなれば読解時間は短くなることが分かりました.しかし差分05,12についてはGUI経験のみが多くなっても読解時間が短くなっていないことがわかりました.読解時間が短くなったもの(グループA)とそうでなかったもの(グループB)に分け,追加行数を比較しました(表2,表3).表から読解時間が短くならなかったグループの差分は読解時間が短くなった差分と比べて追加行数が大きいということが分かりました.

図10. 6つの差分の読解時間の分布
表2. GUI経験によって読解時間が短くなった差分(グループA)の規模

表3. GUI経験によって読解時間が短くならなかった差分(グループB)の規模

以上の結果ではGUIに関する差分のソースコード読解時間は,GUIプログラミング経験が多いと読解時間が短くなる傾向が現れています.このことから事前準備としてソースコードに用いられる知識をレビューアが学習することによってソースコード理解を効率化できる可能性があると考えられます. しかし,上記にあるようにGUIプログラミング経験が多くなっても読解時間が短くならない差分があることがわかりました(グループAとBの差分).グループAとBの追加行数を比較すると,読解時間が短くならない差分はそうでない差分より追加行数が多いことがわかりました.このことから,変更量が大きいとGUIプログラミング経験が多くても読解時間は短くならない可能性があると考えられます.
レビュー経験の豊富な開発者は,レビューのスキルが高く,効率的にソースコードを読解しているのではないかと考えられます.そこで,レビュー経験の長さがソースコードの読解時間にどのような影響を及ぼしているか,ソースコードの種類ごとに分析を行いました. 図11は実験結果の箱髭図です.縦軸が読解時間,横軸が差分の種類を表しています.全13種類の差分の中から,「コメント・リファクタリング」,「単純な変更」,「複雑な変更」の三つの観点に基づき,7種類をピックアップしました.また,各差分を協力者の「レビュー経験の長さ」に基づき経験多・経験少のグループに分類しました.

図11. 7つの差分の読解時間の分布
2010年11月8日