プログラミンググーグルはコードの品質向上のため「バグ予測アルゴリズム」を採用している2011年12月16日グーグルでは、社内のプログラマによって作り出される大量のコードの品質を保つため、チェックイン前にユニットテストとコードレビューが行われているそうです。コードが大量になってくると、ユニットテストやレビューをすり抜けるバグも少なからず発生します。そこでコードの品質をさらに高めるために、グーグルでは「バグ予測アルゴリズム」を採用。バグがありそうな部分をレビュアーにアドバイスする仕組みを採用したとのこと。そのバグ予測アルゴリズムとはどんなものなのか。Google」(グーグルにおけるバグ予測)で説明されています。ソースコードの修正履歴を基に予測コードの中にバグがありそうな箇所を分析する手法としては、「ソフトウェアメトリクス」がよく用いられます。これはコードを静的に分析して、モジュールや関数の行数、ネストの深さ、モジュール間の依存関係が多いか少ないか、といったことを数字に置き換え、そのスコアを見てバグが起きやすい箇所を推測する方法です。ソフトウェアメトリクスのためのツールは、さまざまなベンダから市販されています。グーグルが用いたのはもっとシンプルな方法でした。ソースコードの修正履歴を基にバグ予測をすることにしたのです。Google.そう、私たちはコードのどこが修正を必要とされてきたかという、本物の記録を持っています。それはバグトラッカーとソース管理のコミットログです。FixCacheなどの研究によると、ソースコードの履歴を元にしたバグ予測は非常にうまく働きます。そこでこれをグーグルで運用することにしました。それは、過去にそのコードがバグフィックスのため、いつ、何回修正されたか、という情報を基にした実にシンプルなアルゴリズムです。it.彼らが発見したのは、そのコードに対してこれまでバグフィックスのコミットが何回行われたかをランキングすることで、コードの中のホットスポットを見つけられるだろう、というものです。これは私たちの直感、もしも何度もバグフィックスが必要なファイルはデベロッパーが苦労しているところだからホットスポットに違いない、というものにマッチするのです。試行錯誤の結果、グーグルは以下の式を導き出しました。前述のブログから引用します。右辺の分数が分かりにくいので、以下に書き直しておきます。1/(1+exp(-12×ti+12))nは、コードに対してバグフィックスが行われた回数を示します。tiは修正が行われた時点のタイムスタンプで、コードが生成されたときを0、現在を1と置いて、その間の少数値をとります。12月1日にコードを書き始め、今日が12月30日であるとすると、15日にバグフィクスをしたらti=0.5になります。右辺のtiをxと置いてグラフを描くと以下のようになります。最近のタイムスタンプほど急激に値が大きくなります。このグラフも前述のブログから引用します。右辺には合計を表すΣがありますので、複数回バグを修正したのなら、その修正ごとにタイムスタンプの値をtiに入れて計算し、それを全部合計したのがスコアとなります。高頻度にバグを修正し、かつ最近になって集中的に直しているほど、スコアが大きくなります。スコアが大きいほど、相対的に見てそのコードにはバグがある可能性が高い、というのがこのアルゴリズムが示すところです。Zimmermann氏の研究を紹介したことがあります。このときのパラメータは、以下の4つでした。関係者のまとまりここでもやはり変更の回数が含まれており、バグを発見するのに重要なパラメータであるということが示されています。したソフトウェアメトリクスなどをコードの品質向上を活用している現場というのは、あまり多くないようです(解析ツールも比較的高価なものが多いからかもしれませんが)。プログラマが自分の技術を駆使して品質向上をはかるのは自然なこと。この機会にソフトウェアメトリクス(あるいはソースコード解析など)が注目され、デベロッパーの生産性向上につながるといいのですが。追記:Googleはこのアルゴリズムを実装したツールをオープンソースで公開しました。チームの方がソフトウェアの品質は高い」実証的ソフトウェア工学の研究会が開催[ディスカッション]ソフトウェアインスペクション/コードレビューを成功させる方法(前編)[ディスカッション]ソフトウェアインスペクション/コードレビューを成功させる方法(後編)クラウド時代のソフトウェア品質管理。Payments」が国内でもスタート。Niino(jniino)IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。2.7サポートを発表Google、Lookerの買収完了を発表。Enterprise、BtoBスタートアップ向け支援プログラムで無料提供と発表。usPublickeyについて/運営者についてお問い合わせ広告についてプライバシーポリシ。