私はあなたが投稿した記事のリンクを読みました。ファウラーはいくつかの非常に良い点と彼が言った多くのことを言ったと言わなければなりません。
IMO、まともな設計を行う場合、行き止まりの状況と考えられるものに入るべきではありません。私は常にソフトウェアをビルディングブロックで構成されていると見てきました。私はまだいくつかの事前設計を信じていますが、主な目標は製品全体を設計することではなく、全体的なアーキテクチャ/方向性を提供してチームが共通の全体像を視覚化できるようにすることです。キューブと三角形のピースがたくさんある場合は、ピースをたたくだけで始める前に、城がどのように組み立てられるかをスケッチすると役立ちます。
私はオブジェクト指向の土地から来ているので、私にとっては各ブロックはクラスであり、そのブロックの表面積はパブリックインターフェイス(外部または派生クラスから見えるもの)です。適切なSOLIDの原則に従うと、各ブロックが非常にシンプルで、直感的なパブリックインターフェイスを備えていることを確認できます。私の例えに戻って、コードは単純な形状のみを作成するようにします。複雑すぎるクラス(多くの関数、多くの変数)を作成するときはいつでも、要件の変更時に再利用が困難な形状を作成します。
進化的設計の最大のリスク/挑戦は、設計の決定をコーディング時間に任せ、個々の開発者がそれらの決定を行うことを期待することであるという点で、私はFowlerに同意します。適切なフィードバックメカニズムが整っていない場合、システムが故障する可能性があります。新しい機能が求められたときはいつでも、単純に拡張する必要のある関数を見つけ、その中にある種の条件を入れて、その関数の中に大量のコードを追加するだけです。また、これで十分な場合もありますが、これは(IMO)デッドエンドコンポーネントにつながる最も一般的な唯一のプラクティスでもあります。これは進化的デザインとは関係ありません。これは、いわゆる「デザインなし」です。
時間をかけて少し待って、このクラスにはすでに15個のメンバー変数があり、そのうち6つを抽出して、独自の自己完結型のクラスに入れれば、ソフトウェアは非常に軽量になります。 -重量、柔軟性、再利用可能なビルディングブロック。PMが来て、あなたの製品要件の半分を変更したら、ブロックをいくつか取り出して棚に戻し、新しいブロックを作成する必要があります(城を建設するときのように、すべてを使用することはできません)あなたのシリンダー)。しかし、その時点では、それはビジネスの一部にすぎません。要件が変更され、コードの柔軟性とモジュール性を維持することにより、新しいビジネスの方向性に合わせて製品を変更できるはずです。
設計に対するこの進化的なアプローチは、あらゆるレベルのエンジニアのスキルで機能すると考えています。個人的に、私は非常に長い間ソフトウェアを開発してきました。私たちのチームがアジャイル手法に移行する前に、開発用PCからいくつかの主要コンポーネントをほとんど直接QAなしで顧客に出荷する責任がありました。同時に、これらのコンポーネントは常に柔軟性と保守性を維持しています。
私は自分がソフトウェアを設計するのに比較的まともだと考えていると言っているだけです。同時に、100ページのデザインドキュメントを作成し、それをコーダーに渡し、それが機能することを期待するように頼んだ場合、おそらく紙袋から自分でデザインすることはできませんでした。作業を開始するときに、UMLのような(非常に単純化された、完全な言語ではない)図をいくつかスケッチすることもありますが、コーディングを開始すると、必要に応じてリファクタリングし、最終的なコードは元々描いたもののようにはなりません。1か月か2か月かけてすべての細部を考えても、他の誰かが自分のダイアグラムを作成し、コーディング中に設計を変更せずに堅実なソフトウェアを思い付くことができるとは想像できません。
スペクトルのもう一方の端では、現在私のチーム(現在アジャイルであり、私はそれを完全にサポートしています)に、過去15年間だけCを行った組み込みの土地から私たちに加わった2、3人の男がいます。私は明らかに初期の計画とクラスのレイアウトを手伝いましたが、定期的なコードレビューとブレインストーミングセッションでフォローアップを行い、SOLIDのアプリケーションと設計原則について話し合いました。彼らはスパゲッティコードをいくつか作成してくれたので、少しうんざりさせられましたが、ほんの少しのナッジで、すでに作成されていたもののリファクタリングを開始しました。それを言うために、しかしそのコードを移動した後、これははるかに読みやすく、理解しやすいように見えます。行き止まりは回避されました。ポイントI ' 作成しようとしているのは、OOに完全に慣れていない人でも、経験豊富なメンターがいれば、「進化的デザイン」は「デザインなし」と同じではないことを思い出させるために、ある程度まともなコードを生成できるということです。そして、彼の「より複雑な」クラスのいくつかでさえ、各クラスがそれほど責任を負わないため(つまり、それほどコードがないため)、それほど怖くはありません。それをチャックして、同じパブリックインターフェイスを持つ代替クラスを記述します(これまでのところ、この偶然性の必要性は、私たちが書いたもので見たことがなく、コードレビューを週に2回行ってきました)。
最後の注意点として、私はデザインドキュメント(少なくとも現在のチームのビジネス条件)を固く信じていますが、デザインドキュメントの主な目標はOrganizational Memoryであるため、実際のドキュメントはコードが生成され、リファクタリング。コーディングする前に、通常、ナプキン/ mspaint / visioのクラスをスケッチする簡単な(時にはそれほど速くない)設計フェーズがあります。このフェーズでは、設計図ではなく、コーディングを開始するときに、従うべきパスが生成されることを常に思い出します。意味をなさないものは変更する必要があります。これらのリマインダーを使用したとしても、新しい人は、たとえたとえそれが彼らにとって不自然であっても、元のデザインにコードをフィットさせようとする傾向があります。これは通常、コードレビューで表面化します。
ダン、私はたくさん書いた。ごめんなさい