2025年10月4日
今週の活動¶
開発者の経験を表す変更メトリクス¶
- 先行研究で検討されたメトリクス
- EXP: 特定のシステム全体におけるコードベースに対する変更回数の合計
- SEXP: 特定のシステムにおけるサブシステム全体のコードベースに対する変更回数の合計
- REXP: 変更回数の合計を変更の時間間隔で重み付けしたもので、最近の変更ほど重みが大きい
- 先行研究で検討されたメトリクスの問題点
- 作業量のみを考慮しており、作業の質(理解度)を考慮していない
- 複雑な設計を少数実装した開発者よりも、単純な修正を大量に行った開発者の方が経験を高く評価される
- 変更回数の重み付けをする際に、コードベースに対する変更規模を考慮するのはどうか?
- 「大きさ(Size)」カテゴリーの変更メトリクスを用いて以下のように重みを定義
- 追加率 = 追加行数 / 変更前の総行数
- ただし、変更前の総行数が0のときは、追加率 = 1
- 削除率 = 削除行数 / 変更前の総行数
- 獲得経験値 = 1 + 追加率 + 削除率
- 開発者の経験値 = Σ 獲得経験値
先行研究の経験値メトリクスとの比較¶
| 項目 | 先行研究 | 提案手法 |
|---|---|---|
| 評価観点 | 変更回数 | 変更回数 + 変更規模 |
| 変更回数 | 高く評価 | ある程度評価 |
| 変更規模 | 低く評価 | ある程度評価 |
| コードベースへの理解度 | 反映されない | 反映される |
小規模な変更¶
- 追加: 10行
- 削除: 5行
- 変更前: 1000行
- 追加率 = 10/1000 = 0.010
- 削除率 = 5/1000 = 0.005
- 獲得経験値 = 1 + 0.010 + 0.005 = 1.015
大規模な変更¶
- 追加: 500行
- 削除: 400行
- 変更前: 1000行
- 追加率 = 500/1000 = 0.500
- 削除率 = 400/1000 = 0.400
- 獲得経験値 = 1 + 0.500 + 0.400 = 1.900
完全な書き換え¶
- 追加: 1000行
- 削除: 1000行
- 変更前: 1000行
- 追加率 = 1000/1000 = 1.000
- 削除率 = 1000/1000 = 1.000
- 獲得経験値 = 1 + 1.000 + 1.000 = 3.000
大規模ファイルに対する小さな変更¶
- 追加: 100行
- 削除: 50行
- 変更前: 10000行
- 追加率 = 100/10000 = 0.01
- 削除率 = 50/10000 = 0.005
- 獲得経験値 = 1 + 0.01 + 0.005 = 1.015
ケーススタディのためのプロジェクトの再選定¶
- 有意性検定で帰無仮説が棄却されない(優位差が見つからない)問題を避けるため、データセットのレコード数が大きいプロジェクトを優先的に採用
- データセットを構築する際にSZZアルゴリズムを用いているため、解決済みのバグレポートの数とデータセットのレコード数の大きさは相関関係にあり、その値からデータセットの相対的な大きさを推測できる
| プロジェクト | 解決済みのバグレポートの数 |
|---|---|
| Elasticsearch | 4,287 |
| Hazelcast | 3,762 |
| Netty | 2,207 |
| OrientDB | 1,272 |
| Neo4j | 1,152 |
| Eclipse plugin for Ceylon | 841 |
| Broadleaf Commerce | 675 |
| mcMMO | 656 |
| MapDB | 228 |
| ANTLR v4 | 156 |
| Titan | 127 |
| jUnit | 84 |
| Android Universal Image Loader | 75 |
| Oryx | 65 |
| Mission Control Technologies | 37 |
得られた成果¶
- 新たな経験値メトリクスを定義
- 解決済みのバグレポートの数に基づいたプロジェクトの選定基準を定義
来週の計画¶
- 変更メトリクスを収集するプログラムの作成と実行
- バグ予測精度が改善されるかどうか検証