バグのホットスポットファイルを見つける簡易ワンライナーコマンド

バグのホットスポットファイルを見つける簡易ワンライナーコマンド

パレートの法則(80:20 の法則)とは、全体の数値の大部分は、全体を構成するうちの一部の要素が生み出しているという経験則に基づく考え方です。

たとえば、売上の 80% は、全商品のうちの 20% の商品が生み出している、というようなことです。

ソフトウェアに当てはめると、ソフトウェアのバグの 80% は、全体のコードのうちの 20% のコードが原因で生み出している、と考えることができます。

この 20% のコードを「ホットスポット」と呼びます。

ではどのようなコードがホットスポットになりやすいか。

本来はもう少し複雑な計算を伴うものですが、ざっくりとは「変更頻度が高く、行数が多い」ファイルがホットスポットである可能性が高いと考えられています。

ということで、ホットスポットを簡易的に見つけるためのワンライナーコマンドを紹介します(いうほどワンライナーではないですが)。

FILE_COUNT=10
LINE_THRESHOLD=100

git log --name-only --pretty=format: \
| sed '/^$/d' \
| sort \
| uniq -c \
| sort -nr \
| while read -r count file; do
    [ -f "$file" ] || continue
    lines=$(wc -l < "$file")
    [ "$lines" -ge "$LINE_THRESHOLD" ] || continue
    printf "%6d changes  %8d lines  %s\n" "$count" "$lines" "$file"
  done \
| head -"$FILE_COUNT"

このコマンドは、以下の処理を行っています。

  • Git 履歴に登場したファイルを変更回数順に並べ
  • 現在存在しないファイルは除外し
  • 現在 <LINE_THRESHOLD> 行以上あるファイルだけを抽出し
  • その中から変更回数の上位 <FILE_COUNT> 件を表示する

結果として出力されたファイルはホットスポットの候補だということです。

ホットスポットのコードに変更を加えるときには最新の注意を払い、いつも以上に時間をかけてレビューすること。そして可能であればリファクタリングをしてファイルを分割することが定石です。