Andrew Hayによるブログ投稿 では、次の公理が示されました。
プロジェクトの最初の段階で同じバグを修正するよりも、プロジェクトの最後にバグを修正する方が大幅にコストがかかります。
ただし、これは、特に Less Wrongに関するブログ投稿 を読んだ後は確実ではないようであり、それをバックアップするために見たデータは非常に古いものです。
これは今日でも公理は正しいですか?
私が今まで見た唯一のハードデータは BoehmとPapaccio、ソフトウェアコストの理解と制御 です。
これは1988年にさかのぼり、約80のソフトウェアプロジェクトの研究でした。彼らは、早期に決定され、遅く修正された決定は、それが早期に修正された場合に比べて50〜200倍の費用がかかる可能性があると結論付けました。しかし、彼らが話している非常に初期の決定の種類は、実行するOSと使用する言語とデータベースです。
そのため、これらの数値は、今日のソフトウェア開発に関して過大なものになる可能性があります。しかし、現在、私たちはこの分野で多くの経験を積んでおり、それがある程度まで当てはまることを本能的に知っています。
極端な場合、本番環境に移行する直前に要件の失敗が検出されると、多くの再作業が発生し、プロジェクトが遅延またはキャンセルされます。作業が完了する前にそれが検出された場合、大丈夫だろう。
編集:ドクターブラウンは彼のコメントで良い点を作ります。
Boehmの研究は、コンパイルおよび実行時間が途方もなく遅い時代にCOBOLおよびFORTRANプロジェクトで行われました。私はCOBOLで90年代初頭にキャリアを開始しましたが、コンパイルとテストサイクルには非常に長い時間がかかったため、サイクルを通過する前に(または念のために少なくともビルドフェーズ中に)コードをドライテストするのは価値がありました。何かをキャッチして早期にキャンセルし、1時間ほど節約できます)。
一方、私たちの上司は、手作業で選別されたパンチカードの箱をサーバールームに運んで1日そこに置いておかなければならなかったのはそれほど前ではなかったため、私たちの苦情を笑っていました。
そのため、現在よりも確かにmoretrueでした。
それでも、ごく最近では、そのグラフが実際にはハードナンバーに基づいているかのように、ブログがこの問題を再利用していることを目にしています Steve McConnellによるこの問題の視覚化 ( ref 、1996年)。そうではありません。彼のポイントを簡単に説明するための視覚化です。
OPが引用した記事でモレンディルの前提は良いものだと思います。このテーマに関して私たちが持っている科学は貧弱で時代遅れですが、それでもキヤノンとして扱われます。しかし、私はまた、少なくともある程度までは、それがまだ真実であることを苦い経験から知っているので、それはうまくいき、真実に聞こえると思います。そして私は彼の劇的な「病気のしつけ」の言い回しは彼に好意を与えないと思います。
この主張を裏付ける確かなデータやその他の証拠は知りませんが、最低限なら、それは常識だと思います。
このように考えてください。相互依存のサブシステムを備えた複雑なシステムがある場合(ほとんどの重要なアプリケーションと同様)、いずれかのシステムに加えられた変更の結果である可能性のあるノックオンの問題について考えてください。サブシステムが(単体テストなどを介して)正しいことが証明され、早期に修正された場合、ノックオンaloneによって引き起こされるバグの数は、早期に修正するだけで軽減されます。
また、早期にバグを修正する場合でも、実装は開発者の心に残っています。特定のプロジェクトの長さに応じて、最後にバグを修正する場合、開発者は自分が書いたものと(おそらく)コードが依存するサブシステムがどのように機能するかを理解するのに時間を費やす必要があります。これを再学習するのに費やした時間= $。
これを科学的に厳密に測定する方法を考え出すことはまったく不可能だと思います。関係する要因が他にも多すぎるため、ケーススタディ以上に役立つほど比較可能なプロジェクトは2つありません。論理的思考はあなたに長い道のりを与えるはずです。いくつかの引数:
これは、システムエンジニアリングから受け入れられた基本的なものであり、あらゆる形式の技術開発(橋、ミサイル、戦艦、ソフトウェアの構築など)に適用されます。
基本的に、開発の段階を進むにつれて、物事のコストはおよそ1桁上がります。
アイデアを思いついた時点で修正に10ドルかかるもの...
仕様を更新する必要がある場合、約100ドルかかります。
または、何かが実装されていて、その時点で変更を加える(そして仕様を更新し、承認を得るなど)必要があるが、何らかの正式な承認/売却テストを実施していなかった場合、約1000ドルかかる
または、何かが実装されて顧客が承認し、その時点で変更を加える必要がある場合(そして仕様を更新して承認を取得し、顧客の承認と資格を再テストして再実行する場合など)は、約$ 10000かかります。
また、導入/展開/サービス開始後のコストはさらに高くなります。
例はたくさんあり、それらを理解するのは簡単です。25,000人の従業員がそれを使用した後に重大なスコープ変更を行った銀行システムは、再トレーニング時間にパケットを要します...スコーピング、コーディング、テスト、回帰を考慮する前に、などなど.
明らかに、走行距離は異なります。FredNurkeの電子靴下を暖める電子商取引Webサイトの変更のコストと影響は、航空機の飛行制御コンピューターのソフトウェアを変更するコストとは多少異なります。
ハードデータや事実にアクセスできないので、過去20年間のITで収集された事例観察のみを提供できます。
今日のほとんどの開発者がソフトウェアを作成する方法には、20年前と比べて大きな違いがあると思います。特に過去5〜6年間でアジャイル運動が勢いを増しているので、職場での態度に実際の変化が見られました。私たちが行うことの質は、毎年、プロジェクトごとに学んだ教訓を適用するたびに、プロジェクトごとに飛躍的に高まっているようです。無駄のないプロセスとテストファースト開発に焦点を合わせることは、非常に物議を醸すものから一般的なものへと成長しました。今日の多くの企業に足を踏み入れるほどに、アジャイルに慣れていないのであれば、彼らがあなたにドアを見せなくても幸運です。
これはどのような影響を与えましたか。まず第一に、私は問題がずっと早く特定されることが多いことに気づきました。多くの場合、問題があまり大きくないように見えても、無期限に保留されることがあります。まれに少数のケースで、些細なことだと考えられていたバグが、後で対処するときに深刻な問題になることを確認しました。当時考慮されていなかった根本的な問題が明らかになったためです。これは、場合によっては修正サイクルの引き延ばしにつながる可能性があり、ある程度のコストがかかる可能性がありますが、そのコストは、多くの場合、リソースの観点からはあまり測定されず、顧客と開発者の関係への影響の観点から測定されます。顧客はこのアジャイルの考え方に慣れてきています。これは、非常に反復的な開発スプリントと要求と実装間の迅速なターンアラウンドにより、結果を以前よりもはるかに速く顧客に返すため、非常に多くの期待が寄せられるようになりました。 。また、実際のバグに関する限り、変更をサポートするための強固な一連のテストと、洞察と解決策を提供する新しいテストを作成する機能により、バグを修正する時間が大幅に短縮されることがよくあります。報告された問題に。
したがって、全体として、堅牢な一連のテストが実施されている場合、ほとんどの場合、バグを修正するための全体的な労力は削減されているように見えます。いくつかの点で、焦点は純粋な需給から関係管理へと移行したため、少なくとも一部は、実装からビジネスの他の領域にシフトしました。
もう1つ明らかになっているのは、アジャイルになることでメンテナンスサイクルが短縮されることを示唆する数年前の直感は、ある程度は正しいことも間違っていることも証明されていることです。確かなテストにより、コードのデバッグと修正が大幅に容易になり、製品コードにリリースされるバグの数を全体的に減らすことができたという意味で、現在では、必要になるのを避けるためにより懸命に取り組んでいるという意味で間違っています。常にコードをリファクタリングし、アーキテクチャを改善することにより、レガシーコードを維持します。これにより、新製品を完全にゼロから開発する必要がほとんどなくなります。
つまり、結局のところ、これはOPの質問に関して何を意味するのでしょうか。まあ、それは答えが本当に私たちがかつてそうであったと思ったかもしれないほどカットアンドドライではないことを意味します。 15年前は、おそらくこの質問にはいと答えていただろうが、今、経験的に測定するのは非常に難しいと言う方が現実的だと思う。ソフトウェアは、私たちが最初にOPの質問を始めたときから大きく変化しました。ある意味では、業界としての技術とスキルを進歩させるほど、問題は決定的な「はい」から、数年後には問題ではないと私が疑うところまで、さらに大きくなりますテストとプロセスが非常に堅牢になるため、バグを修正すると、バグ修正のタイミングは予算を節約するための努力ではなく、顧客のニーズを満たすための優先順位によって決定され、相対的なコストは実質的に意味のないコンテキストになります。
しかし、私が言うように、これはデータに裏付けされた確固たる証拠ではなく、過去数年間の私の観察であり、私たちのやり方は、私たちが物事を行う方法を改善するより多くの揺るぎない知恵が来ると私に告げています。
Pentium BugのコストをIntelに尋ねてください。Ariane5 Rocketも良い例です。これらのバグは、プロジェクトの最後に修正されました。私は、ソフトウェアリリースの「試行」が6桁の予算を持つシステムで作業しました。これらの極端なケースでは、コストを確認するのは簡単です。他の(ほとんど?)場合、コストはノイズによって隠されますが、それはまだそこにあります。
バグが存在している間、バグに費用がかかることは間違いありません。 1つの項目、欠陥レポートは、コンパイル、トリアージ、およびdupとしてのクローズに時間がかかります。時間はお金です。したがって、未解決のバグは継続的なコストを生み出します。したがって、バグ修正を延期することは、より早く修正するよりもコストがかかることになります。
バグが実際に発生した場合、コストは段階的に跳ね上がります。「プロジェクトの終わり」はソフトウェアのリリース前またはリリース後ですか?
私はかつて2つの興味深い点がある記事を読んだことがあります(残念ながら、私が持っていた参考文献はもうなくなっているので、ここで仮定する必要があります)。彼らが行った最初のポイントは、すべてのエラーの約50%が要件仕様で導入され、すべてのエラーの約90%がUATまたはシステムテスト中に見つかったということでした。
2番目のポイントは、Vモデルの各フェーズでコストが10倍に増加したことです。要素が正しいかどうかは関係ありませんが、最もコストのかかるエラーは、設計が誤った仮定に基づいている場合です。これは大量のリライティングにつながります。その仮定のために機能するが、正しい仮定を適用すると失敗するすべてのコードを書き直す必要があります。
要件の仕様に1つの誤った仮定があるため、ドメインモデル全体を書き換える必要があることを経験しました。このようなバグが早期に発見された場合、つまり、要件の仕様を確認すると、コストは非常に低くなります。この特定のケースでは、10行のテキストが必要になります。 UAT中に見つかった場合(これはそうでした)のコストは高額です(この例では、プロジェクトのコストは50%増加しました)。
統計データはありませんが、個人的な経験:
私が取り組んでいたロケットモーター制御コードには、powerCutoff = someCondition && debugOptions.cutoffIsAllowed;
のような行がありました。デフォルトのオプションでは、カットオフは許可されていませんでした。 「最終」ビルドはすべてのデバッグオプションを削除することになっていたため、行はpowerCutoff = someCondition;
に変更されました。
コードレビュー中にバグをキャッチしましたか?私たちはしませんでした。テストでトリガー条件が初めて発生して予期しないカットオフが発生したのは、最初の飛行のわずか数か月前でした。
このバグは、レビュー中に発見された場合、1時間未満で済みます。統合中に捕捉された場合、1〜2日かかる可能性があり、1回のテストが繰り返されます。正式な予選で発見された場合、新しいビルドで一連の完全なテストを再開するため、1〜2週間かかる可能性があります。
当然のことながら、コストは気が遠くなりました。最初に、フライトユニットが条件をトリガーできるかどうかを判断するためのテストを設計および実行しました。現実的な可能性があると判断された後、最良の修正のエンジニアリング、管理、顧客分析、新しいビルドのリリース、新しい回帰テスト計画の作成と実行、複数のユニットでのシステムテスト、およびシミュレーターにコストがかかりました。全体として、数万とは言わないまでも数千の工数がかかります。さらに、最初の15分で実際に適切なコードを変更します。
初期のバグはシステムの他の部分に伝播するため、バグを修正すると、バグ自体に依存していたシステムの一部を書き直す必要が生じる場合があります。
加えて、時間の経過とともに、プログラムの一部がどのように構築されているかがわからなくなり、自分自身に気付かせる必要があります。これはある種の技術的負債です(プロジェクトを早い段階で急いだ場合、行ったショートカットが原因でプロジェクトを完了するのに問題が発生します)。
それはそれと同じくらい簡単で、証明するものは何もありません。
私はあなたが従業員にいくつかの実用的な解決策を提示するためにプロジェクトをできるだけ早く急ぐことを試みていると思います。良いニュースはあなたがそれを非常に速く得るということです、悪いニュースはおそらくクラップをできるだけ速く書き続け、数ヶ月ですべてを修正することを計画している場合、完全な書き直しなしではそれを終えることはないでしょう。これをリファクタリングすることさえできないでしょう。
ええと、私はあなたが求めている決定的な証拠をあなたに与えることはできませんが、私の仕事からのかなり最近の事件を関連付けることができます。
製品にワークフロー管理機能を提供する機能を追加しました。典型的なBDUFのもの、クライアントがサインオフして承認した仕様。仕様に合わせて実装。導入に関する初日からの苦情。
私たちはクライアントとの実際のユーザビリティウォークスルーを行っていませんでした、彼らが望むもののために彼らの言葉を取りました。結果:何百時間ものやり直し-分析、設計、実装、QAをやり直す必要がありました。仕様が特定のユースケースを逃したためです。仕様にバグがある場合。
チェーン内の誰かがエンドユーザーの想定とは異なる想定を行っているとき、私は以前の仕事で同様のことを見てきました。ストレートアップコーディングバグは、発生時に間近に捉えれば比較的簡単に対処できますが、設計のバグはシステム全体を破壊する可能性があります。
リリース後にバグを修正すると、バグを見つけて修正するコストがかかります。リリース後の作業にかかる時間やコストが増える場合とそうでない場合があります。ただし、説明が必要な一連の統合テスト、回帰テスト、UAテスト、リリースアクティビティなどがあります。バグ修正が他の多くの修正またはバージョンの更新と一緒にならない限り、テストおよびリリースアクティビティに追加費用がかかります。これは、修正を最初のリリースに含めることで回避されます。修正/更新/機能。
また、バグが使用中に発生するコストを検討します。これは単なる表面的なものである場合、それはおそらく問題ではありませんが、機能またはパフォーマンスのバグにより、サポートアクティビティや生産性の低下や誤った計算によりコストが発生する可能性があります。
悲しいことに、多くのことのように、それは異なります。
ダイアログメッセージのスペルが間違っている場合、修正するのは簡単です(文字列の更新、再構築/パッケージ、再展開)。または、レイアウトを更新する必要がある場合は、.cssファイルを変更するだけで十分な場合があります。
バグが100を超えるページ仕様と証明を含む重要なメソッドの出力が間違っている場合、調査自体は数時間または数日かかることがあります。これは、古い「公理」が指すものであり、とりわけ、TDDとアジャイルが回避しようとしていることです(早期かつ明確に失敗し、安全に段階的に進歩させてください、yada)。
単一のプロジェクトでのマルチスクラムチームでの最近の経験から、「バグ」は通常、機能ブランチが安定版に昇格したときにリリースの終わりにのみ現れるマージ/統合の問題です。チームが自分の目標を達成するために急いでいる間、競合はしばしばチーム間のサポートを必要とするため、これらは最悪です。リリースですが、できるだけ早くリリースできます。それが最悪の理由です。