次のプロジェクトでは、多くのパーツを含む大規模なレガシーWebアプリケーションの「オーバーホール」を担当しました。それは2004年に書かれたJSPアプリケーションであり、私の会社で頻繁に使用されています。
このアプリケーションは、懸念事項の分離がないという点でひどく設計されました。サービス層、DAO層、MVC構造はありません。 HTMLと混合されたロジックとデータベースクエリを含むスクリプトレットがロードされた一連のJSPファイル。それは混乱です。
私の上司は、「オーバーホール」を基本的に、最近のアプリケーションに使用するテクノロジーを使用して全体を書き直すことと定義しています。
[〜#〜]および[〜#〜]は、新しい機能の束を追加します。
私の質問は、どうすればよいですか?現在使用中の大規模なアプリケーションを完全にやり直し、一連の機能を追加するための戦略は何ですか?
最初に既存のアプリケーションを書き直して、更新されたテクノロジで動作させる必要があります。その後、新しい機能の追加について心配する必要がありますか?それとも、まったく新しいアプリケーションを作成し、古い機能を使用して新しい機能を実装するようにするべきでしょうか?
誰かがこれを成功させましたか?もしそうなら、どの戦略があなたの成功に役立ちましたか?
編集:コメントからの詳細情報:
書き換えを正当化するために、設計はどれほど悪いものでなければなりませんか?このデザインはかなり悪いです。アプリケーションには多くのビジネスロジックが隠されています。仕様、要件変更のログ、バグ修正のリスト、未解決のバグのリスト、テストスイート、ドキュメントはありません。そして、最初にそれを書いた人は現在、上級管理職にいます。
アプリケーション全体を書き直すことはお勧めしません。特に現在お客様が使用されているもの。古いシステムでできることをすべて実行できるようになるまで、新しいシステムに切り替えることはありません。あなたが新しいシステムを書いている間、顧客と経営陣は焦り、それらの新機能を求めます。あなたまたは他の誰かがそれらを古いアプリに追加する必要があります。これにより、新しいアプリから時間がかかり、完了する前に行う必要のある作業が増えます。終わりのないプロジェクトに参加していると感じ、モラルが低下し始めるまで、時間が経つにつれ、実際にプロジェクトを完了する可能性は低くなります。
一般的に、悪い考えです。上記のMichaelTリンクのとおり。
代わりに何をすべきか?
現在のコードベースをよく調査してください。良い、悪い、醜い、そして恐ろしい右を見つけてください。すばやくクリーンアップできるもの、再利用およびリファクタリングできるもの、使用されなくなったか不要になったもの、書き直しが必要なものを確認します。
新しいDALを設計して実装します。ページとコードを確認し、もつれをほどくと、DALを呼び出す別のビジネスレイヤーができます。一度に同じようなページに焦点を当てます。それらがクリーンアップされて準備ができたらリリースします。より反復的にします。これらのページを2回以上ヒットする必要があるかもしれませんが、毎回より良いままにしてください。
新しい機能が導入されると、現在パイプラインにあるもの以上のものを手に入れ、それらをクリーンアップ作業に組み込みます。新しい機能をリリースするときは、同時にクリーンアップされた新しいコードをリリースします。
これにはしばらく時間がかかりますか?はい。はい、そうです。私は現在の会社に3年間在籍しており、クリーンアップしてきたWebクライアントアプリケーションは完了していません。しかし、多数のメジャーリリースがあり、それを多くの異なるクライアントに販売しました。今ではより多くのプラットフォームで動作し、新しいページや機能を作成することがますます簡単になっています。ゼロから始めて、完了したらリリースすることに決めていたとしても、それはまだ進行中の作業であり、メジャーリリースやクライアントを示す必要はありません。
このアプリケーションにはどのくらいのビジネスロジックが隠されていますか?最初に完全な仕様はありますか?すべての要件は過去10年間で変化しますか?修正されたすべてのバグ?まだ開いているすべてのバグ?包括的な回帰テストスイート?
答えられたのは...
書き換えを正当化するために、設計はどれほど悪いものでなければなりませんか?このデザインはかなり悪いです。アプリケーションには多くのビジネスロジックが隠されています。仕様、要件変更のログ、バグ修正のリスト、未解決のバグのリスト、テストスイート、ドキュメントはありません。そして、最初にそれを書いた人は現在、上級管理職にいます。
10年前のアプリケーションがあり、実際に何をすべきか、それを修正するために何が行われたか、何が正しく機能していないかについてのドキュメントはありません。
2つの方法があります。
1つ目は、内部からゆっくりと書き換えることです。入ってモジュールを見つけ、それが何をすべきか、何をすべきかを正確に理解し、それを置き換えます。これは段階的なプロセスです。それはおそらく最良のアプローチです。それは経営者が好む傾向があるものではありません(経営者は見た目が大きく、リリースが大きい大きなプロジェクトを好む傾向があることを発見しました)。何もしていないように見える内側から何かを交換しても、称賛は得られません。
もう1つのアプローチは、元のファイルを捨てて最初からやり直すことです。問題は、「これにはどのくらい時間がかかるか」です。尋ねられる最初の質問の1つです。このため、妥当な見積もりを得ることができます。
ドキュメントがない場合は、完全に書き直し、アプリケーションが持っているコードの行数を調べ、それを COCOMO II モデルに放り込みます。これは、現在存在しているのと同じくらい多くのコード行が新しいコードを書くのにかかることを想定して機能します。それがどれほど大きいか見てください。
問題は、ビジネスが着手すべきこれは、プログラマとして私たちが作るべきものではないということです。私たちはそれに意見を持っています、そしてこれはひどい時間の無駄だと思うかもしれません、またはこれはとても楽しいことだと思うかもしれません(私はこれを読むことを強くお勧めします Death March これについていくつかの視点を得る)-しかし、私たちがビジネスを求めるのは私たちではありません。
これにかかる時間枠を特定し、正当な投資収益があるかどうかをビジネスに判断させます。
3番目のオプションがあることに注意してください-そのままにしておきます。
誰かがこれを成功させましたか?
こちらが当社のサクセスストーリーです。かなり長い間、私たちは乱雑なウェブサイトを持っていました:
良いニュースは:
それが起こった方法:
結局、新しいバージョンがオンラインになり、大きな問題はありません。
次の理由により、100%の書き換えではありませんでした。
それだけのメンテナンスがなければ、おそらくそれはできなかったでしょう。完全な書き直しは一般的に悪い考えであるという点で、私は他の回答に同意する傾向がありますが、私たちの物語が示すように、これらの条件を前提として可能です。
あなたの特定の状況について、私はあなたに提案することができます: