2012-01-01 8 views
11

私は、適度に大きなシステム(約60k LOCの非ムースOO Perl)を維持することを任されています。私はそれを書き直すのではなく、リファクタリングの知恵に疑問を持ち始めています。私はこの質問が長らく議論されていることを知っていますが、状況は非常に複雑であり、反対方向を強く指し示すいくつかの要素を持っています。質問の冗長さには申し訳ありません。それは私が全体の画像を横断しながら管理することができるように簡潔です。これをリファクタリングして書き直しを計画する必要がありますか?

遠方での行動に頻繁に依存していることからもわかるように、抽象化されたものはきれいに何かをカプセル化するのにはかなり不十分で、手元のモジュールとは無関係のタイプのオブジェクト、およびソーシャルネットワークのように見える依存グラフが含まれています。これは、私が感じたことは悪いですが、リファクタリングすることができました。

テストカバレッジはばらつきがあります。これはもちろん修正可能であり、リファクタリングの前に修正する必要があります。もちろん、そのようなシステムでは、テストに足りない量の足場が必要となります。これは、テストの範囲をより困難にしますが、それでもなお不可能です。

そして私はゆっくりと混沌にいくつかの秩序をもたらし、多くの時間を費やすことを計画のです。私は思っていましたが、システムはビジネス上の目的のためには十分に機能していますが、それは問題があるにもかかわらず、何か正しいことをしているに違いありません。そして、 "誰もが知っている"このようなものを書き換えることは、災害のためのレシピです。

しかし、最近、私はシステムの最も重要な信頼性の低い部品の一部が深く座って、データスキーマにすべての道を行く、重大な設計ミスしていることを発見しました。全体的な方法論には大きな問題があります(これは私だけではなく、それに取り組んできた人々の合意です)。そのための回避策はおそらくその部分のコードの半分を構成します。ビジネスの論理。コードは自分自身にとって(あまりにも数ヶ月間それに取り組んできた)、または以前のプライマリメンテナー(数年間)が完全に理解するにはあまりにも複雑です。また、テストカバレッジは10%未満です。

誰もが、はるかに少ないそれらがどのように完全にかつ正確にその一部が実現かを説明できると確信していません。コードが解読不能で、満たされている要件が十分に理解されていない場合、この部分の優れたテストカバレッジを得ることは不可能です。テストカバレッジなしでリファクタリングするのは適切ではないし、このサイズのシステムでは複雑であり、動的にタイプされているため変更の影響を自動検出することは不可能です。この暗いコーナーが手つかずのまま

が原因絶えず変化するビジネス要件にオプションではありません。

私が見ることのできる唯一の実用的な方法は、ビジネスレベルでシステム要件を再定義し、その仕様を満たし、誰も予想していない破損を招くことを約束することから始まります。私はそれが悪い戦略だと知っていますが、私は選択肢を見ません。それが進路として選択されていれば、リファクタリングのメリットの多くが窓から出てきているように思えるので、これをリファクタリングしようとしても真剣に疑問を投げかけてくれます。

この場合、リファクタリングはリファクタリングですか?実際の経験に裏打ちされた回答は強く推奨されます。なぜなら、理論的な側面はここや他のところでよく確立されていると思うからです。

+3

これは大きな赤い旗です...あなたは実際にコードが何をしているのかわかりません!確かに進歩を考える前に、コードを理解し文書化した時点に到達する必要がありますか? – AmbroseChapel

+1

+1:これは素晴らしい質問だと思います。なぜなら、この記事が同じボートの他の人たちに優れた指針を与えることができるように、ローカライズすぎると思う理由があるからです。 – Zaid

答えて

4

ここには、があります。私が現在維持しているレガシーコードは、メンテナンス性、柔軟性、スケーラビリティに殆ど関係なく、必要な機能を達成するためのプログラムを手に入れようと考えている複数の非CSユーザー(エンジニア)の累積努力です。

しかし、私にとってうまくいくことは、誰にとってもうまくいかない可能性があります。

このような状況では、関連する基準をすべて列挙し、その選択肢を評価することが役立ちます。私は自分自身に次の質問をする傾向がある:

  • は、あなたの雇用者は、コードの書き換え/リファクタリングの値を参照してくださいしていますか?

    あなたの雇用主のバイインを持っている場合にのみ、「正しいことをすること」で逃げ出してしまうのは簡単です。

    私の経験 - ビジネスがリライト/リファクタリングの価値を見ない場合、本当にこのアクティビティをバックバーナーに置くべきです。既存のコードを文書化し、必要に応じて何かを書く/修正する/テストする前に、コードがどのように動作するかをより深く理解することに焦点を合わせます。

  • コードに新しい更新/機能要求を追加する頻度はどのくらいですか?

    このような活動が頻繁に行われるほど、あなたのケースはリファクタリング/リライトに強くなります。

    私の経験 - それはあなたが既存のコードで動作し、最小限の変更でそれによく文書化されたパッチを適用するビジネスに時々より貴重です。

  • コードはnヶ月後に機能Xを実行する必要があります。今日はどのようにそれが可能ですか?

    これは、開発が進行中の場合に適用されます。長期的に見て、コードが何をすることができる必要があり、現在の状態でそのニーズにどれくらいうまく対応できるかを見てください。

    私の経験 - コードの現在の状態が著しく不十分であるため、マスタードをカットしない時々リファクタリング

  • どのくらいの時間が想定される変更を実装するために時間がかかりますか?

    推定には、変更内容の理解、文書化、実装、テスト、検証、およびリリースに必要な時間が含まれている必要があります。

    私の経験 - 実際には最初に想像するよりもはるかに時間がかかる、特に&の検証をテストします。

+0

ありがとう!これは、私がむしろ避けたい "何もしない"オプションに関する多くの素晴らしい点を網羅していますが、それにもかかわらず、最善のものかもしれません。なぜなら、あなたはいくつかの良い理由を列挙したと思います。 – purpleamy

+0

@purpleamy:私は何もしないと言っているわけではありません。このコードを文書化することは、あなたができる最も貴重なものかもしれません。 – Zaid

+0

「何もしない」とは、それを修正しようとしないことを意味していました。確かに私たちができることを文書化する "最善の努力"の仕事は助けになるだろうが、それは問題の最悪を解決することはできません。文書化が最も必要な部分は、完全に発見して文書化することができない境界線であり、したがって私のジレンマです。 – purpleamy

2

私は現在プロジェクトで同じ立場にありますが、私はどのように進めるべきかを決める際にいくつかの要素を使用します。うまくいけば、これらはいくつかの助けになるでしょう。

1)私の最大の基準は、すでにリリースされ、私たちはプロジェクトを維持しているか、私たちは解放されようとしているプロジェクトを構築している、あるプロジェクトですか?

  • リリース予定のプロジェクトをビルドする場合、リリース前に解決できないセキュリティ上の問題がないことを確認しながら、プロジェクトをリリースすることが目標です。
  • 私たちがプロジェクトを維持しているなら、あなたの現在のユーザベースを傷つけることなく、新しいコードを入手する方がはるかに重くなりますが、あなたはその報酬を手に入れます。

2)書き換えにはどれくらい時間がかかりますか?新しいコードは、メンテナンスと今後の開発で時間を節約できますか?

  • 多くの場合、リライトはリファクタリングよりも時間がかかりますが、最終的にはメンテナンスや開発時間を大幅に節約できます。

3)私は、リファクタリングのためにあまりにも多くのボトルネックになっているソフトウェアに遭遇し、ちょうどソフトウェアがうまく動作するように書き直す必要があります。

私が現在取り組んでいるプロジェクトでは、私たちが開発の過程にあるので、私は大いに賛成またはリファクタリングすることに決めました。私たちが開発の過程にあるので、少なくとも3〜4ヶ月早くリリースすることができます。書き換えをしないでください。 このソフトウェアのメンテナンスは負担になるため、リリース後に書き直しが予定されています。ソフトウェアをリリースしてから数ヶ月後のユーザー数を処理するのに最適化も最適化もできません私たちは何ヶ月もの大きなバグを解消し、ソフトウェアにいくつかの断片を追加するつもりです。そして、我々は書き直しに取り掛かります。

だからうまくいけば私の10セント(2¢+インフレ)が助けてくれるはずです。 幸運を祈る!

4

最初に、Joel Spolskyから書き直さない理由をthis articleと読んでください。次に、リライト、リファクタリング、または通常のメンテナンスに必要なテストを書くことに集中することをお勧めします。それが完了したら、リライト/リファクタリングの質問に戻ってください。

+0

私はそれを読んで、それを受け入れるのは難しいと書き直す(またはそれを多かれ少なかれそれと一緒に生きる)という決定を見つける理由に同意します。しかし、問題がやりとりする方法を考えれば、リファクタリングのような純粋に技術的な解決策では現実的な解決策であることが疑わしいです。 – purpleamy

+1

+1素晴らしい記事 – dantuch