質問

この質問の焦点: 一部のソフトウェアは、ソフトウェアに 1 つ以上の内部エラーがあるにもかかわらず、「最終的に成功/満足のいく」結果が得られる可能性を高めるために「追加の作業」を実行します。これらのエラーが発生すると、より長い実行時間が必要になります。結果が成功した場合、これらはすべてユーザーの知らないうちに発生します。

複雑なソフトウェアの定義:

  • 10 人を超える開発者によって生涯にわたって書かれた (寄稿された) コードが含まれており、同じ期間内に書かれたものではありません。
  • 10 を超える外部ライブラリに依存しており、それぞれに注意事項があります
  • 一般的なソフトウェア タスク (ユーザーが望む結果を生成するため) には 10 個以上の入力パラメーターが必要で、そのほとんどにはデフォルト値がありますが、ユーザーが制御する必要がある場合は構成可能です。
  • 最も重要なのは、実行されるタスクに対して適切な複雑さを持つソフトウェアであることです。 不必要に複雑ではない.

編集: コンプレックスとは何ですか?参照してください 「複雑」と「複雑」には大きな違いがあります. (直接リンク)

冗長性/堅牢性の定義 この質問の中で:
(コメントに基づいて堅牢性を追加)

  • 現在のパラメータ セットを使用したときにソフトウェア タスクが失敗した場合は、別のパラメータを試してください。
    • 明らかに、これらの「異なる」パラメーターが異なるコード パスを使用し、異なる (できればより良い) 結果が生じる可能性があるという内部知識が必要です。
    • これらの異なるコード パスは、外部ライブラリの観察に基づいて選択される場合があります。
  • 最後に、実行された実際のタスクがユーザーの仕様とわずかに異なる場合、ユーザーはその矛盾を詳細に説明するレポートを受け取ります。
  • 最後に、10 を超える構成可能なパラメーターと同様に、冗長性とレポートも構成可能です。

そのようなソフトウェアの例:

  • データベースの移行
    • ビジネスデータベース
    • ソース管理データベースなど
  • Word 文書と OpenOffice 文書、PowerPoint と OpenOffice Draw などの間のバッチ変換。
  • Webサイト全体の自動翻訳
  • Doxygen などのソフトウェア パッケージの自動分析。ただし、分析の信頼性を高める必要がある場合 (例:単なる文書化ツールではありません)
  • パケットが失われる可能性があり、何度も再試行が予想されるネットワーク通信

この質問はもともと以下からインスピレーションを受けました 意図的に悪いコードにどう対処しますか?
しかし現在は、ソフトウェア肥大化の原因の 1 つにのみ焦点を当てています。この質問では、新機能の追加など、ソフトウェアの肥大化のその他の原因については説明しません。

関連する可能性のあるもの:

役に立ちましたか?

解決

これはビジネス上の質問であり、技術的な質問ではありません。

研究者やプロトタイプでコーディングすることもあるので、非常に低い堅牢性のあるものを構築します。壊れた場合、修正します。すぐにコードを捨てるつもりなら、余分な魔法に投資する意味はありません。

しかし、システムのユーザーが堅牢であるために必要な場合は、そのように構築する必要があります。そして、あなたと彼らが必要としない冗長性/堅牢性の種類を無視しながら、あなたと彼らが長期的な成功を最大化する必要がある方法で具体的に堅牢にする必要があります。

一般的に、私はラフを始めてから、時間の経過とともに堅牢性を追加します。私は頻繁に通常の計画プロセスのこの部分のような質問をします。私は通常、極端なプログラミングスタイルで作業しています。ここでは、目的の機能の長いリストを作成し、そこにも堅牢性の機能を掲載しています。たとえば、「システムは、単一のボックスの障害に耐える」と、「ユーザーがFacebook資格情報を使用して参加できる」などのものと混ざり合っています。どちらが最初に登場しても、最初に構築します。

他のヒント

通常、複雑なソフトウェア おそらくご存知のように冗長ですが、明らかにそれが最良の方法であるからではなく、開発者がソフトウェアの仕組みを詳細に理解しようとするのではなく、既存のコードを「タック」する傾向があるためです。

しかし、冗長性を受け入れられるべきであると私に尋ねたなら、私は何も言いません。冗長性は、複雑さの多くの副作用の1つであり、シンプルさの絵文字です。間違いなく、時間が非常に重要である場合、シンプルさは後部座席を取る必要がありますが、時間が非常に重要であると主張する人は、ソフトウェアの開発に実際に気をつけることはめったにないことを強調しています。通常、プロジェクトマネージャーは、できるだけ早く仕事を終わらせるためにあなたに卵を産むので、より差し迫った問題に戻ることができますが、仕事がいつ終わるかを知ることはプログラマーとしての義務です。その仕事は、それが意図されていたようにプログラムに成功裏に統合するまで、仕事は終わっていないと思います。おそらくプログラムは複雑ですが、少なくともあなたの変更はパターンに適合し、同様のコードを見るのに慣れているプログラマが理解しやすくなります。

ただし、そうすることで、冗長コードを作成する必要がある場合があると言われるべきです。プロジェクトが既に非常に冗長である場合、もちろん上司がプロジェクト全体を再構築できるようにするために数週間がないと仮定すると、実際にパターンを継続する方が簡単かもしれません。

編集:質問のrephrasingに照らして、堅牢性について少し追加します。私の意見では、パラメーターチェックは、a)文字列としての日付値やb)潜在的に互いに競合するか、相互に排他的である可能性がある場合の非常に特定の形式を受け入れる場合にのみ実行する必要があります。

a)では、パラメーターが特定の形式と一致する要件は、通常、メソッド(文字列からの日付への変換など)の必要性にとって重要です。技術的には、それが必要にならずにあなたのプログラムでまだ起こる可能性がありますが、私はあなたがこれらの可能性を排除し、あなたが探しているデータのタイプを表すパラメーターのみを受け入れることを強く勧めます(あなたが探しているデータのタイプを表します(文字列ではなく日付を受け入れます。たとえば、ポイントは変換するためではありません。変換も実行する必要がある場合は、ユーティリティメソッドを使用して文字列をメソッドに渡す前に変換します)。

b)に関しては、相互に排他的なパラメーターは悪い構造を表します。 2つのクラスがあります。1つは1つのケースを処理し、もう1つは別の方法で処理するものです。すべての一般的な操作は、冗長性を回避するために、単一の基本クラスで実行できます。

メソッドのパラメーターの数が10以上になるようになる状況では、頻繁に変更されない可能性が最も高いこれらすべてのパラメーターを含むプロパティファイルを検討し始めます。それらが変更された場合、プロパティファイルにデフォルトを保存し、実行時にデフォルトをオーバーライドできる「setPropertyName()」メソッドを追加できます。

ソフトウェアはユーザーの間違いを許し、プログラマーの間違いに完全に不寛容でなければなりません。

つまり、ソフトウェアは非常に堅牢であり、ユーザー入力エラーやシステム構成エラーなどのスムーズな回復を可能にする必要があります。少なくとも、エラーが発生した場所(入力ボックス、構成ファイル、コマンドライン引数など)と違反された場所(「X文字未満でなければならない」、「有効なオプションは[x」と違反したものを示す友好的なエラーメッセージ。 、y、z] "など...)追加の堅牢性のために、ソフトウェアは代替を提案するか、合理的なデフォルトを使用することができます(ただし、ユーザーが指定したものを正確に使用していないことを常に示す必要があります)。

さまざまなデフォルトで自動再試行が保証されている多くの状況は考えられませんが、一部があります(通信リンクを確立するための自動再試行が合理的であると思われます)。 @williamに、このレベルの「冗長性」がビジネスの決定であることに同意します。

一方、プログラマーエラーに対して実行時間の堅牢性はないはずです。関数のパラメーターの事前条件がある場合、ランタイムチェックではなく、アサートで確認する必要があります。コールスタックに3つまたは4つのレベルを3つまたは4つのレベルで確認してレポートする冗長なエラーチェックとレポートを見るのは、私の巨大なペットのピーブです。

 int A(int x)
 {
   if (x==0) return -1
   ...
 }
 int B(int x)
 {
   if (x==0) return -1
   err = A(x)
   if (err) return err;
   ...
 }
 // and so on and so on....

これは、追加の不要な複雑さです。ある関数が別の機能を誤用することで導入されたエラーをどのように処理するかを理解するタイミングを費やすべきではありません。これがあなたが言及している「堅牢性」のタイプである場合 - あなたはそれを必要としません。アサートと徹底的な統合テストに置き換えます。

それは要件の事です。

堅牢性に対する要件はありますか?

「通信リンクが失敗すると、誤ったパケットが破棄されます」「リンクが操作を再開すると、トランザクションは2回処理されません」

エラー回復のユースケースがあるはずです (そうでない場合、エラーがどのように発生するかをどうやって知ることができますか?)

(必要に応じて) プログラマが堅牢性を開発するのを任せると、結果的に「魔法の」システムが生まれます。

すべての魔法システムは時間の経過とともにくだらない魔法になります。バックグラウンドでのエラー修正により障害の発生が隠蔽されるため、障害は修正されず、システムは最終的により大きなエントロピーの状態に劣化します。常にエラーを修正してくれるので、クソみたいに実行できます。システムが永続的に劣化した状態になるのを防ぐには、制限を設ける必要があります。

一部の操作は、特にデータベースのような外部リソースに依存する場合、「試行」アプローチを保証する可能性があります。たとえば、データベースを接続できない場合、またはクエリが失敗した場合、あきらめてエラーをより高いレベルにスローする前に、操作を一定回再試行する場合があります。しかし、いくつかの論理では、同じことを複数回試すことは、多くの場合、実際の問題を隠す悪いコードと魔法の思考の症状です。

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top