質問に対処しています...
...エンタープライズクライアントに複雑な問題を解決するためであっても、超シンプルなアーキテクチャを推奨するのは間違っているでしょうか?
絶対違う。
クライアントの視点から
上記のように、それはクライアントに大きく依存します。また、どのソリューションがクライアントに適しているかを正確に判断する能力にも依存します。常に望ましい値に達すると認識されるコストが存在しますが、コンサルタントとして、クライアントの適切な期待を設定するのはあなたの仕事です。場合によっては、その認識を満たす必要があります。他では、それらを修正することがあなたの最善の利益になります。結局のところ、あなたはあなたのクライアントの専門家でなければなりません。そうでない場合は、その専門家になるための知識が必要です。それは彼らがあなたに支払うものです。
開発者の観点から
使用するアーキテクチャを選択する上で最も難しいのは、多くの場合、特定のニーズを満たすためにテクノロジを利用するために必要な作業量を正確に見積もることです。これは、クライアントの期待に応えられないプロジェクトにすぐにつながる可能性があります。あなたが言及しているこれらの「複雑な」コードの断片を使用すると、一部のプロジェクトが実際に高速化されることを理解してください。一部はそうではないことも理解されています。あなたまたはあなたのチームが知っていることに基づいて、その測定値を提供する必要があります。
エンタープライズソリューションを定義するのは複雑ですか、それとも信頼性、同時ユーザー数、保守の容易さ、またはこれらすべてですか。
詳細は異なる場合がありますが、一般的に、エンタープライズソリューションは、幅広い混合対象ユーザーに適用されるソフトウェアソリューションです。同時使用ユーザーの数は、要因である場合もあればそうでない場合もあります。ユーザーの総数は、多くの場合さまざまなビジネスロールに属しますが、ソリューションが「エンタープライズ」であるかどうかに関する最大の決定要因の1つです。
多くのエンタープライズソリューションは非常に複雑ですが、非常にシンプルなものもあります。企業は信頼性の空気を提供しますが(確かに特定の基準を維持する必要があります)、ソリューションごとに信頼性のレベルは異なります。
メンテナンスのしやすさは、すべての開発者(独立者またはチームメンバー)が努力することだと私は思うが、必ずしも簡単に達成できるとは限らない。重要なのは、「簡単」ではなく、しっかりとしたガイドラインのある保守手順があることです。異なるコードベースは、哲学、方法論、(ビジネス)環境活動、およびコードの複雑さに応じて、大幅に異なるレベルの容易さを持つことに注意してください。
他のステートメントに対応しています...
すべての場合において、コードを実際にスワップ可能または再利用可能にする必要はありませんでした
多くの場合、そうする必要は特にありません。ただし、これは常に目標です。これを検討してください... Webページからカレンダーにアクセスしたり、カレンダーを表示したりする機能を必要とするクライアントがあるかもしれません。独自のコードを再利用可能にすると、別のクライアントが同じことを要求したときに、すでにいくつかの作業が完了しています。そうしないと、もう一度やり直す必要があります。多くの場合、すべてのクライアントの問題は、将来別のクライアントが必要とする問題です。言い換えると、一緒に仕事をするすべてのクライアントは、将来のクライアントの仕事のコスト(必ずしも製品のコストではない)を削減できる可能性があるはずです。
要件が変更されたため、テストが実際に最初の反復を超えて維持されることはなく、時間がかかりすぎました。
ここでは、テスト方法論が十分に抽象化されていなかったと主張します。最近、独自の単体テストを直接実行するコードを使用しました。プロジェクトのニーズに対応するカスタムassert
とexpect
機能が作成されました。ユニットテストが必要なときはいつでも、コードを調整することなく適用できます。実際、コードはアサートとともに積極的に配布され、まだそこにあることを期待しています。作業コードの一部としてこれらのチェックを行いました。
...締め切り、ビジネスのプレッシャーなど...
多くの場合、余分なビジネスプレッシャーとコーディングプロセスを妨げる期限が、クライアントではなく開発者の責任であることに気づきました。これは常に当てはまるわけではありませんが、多くの場合、ビジネスの圧力は、クライアントの期待に応えられないという認識によって引き起こされます。締め切りがコードの妨げになる場合、それは開発者が使用可能な機能コードに必要な作業量を正確に測定できなかったことが原因であることがよくあります。言い換えれば、それらをスケジュールし(クライアントはそれを期待する)、それらを測定し(将来のクライアントはそれを期待する)、それらを実行し(ユーザーはそれを必要とします)、それらに対して支払いを受けます(契約でそれを要求する必要があります)。