web-dev-qa-db-ja.com

1つを構築して捨てるvs二次システム効果

一方では、「捨てるために1つ構築する」というアドバイスがあります。ソフトウェアシステムを完成させ、最終製品を見て初めて、設計段階で問題が発生したことに気づき、実際にそれを実行する方法を理解しました。

一方、設計されている同じ種類の2番目のシステムは通常、最初のシステムよりも悪いことを示す「2番目のシステムの影響」があります。最初のプロジェクトに適合せず、2番目のバージョンにプッシュされた多くの機能があり、通常は過度に複雑で過度に設計されています。

ここでこれらの原則の間に矛盾はありませんか?問題に対する正しい見方は何ですか?これらの2つの間の境界はどこですか?

私はこれらの「良い習慣」が最初に独創的な本The Mythical Man-Monthでフレッド・ブルックスによって宣伝されたと信じています。

これらの問題の一部はアジャイル方法論によって解決されることは知っていますが、深く掘り下げても、問題は依然として根本にある原則です。たとえば、私たちは重要な設計変更を実施する前に3つのスプリントを実行しません。

15
m3th0dman

捨てるための1つを構築することは、最初に「わからないことを知らない」ことから来るので、最初に何をすべきかを行くにつれて学びます。

2番目のシステム効果は、「あなたが知らなかったものを知っているが、あなたがまだ知らないものを知らない」ことから生じます。すなわち、2番目のシステム効果は、最初のシステム効果よりも大きくて、光沢があり、より複雑なシステムを、知識なしに構築しようとすることから生じます。最初に必要-最初のシステムで何が起こるかとよく似ています。

したがって、2番目のシステム効果は矛盾しません。最初のシステムと同じ機能を備えた2番目のシステムを構築することは(私の知る限り)決して行われていません。 2番目のシステムは常に「より良い」必要があり、したがってより複雑であり、したがって最初のシステムと実質的に同様の問題が予想されます-破棄する必要があります。

したがって、1つを構築して破棄し、それを破棄して、スコープを拡大せずに再度構築すれば、2番目のシステムの問題は発生しません。 (これは紫の空、ピンクの海、空飛ぶ豚のいる惑星でより頻繁に行われる傾向があります。)

23
mattnz

あなたが言及している問題は、いくつかの事柄がスキップされたことを意味し、その結果、システムは失敗しました。不足しているステップのいくつかを説明しましょう:

品質管理-はじめて正しく実行してください!一時的なハッキングや一時的な妥協は絶対に使用しないでください。やり直す必要はありません。すべてのリソースが効率的に使用され、行うすべてのことはプロジェクトへの適切な貢献です。

実現可能性分析-ビジネスニーズを発見します。プロジェクトのビジネスケースを作成します。

プロジェクト計画-最初のスコープを明確に定義し、ソリューションの提供方法を​​計画し、ベースラインを作成し、計画に固執します。クリティカルパス上にないものに時間を費やさないでください。

要件エンジニアリング-ビジネス要件を引き出します(つまり、ビジネスプロセスをキャプチャし、コンピュータ化されたシステムでサポートする必要があるビジネスオペレーションを決定し、1対1のビジネスオペレーションをシステムのユースケースに変換します)。検証と検証! (正しいものを構築していますか?正しいものを構築していますか?)すべての要件は、元のビジネスニーズにリンクする必要があります。

ソフトウェア設計-ユースケースとドメインモデルをコンポーネント設計とソリューションアーキテクチャに変換します。すべてのコンポーネントは、REの要件にリンクする必要があります。

実装-ソフトウェアを設計どおりにコーディングします。すべてのコードはSDのコンポーネントにリンクする必要があります。

検証-単体テスト、統合テスト、パフォーマンスなど(REのすべてのユースケースをテストする必要があります)

これらは、ソフトウェアプロセスのいくつかの重要な側面です。言及された活動はソフトウェア工学の一部です。これは、実際のビジネスニーズに合った適切なソフトウェアソリューションを構築する方法であり、仕様どおりに、時間通りに、予算内で構築します。

より良いソフトウェアを構築し、それを初めて正しくするためにこれらの用語を調べてください:

  • 実現可能性分析(特にビジネスケースの構築方法)
  • プロジェクト管理(特にプロジェクト計画とリスク軽減を伴うリスク登録)
  • 要件エンジニアリング(誘発、分析、仕様、検証)
  • ソフトウェア設計(UMLおよびコンポーネントベースのソフトウェアエンジニアリング)
  • ソフトウェア構築(設計パターン、フレームワーク、防御的プログラミング)
  • ソフトウェアの検証(単体テスト、UATなど)
0
user42242