記憶力に基づくプログラム理解容易性評価尺度の追加実験
村上 優佳紗
角田 雅照
中村 匡秀
近畿大学大学院
近畿大学大学院
神戸大学大学院
[email protected]
[email protected]
[email protected]
要旨
ソフトウェア開発の生産性を高めるためには,理解し やすいソースコードを書くことは非常に重要である.その ため,ソースコードの複雑度を評価する指標が,これまで 数多く提案されてきた.例えばサイクロマチック数やCK メ トリクスはソースコードの複雑度を評価する代表的な指標 である.ただし,複雑度が低い場合でも,必ずしもプログ ラムが理解しやすいとは限らない.プログラムの理解のし やすさは,理解のために必要とする記憶量の多寡に基づ くと仮定し,プログラム理解容易性評価尺度が提案され ている.この尺度では,人間の短期記憶は,大きさの限ら れたキューになっていると仮定し,プログラムを読む時に, 覚えるべき変数の個数がキューの大きさの上限を超える 場合,理解が難しくなるとしてプログラムの理解容易性を 評価している.ただし,指標を評価する実験では,学生を 被験者としている.学生は年齢やプログラム経験が比較 的均質であり,学生以外の,より幅広い年齢の被験者に 適用した場合,必ずしも評価尺度がプログラムの理解容 易性を表しているとは限らない.そこで本研究では,大学 の教員を被験者実験とし,この評価尺度がプログラムの 理解容易性を適切に表すかを確かめた.学生 24 人と大 学教員8 人を被験者として実験を行った結果,評価尺度 がプログラムの理解容易性を適切に表していることがわ かった.1. はじめに
ソフトウェア開発の生産性を高めるためには,理解しや すいソースコードを書くことは非常に重要である.ソースコ ードが理解しにくい場合,ソフトウェアの保守性が低下し やすく,その結果,ソフトウェア開発の生産性が低下した り,ソフトウェアの品質が低下したりする可能性がある.そ のため,ソースコードの複雑度を評価する指標が,これま で数多く提案されてきた.例えばサイクロマチック数[4]や CK メトリクス[1]はソースコードの複雑度を評価する代表 的な指標である. ただし,複雑度が低い場合でも,必ずしもプログラムが 理解しやすいとは限らない.文献[3][5]ではプログラムの 理解のしやすさは,理解のために必要とする記憶量の多 寡に基づくと仮定し,プログラム理解容易性評価尺度を 提案している.この尺度では,人間の短期記憶は,大きさ の限られたキューになっていると仮定し,プログラムを読 む時に,覚えるべき変数の個数がキューの大きさの上限 を超える場合,理解が難しくなるとしてプログラムの理解 容易性を評価している. 文献[3][5]では,プログラム理解容易性評価尺度の妥 当性を確かめるために,学生を被験者として実験を行っ ている.ただし,学生は年齢やプログラム経験が比較的 均質であり,学生以外の,より幅広い年齢の被験者に適 用した場合,必ずしもこの評価尺度がプログラムの理解 容易性を表しているとは限らない.そこで本研究では,大 学の教員を被験者実験とし,この評価尺度がプログラム の理解容易性を適切に表すかを確かめる.2. プログラム理解容易性評価尺度
プログラムの理解容易性を評価するために,文献[3] [5]では,人間の記憶力に基づく尺度を提案している.こ れらの尺度では,プログラムを理解するためにメンタルシ ミュレーション[2]が行われることを前提としている.メンタ ルシミュレーションとは,プログラムの動作をコンピュータ や筆記具を用いずに,思考しながら理解することであり, 比較的規模の小さなコード片に対して用いられる.メンタ ルシミュレーションを行う場合,変数の値を記憶しておく 必要があるが,多数の変数の値を同時に記憶しておくこ とは容易ではない.このため文献[3][5]では,多数の変数 の値を記憶しておく必要のあるプログラムの場合,メンタ ルシミュレーションのコストが高くなり,プログラムの理解 容易性が低下すると仮定している.int i , t; t = 11; t = t - 1; i = 2; if(i < t){ i = i + 2; if(i < t){ i = i + 2; } if(i < t){ i = i + 2; if(i < t){ i = i + 2; } } if(i < t){ i = i + 2; } } System.out.println("i = " +i); int i , t; t = 11; t = t - 1; i = 2; if(i < t){ t = t - 2; if(i < t){ i = i + 2; } if(i < t){ t = t - 2; if(i < t){ i = i + 2; } } if(i < t){ i = i + 2; } } System.out.println("i = " +i); (a0) (a1) 図 1 プログラム a0, a1[3] int a, b, c, d, e, f, g; a = 2; b = 4; c = 3; d = 6; c = c + 4; d = d - 2; if(c < 5) e = d + 5; else e = d + 3; a = a * 2; b = b + 6; if(a > 7) f = b - 3; else f = b - 5; g = e + f; System.out.println("g = "+g); int a, b, c, d, e, f, g; a = 2; b = 4; c = 3; d = 6; c = c + 4; d = d - 2; a = a * 2; b = b + 6; if(a > 7) f = b - 3; else f = b - 5; if(c < 5) e = d + 5; else e = d + 3; g = e + f; System.out.println("g = "+g); (b0) (b1) 図 2 プログラム b0, b1[3] 文献[5]では,人間の短期記憶を FIFO キューとして,メ ン タ ル シミ ュレ ー ション の 仮想 モ デ ル(Virtual Mental Simulation Model; VMSM)を作成し,そのモデルに基づ いて理解容易性評価尺度を定義している.基本的なアイ ディアは,ある変数の値を参照する際,(大きさに制限の ある)キューに変数の値が記憶されている場合はコストが 小さくなるとしている.逆にキューに値が記憶されていな い場合,その値の変更箇所にまでバックトラックする必要 が生じるため,コストが大きくなるとしている. 文献[5]では,VMSM に基づき,以下の 4 つの評価尺 度を定義している. ASSIGN: 変数代入に関するコスト. RCL: 短期記憶内の変数を思い出すコスト. BT_CONST: 定数をバックトラックする回数. 短期記憶にない定数を得るコスト. BT_VAR: 変数のバックトラックの距離.短期 記憶にない変数を得るコスト. 文献[3]では,上記のメトリクスが変数の更新回数に基 づく再計算コストを考慮していないことと,バックトラックに 関するメトリクスがプログラムの行の入れ替えに敏感すぎ ることが問題点であるとし,新たな評価尺度を2 つ提案し ている.具体的には,各変数の値の更新回数をベクトル の 要 素 と し , ベ ク ト ル の 要 素 の 和 に 基 づ く メ ト リ ク ス SUM_UPD とベクトルの要素の分散に基づくメトリクス SUM_VAR を定義している.
3. 実験
3.1. 概要 実験の目的は,学生以外(今回の実験では大学教員) の場合でも,プログラム理解容易性評価尺度が妥当に機 能するかどうかを確かめることである.そのために,必要と する記憶力が異なる,複数のプログラムを用意し,被験 者がコードを理解するために掛けた時間を計測した. 必要とする記憶量の異なるプログラムは,石黒らの研 究[3]で示されているもの 4 つ(a0, a1, b0, b1.図 1,図 2 参照)を利用した.各プログラムは20 行から 30 行の規模 である.あらかじめ指定された変数の値が,プログラム実 行後にどうなるかプログラムを読んで答え,それが正しか った場合,プログラムを理解できたとした.例えばプログラ ムa0 の場合,プログラム実行後の変数 i の値を答えさせ た.プログラムの理解はメンタルシミュレーションにより行う こととし,メモなどは利用させないようにした. 各プログラムで理解のために必要とする記憶力の多寡 については,2 章で説明した 6 つのメトリクス(ASSIGN, RCL,BT_CONST,BT_VAR,SUM_UPD,VAR_UPD) に基づき評価した.これらのメトリクスに基づく各プログラ ムの理解容易性を表 1に示す(石黒らの研究[3]からの引 用).ASSIGN,BT_CONST,SUM_UPD より,プログラム b0,b1 を理解するためには,比較的記憶力が必要とされ ることがわかる. 被験者を学生グループと教員グループに分け,それぞ れのグループの解答時間の平均値や中央値などを算出表 1 各プログラムの理解容易性[3]
プログラム ASSIGN RCL BT_CONST BT_VAR SUM_UPD VAR_UPD
a0 12 6 0 80 7 1.25 a1 12 6 0 48 7 0.25 b0 18 8 1 30 11 0.24 b1 18 6 1 54 11 0.24 図 3 実験用ツールのスクリーンショット し比較した.学生グループは,近畿大学理工学部情報学 科に所属する学部4 年生から修士 2 年生の 24 名であり, 教員グループは同学科の教員8 名である.教員グループ の平均年齢は45 歳(最小 33 歳から最大 64 歳)である. プログラムを読む順番が実験結果に影響することを避 けるために,4 つのプログラムを読む順番を被験者ごとに 変更した.例えばある被験者ではプログラムをa0, b1, a1, b0 の順に読むとし,別の被験者では b1, a0, b0, a1 の順に 読むなどとした. 3.2. 実験ツール 実験のために,問題を出題し,回答時間や誤回答の 回数を計測するためのツールを作成した.図 3 にツール のスクリーンショットを示す.本ツールは表計算ソフトのマ クロを用いて開発した.ツールの動作を以下に示す. 1. 「解答する」をクリックすると問題とテキスト ボックスを表示する. 2. 問題に正解するまでテキストボックスを表示 し続ける. 3. テキストボックス(問題)が表示されてから正 答するまでの回答時間と誤回答の回数を記録 し,被験者にも表示する. 4. 正解すると次の問題に自動的に遷移する. 3.3. 結果 表 2 に各グループの回答時間の平均値と中央値を示 す.教員グループ,学生グループとも,記憶力を比較的 必要としないプログラムa0,a1 と比べ,プログラム b0,b1 の ほうが,解答時間が長くなっていた. 比較的記憶力を必要としないプログラム a0 と比べ,何 倍の回答時間が掛かっているかを調べた.具体的には, プログラム a0 以外の回答時間÷プログラム a0 の回答時 間を求めた.この値が大きいほど,a0 と比較して回答時 間が多く掛かっていることを示している.結果を表 3 に示 す.学生グループでは,b0 / a0,b1 / a0 の平均値と中央 値のうち,b0 / a0 の平均値以外は 2 を下回っていたが, 教員グループでは,それらの値全てが 2 を上回ってい
表 2 各グループの回答時間(秒) a0 a1 b0 b1 学生 平均値 65 82 105 89 中央値 58 75 100 70 教員 平均値 59 91 141 115 中央値 51 51 144 109 表 3 プログラム a0 との回答時間の比 a1 / a0 b0 / a0 b1 / a0 学生 平均値 1.6 2.0 1.4 中央値 1.2 1.5 1.4 教員 平均値 1.5 2.4 2.2 中央値 1.0 2.4 2.4 表 4 誤回答数の基本統計量 a0 a1 b0 b1 学生 平均値 1.0 0.5 1.3 0.8 中央値 0.0 0.0 0.0 0.0 標準偏差 2.5 0.8 2.2 2.3 教員 平均値 0.1 0.4 1.1 0.5 中央値 0.0 0.0 1.0 0.0 標準偏差 0.4 0.7 1.0 0.8 図 4 学生グループの回答時間正規化 図 5 教員グループの回答時間正規化 た. 被験者ごとに解答時間を正規化して比較した.正規化 は(回答時間 – 最小解答時間)÷(最大回答時間 – 最 小回答時間)により行った.正規化を行うことで被験者個 人の問題の得手不得手を判別することができるためであ る.箱ひげ図を図 4,図 5 に示す.学生グループの場合, プログラム a0 以外はばらつきが大きい,すなわち記憶力 を比較的多く必要とするプログラム b0, b1 の場合でも, 相対的に回答時間が長くなるとは限らないといえる.教員 グループの場合,特にプログラム b0 において相対的に 回答時間が長い傾向があった.これらの結果より,教員 グループのほうが,プログラム理解容易性評価尺度がより 明確に機能しているといえる. 誤回答数の基本統計量を表 4 に示す.プログラム b0 を除き中央値は0 であり,どちらのグループも誤回答を多 く行った被験者は少ないことがわかる.プログラムb0 につ いては,教員グループの中央値が 1 となったことから,こ のプログラムは教員グループにとって,特に理解が難し かったと考えられる.なお,学生グループでは,一部の被 験者の誤回答数が多く,プログラム a1 を除き,標準偏差 が 2 を超えていた.ただし,教員グループと比較して,平 均値と中央値に大きな差はないため,全体としては正答 率に教員グループと差はないといえる.
表 5 アンケート結果 問I 問II 1 2 3 1 2 3 学生 43% 43% 14% 33% 50% 17% 教員 57% 29% 14% 46% 46% 8% 3.4. 考察 教員グループの被験者が,実験に集中して取り組んで いなかった可能性は低いと考えられる.これは,プログラ ム a0 の出題順序が被験者によって異なっていたにも関 わらず,a0 の回答時間が学生グループよりも低かったた めである. 実験後のアンケートで出題したプログラムについてア ンケートを行った.その内容は以下の2 つである. I. 1 問目と 3 問目について,具体的にどの部分が どのように変更されたかについて気づいたか. II. 2 問目と 4 問目について,具体的にどの部分が どのように変更されたかについて気づいたか. 回答は以下の3 つとした.
1.
気づいたうえで早く読めたと思う2.
気づいたが早く読むのに役立たなかった3.
気づかなかった 学生グループの有効解答数は24,教員グループの有 効解答数は 7 であった.アンケート結果を表 5 に示す. 学生グループと比較して,教員グループは問I,問 II とは 「1:気づいたうえで早く読めたと思う」と解答した被験者が 多かった.図 5 において,教員グループのプログラム a1 の回答時間のばらつきが比較的小さかったのは,このこ とが影響している可能性がある.記憶力を必要とするプロ グラムb0,b1 について,もし回答 2,3 が多かった場合, 回答時間がより長くなった可能性がある.4. おわりに
本研究では,記憶力に基づくプログラム理解容易性評 価尺度[3][5]に着目し,指標の妥当性を評価するために, 被験者の対象を変えて実験を行った.この尺度では,人 間の短期記憶は,大きさの限られたキューになっていると 仮定し,プログラムを読む時に,覚えるべき変数の個数が キューの大きさの上限を超える場合,理解が難しくなると してプログラムの理解容易性を評価している.文献[3][5] の実験では,評価尺度の妥当性を確かめるために,学生 を被験者として実験を行っている. ただし,学生は年齢やプログラム経験が比較的均質で あり,学生以外の,より幅広い年齢の被験者に適用した 場合,必ずしもこの評価尺度がプログラムの理解容易性 を表しているとは限らない.そこで本研究では,大学の教 員を被験者実験とし,この評価尺度がプログラムの理解 容易性を適切に表すかを確かめた.その結果,学生の被 験者よりもより明確に,プログラム理解容易性評価尺度が 適切に機能した. 謝辞 本研究の一部は,文部科学省科学研究補助 費(挑戦的萌芽:課題番号 26540029,基盤 C:課題番号 25330090)による助成を受けた.参考文献
[1] Chidamber, S. and Kemerer, C: A metrics suite for object oriented design, IEEE Transactions on Software Engineering, vol.20, no.6, pp.476-493, 1994.
[2] Dunsmore, A., Roper, M. and Wood, M.: The role of comprehension in software inspection, Journal of Systems and Software, vol.52, no.2–3, pp.121-129, 2000.
[3] 石黒誉久,井垣宏,中村匡秀,門田暁人,松本健 一:変数更新の回数と分散に基づくプログラムのメ ンタルシミュレーションコスト評価,電子情報通信学 会技術報告,SS2004-32,pp.37-42, 2004.
[4] McCabe, T: A Complexity Measure, IEEE Transactions on Software Engineering, vol.SE-2, no.4, pp.308-320, 1976.
[5] Nakamura, M., Monden, A., Satoh, H., Itoh, T., Matsumoto, K., and Kanzaki, Y.: Queue-based Cost
Evaluation of Mental Simulation Process in Program Comprehension, Proc. of International Software