13

本当に悪いシステムの改善をどのように始めますか?

単体テストの作成とリファクタリングを推奨する前に、私が何を意味するのか説明させてください。これらのテクニックを使用することもできますが、この場合は無意味です。

実際、システムは非常に壊れており、必要なことを行っていません。

たとえば、システムは送信するメッセージの数をカウントする必要があります。ほとんどの場合は機能しますが、場合によっては、メッセージ カウンターの値を増やすことを「忘れる」ことがあります。問題は、独自の回避策を持つ他の多くのモジュールがこのカウンターに基づいて構築されているため、カウンターを修正すると、システム全体が現在よりも悪化することです。解決策は、すべてのモジュールを変更し、独自の修正を削除することですが、150 以上のモジュールを使用すると、非常に多くの調整が必要になるため、余裕がありません。

さらに悪いことに、システム自体ではなく、人々の頭の中に回避策がある問題がいくつかあります。たとえば、システムは 1 つのメッセージ グループで 4 つを超える関連メッセージを表すことはできません。一部のサービスでは、グループ化された 5 つのメッセージが必要になります。会計部門はこの制限を認識しており、これらのサービスのメッセージをカウントするたびに、メッセージ グループをカウントし、それに 5/4 を掛けて正しいメッセージ数を取得します。これらの逸脱に関する文書はまったくなく、現在システムにそのようなものがいくつ存在するかは誰にもわかりません。

では、このシステムの改善にどのように取り組み始めますか? どのような戦略に従いますか?

いくつかの追加事項:私はこれに取り組んでいる一人の軍隊であるため、十分な数の男性を雇ってシステムを再設計/リファクタリングすることは受け入れられる答えではありません. そして、数週間または数か月で、目に見える進歩を実際に示す必要があるため、数年で自分でリファクタリングを行うという選択肢はありません.

技術的な詳細: システムは Java と PHP で書かれていますが、それはあまり重要ではないと思います。その背後には、Oracle と PostgreSQL の 2 つのデータベースがあります。コード自体が臭いという前に述べた欠陥に加えて、それは本当にひどく書かれ、文書化されています。

追加情報:

カウンターの問題は、同期の問題ではありません。counter++ ステートメントは、一部のモジュールに追加され、他の一部のモジュールには追加されません。手っ取り早い修正方法は、不足している場所に追加することです。長い解決策は、それを必要とするモジュールの側面のようなものにして、後で忘れないようにすることです。このような問題を修正することには問題はありませんが、この変更を行うと、他の 10 個のモジュールが壊れてしまいます。

アップデート:

グレッグ D の回答を受け入れました。アダム・ベレアのほうが好きだとしても、何を知るのが理想的かを知っても何の役にも立ちません。答えてくれてありがとう。

4

9 に答える 9

14
  1. 火を消します。重要な優先順位の問題がある場合は、それが何であれ、最初にそれらを処理する必要があります。必要に応じてハックしてください。臭いコードベースで大丈夫です。あなたはあなたが将来それを改善することを知っています。これは、あなたが報告している人を対象としたあなたの販売テクニックです。
  2. ぶら下がっている果物をいくつか選んでください。 あなたはこの特定のソフトウェアに比較的慣れておらず、それに対処するために再任されたと思います。コードの関連サブシステムで、1つ1つを解決するのに1〜2日以上かかることのない、明らかに簡単な問題をいくつか見つけて、修正します。これにはリファクタリングが含まれる場合と含まれない場合があります。目標は、システムと元の作成者のスタイルに慣れることです。あなたは本当に幸運にならないかもしれません(私の前に私のシステムで働いていた2人の無能な人の1人は常に彼のコメントを1つではなく4つの句読点で後付けしました。ただし、作成者の弱点についての洞察を深めて、注意すべき点を把握します。たとえば、グローバルな状態との広範囲にわたる緊密な結合と、言語ツールの理解不足。
  3. 大きな目標を設定します。 あなたの経験が私のものと似ている場合、前のステップを実行するにつれて、特定のスパゲッティコードにますます頻繁に遭遇するでしょう。これはあなたが解く必要がある最初の結び目です。コンポーネントを理解し、元の作成者が間違った可能性があること(したがって、注意する必要があること)についての知識を身に付けた経験で、システムのこのサブセットのより良いモデルを想像し始めることができます。機能を維持するために厄介なインターフェースを維持する必要がある場合でも心配する必要はありません。一度に1ステップずつ実行してください。

泡立てて、すすぎ、繰り返してください!:)

時間がある場合は、システムの他の部分とのインターフェイスの1レベル下に、新しいモデルの単体テストを追加することを検討してください。悪いインターフェースを使用するテストを介してコードに刻印しないでください。将来の反復でそれらを変更することになります。

あなたが言及する特定の問題に対処する:

ユーザーが手動で回避している状況に遭遇した場合は、それを変更することについてユーザーと話し合ってください。あなたがそれに時間を沈める前にあなたがそれを提供するならば、彼らが変更を受け入れることを確認してください。彼らが変更を望まない場合、あなたの仕事は壊れた振る舞いを維持することです。

他の複数のコンポーネントが回避したバグのあるコンポーネントに遭遇した場合、私は並列コンポーネント手法を支持します。既存のカウンターが機能するように機能するカウンターを作成します。同様の(または実用的な場合は同一の)インターフェイスを提供し、新しいコンポーネントをコードベースにスライドさせます。壊れたコンポーネントを回避する外部コンポーネントに触れるときは、古いコンポーネントを新しいコンポーネントと交換してみてください。同様のインターフェースにより、コードの移植が容易になり、新しいコンポーネントに障害が発生した場合でも、古いコンポーネントはそのまま残ります。できるまで古いコンポーネントを削除しないでください。

于 2008-10-10T18:27:55.313 に答える
3

今、あなたに何を求められていますか?機能を実装したり、バグを修正したりするように求められていますか?彼らはあなたに何をしてほしいかさえ知っていますか?

システム全体を「修正」するための人的資源、時間、またはリソースがない場合、できることは水を保釈することだけです。あなたは、数ヶ月の間に「目に見える進歩」を遂げることができるはずだと言っています。さて、あなたが説明したようにシステムが悪いので、あなたは実際にシステムを悪化させるかもしれません。目立つことをするようにプレッシャーがかかると、コードを追加するだけで、システムがさらに複雑になります。

最終的には、リファクタリングする必要があります。それを回避する方法はありません。エンドユーザーに表示されるリファクタリングの方法を見つけることができれば、「数か月」ではなく6〜9か月または1年かかる場合でも、それが理想的です。しかし、それができない場合は、次のことを選択できます。

  • リファクタリング、そしてあなたの努力にもかかわらず「何も達成していない」と見なされるリスク
  • リファクタリングを行わず、「目に見える」目標を達成し、システムをより複雑にし、ある日リファクタリングをより困難にします。(たぶん、あなたがより良い仕事を見つけた後、そして一緒に来る次の開発者があなたがどこに住んでいるのか決してわからないことを願っています。)

どちらがあなたにとって最も有益であるかは、あなたの会社の文化に依存します。彼らはいつの日か、より多くの開発者を雇うことを決定するのでしょうか、それともこのシステムを他の製品に完全に置き換えることを決定するのでしょうか?

逆に、「物事を直す」というあなたの努力が実際に他のものを壊すなら、彼らはあなたが片手で取り組むように求められている怪物について理解しているでしょうか?

ここに簡単な答えはありません、ごめんなさい。あなたはあなたのユニークな、個々の状況に基づいて評価しなければなりません。

于 2008-10-10T18:16:12.233 に答える
2

これは基本的にユニットテストとリファクタリングを説明する本全体ですが、それを行う方法についてより実践的なアドバイスがあります

http://ecx.images-amazon.com/images/I/51RCXGPXQ8L._SL500_AA240_.jpg

http://www.amazon.com/Working-Effectively-Legacy-Robert-Martin/dp/0131177052

于 2008-10-10T18:07:32.377 に答える
1

私はほぼ3年間、同じ特性を持つレガシーシステムを使用してきましたが、私が知っているショートカットはありません。

私たちのレガシーシステムで最も気になるのは、バグを修正すると他の多くの機能が壊れてしまう可能性があるため、いくつかのバグを修正することが許可されていないことです。これには、醜い回避策または古い関数の新しいバージョンの作成が必要です。その後、古い関数の呼び出しを一度に新しい関数に置き換えることができます(テスト中)。

あなたのタスクの目的が何であるかはわかりませんが、コードにできるだけ触れないようにすることを強くお勧めします。必要なことだけをしてください。

あなたは人々にインタビューすることによって可能な限り文書化されたいと思うかもしれません。どの質問をするべきかわからないので、これは大きな仕事であり、人々は多くの詳細を忘れてしまうでしょう。

それ以外:あなたが報酬を得て、十分な道徳的支援を受けていることを確認してください。しだれと歯ぎしりがあります...

于 2008-10-10T18:30:51.410 に答える
1

このシステムを含むディレクトリを Windows エクスプローラで開きます。次に、Ctrl-A を押してから、Shift-Delete を押します。それはあなたの場合の改善のように聞こえます。

真剣に、そのカウンターはスレッドセーフの問題を抱えているように聞こえます。増加する関数をロックします。

システムの残りの部分に関しては、不可能なことはできないので、可能なことを試してみてください。システムを 2 つの面から攻撃する必要があります。より目に見えて問題のある問題に最初に対処して、進捗状況を示すことができます。同時に、よりインフラストラクチャの問題に対処する必要があります。そうすれば、いつかこの問題を実際に修正できる可能性があります。

幸運を祈ります。ソースがあなたと共にありますように。

于 2008-10-10T18:05:45.517 に答える
1

リファクタリングの難易度が中くらいの領域を 1 つ選びます。既存のメソッド シグネチャのみを使用して、元のコードのスケルトンを作成します。インターフェースを使用することもできます。次に、ハッキングを開始します。「新しい」メソッドを古いメソッドに向けることもできます。

それから、テスト、テスト、テスト。単体テストがないので、古き良き Voice-Activated-Unit Tests (人) を使用するだけでよいでしょうか? または、独自のテストを作成します。

フラストレーションや質問など、ある種のリポジトリに進むにつれて進捗状況を文書化してください。そうすれば、このプロジェクトを取得する次の貧しい愚か者があなたのいる場所にいることはありません :)。

最初の部分が完了したら、次の部分に進みます。重要なのは、漸進的な進歩の上に構築することです。そのため、最初に最も難しい部分から始めるべきではありません。意気消沈するのは簡単すぎるでしょう。

Joel には、リライト/リファクタリングに関する記事がいくつかあります。

http://www.joelonsoftware.com/articles/fog0000000069.html

http://www.joelonsoftware.com/articles/fog0000000348.html

于 2008-10-10T18:05:52.427 に答える
0

問題がある現在存在するすべてのものを廃止し、正しく機能する新しいものを作成します。何が変わるかについてできるだけ多くの文書を作成し、この文書を指す場所全体に大きな赤い点滅標識を配置します。

そうすることで、実際に機能するシステムの取得に向けた進捗を遅らせることなく、既存のバグ(他の​​場所で補正されているバグ)を維持できます。

于 2008-10-10T18:25:51.137 に答える
0

さて、どこかから始める必要があります。修正が必要なバグがあるようです。私はそれらのバグを処理し、迅速な勝利のリファクタリングを行い、途中で可能な単体テストを作成します。また、 SourceMonitorのようなツールを使用して、システム内のコードの最も「複雑な」部分のいくつかを識別し、それらの設計を何らかの方法で単純化できるかどうかを確認します。最終的には、それが遅いプロセスになることを受け入れ、より良いシステムに向けて小さな一歩を踏み出す必要があります。

于 2008-10-10T18:06:52.160 に答える
0

私は、システムの一部を抽出して、かなり迅速に分離して書き換えることができる部分を選択しようとしました。あまり効果がない場合でも、進行状況をすばやく表示でき、レガシーコードと直接やり取りする問題はありません。

うまくいけば、あなたがそのようなタスクをいくつか選ぶことができれば、彼らはあなたが目に見える進歩を遂げているのを見るでしょう、そしてあなたはより大きなモジュールを書き直すためにより多くの人々を雇うための議論を提起することができます。システムの一部が壊れた動作に依存している場合、何かを修正する前に分離する以外に選択肢はありません。

うまくいけば、全体を書き直すことができるチームを徐々に構築することができます。

これらすべては、適切なトレーニングと密接に関連している必要があります。そうしないと、人々の古い習慣が固執し、物事が期待どおりに機能しない場合にあなたの仕事が非難されます。

幸運を!

于 2008-10-10T18:18:21.387 に答える