コードクローンのメトリクス値と 開発者の相関の調査 東誠† 肥後芳樹‡ 早瀬康裕‡ 松下誠‡ 井上克郎‡ 「大阪大学」の東です. コードクローンのメトリクス「ち」と 開発者の「そーかん」の「ちょーさ」 について発表します. 別刷り † 大阪大学基礎工学部情報科学科 ‡ 大阪大学大学院情報科学研究科 2008/3/13 情報処理学会 第70回 全国大会
コードクローン ソースコード中に存在する同一または類似したコード片 クローンの検出と除去が研究されてきた 以降単にクローンと呼ぶ ソースファイルF1 ソースファイルF2 まず,コードクローンについて説明します. コードクローンとは,ソースコード中に存在する 同一または類似したコード片です. コードクローンを,図を用いて説明します. 図には2つのソースファイルがあります. そしてソースファイルの色がついているコード片は コードクローンであり, それぞれ類似しています. 以降,コードクローンを単にクローンと呼びます. このようなクローンに対し、 従来は検出と除去が研究されてきました. コードクローン コードクローン 情報処理学会 第70回 全国大会 2008/3/13
クローンが保守性に与える影響 クローンはソフトウェア保守を困難にする場合がある クローンが保守性を悪化させるとは限らない[1] バグ修正などコード変更をする際、全てのクローンに対して同じ変更を検討する必要がある 保守作業の手間が増大 クローンが保守性を悪化させるとは限らない[1] 例 : プラットフォーム変更の際に,仮想化層を書く代わりに作成するクローン 次に,クローンが保守性に与える影響について説明します. クローンはソフトウェア保守を困難にする場合があります. その理由は,バグ修正などでコード変更をする際, 全てのクローンに対して 同じ変更「を検討する」必要があり, これによって保守作業の手間が増大するからです. 一方で,クローンが保守性を悪化させるとは限りません. このようなクローンの例としては, プラットフォーム変更の際に, 仮想化層を書く代わりに 作成するクローン が挙げられます. [1]C. Kapser and M. W. Godfrey: ““Cloning Considered Harmful” Considered Harmful”, Proceedings of the 13th Working Conference on Reverse Engineering (WCRE 2006), pp.19-28, 2006. 情報処理学会 第70回 全国大会 2008/3/13
クローン管理の必要性 全てのクローンを取り除くのではなく,必要なクローンだけ除去する 保守性を悪化させるクローンは除去する 明確な理由があって作成したクローンは様子を見る 「このことから」、 クローンを適切に管理する必要があると考えられるようになりました. クローン管理の例としては, 全てのクローンを取り除くのではなく、 必要なクローンだけを除去する ことが挙げられます. 例えば, 保守性を悪化させるクローンは除去し, 明確な理由があって作成したクローンは 除去せずに様子を見ることが 管理の一例として挙げられます. 管理って何? という質問が出てきそう. 「(基準によって)クローンを複数のグループに区別して, 各クローンのグループに対して適切な処理を行うこと」 情報処理学会 第70回 全国大会 2008/3/13
着目点 クローンを編集した開発者 開発者によってクローンの編集内容に特徴が表れるのではないか 異なる役割や目的を持つ 経験に差がある 開発者によってクローンの編集内容に特徴が表れるのではないか 例 : 経験の浅い開発者によって編集されたクローンは保守性を悪化させる 特徴によってクローンを区別し,管理することができるのではないか そこで本研究では,クローンを管理する基準として, クローンを編集した開発者に着目しました. 各開発者は,異なる役割や目的を持って開発します. また,各開発者の開発経験には差があります. これらのことから, 開発者によってクローンの編集内容に特徴が表れるのではないか と考えました. 例えば, 経験の浅い開発者によって編集されたクローンは保守性を悪化させる のではないかと考えました. そして, その特徴によってクローンを区別し,管理することができるのではないか 情報処理学会 第70回 全国大会 2008/3/13
本研究の目的 クローン管理に役立つ情報を提供する メトリクス値の変化を用いて,各開発者のクローンに対する編集傾向を調査する 編集傾向 : クローンを編集する時に現れる特徴 例 : 開発者Aはクローンを長くすることが多い そこで本研究では, クローン管理に役立つ情報を提供することを目的とします. そのために, 「クローンの性質を表す」メトリクス値の変化を用いて, 各開発者のクローンに対する編集傾向を調査しました. 編集傾向とは 開発者がクローンを編集する時に現れる特徴であり, 例としては, ある開発者がクローンを長くすることが多いことなどがあげられます. 情報処理学会 第70回 全国大会 2008/3/13
調査方法の概略 1 ソースコードの スナップショット の取得 2 クローン 検出 3 クローン対応関係 の抽出 4 メトリクス値の 版管理システム (ソフトウェアの 編集履歴を 格納するシステム) 2 クローン 検出 3 クローン対応関係 の抽出 次に、調査方法の概略について説明します. まず,ソフトウェアの編集履歴を格納している版管理システムから, 過去のいくつかの時点の ソースコードのスナップショットと, それらのソースコードを編集した 開発者の情報を取得し「ます」. 版管理システムについては後に詳しく説明します. 次に、各スナップショット中のクローンを検出し「ます」. 図のクローンの色は, それが存在するスナップショットによって 分けています. そして、クローン対応関係を抽出し「ます」. クローン対応関係についても後に詳しく説明します. さらに、クローン対応関係にあるクローン間の メトリクス値の変化を取得し, それを開発者ごとに集め「ます」. 最後に、 開発者間の差を検定し「ます」. 以降のスライドでは, 調査方法の詳細について説明します. 4 メトリクス値の 変化の取得 5 開発者間の差の検定 メトリクスα メトリクスβ A {+2, 0, …} {0, 0, …} B {0, -3, …} {+1, 0, …} α β A + B - 開発者 情報処理学会 第70回 全国大会 2008/3/13
1 : スナップショットの取得 版管理システムを用いる 各開発者がソースコードを編集した直後の時点のスナップショットを取得 ソフトウェアの編集履歴を格納するシステム 本研究において用いる情報 編集されたファイルの変更差分,編集した開発者,編集日時 各開発者がソースコードを編集した直後の時点のスナップショットを取得 まず版管理システムを用いて,スナップショットを取得します. 版管理システムとは,ソフトウェアの編集履歴を格納するシステムです. このシステムに格納されている情報のうち, 本研究ではファイルの変更差分,開発者,日時を用いました. そしてこれらの情報から, 各開発者がソースコードを編集した直後の時点の スナップショットを取得しました. スナップショットの取得方法を図を用いて説明します. 図の版管理システムには, 開発者A,B,Cが順にソースコードを編集したという情報が 格納されています. この情報を用いて, 各開発者が編集した直後のスナップショットを 取得しています. 開発者Aが編集 ↓ 開発者Bが編集 開発者Cが編集 版管理システム 開発者Aが 編集 開発者Bが 編集 開発者Cが 編集 情報処理学会 第70回 全国大会 2008/3/13
2 : クローンの検出 各スナップショットごとに,その中のクローンを検出 開発者Aが 編集 開発者Bが 編集 開発者Cが 編集 次に,各スナップショットごとに, その中のクローンを検出します. この検出方法を,図を用いて説明します. 図では,3つの時刻に取得したスナップショットがあります. スナップショットにはそれぞれソースファイルの集合があります. そして,それぞれのソースファイルの集合を対象として コードクローンを検出しています. 開発者Aが 編集 開発者Bが 編集 開発者Cが 編集 情報処理学会 第70回 全国大会 2008/3/13
3 : クローン対応関係の抽出 メトリクス値の変化を取得するために,連続するスナップショット間のクローン対応関係を抽出する クローン対応関係 : 連続する2つのスナップショット中の同じファイルの同じ位置にあるクローン間の関係[2] → 編集前のスナップショット中の各クローンが,編集後のスナップショット中のどのクローンと対応しているかを特定 クローン対応関係 クローン 対応関係 次に,メトリクス値の変化を取得するために, 連続するスナップショット間のクローン対応関係を抽出します. クローン対応関係とは, 2つのスナップショット中の 同じファイルの同じ位置にあるクローン間の関係です. この関係を用いれば, 開発者が編集する前のスナップショットにある各クローンが, 編集後のスナップショットにあるどのクローンと対応しているかを 調べることができます. クローン 対応関係 クローン 対応関係 開発者Aが 編集 開発者Bが 編集 開発者Cが 編集 [2]M. Kim and D. Notkin : “Using a clone genealogy extractor for understanding and supporting evolution of code clones”, Proceedings of the 2nd International Workshop on Mining Software Repositories, pp.17-21, 2005. 情報処理学会 第70回 全国大会 2008/3/13
4 : メトリクス値の変化の取得 クローンの様々なメトリクス値を計算する クローン対応関係にある2つのクローン間のメトリクス値の差を計算する クローンが存在するスナップショットを編集した開発者毎に,メトリクス値の変化を集める 開発者B 開発者C メトリクスα {+2, 0} {0, 0} メトリクスβ {0, -3} {+1, -4} 次に,メトリクス値の変化を取得します. この取得方法を,図を用いて説明します. 図では3つのスナップショットがあり, それぞれのスナップショット中のクローンを検出しています. これらのクローンに対し, まずは,様々なメトリクス値を計算します. 図では,アルファとベータというメトリクスを計算しています. 次に,クローン対応関係にある2つのクローン間の メトリクス値の差を計算します. 例えば,図の左上のクローン対応関係にある2つのクローン間では, アルファ,ベータの差はそれぞれ2,0となっています. 最後に, クローンが存在するスナップショットを編集した開発者毎に, メトリクス値の変化を集めます. 図のメトリクス値の変化を集めると,このような表になります. 表では,横軸に開発者,縦軸にメトリクスが並んでいます. そして表の要素には, 開発者によるメトリクス値の変化のリストが 記録されています. 図では,左上のメトリクス値の変化は, 開発者Bが編集した際に起こっているので, 表では開発者Bの列に記録されています. α : +2 β : 0 α : 0 β : +1 α : 0 β : -3 α : 0 β : -4 開発者Aが 編集 開発者Bが 編集 開発者Cが 編集 情報処理学会 第70回 全国大会 2008/3/13
5 : 開発者間の差の検定 各メトリクスに対し,各開発者が他の開発者とメトリクス値の変化に差があるかを検定 差があるメトリクス及び開発者ごとに,値の変化の分布を用いて,変化の傾向を分類 他の開発者が編集した時よりも 大きくなる傾向にある 小さくなる傾向にある 各メトリクス値の変化の傾向を用いて,各開発者の編集傾向を判断 最後に,開発者間の差を検定します. この検定により, 他の開発者と差がある開発者を特定できます. これらの開発者に対し, 各メトリクス値の変化の分布を用いて, 開発者ごとに 各メトリクス値の変化の傾向 を分類します. 分類する項目は, メトリクス値が大きくなる傾向にある, メトリクス値が小さくなる傾向にある, というものです. これらの各メトリクス値の変化の傾向を用いて, 各開発者の編集傾向を判断します. 情報処理学会 第70回 全国大会 2008/3/13
調査内容 1/2 実際のソフトウェア編集履歴に対して調査 調査対象 クローン検出:CCFinderX PostgreSQLの編集履歴 1997/01/01~1999/06/30を半年間ずつに分け,各期間中の編集履歴に対して調査 各期間は古い順に1から通し番号をつける クローン検出:CCFinderX 提案した調査方法を用いて, 実際のソフトウェア編集履歴に対して調査したので, その調査内容と結果について説明します. 調査対象は,PosgtgreSQLの編集履歴です. これを調査する際には, 97年の1月から99年の6月を半年間ずつに分け, 各期間中の編集履歴に対して調査しました. なお,各期間は古い方から順に番号をつけました. また,クローン検出には 「シーシーファインダーエックス」を用いました. 情報処理学会 第70回 全国大会 2008/3/13
調査内容 2/2 使用したメトリクス 複雑度メトリクス : 値が大きいほど複雑なクローンであることを表す 開発者の編集傾向 LEN : クローンの長さ(トークンの数) TKS : クローン中のトークンの種類数 LOOP : クローン中のループ文の数 COND : クローン中の条件分岐の数 McCabe : LOOP+COND 開発者の編集傾向 大きくなるメトリクスの方が多い → クローンを複雑にする 小さくなるメトリクスの方が多い → クローンを簡単にする 両者の個数が等しい → どちらともいえない そして使用したメトリクスは, これらの複雑度メトリクスです. 複雑度メトリクスとは, 値が大きいほど複雑なクローンであることを表す メトリクスです. これらのメトリクスのうち, 「レン」はクローンの長さ, 「ティーケーエス」はクローン中のトークンの種類数, 「ループ」はクローン中のループ文の数, 「コンド」はクローン中の条件分岐の数, 『マッケーブ』は「ループ」と「コンド」の和 を表します. そして,これらのメトリクス値の変化の傾向から判断される 開発者の編集傾向は,以下のようになっています. これらの複雑度メトリクスのうち, 大きくなるメトリクスの方が多ければ, その開発者はクローンを複雑にする傾向にある, 小さくなるメトリクスの方が多ければ, その開発者はクローンを簡単にする傾向にある, 両者の個数が等しければ, その開発者の傾向はどちらともいえない, と判断しました. 情報処理学会 第70回 全国大会 2008/3/13
開発に参加した開発者 1997/01/01~1999/06/30 に開発に参加した開発者は13名 クローンを編集した開発者は12名 期間 開発者数 クローンを編集した クローンを編集した開発者 1 6 5 D, G, I, J, K 2 4 D, G, I, J 3 7 D, G, H, I, J, L 8 A, D, E, G, H, I, J 10 A, B, C, D, E, F, G, H, I, J 次に,調査結果について説明します. まず,開発に参加した開発者について説明します. 調査した編集履歴で開発に参加していた開発者は13名で, そのうちクローンを編集した開発者は12名でした. 各期間に開発に参加していた開発者は 表のようになっています. 情報処理学会 第70回 全国大会 2008/3/13
検定結果 1/2 クローンを複雑にする開発者 : A, B クローンを簡単にする開発者 : C, D, E 開発者 A B C D E 期間 4 5 1 2 3 LEN + - TKS LOOP COND McCabe 開発者の編集傾向 次に,検定結果について説明します. まず,検定結果の表について説明します. 表の横軸には開発者が並んでおり, 開発者ごとに その開発者が開発に参加した期間を 分割しています. 一方,縦軸にはメトリクスが並んでいますが, 縦軸の最後には開発者の編集傾向があります. そして,表の要素のうち, メトリクスの行の要素には, その期間中に開発者が起こした メトリクス値の変化の傾向 が記録されています. 要素のうち, プラスはメトリクス値を大きくする傾向にある, マイナスはメトリクス値を小さくする傾向にある, 空欄は差があるとはいえない, となっています. また,開発者の編集傾向の行の要素には, その期間中の開発者の編集傾向が記録されています. +はクローンを複雑にする傾向がある, -はクローンを簡単にする傾向がある, 空欄はどちらともいえない としています. 次に,表から読み取れることについて説明します. まず,開発者A,B,Cは 全ての期間中で クローンを複雑にする傾向にあります. 一方,開発者D,E,Fは, 各期間の編集傾向は クローンを簡単にする傾向にあるか, どちらともいえないか, のどちらかとなっています. これらの事から、 開発者A,B,Cはクローンを複雑にする開発者, 開発者D,E,Fはクローンを簡単にする開発者 であるといえます. クローンを複雑にする開発者 : A, B クローンを簡単にする開発者 : C, D, E 情報処理学会 第70回 全国大会 2008/3/13
検定結果 2/2 期間によって傾向が変化する開発者 : F, G, H, I 明確な傾向が見つからなかった開発者 : J, K, L 開発者 1 2 3 4 5 LEN + - TKS LOOP COND McCabe 開発者の編集傾向 しかし, 開発者Gは, 期間3ではクローンを複雑にする傾向にありますが、 期間4ではクローンを簡単にする傾向にあります. また、開発者Hは 期間3,4ではクローンを複雑にする傾向にありますが、 期間5ではクローンを簡単にする傾向にあります。 一方、開発者Iは, 期間3,4ではクローンを簡単にする傾向にありますが, 期間5ではクローンを複雑にする傾向にあります. そして,開発者Jは, クローンを複雑にする傾向にある期間と クローンを簡単にする傾向にある期間が 交互にあります. このように,期間によって傾向が変化する開発者もいます. なお,残りの開発者は, 明確な傾向が見つかりませんでした. 期間によって傾向が変化する開発者 : F, G, H, I 明確な傾向が見つからなかった開発者 : J, K, L 情報処理学会 第70回 全国大会 2008/3/13
開発者によるクローン管理方法 1/2 開発者は目的を達成するために,前に編集した箇所やその付近を連続して編集する傾向がある 開発者A, Bが編集したクローンは,その後複雑になる可能性が高い → 複雑度が低くても,除去した方が良い 開発者C, D, Eが編集したクローンは,その後簡単になる可能性が高い → 複雑度が高くても,除去を急ぐ必要はない 次に,検定結果から考えられる, 開発者によるクローン管理方法について説明します. 開発者は目的を達成するために, 前に編集した箇所やその付近を連続して編集する傾向があるといえます. このことから, 開発者A,B,Cが編集したクローンは, その後複雑になる可能性が高いと考えられるので, 「調べた時点の」複雑度が低くても除去した方が良いと考えられます. 一方,開発者D,E,Fが編集したクローンは, その後簡単になる可能性が高いと考えられるので, 「調べた時点の」複雑度が高くても, 除去を急ぐ必要はないと考えられます. 情報処理学会 第70回 全国大会 2008/3/13
開発者によるクローン管理方法 2/2 期間によって傾向が変化することもあるので,調査を続けて傾向を確認する 明確な傾向が見つからなかった開発者は調査を続ける → 傾向が見つかればクローン管理に利用する ただし,期間によって開発者の傾向が変化することもあるので, 調査を続けて傾向を確認する必要があります. また,差があるとはいえない開発者は調査を続け, 差が見られればクローン管理に利用することが考えられます. 情報処理学会 第70回 全国大会 2008/3/13
まとめと今後の課題 クローンのメトリクス値と開発者の相関を調査 今後の課題 メトリクス値の変化は開発者毎に差があった 一定の傾向でメトリクス値を変化させ続ける開発者がいた 今後の課題 他のメトリクス値と開発者の相関の調査 開発者以外の要因(モジュール等)の影響の除外 クローンのメトリクス値の変化予測 本研究では,クローンのメトリクス値と 開発者の相関を調査しました. その結果,メトリクス値の変化は開発者毎に差があり, その開発者の中には 一定の傾向でメトリクス値を変化させ続ける開発者がいました. 今後の課題としては, 他のメトリクス値と開発者の相関の調査や, モジュール等の開発者以外の要因の影響の除外, クローンのメトリクス値の変化予測 が挙げられます. 以上で発表を終わります. 情報処理学会 第70回 全国大会 2008/3/13