「ソフトウェア開発・保守の支援」に関する私の研究のご紹介

私はソフトウェア設計学研究室の助教の崔恩瀞(チェ ウンジョン)です.私はソフトウェア設計学研究室で「ソフトウェア開発・保守の支援」に関する研究に取り組んでいます.私がこの「ソフトウェア開発・保守の支援」を自分の研究テーマとして選択した理由は,自分のIT会社で仕事をした経験からです.私は一度,韓国の大学を卒業した後にIT会社でソフトウェア開発者として仕事をしていました.ソフトウェアの開発や保守の仕事は楽しかった反面,仕事で様々な問題で苦労もありました.そして,その苦労を解決する技術に関して研究したいと思い,大学院に進学しました.

「ソフトウェア開発・保守の支援」のための研究では,私は主に,ソフトウェアメトリクスおよびソースコードの静的解析情報に基づいて「コードクローン」や「リファクタリング」の検出および管理に関する研究に取り組んでいます.

「コードクローン」とはソースコード中に存在する一致または類似したコード片であり,コピーアンドペーストなどのさまざまな理由により生成されます.ソースコードの中に修正されるコード片のコードクローンが存在すれば,その全てのコードクローンに対して修正の是非を検討する必要があり,一般的にコードクローンの存在が保守作業を困難にさせると言われています.下の図はapache ant 1.6.3から検出されたコードクローンの例です.互いにコードクローンになってるコード片に色がつけられています.

codeclone

「リファクタリング」は外部から見た時の振る舞いを保ちつつ,ソフトウェアの保守性や理解性を向上させるために,ソフトウェアの内部構造を整理することです.現在まで,多くのリファクタリングパターンが提案されており,Fowler氏は著書「リファクタリング―既存のコードを安全に改善する―」の中で各リファクタリングパターンが実施されるべき状況や手順などをまとめました.
今回は現在,私の指導しているNAISTの学生が取り組んでいる「リファクタリング」に関する研究と私の学生時代に行った「コードクローン」に関してそれぞれ紹介します.


「プロセスメトリクスを用いたメソッド抽出事例の特徴調査」関する研究
メソッド抽出」リファクタリングとは,既存のメソッドの一部を新規メソッドとして抽出することです.長すぎるメソッドや,複数の機能が実装されたメソッドを「メソッド抽出」リファクタリングによって適切に分割することで,ソースコードの可読性や保守性を向上させることが出来ます.

「メソッド抽出」は頻繁に実施されるリファクタリングの一つです.多くの支援ツールや技術が提案されてきましたが,一般には広く使われてないません.多く使用される支援ツールを開発するために,この研究では開発者が過去に実施した「メソッド抽出」事例を調査しました.特に,この研究ではソースコードの品質に影響を与えることが知られている開発プロセスの情報を新しく用いることにより,プロダクトメトリクスを用いて調査した従来の研究と異なり、新しい発見ができると思います.

この研究では,javaで開発されたテキストエディタであるJEditのリポジトリを7,707個のリビジョンから選択し,メソッド抽出リファクタリングの対象になっていたメソッド・クラスと対象になってなかったメメソッド・クラスの以下のプロセスメトリクス値を計測しました.

図5

また,メソッド抽出対象メソッド・クラスと対象ではないメソッド・クラスの間で,各プロセスメトリクスに有意差があるか確認するため,マンホイットニーのU検定を実施しました.以下の表は,各プロセスメトリクスの中央値,検定の結果得られたp値を表しています.

図7

これらの結果より,今回対象としたソフトウェアにおいては,メソッド抽出の対象となるメソッドが属するクラスは,対象ではないメソッドが属するクラスと比べ,変更回数が多く,また,関わった開発者も多いということが判明しました.特に,クラスの変更回数は,抽出の対象となるメソッドと対象ではないメソッドの間で顕著な差が確認できました.本研究はソフトウェアエンジニアリングシンポジウム2016で発表しました.興味のある人はこの論文を参考にしてください.


「ソースファイルの前処理によるクローン検出手法の提案と評価」に関する研究
近年,大規模ソフトウェアの開発が進んでいますが,大規模のソースコードからコードクローンを検出するためには膨大な時間がかかります.同一ファイル群を検出することにより,クローン検出時間を減らすために,ソースコードの前処理によるコードクローン検出をする手法を提案しました.提案手法は、以下の3つのパイプラインフェーズで構成されています.

  1. 前処理:入力ソースコードに異なる正規化(空白の除外,識別子の正規化等)を適用し, MD5ハッシュ値に変換します.また,そのハッシュ値に基づいて同値類(同一ファイル群)に分割し,次にコーパス(同値類の代表であるファイルのセット)を生成します.
  2. クローン検出:コードクローン検出ツールCCFinderを使用してコーパス上のコードクローンを検出します.
  3. 後処理:CCFinderの出力,同値類などの情報に基づいてマッピングし,すべてのクローンセットを生成します.

評価実験では,3つのオープンソースソフトウェアに対して,提案手法とCCFinderのみを使ってコードクローンを検出する方法を適用しました.その結果,CCFinderのみを使ってコードクローンを検出する方法より提案手法の方が約2倍早く検出できることがわかりました.また,提案手法の中では,入力ファイルに何の正規化を適用せずに,完全一致ファイルに基づいてコードクローンを検出する手法が,より早くコードクローンを検出できることが分かりました.

ここで,私の研究に関して紹介しました.私の研究の詳細は、私のウェブサイトをご覧ください.