申し訳ありませんが、これは長くなりますが、複数の書き換えプロジェクトの設計者および開発者としての個人的な経験に基づいています。
次の条件により、何らかの書き換えを検討する必要があります。その後、どちらを実行するかを決定する方法について説明します。
- 開発者の立ち上げ時間は非常に長くなります。新しい開発者を増やすために(経験レベルで)以下よりも長くかかる場合、システムを再設計する必要があります。ランプアップ時間とは、新しい開発者が最初のコミットを行う準備が整うまでの時間を意味します(小さな機能で)
- 大学卒業直後-1.5か月
- まだグリーンですが、以前に他のプロジェクトに取り組んでいました-1か月
- 中レベル-2週間
- 経験豊富-1週間
- 上級レベル-1日
- 既存のアーキテクチャが複雑であるため、展開を自動化できません
- 単純なバグ修正でも、既存のコードの複雑さのために時間がかかりすぎる
- コードベースの相互依存性のために、新機能は時間がかかりすぎ、コストがかかりすぎます(新機能は分離できないため、既存の機能に影響します)
- 既存のコードベースの相互依存性のため、正式なテストサイクルには時間がかかりすぎます。
- あまりにも多くのユースケースが実行される画面が少なすぎます。これにより、ユーザーと開発者のトレーニングの問題が発生します。
- 現在のシステムにある技術はそれを要求します
- 技術の経験を持つ質の高い開発者を見つけるのは難しい
- 廃止されました(新しいプラットフォーム/機能をサポートするためにアップグレードすることはできません)
- 単にはるかに表現力豊かな高レベルの技術が利用可能です
- 古いテクノロジーのインフラストラクチャを維持するコストが高すぎます
これらはかなり自明です。完全なリライトとインクリメンタルなリビルドをいつ決定するかは、より主観的であり、したがって、より政治的な責任を負います。確信を持って言えることは、決して良いアイデアではないと断言することは間違っているということです。
システムを段階的に再設計でき、そのようなことに対するプロジェクトスポンサーシップの完全なサポートがある場合は、それを行う必要があります。ただし、ここに問題があります。多くのシステムは、段階的に再設計することはできません。これを防ぐために私が遭遇したいくつかの理由を以下に示します(技術的および政治的の両方)。
- テクニカル
- コンポーネントの結合は非常に高いため、単一のコンポーネントへの変更を他のコンポーネントから分離することはできません。単一のコンポーネントを再設計すると、隣接するコンポーネントだけでなく、すべてのコンポーネントに間接的に変更がカスケードされます。
- テクノロジースタックは非常に複雑であるため、将来の状態設計では複数のインフラストラクチャの変更が必要になります。これは完全な書き換えでも必要ですが、インクリメンタルな再設計で必要な場合は、その利点が失われます。
- コンポーネントを再設計すると、とにかくそのコンポーネントが完全に書き直されます。これは、既存の設計が非常に複雑で、保存する価値がないからです。繰り返しますが、これが当てはまる場合、あなたは利点を失います。
- 政治的
- 段階的な再設計にはプロジェクトへの長期的なコミットメントが必要であることをスポンサーに理解させることはできません。必然的に、ほとんどの組織は、段階的な再設計によって生じる継続的な予算流出に対する欲求を失います。この食欲不振は書き直しにも避けられませんが、スポンサーは部分的に完全な新しいシステムと部分的に廃止された古いシステムに分割されたくないため、継続する傾向があります。
- システムのユーザーも「現在の画面」に執着しています。この場合、システムの重要な部分(フロントエンド)を改善するためのライセンスはありません。再設計を行うと、新しい問題から始まるため、この問題を回避できます。彼らはまだ「同じスクリーン」を手に入れることを主張しますが、あなたは押し戻すためにもう少し弾薬を持っています。
増分再編集の総コストは、完全な書き換えを行うよりも常に高くなりますが、通常、組織への影響は小さいことに注意してください。私の意見では、書き直しを正当化でき、スーパースターの開発者がいる場合は、それを行います。
それを完了するまで政治的な意思があると確信できる場合にのみ、それを行ってください。これは、エグゼクティブとエンドユーザーの両方の賛同を意味します。それなしでは、失敗します。これが、ジョエルが悪い考えだと言う理由だと思います。エグゼクティブおよびエンドユーザーのバイインは、多くの建築家にとって双頭ユニコーンのように見えます。それを積極的に販売し、完了するまで継続的にキャンペーンを行う必要があります。それは難しいことであり、あなたは、成功を望んでいない人に評判をかけることについて話している。
成功のためのいくつかの戦略:
- ただし、既存のコードを変換しようとしないでください。システムをゼロから設計します。そうしないと、時間を無駄にします。悲惨な結果にならなかった「変換」プロジェクトを見たことも聞いたこともない。
- 一度に1チームずつ、ユーザーを新しいシステムに移行します。既存のシステムで最も苦労しているチームを特定し、最初にそれらを移行します。彼らに口コミで良い知らせを広めましょう。これにより、新しいシステムが内部から販売されます。
- 必要に応じてフレームワークを設計します。実際のコードを見たことがないこのフレームワークから始めてはいけません。
- テクノロジースタックをできるだけ小さくしてください。過剰に設計しないでください。必要に応じてテクノロジーを追加できますが、それらを取り出すことは困難です。さらに、レイヤーが多いほど、開発者がより多くの作業を行うことができます。始めから難しくしないでください。
- ユーザーを設計プロセスに直接関与させますが、ユーザーにその方法を指示させないでください。優れた設計原則に従えば、より良いものを提供できることを示して、信頼を獲得します。