コードの安定性を測定するためのソースコードメトリック?


17

リリースサイクル(実装、テスト、バグ修正、リリース)でソフトウェアがどのように開発されるかを考えると、コードベースで変更されるコードの行に何らかのパターンが見えるはずだと考えていました。たとえば、プロジェクトの終わりに向かって、コードがより安定した場合、単位時間あたりに変更されるコードの行が少なくなることがわかります。

たとえば、プロジェクトの最初の6か月の平均は1日あたり200行のコードでしたが、先月は1日あたり50行のコードであり、先週(製品DVDの直前)出荷された)、コードの行はまったく変更されていません(コードのフリーズ)。これは単なる例であり、特定のチームが採用した開発プロセスに応じてさまざまなパターンが出現する可能性があります。

とにかく、単位時間あたりのコードの修正行数を使用してコードベースの安定性を測定するコードメトリック(それらに関する文献はありますか)はありますか?プロジェクトがどこかで手に入れようとしている場合や、リリースの準備がまだ整っていない場合に、感覚をつかむのに役立ちますか?バージョン管理システムからこの情報を抽出し、統計を生成できるツールはありますか?



4
「第二に、メカニズムは抽象的であり、その制作はその設計に含まれています。この点で、プログラムは詩のようなものです。 「プログラマーの生産性」を「生成されるコード行数」の観点から見ます。そうすることで、彼らはその番号を台帳の間違った側に予約します。- 誤解の果実、エドガー・W・ダイクストラ。
ヤンニス

3
@Yannis Rizos:LOCで生産性やコードの複雑さを測定することを提案することは決してありません。これは良い測定ではないことがわかっているからです。一方、出荷の2日前に300行のコードが変更された場合、マネージャーとして私は大きな「赤い警告」ランプを思い浮かべます(これが計画されており、リスクを非常に慎重に評価した結果でない限り) )。一般的に、長い間変更されずに使用(およびテスト)されたコードは、毎日100行が変更されるコードよりも「安定している」と思います。
ジョルジオ

2
@Giorgio Argh、私は別のコメントを投稿している間に中断されました(ここの平日の真ん中)(最初のコメントではchar制限に達しました)。あなたが生産性について話していることを意味するのではなく、ダイクストラの引用が思い浮かび、私はそれが面白いと思いました。いずれにせよ、コードチャーンメトリックは探しているものに非常に近いものであり、それらに関する膨大な文献があります。ツールについては、アトラシアンのFishEyeは素晴らしいです。
ヤンニス

@Yannis Rizos:それは実に興味深い読み物です。FishEyeについては、職場で(レビュー用に)使用するため、すぐにマニュアルを調べて、どのような統計を作成できるかを確認します。
ジョルジオ

回答:


17

マイケル・フェザーズが説明した1つの尺度は、「アクティブなクラスのセット」です。

彼は追加されたクラスの数をそれらの「クローズ」に対して測定します。クラスクロージャを次のように説明します。

クラスは、その日付から現在までの間にそれ以上の変更が発生しない日付で閉じられます。

彼はこれらのメジャーを使用して、次のようなチャートを作成します。 アクティブクラスチャート

2本の線の間隔が小さいほど良い。

コードベースに同様の尺度を適用できる場合があります。クラスの数は、コードの行数と相関している可能性があります。これを拡張して、クラスメジャーごとにコード行を組み込むこともできます。大きなモノリシッククラスがある場合は、グラフの形状が変わる可能性があります。


4

機能のクラスへの比較的一貫したマッピングがある場合、またはファイルシステムに関しては、バージョン管理システムにgourceのようなものをフックし、開発の大部分が焦点を当てている場所を非常に迅速に把握できます(それによりコードのどの部分が最も不安定です)。

これは、比較的きちんとしたコードベースがあることを前提としています。コードベースが泥だらけの場合、本質的に相互依存関係のために作業中の小さな部分がすべて表示されます。そうは言っても、それ自体(機能の作業中のクラスタリング)がコードベースの品質をよく示している可能性があります。

また、ビジネスチームと開発チーム全体が、開発中の機能を分離する何らかの方法を持っていることを前提としています(バージョン管理の分岐、一度に1つの機能など)。たとえば、同じブランチで3つの主要な機能を使用している場合、コードの安定性よりも大きな問題があるため、この方法では意味のない結果が生成されます。

残念ながら、私は自分の主張を証明するための文献を持っていません。それは、良い(そしてあまり良くない)コードベースでgourceを使用した私の経験にのみ基づいています。

gitまたはsvnを使用していて、バージョンが0.39以上の場合、プロジェクトフォルダーでgourceを実行するのと同じくらい簡単です。


gourceも素晴らしいツールのようです!(+1)
ジョルジオ

1
私はこの答えに出くわし、その後6時間Gourceで遊んだ。それが+1に値するか-1に値するかはわかりませんが、いまいましい、それは1つのクールなツールです。
RonU

@RonU:gourceを使用して、カスタムの時間範囲でリポジトリの状態を視覚化できます。そのポイントは、コードベースのアクティビティを経時的に視覚化することです。上記の回答で説明したように、情報の解釈の容易さは多くの要因に依存します。はい、「全体像」が必要な場合は素晴らしいツールです。したがって、+ 1に値すると思います;)
カール

はい、「6時間」と言ったとき、その時間に1つのGourceシムを実行したわけではありませんでした。ただ、たくさんのオプションで遊んだり、ffmpegにパイプしたり、おそらく壮大なサウンドトラックを追加したりしました。うさぎの穴でした。:)
RonU

レム推測。サウンドトラックはループハーレムシャッフル;)
カール

0

変更された行の頻度をコードの安定性の指標として使用することには、少なくとも疑問があります。

最初に、変更されたラインの経時的な分布は、プロジェクトのソフトウェア管理モデルに大きく依存します。さまざまな管理モデルには大きな違いがあります。

第二に、この仮定の犠牲者は明確ではありません-ソフトウェアの安定性によって引き起こされた変更された行の数が少ないか、単に期限が切れて開発者が現在いくつかの変更を行わず、リリース?

3番目に、新しい機能が導入されると、ほとんどの行が変更されます。しかし、この新機能はコードを安定させません。開発者のスキルと設計の品質に依存します。一方、深刻なバグでさえ、ほとんど行を変更せずに修正される可能性があります-この場合、ソフトウェアの安定性は大幅に向上しますが、変更された行数はそれほど大きくありません。


「開発者のスキルと設計の品質に依存します。」:ただし、バグを導入していないことを十分に確信できるように、少なくとも変更をテストする時間が必要です。最も熟練した開発者でさえ、入力ミスをすることができます。例えば、彼らがプレッシャーにさらされている、残業が多すぎる、睡眠が少なすぎるなどです。また、オープン/クローズの原則を適用すると、しばらくすると変更(バグ修正)の数が減るはずです。とにかく、このような測定の結果は開発プロセスに応じて変化する可能性があることを私の質問で明示的に述べました。
ジョルジオ

ところで、コードが不安定になるのは、開発者が悪いからではなく、要件が明確ではなく、プロジェクトがまだ試作段階にあるためです。
ジョルジオ

@ジョルジオ:もちろんあなたは正しいです。しかし、これはまさに私が書いたものです。変更された行の数は、非常に多くの要因に大きく依存します。それらの一部はコードの安定性に関連し、一部はそうではありません。これは、仮定によって、電力を測定して、セックスをしている人の数を計算しようとするようなものです。出生率は大きな停電の後に上昇していることが証明されていますが。;)
johnfound

-1

ロバストネスとは、命令セットの正しい機能に関連する用語であり、それらの命令を表現するために使用されるテキストの量、冗長性、簡潔さ、文法の正確さではありません。

確かに構文は重要であり、正しい必要がありますが、それを超えるものは、指示の「メトリック」を見て指示の目的の機能に関係しているため、あなたはティーカップ。

堅牢性はテストによって測定されます。単体テスト、煙テスト、自動回帰テスト。テスト、テスト、テスト!

あなたの質問に対する私の答えは、あなたが堅牢性の答えを求める際に間違ったアプローチを使用しているということです。コードの行は、コードを占める行以外のものを意味するのは赤いニシンです。コードは、必要なことを実行していることをテストする場合に、コードが実行したいことを実行するかどうかを知ることができます。

適切なテストハーネスを再確認し、コードメトリックの神秘主義を避けてください。

ご多幸を祈る。


3
コードの複雑さの尺度としてLoCを提案していないことを明示的に述べました。私は、コードの安定性の尺度としてコードの変更を提案していました。コードには安定した機能要件があり、それらの要件を満たす安定したテスト済みの実装がありますか?
ジョルジオ

私はあなたと議論したくありませんが、コードメトリックの無意味さの愚かさから敬意をもってあなたを導きます。私はあなたの質問を読み直し、あなたの例はすべて、変更されるコード行とその結果の堅牢性との関係を推測したいという希望を示しています。入力する単語が多いほど、タイプミスをする可能性が高くなります。しかし、私は彼の原則に反し、このようにあなたの探求を放棄することを強く支持しなければなりません。適切なテスト方法=堅牢性の可能性が高い。
Sassafras_wot

「優れたテスト手法=堅牢性の可能性が高い。」:私は完全に同意します。そのため、最近変更されたコードは、正しいと確信する前に再度テストする必要があることを提案しています。
ジョルジオ

安定性にはいくつかの定義があり、それらの1つはあなたが主張していることです。これは、私が作成したものとは異なる意味解釈です。私はそれが「変化に対する耐性」ではなく「極端にない被写体が変わる」であることを意味する安定を取った
デイブ・ヒリアー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.