私のマネージャーは私に巨大な量のひどく結合された、マクロ化された、プライベートな名前空間メソッドの完全な、階層的に倒錯した(10+レベルの継承でさえ)をリファクタリングすることを望んでいます)「実際に」「全体像」のコンセプトで設計されていないコード。
私は彼にこのコードをリファクタリングするだけでなくリライトする必要があることを説明しようとしましたが、彼は耳を傾けず、私はそれをリファクタリングする必要があると明確に述べました..どういうわけか。
私はすべての「レガシーコードを扱う」本に飛び込むことができましたが、役に立つものは何も出ないと思います。
リファクタリングではなくリライトが実際に必要であることをどのように彼に納得させることができますか?
彼はおそらく正しいです。
コードベースが非常に巨大で、非常に複雑で、理解するのが難しい場合、同じことを正しく行う何かを書くことができると思う理由は何ですか?
一般に、大きなリファクタリングが開始するのに最適な場所です。ビットをリッピングし、再利用可能なチャンクに結合します。見やすいようにコードを整理します。継承階層を平坦化し、ぶら下がっているエッジケースを削除します。名前空間を組み合わせる。マクロを展開します。大きな混乱を合理的に理解できるシステムに変えるために必要なことは何でも。
あなたはそれを書き直す前にそれを理解する必要があります-そうでなければあなたはただ別の混乱に終わるでしょう。
コードを攻撃する前に、まずテストケースを定義し、それらのユニットテストを作成することをお勧めします。
単体テストはリファクタリングの状況や書き直しに便利です。これらは、コードを変更した場合でも、必要な機能が正しいことを確認するのに役立ちます。
書き換える場合は、元のコードと新しいコードに対して単体テストを実行して、機能が変更されていないことを確認できます。
ユニットテストは、複数回のリファクタリングの後でお尻を救います!
大規模なプロジェクトを最初から書き直すのは、最初の見た目よりもはるかに難しいことがよくあります。コードが混乱している場合は、要件とドキュメントがさらに悪化している可能性があります。要件を考え出し、スパゲッティコードの各部分がどのように、そしてなぜ機能するのかを理解するために、多くの時間を費やすことになります。あなたは常にこの特定の振る舞いにバグ、機能、または単にそれを書いた人のための利便性について尋ねるでしょう。
マネージャーの観点から、できればあなたのマネージャーからも、最終的な目標はビジネスの価値を生み出すことです。結局のところ、私たちはお金を稼ぐためにコードを書くためだけにコードを書くわけではありません。
あなたが見ていないかもしれない何かは会社とあなたのマネージャーのためのリスクのレベルです。ゼロからビルドを開始し、何らかの理由でそれを完了することができない場合、新しい半分完了した再書き込みは破棄される可能性があります。すでに作業中のバージョンがあり、主な設計者がプロジェクトの途中で去った場合、この書き直しが優先される場所を考えてください。このアップグレードで会社に十分強い理由があるでしょうか?
それを、現在活発に開発されているバージョンのプロジェクトが存在する既存のコードのリファクタリングと比較してください。プロジェクトに取り組むことができなくなった場合、それは理想的ではありませんが、リスクははるかに低くなります。
マネージャーがあなたに完全な書き直しを許可することは多くの信頼を必要とし、他の誰かの混乱をクリーンアップするよりも書き換えがはるかに楽しいとしても、たまに行う価値があるだけです。
私は完全な書き換えが最善の解決策である状況にありました。元のコードが不十分な設計の山である場合、ほとんど理解されておらず、怠惰なプログラマーのゴミによってハッキングされます。
そのようなコードをジャンクから使用可能なコードにリファクタリングすることはほとんど常に可能です。しかし、問題はそれがかかる時間の長さです。一連のリファクタリングには、追加のコストが伴います。それは、変更の各ブロックを、まだ変更されていないレガシーコードで機能させるために必要な時間とコードです。別のキッカーは、誰かがそれを「リファクタリング」し始め、最小値を実行した(半分アーセドを読んだ)か、完了する前に残っているため、元のコードがあなたが見ているものとまったく同じものから発生したことは珍しくないということです。
ほとんどの人がリファクタリングをサポートしているのは、リファクタリングを理解しているということです。したがって、彼らはそれを「安全な」オプションとして認識します。ほとんど正しいが、常にそうとは限らない。彼らは怖いので書き直すことができないので、彼らはしばしばそれを選びます。
以上のことをすべて言っても、アプリケーションが何をすべきかを完全に理解する必要があります。これについて明確なビジョンがない場合。そうすれば、書き直しがオリジナルよりはるかに良くなることはまずありません。