ソースコードの有用なメトリックとは何ですか?[閉まっている]


33

ソースコードをキャプチャするのに役立つメトリックは何ですか?

たとえば(実行可能?)コード行循環的複雑性などのメトリックは、品質保証にどのように役立ちますか、またはソフトウェア開発プロセスに一般的にどのように有益ですか?


37
有効な測定値はWTF /秒のみです。:)
ターミナル


回答:


30

「コードの行でソフトウェアの生産性を測定することは、飛行機の重さで進捗状況を測定するようなものです。」-ビル・ゲイツ


3
非回答を更新しないでください。
エリックウィルソン

3
面白い逸話ですが、この答えはこの質問の答えにほとんど寄与しません。
クリスナイト

7
@Chris多くの開発者がソフトウェアメトリックは役に立たないと考えているため、この回答には多くの賛成票(またはFarmBoyが呼びたいように「更新」)が寄せられました。質問に対してより良い回答があると思うか、そう思わない場合は、自分の答えを投稿してください。ここで行ったようなコメントは、生産的ではありません。あなたは自分で何も貢献していません。
chrisaycock

7
私のダウン票とコメントは、深さを欠いてOPの質問に直接対処しない答えを思いとどまらせることを目的としています。これは、ソフトウェアメトリックスがソフトウェア開発と品質保証に関して役に立たないと考え、なぜLOCだけではないことに焦点を当てるのかをさらに詳しく説明した場合、はるかに良い答えになる可能性があります。
クリスナイト

ソフトウェアメトリックは、適切に使用すれば実際に非常に役立ちます。つまり、LoCが多ければ多いほど->バグが多ければ多いほど->品質は低下します。品質の尺度としてそれが失敗するのを見たことがありません。そして、飛行機は同じ速度で同じ旅行をするが、はるかに少ない重量で済むなら、決定的に優れています。ビル・ゲイツは、飛行機についてはあまり知らなかったし、ソフトウェアについても十分に知らなかったようだ。
パブロアリエル

12

このテーマに関するジェフの投稿をご覧ください。

メトリクスメイドからの訪問

ソフトウェア工学:死んだ?

ソフトウェアメトリックスと密接に関連するJoelからの古くても良い投稿もあります。その読み物を強くお勧めします 。TheEcon 101 Management Method

私にとって重要な点は、ジェフを引用して、これです: 「メトリックの責任ある使用は、そもそもそれらを収集することと同じくらい重要です。」


ジェフのワンライナーを引用して+1。そこにある、純粋な、戦いで固められた知恵
luis.espinal

11

コードメトリックスについて私を混乱させるのは、それ以上行われていないということです。ほとんどの企業は、従業員、サプライヤー、システムの効率性について報告していますが、誰もコードについて報告したくないようです。コードの行数を増やすことは不利ですが、あなたのコードが何をするかがより重要であると述べる答えには間違いなく同意します。

コードの行: 「前述したように、これは重要な測定であり、各レベルで最も真剣に取られるべきです。関数、クラス、ファイル、およびインターフェイスは、保守が難しく、長期的にコストがかかるすべてを実行するコードを示すことができます。コードの合計行数とシステムの動作を比較するのは無限に困難です。それは多くのことを行うものである可能性があり、その場合、多くのコード行があります!

複雑さ: この測定は、作業していないコードベースで行うのに適しています。また、問題のある領域の適切な指標を提供できます。有用な逸話として、私は自分のコードベースの1つで複雑さを測定しました。最も複雑な領域は、変更する必要があるときに最も時間を費やしていた領域です。複雑さの軽減に取り組んだ結果、メンテナンス時間が大幅に短縮されました。管理者がこれらの測定値を手元に持っている場合、システムの特定の領域のリファクタリングの反復または再設計を計画できます。

コードの複製: これは、私にとっては非常に重要な測定です。コードの複製は非常に悪い兆候であり、システムの設計の低レベルでの深刻な問題、またはコピーペーストである開発者のいずれかを指し、長期的に大きな問題を引き起こし、システムを維持できません。

依存関係グラフ 悪い依存関係と循環依存関係を見つけることは、コードの重要な測定です。これはほとんどの場合、修正が必要な誤った高レベルの設計を指します。誰かが電子メールライブラリ内でaddNumberを使用して財務計算を行っているため、1つの依存関係が不必要な他の依存関係を吸い込む場合があります。電子メールライブラリが変更され、財務が中断されると、誰もがショックを受けます。すべてが1つのものに依存している場合は、保守が難しく設計が不十分なあらゆるライブラリを指すこともあります。

適切な測定では、システムのすべての機能のフットプリントが小さいことが常にわかります。依存関係、複雑さ、重複の減少。これは、疎結合と高い凝集力を示しています。


8

この「ソースコードメトリック」は決して死ぬことはありませんか?

ソースコード行(SLOC)は、最も古く、最も簡単で、最も基本的なメトリックです。

Halsteadは元々、一連のメトリックを提案していました。スポイルスポーツが明らかな研究を行い、ハルステッドの各メトリックがSLOCと強く直接相関していることを実証するまで、多くの人々が測定プログラムを書くのをたくさん楽しんでいた。

SLOCは常に測定しやすいため、その時点でHalsteadのメトリックは破棄されました。


1
研究へのリンクはありますか?
ジョンホプキンス

Googleはあなたの友人ですが、ここから始めましょう。 ecs.csun.edu/~rlingard/comp589/HoffmanArticle.pdf
ジョンR.ストローム

6
興味深い研究ですが、彼らの研究では、一般に50〜100行のコードのみを調査しました。このように明確に定義された小さな問題を解決すれば、最終結果はそれほど驚くことではないように思えます。
クリスナイト

現実の世界では、これらの研究はすべて泥に変わっていると思います。
ウォーレンP

これは本当です。コードの行が多いほど、品質は最高になります。
パブロアリエル

8

品質保証のソースコードメトリックは、2つの目的を目指しています。

  • 内部にバグの少ないコードを書く
  • メンテナンスが簡単なコードを書く

両方とも、可能な限り単純なコードの記述につながります。これの意味は:

  • 短いコード単位(関数、メソッド)
  • 各ユニットのいくつかの要素(引数、ローカル変数、ステートメント、パス)
  • その他の多かれ少なかれ複雑な基準(Wikipediaのソフトウェアメトリックを参照)。

7

私の知る限り、発見されたバグの数は、コード行(おそらく解約)、モジュロ言語、プログラマー、およびドメインと直接相関しています。

バグと相関関係のある他の簡単で実用的なメトリックは知りません。

私がやりたいことの1つは、現在行っているさまざまなプロジェクトの数値の実行を開始することです。テストカバレッジ:: kLOCで、「知覚品質」について話し合い、相関関係があるかどうかを確認します。


1
それで、より多くのコードがそこにあるより多くのバグがありますか?

3
@Thor:lうんうん。ショッカー、ハァッ?
ポールネイサン

私が覚えている限りでは、一般的な業界の数字は平均的なプロジェクトのコード1000行あたり約2〜3エラーであり、原子力プラント制御ソフトウェアまたはNASAプロジェクトのコード1000行あたり0.5エラーのようなものです。 、制御、テスト、レビューなど。障害は非常に深刻な結果になる可能性があるためです。これをサポートする数字に言及している人はいますか?
hlovdal

2
@hlovdal:KSLOCあたり2〜3個のエラーはすでに非常に低い数字です。航空宇宙およびセキュリティドメインで私が知っている最も低い数字は、KSLOCあたり0.1エラー程度です。典型的な数値は、KSLOCあたり20〜50のエラーのようです。参考として、Google for Andy Germanの「ソフトウェアの静的コード分析-教訓」というタイトルの論文。
シュドラー

1
私はこれらの数字に異議を唱えます-それは完全に言語、コンパイラ、実行可能環境に依存します。JavaScriptコードのタイプミスは見つけるのに何年もかかることがありますが、コンパイルされた言語のタイプミスは最初のコンパイルで見つかります。
JBRウィルキンソン

7

メトリックは、得られた回答をどう処理するかを知っている場合にのみ役立ちます。本質的に、ソフトウェアメトリックは温度計のようなものです。あなたは何を知っているまで、あなたは98.6°Fで何かを測定するという事実はありません平均何もしない、通常の温度です。上記の温度は体温には良いが、アイスクリームには本当に悪い。

役立つ可能性のある一般的なメトリックは次のとおりです。

  • 発見されたバグ/週
  • 解決されたバグ/週
  • #要件の定義/リリース
  • #要件の実装/リリース

最初の2つは、傾向を測定します。バグを修正するよりも早く見つけていますか?考えられる2つの結果:バグを修正するためにさらにリソースが必要な場合と、追いつくまで新しい機能の実装を停止する必要がある場合があります。2番目の2つは、あなたがどれだけ近くにいるのかを示しています。アジャイルチームはそれを「バーンダウン」チャートと呼びます。

循環的な複雑さは興味深い指標です。基本概念では、関数/メソッド内の一意の実行パスの数です。単体テストの重い環境では、これはすべての実行パスを検証するために必要なテストの数に対応します。それでも、Cyclomatic Complexityが96のメソッドを持っているからといって、必ずしもバグのあるコードであるとは限りません。または、妥当な信頼性を提供するために96個のテストを記述する必要があります。生成されたコードが(WPFまたはパーサージェネレーターを介して)この複雑なものを作成することは珍しくありません。メソッドのデバッグに必要な作業レベルの大まかなアイデアを提供できます。

ボトムライン

行うすべての測定には、以下を定義する必要があります。定義しないと、役に立ちません。

  • 「正常」とは何かの理解。これは、プロジェクトの存続期間中に調整できます。
  • 何らかのアクションを実行する必要がある「通常」以外のしきい値。
  • しきい値を超えたときにコードを処理するための計画。

取得するメトリックは、プロジェクトごとに大きく異なる場合があります。プロジェクト全体で使用するいくつかのメトリックがありますが、「通常」の定義は異なります。たとえば、1つのプロジェクトが1週間に平均5個のバグを発見し、新しいプロジェクトが1週間に10個のバグを発見している場合、必ずしも何かがおかしいとは限りません。今回はテストチームがより細心の注意を払っているのかもしれません。また、「通常」の定義はプロジェクトの存続期間中に変更される場合があります。

メトリックは単なる温度計であり、それをどうするかはあなた次第です。


これに関連する別のバグは、場合によってはコードの行ごとのバグです。一般に、成熟したコードベースでは、まだ開発中のアプリケーションとは対照的に、コードの行あたりのバグの数がかなり少ないはずです。
rjzii

@Rob Zは、どんなメトリックでも、そのメトリックを最適化するのに十分なことをします。コードの行ごとのバグでは、バグのないLOCの数を増やすためだけに増加する未使用の変数を開発者に導入することがあります(SLOCカウンターは複数のセミコロンを検出できるため)。もちろん、これはまた、人為的にコードの量を増やします。
ベリンロリチュ

6

ソースコードは資産であり、負債ではありません。それを念頭に置いて、コードの行を測定することは、家を建てるときに費やしたお金を追跡することに似ています。予算を抑えたい場合は、それを行う必要がありますが、1日あたり$ 50を使うよりも1日あたり$ 1000を使う方が良いとは限りません。そのお金のためにどれだけの家が建てられたかを知りたいでしょう。ソフトウェアプロジェクトのコード行でも同じです。

要するに、ソースコード自体を測定することは役に立たないため、ソースコードに役立つメトリックはありません。


4

ソースコードは、シーケンス、選択、繰り返しの単なる組み合わせであるためです。合理的に生産できると予想できる最適なソフトウェアについて説明すると、次のようになります。ジョブを実行するのに必要な最小限のコード行を使用して、ほぼ100%のコードカバレッジをテストし、しかも変更に耐えるのに十分な柔軟性を備えたソフトウェア。


2
100%のカバレッジは、すべての行だけでなく、すべてのパスをカバーする場合にのみ100%です。現実的なソフトウェアでは、100%のパスカバレッジを設定するのは悪い目標です。到達するのに非常にコストがかかり、コードが設計どおりに動作することだけを伝え、設計自体が健全だとは言えないからです。セキュリティホールが大きく開いている可能性があり、100%のパスカバレッジがあります。
ジョーリSebrechts

+1より多くのソースコードが必ずしも優れているとは限りません。
ラリーコールマン

非常に単純なアプリケーションのみが100%のテストカバレッジに対応します(カバレッジを冗長にします)。複雑なソフトウェアのテストカバレッジを100%達成するのは(実行不可能ではないにしても)計算コストがかかります。私たちはその事実を今から60年ほど前から確固たる根拠で知っています。第二に、テストはバグを発見していないことを伝えるだけです-構造上の品質、サイズ、複雑さ(かなり長い間知られていること)以外のバグがないことを保証するものではありません。ソフトウェアの物理学者は熱力学の法則を知らないのと同じです。
-luis.espinal

@ luis.espinalテストするには計算量が多すぎるほど大きなソフトウェアは、非常に貧弱に作成されたソフトウェアです。動作するソフトウェアの作り方についての手がかりがほとんどない。
パブロアリエル

@PabloAriel-「ソフトウェアが非常に大きいため、テストするには計算コストがかかりすぎる」<<これは私が言ったことではない。コメントを(おそらく2、3回)読んで、あなたが読んでいると思うものを実際に読んでいることを確認してください。
luis.espinal

4

KLOCカウントがパフォーマンスを測定するのに役に立たない(そして有害でさえある)理由を示す逸話。

数年前、私はチームと個人のパフォーマンスの唯一の尺度としてKLOCカウントを使用する大規模プロジェクト(当社の70人以上、顧客の30人以上)に取り組みました。

Y2Kの取り組みのために(どれくらい前にそれがあったかをお伝えします:))、チームが担当したコードのセクションの大規模なクリーンアップを行いました。最終的には、約30.000行のコードを作成するリリースになりましたが、5人で3か月の苦労はありません。また、さらに70.000行のコードを廃棄することになりました。これは、特に新しいコードと組み合わせて、3か月間の作業で非常に良い仕事でした。

四半期の最終結果:-40.000行のコード。四半期後のパフォーマンスレビュー中に、四半期ごとに2万行のコードを生成するという生産性要件を満たしていないことについて会社から公式のre責を受けました(結局、ツールは、40.000行のコードを生成したことを示していました)プロジェクトマネージャーとQAチームが介入してre責を覆し、称賛に取って代わられなかった場合、プロモーション、トレーニング、昇給などのために私たち全員が成果の低いものとしてリストされ、バイパスされていました。

数か月後(そのようなことには時間がかかります)、会社は生産性の基準を見直していて、機能ポイント分析に基づいて新しいシステムを作成するために専門家チームを雇ったと言われました。


なぜ差分を表示しなかったのですか?!
reinierpost

それが行われたと思います。しかし、システムが非常に硬直している場合、そのような露骨に誤ったデータポイントが表示されても警告音を鳴らすことすらできません。
11

2
あなたの答えは、KLOCが役に立たないということではなく、それらを使用しない方法を示しています。
ニールN

2
生産性の尺度としてそれらに依存することは近視眼的であり、唯一の尺度としてそれらに依存することはばかげていることを示しています。KLOCを生産性と品質の尺度として使用する他のプロジェクトでは、行の負荷を引き起こすコーディング標準を作成することで、簡単に数値を増やしました(C ++のブレースプラクティス、どこでも短いコメントだけで余分な空の行、ifステートメントの条件を分割3行など)。
jwenting

1
SLOCを生産性の指標として使用するのは馬鹿げているだけで、おそらく良い結果をもたらさないでしょう。保守性と欠陥の数を示す品質指標としてSLOCを使用することは、より正気です。この質問ですべての警告がすでに議論されています。
-redcalx

2

ユニットテストのステートメント/意思決定カバレッジ(ユニットテストで実行されたコードの割合)に誰も言及していないことにまだ驚いています。

コードカバレッジは、アプリケーションの何パーセントが破局的に失敗しないかを知っているので便利です。残りの有用性は、単体テストの品質に依存します。


コードカバレッジも誤ったメトリックです(何らかの用途はありますが)。より高いカバレッジを得るためだけに、ナンセンスなテストを書くことを勧めます。そしてもちろん、決してカバーされないものがあり、人々はそのようなものを書くことを避け始めます。たとえば、JavaDocをコードとしてフラグ付けするコードカバレッジツールを見たことがありますが、もちろんカバーされません。別のツールは、すべての空行にテストでカバーされていないというフラグを立てました。コード内のコメントや空白をなくすことは、一部のセッターの単体テストを逃すよりも悪いことに同意するでしょうか?
11

確かに、不良な単体テストは、多くの点で役立つよりも大きな被害をもたらします。たとえば、単一のアサートを持たないテストスイートに対して100%のコードカバレッジを取得できます。
StuperUser

1

通常、コミットが小さいほど良いです。これはSCMツールに関するものであり、コード自体ではありませんが、非常に測定可能なメトリックです。コミットが小さいほど、各変更をアトミック単位として見やすくなります。特定の変更を元に戻し、問題が発生したときに特定するのが簡単です。

コミットがビルドを中断しない限り...


1

これらは、進行状況の点で非常に有用な絶対メトリックではありませんが、コードの状態の一般的なアイデアを提供するために使用できます。

特にCyclomatic Complexityは、特定のコードベースがどの程度モジュール化されているかを視覚化するのに役立つことがわかりました。これは、モジュールごとのソースの数が少なく、多くのモジュールが存在することを意味するため、通常は複雑さを低くしたいでしょう。


1

私は頻繁に巨大なC ++パッケージで作業しますが、Cyclomatic Complexityや恐ろしいFanIn / FanOutをリファクタリングする価値のある問題のあるコードを探す場合、通常は非常に良いレッドフラグを探します。そこで問題を修正すると、通常、コードベース全体が改善されます。

もちろん、これらの数字は、見る価値があるもののヒントとしてのみ使用できます。ビルドを失敗させるか、コミットを拒否するために、これをある程度厳しいしきい値にすることはばかげているでしょう。


1

私の仕事には、コードメトリックを使用する多くの状況があります。

コードを書いている間

私の毎日の仕事で最も大きく、おそらく最も重要な使用法はCheckstyleです。これは、Java開発者向けのツールです。これは、定義済みのルールセットに対してコードのメトリック(特に)を継続的にチェックし、コードがそうでない場所にフラグを立てますそれらのルールを順守します。コードを開発するときに、メソッドが長くなり、複雑になり、結合された場合、リアルタイムで通知され、後戻りしてより良いものにリファクタリングすることを考えることができます。

開発者はすべての状況に適用されることはないため、すべてのルールを完全に破ることができます。「ルール」は、思考を刺激し、「これがこれを行う最善の方法ですか?」と言うためにあります。

QA /コードレビュー中

コードレビューを実行するときに最初に行うことは、通常、レビュー対象のコードのコードカバレッジを、カバーされているコード行を強調表示するコードカバレッジツールと共に確認することです。これにより、テストコードがどの程度徹底しているかについての一般的な考えが得られます。重要なコードが十分にテストされている限り、カバレッジが20%か100%かはあまり気にしません。したがって、カバーされている割合はいくぶん無意味ですが、0%は確かに親指を痛めたように際立っています。

また、チームによって合意されたメトリックが「壊れている」場合、それが問題ないことを開発者に同意するかどうか、または改善方法を提案できるかどうかを確認します。新しいコードを記述するためにこれらの開発指標をチームで合意することで、コードの改善に大きな道が開かれました。私たちはモノリシックな方法をはるかに少なく記述し、単一の責任原則ではるかに優れています。

レガシーコードのトレンド改善改善したいレガシーコード がたくさんあります。どの時点でもメトリックは役に立たないが、私たちにとって重要なのは、時間の経過とともにコードカバレッジが上昇し、複雑さや結合などが低下することです。したがって、メトリックは継続的インテグレーションサーバーにプラグインされるため、時間をかけて適切な方向に進むことができます。

新しいコードベースを 理解するソースコードメトリックの行を使用するのは、よく知らないコードベースを見るときだけです。これにより、私が作業した他のプロジェクトと比較して、プロジェクトの大まかなサイズをすばやく測定できます。他のメトリックを使用して、プロジェクトの品質についてさらに大まかなアイデアを得ることができます。

重要なことは、トレンド、ディスカッション、または今後の方法の出発点としてメトリックを使用し、正確に数値を管理しないことです。しかし、適切に使用すれば、適切なコードの改善に役立つと強く信じています。


0

Q:ソースコードをキャプチャするのに役立つメトリックスは何ですか?

ビジネス用:

A:工数

コーダーのスーパーバイザーの場合:

A:関係ありません。今日は何でもしましょう

コーダーの自尊心の場合:

A:SLOCの数(コードのソース行)

コーダーの母親の場合:

A:これらの柔らかいフレンチロールをもっと食べて、お茶を飲む

以下のコメントに続きました...


-1

要確認:すべてのコードは、少なくとも1命令削減できます。すべてのコードには少なくとも1つのバグがあります。したがって、すべてのコードを、機能しない単一の命令に減らすことができます。お役に立てば幸いです!


そして副作用が少ない。

または、それができます:en.wikipedia.org/wiki/Sorites_paradox
StuperUser
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.