2009-04-03 7 views
7

現代のソース管理システムでは、プログラムの履歴をスライスしてサイコロにすることができます。静的および動的にコードを分析するための多くのツールがあります。どのような数式を使用すれば、ファイル内のアクティビティ量とそのソフトウェアの展開数を統合できますか?プログラムがすべての単体テストを完了したとしても、アップグレード時に期待する以上の作業が必要であることがわかりました。このタイプの措置は可能なはずですが、座っていてもユニットを考えていると私は困惑しています。bitrotの寸法はどれですか?

更新:テストマシンに何かが送信されたら、それほど腐っていないことがわかります。何かがすべてのテストボックスに送られたら、それは新鮮なマーカーを得ることができました。何かが生産に行くなら、私はそれにうなずき、bitrotの得点を減らすことができます。ファイル内にたくさんのアクティビティがあり、どこからでも送信されることはありません。コードに焦点を当てないで、私が必要とするデータがすべて手元にあると仮定します。

どのような種類のコミット分析(コミットコメント(下記参照)またはコミット間の時間)は適用する公正なデータですか?

更新:私は次元分析はたぶん年齢に基づいている可能性があると思います。それに比べると少し難しいです。古いコードは腐っています。コードの各行の平均年齢は、単に時間の尺度に過ぎません。より大きいソースモジュールは、より小さく複雑なものより速く腐っていますか?

更新コードカバレッジは行単位で測定されます。定義されたコードは、しばしば実行されなかったコードよりも腐敗しにくいものでなければなりません。 bitrotを正確に測定するには、カバレッジ解析がダンパーとして機能する必要があります。

答えて

1

明白な答えはいいえです。 BItrotには受け入れられる寸法がありません。

0

全コード行に対する単体テスト数の反比例?

+0

時間はどこかにあるはずだと思います。 – ojblass

0

ハミングまたはワグナー距離のような違いを編集するには、2つの方法が考えられます。情報理論的エントロピーなどがある。

+0

すべてのユニットは「距離」でキャンセルする傾向がありますか? – ojblass

2

私はチャーリーに同意しません。ソースコードを少しリファクタリングすると、Hamming distancesという非常に大きなサイズになる可能性があり、コードが論理的にどの程度修正されたかについての良い尺度は提供されません。

コミットコメントの長さを検討することを検討します。与えられたプログラマーにとって、比較的長いコミットコメントは、通常、コードに大きな変更を加えたことを示します。

+0

コミットコメントは、インシデント番号などの習慣にも影響されます。質問に少し詳しく情報を追加するよう促しました。 – ojblass

4

非常に興味深い思考の列車!

まず、bitrotですか? WikipediaのSoftware Rot記事は、いくつかのポイントを収集します。

  • 環境の変化:ランタイムの変化
  • 未使用コード:使用パターンの変化が
  • ほとんど更新しないコード:メンテナンスを通じて変更
  • リファクタリング: bitrotを茎にする方法

Moore's Law,delta(CPU)/delta(t)は、18〜24ヶ月ごとに定数2です。環境にはCPU以上のものが含まれているので、これは実際の環境の変化に対して非常に弱い下限しか形成しないと考えています。単位:OPS/$/sの、時間をかけて第二ドルあたりのオペレーション毎の変化

delta(users)/delta(t)は定量化することは困難ですが、ニュースの単語「知識の時代」の出現頻度の証拠は、I」ユーザーの期待が指数関数的に増加すると言います。 $/flopsの発展を見ると、供給が需要よりも急速に増えていることがわかり、ムーアの法則がユーザーの変化の上限として与えられています。要件の尺度としてfunction points(「情報システムがユーザーに提供するビジネス機能の量」)を使用します。 単位:FP /秒、時間をかけて必要なファンクションポイントの変化

delta(maintenance)/delta(t)は、組織に完全に依存しており、迅速な修正を押し通し、大きな変更を統合する場合されている場合、リリース直前に、通常は非常に高いです。 SLOC,Cyclomatic Complexityなどのさまざまな対策の変更や、時間の経過とともに実装された機能ポイントをスタンドとして使用できます。利用可能であれば、発券システムにバグチャーンが発生する可能性もあります。時間をかけて実装されたファンクションポイントにとどまります。時間が新しい機能を実装しないを過ごしたよう単位= FP /秒、時間をかけて実装ファンクションポイントの変化

delta(refactoring)/delta(t)を測定することができます。 ユニット= 1、

時間にわたる時間費やしリファクタリングそこでOPS/$/s * FP/s * FP/s = (OPS*FP²)/($*s³)の組み合わせ単位で

   d(env)  d(users)  d(maint)  d(t) 
bitrot(t) = -------- * ---------- * ---------- * ---------------- 
       d(t)  d(t)  d(t)  d(refactoring) 

      d(env) * d(users) * d(maint) 
      = ------------------------------ 
       d(t)² * d(refactoring) 

をbitrotをあろう。

これはもちろん、Wikipediaの記事で既に述べたように、ビットロットはユーザー環境の変化、ユーザーの要求の変化、コードの変更から生じるもので、支出によって軽減されますリファクタリングの時間。すべての組織は、それらの変化をどのように測定するかを自分自身で決める必要があります。私は非常に一般的な範囲を与えます。

+0

どのような意味で遅すぎますか?家に帰る...私はこのことを私に熱心だからしばらく開いておくつもりだ。私はあなたに素晴らしい週末があることを願っています。 – ojblass

+0

私はクラックパイプを外に出して、最終的な公式を解読するのには役に立たなかった... – ojblass

+0

"あまりにも遅い":終わった午前1時だった。私はもう一度フィットするように、最後にもう少しメモを追加します。 –

2

最も簡単な回答はどうですか。ファイルを長期間(生産またはテストマシンのいずれか)が配備されていない場合

foreach (file in source control){ 
    file.RotLevel = (Time.Now - file.LastTestedOrDeployed) 
} 

、それは「現実」と同期していないかもしれません。環境が変更されている可能性があり、ファイルが変更されていなくても機能しなくなる可能性があります。だから私はシンプルで正確な式になっているようです。なぜそれをもっと複雑にするのですか?変化の数を含めると、不確実性だけが加わるようです。最近ファイルが変更された場合、環境の変化(「腐敗度が低い」)を反映するように更新されたか、または新しい機能が追加された(エラーのリスクが高まり、より腐った ")?ファイルの変更は何かを意味する可能性があります。

「私が最後にファイルを処理したことが確認されてから、どれくらいの期間が経過したか」という唯一の曖昧な要素は考えられますか?

+0

しかし、腐敗=今夜私は眠りを良くするつもりはない。たぶんあなたは死んでも死ぬだろう...最後のチェックからの時間/コード行。時間が無限に近づくにつれて腐っています。しかし、コードの行が大きくなるにつれて、それはより腐ったものになります... blech ... – ojblass

+0

その数量の両方に比例するようになっています。たぶん分*行数。 0行=ゼロの腐敗。 0時間= 0腐敗。それは始まりです。今、各モジュール内のアクティビティから情報を追加する方法はありますか? – ojblass

+0

私は活動が良い措置だとは思わない。私が言ったように、それは多かれ少なかれ腐敗を意味することができます。 (メンテナンスは良いか、それとも新しい機能で、悪い(腐敗の観点から)か)。私は同意するが、コードの量はおそらく同様に考慮する必要があります – jalf

0

本当にこれを掘り下げることに興味がある場合は、そこにいくつかの研究があります。私は少し前にOrganizational Structure on Software Qualityの効果を調べた記事から概念を探していました。私は私の頭の後ろにアイデアを書いてしまったが、あなたはそれが啓発されているかもしれない。

0

私たちは動作するコードは気にしないので、ファイルに加えられた変更の数を見てみましょう(変更の大きさではなく、ファイルの変更頻度と修正されたバグの数それらの変更に加えてファイルに対して記録された未処理のバグの数を加えたものです。結果は、ファイルがより腐ったほど大きくなる数値でなければなりません。

大きなファイルを修正しないで頻繁に変更するファイル(configなど)は、式のバグ部分が低くなるため表示されません。開いているバグの多いファイルは、変更が頻繁に新しいバグにつながるファイルとして表示されます。 * bugfixesの変更は、古いホットスポットを気にしないので、時間の経過とともに腐敗するはずです。

+0

数字と...どのような寸法? – ojblass

+0

私たちは何かを物理的に話しているわけではないので、数字はPIに次元がないのと同じように「次元」を持つ必要はありません。また、「最近のファイルの変更件数」にはどのような次元がありますか? –

+0

ファイルへの最近の変更の数に変更の次元があります。 4が変化する。それはユニットです。 – ojblass

1

私はEvidence Based Schedulingを思い出しています。ビットロット(実際の価値と特定の変更によってどれくらい減少したか)を示す合理的な指標のセットを用意してください。その後、後で費やした時間に基づいてそれらの正確さを判断します。これのための数とルールを考えるのはおそらく複雑です。

+0

これは私が今まで読んだことのない最高級のトピック記事の1つでした。 – ojblass

0

コードカバレッジと単体テストでの私の唯一の問題は、単体テストはテスト用に設計されたものだけをテストすることであり、定義上、コードであり、正規のコードを悩ます同じ機能的ソフトウェア腐敗になりやすいことです。 (それらは書かれているものにのみ有効で、しばらくしてからは十分ではありません)

高品質の単体テストは明らかに保護を提供します。

したがって、これらは、ソフトウェアの腐敗のための私の重要な要素である:データ/エラー処理の

  1. 外部データインターフェースポイントの数(extDataIntfPts)
    • 品質、ユニットテスト(codeQuality)
    • 依存OS/VMなどの基盤となる実装について説明します。 (osDep)
    • プラグインなどの外部実装インタフェースポイントの数。 (extIntfPts)
    • コードのコード/シンプルボリューム(linesOfCode)

の複雑系は、それが収集したデータセットが大きくなるにつれて、それがデータ入力のより多様に露出され、生産に住んでいるよう。この定義によって、コードベースが多数のエッジケースとシーケンスに公開されます。

これは、データ処理、エラー処理、単体テストの品質によって軽減できます。

システムが動作する環境の移動ターゲットもあります。これを緩和する方法の1つは、アプリケーションをVMに入れることです。

システムがプラグインを実装している場合、より多くのプラグインが開発されるにつれ、コードベースの障害が発生する可能性が高くなります。

複雑なコード!=エレガントなコード。それがエレガントなら、それはおそらく単純です。ここでは、コードの数が多いほど、テストがうまくいく可能性は低いが、それを回すことができると考えている。codeQualityはおそらくユニットテストのコードカバレッジが何であるかのメトリックを伴うだろう判断

bitrot=((linesofcode/codeQuality)*(extDataInfPts+(osDep/change)+extIntfPts)*numberOfSecondsDeployed) 

だから、ここに私の方程式です。潜在的なバグを突き止めるために静的な解析プログラムを実行することができ、おそらく助けになるでしょう。つまり、ある時点では、マルチスレッドコードはPOJOよりも重く重み付けする必要があるため、スコアリングは実際には困難です。そして、はい、リファクタリングは考えられるべきですが、ソフトウェアの腐敗の証拠があるところだけです。

最後に、それは疑似科学です。ここに私の擬似科学への貢献があります。

0

実際のbitrot(ソフトウェアの腐敗ではない)は、物理的な記憶容量*時間の次元を持っています。

Bitrotは、記憶媒体中の不純物の放射性崩壊によって引き起こされる。

+0

私はあなたが時間が掛けなければならない何か腐った何かを決定するためにビット/秒を意味すると思います。私はこれを数日間夢見ていたが、今はもっと良い。 – ojblass

関連する問題