まず第一に、私は TDD の第一人者であると主張しているわけではありませんが、あなたの質問の情報に基づいたいくつかの考えを以下に示します。
上記の #1 に関する私の考え: あなたが言及したように、アーキテクチャ設計を事前に行う必要があります。これなしで成功できる方法論は考えられません。アーキテクチャは、チームに結束とビジョンを提供します。前もって十分な設計を行いたいと思うかもしれませんが、それはあなたがどの程度アジャイルになりたいかによって異なります。開発者チームは、コーディングを開始する前に、システムのさまざまなコンポーネントをどのように組み合わせるかを知る必要があります。
誰かがこの方法でシステムを組み立てるための例と高レベルの手順を提供できれば素晴らしいでしょう
サービスで構成されるシステムを構築する場合は、サービス インターフェイスとそれらが交換するメッセージを定義することから始めます。これは、システムのさまざまなコンポーネントがどのように相互作用するかを定義します (これは、事前設計の例です)。これがあれば、さまざまな開発リソースを割り当てて、サービスを並行して構築できます。
#2については。TDD の利点の 1 つは、リファクタリング中に「セーフティ ネット」が提供されることです。コードは単体テストでカバーされているため、コードを変更する場合、特に継続的インテグレーションを実行している場合 (ほとんどの人が TDD アプローチで行っている場合)、何かが壊れているかどうかがすぐにわかります。この場合、新しい動作に対応するように単体テストを適応させるか、単体テストがパスするようにコードを修正する必要があります。
コードの大部分をリファクタリングする必要がないように、動作を抽象化できるシステムになります。
これは、たとえば戦略パターンを使用して、動作を抽象化および置換できるようにするための設計次第です。TDD は、設計が苦しむ必要があることを規定していません。機能要件を満たすために必要なことだけを行うように求めているだけです。システムが新しい支払い方法または価格設定モデルに適応できる必要があるという要件がある場合、それが設計のポイントになります。TDD を正しく実行すると、要件を満たしていること、および設計が正しい方向に進んでいることを確認できます。
リファクタリングは、データ モデルの変更が顧客と会社のリスクを増大させる実稼働システムの大きなオーバーヘッドであると私は考えています。
ソフトウェア設計の問題の 1 つは、それが厄介な問題であることです。つまり、リファクタリングはほぼ避けられません。はい、リファクタリングは本番システムではリスクがありますが、そのリスクを軽減でき、TDD が役に立ちます。また、しなやかな設計とカップリングの少ないシステムも必要です。コードをテスト可能に設計しているため、TDD は結合を減らすのに役立ちます。また、テスト可能なコードを作成することの副産物の 1 つは、システムの他の部分への依存を減らすことです。実装をモックまたはスタブに置き換えることができるインターフェイスにコーディングする傾向があります。これの良い例は、データベースへの呼び出しを、既知のデータを返すモック/スタブに置き換えることです。単体テストでデータベースにアクセスしたくありません。ここで、TDD アプローチでは優れたモッキング フレームワークが非常に貴重であることを言及できると思います ( Rhino モックとMoqどちらもオープンソースです)。
真の TDD の専門家がいて、あなたに知恵の真珠を与えてくれるはずです...個人的には、TDD アプローチなしで新しいプロジェクトを開始することは考えません。