50万行を超えるコードベースで作業しています。それはリファクタリングの深刻な必要性にあります。通常の2週間のスプリントよりも時間がかかるリファクタリングの取り組みが確認されています。このサイトの他の回答で提案されているように、これらを小さなタスクに分割することはできません。製品は反復の最後に動作する必要があり、部分的なリファクタリングは、アイテム間の依存関係がひどいため、システムを使用できない状態のままにします。それで、このハードルに取り組む最良の方法は何でしょうか?繰り返しますが、それをより小さな部分に分割することはオプションではなく、すでに行われています。
更新:これが2週間のスプリントに収まらない理由を説明する必要があるようです。コードを書くだけでなく、スプリントに関わることが多くあります。テストなしではコードを使用しないというポリシーがあります。そのポリシーは常に存在するわけではなく、コードベースの大部分にはそれらがありません。また、一部の統合テストはまだ手動テストです。問題は、リファクタリング自体が非常に大きいということではありません。これは、小さな変更がシステムの多くの部分に影響を与えるという事実によるものであり、それらの部分が引き続き正しく動作することを確認する必要があります。
毎月の修正プログラムがあるため、スプリントを延期または延長することはできません。したがって、スプリントを超えて拡張されるこの変更は、修正プログラムに追加されている他の作業を停止できません。
リファクタリングと再設計:開発プロセスが2週間のサイクルでこのリファクタリングを処理するのに十分効率的ではないからといって、名前を変更して再設計する必要はありません。将来的には、プロセスが改善されれば、2週間のサイクルでまったく同じタスクを達成できると信じています。ここで問題となっているコードは、非常に長い時間で変更する必要がなく、非常に安定しています。さて、会社の方向性が変化に適応できるようになっているので、コードベースのこの部分を他の部分と同じように適応できるようにしたいと考えています。それをリファクタリングする必要があります。ここでの回答に基づいて、通常のスプリントの時間枠でこのリファクタリングを機能させるために必要な足場が不足していることが明らかになりつつあります。
回答:
これらの問題領域と不足しているテストを特定する方法について詳しく知ることができるように、Corbin Marchが最初に提案したブランチとマージのアプローチを実行します。今後は、テストが欠落している領域を特定し、最初にそれらを実装するというBuhbの提案したアプローチを採用してから、リファクタリングを実行する必要があると思います。ここにいる多くの人がいつもリファクタリングのケースであるべきだと言っているのと同じように、それは私たちが通常の2週間のスプリントサイクルを保つことを可能にします。
リファクタリングを遅らせる余裕がある場合は、コードベースを快適にリファクタリングし、1回のスプリントでリファクタリングできるようになるまで、単体テストと自動統合テストを追加することに集中することをお勧めします。
私のおすすめ:
おそらく醜くなるという事実を回避することはできません。羨ましくない。私の経験では、プロジェクトを大幅に変更する場合、進行中の開発を新しいパラダイムにマージする方が、すべてが終了した後で新しいパラダイムを現在変更されているトランクにマージするよりも簡単です。それでも、それは傷つくでしょう。
すべてのタスクを(人工的な)2週間のスプリントで実行できるわけではないため、常識が必要です。それ以上分解できない場合、それを実行する必要がある場合は、すぐに実行してください。プロセスは最終結果よりも重要ではなく、決して破られることのない法律というよりもガイドラインとして見なされるべきです。
3、4、または5週間のスプリントを実行するだけです。誰も気にしない?あなたは明らかに、より短い時間枠では何もできないと確信しているので、それとの戦いをやめてください。
王立盲協会のアジャイルアドヒアランスであなたの仲間に言ってはいけません。
Michael Feathers著の本 効果的なレガシーコードの使用 から始めることをお勧めします。彼は、リファクタリングスタイルの変更の範囲を減らすためのさまざまなテクニックをカバーしています。
当店では、リリースウィンドウで完了できない大きなリファクタリングまたはリライトタスクがある場合、機能をシステムにそのまま残します。しかし、時間の許す限り、新しいリファクタリングされたレゴブロック機能から始めます。最終的に、十分なレゴブロックが完了した状態になり、スプリントがレゴブロックをアプリケーションに接続してユーザーにオンにするための十分な時間を提供します。
より簡潔に言うと、新しい名前を使用して大きな関数を分割または再作成します。次に、最後に、厄介な古いコードの代わりに、名前を変更してリファクタリングした作業を使用します。
コービンマーチの答えに+1、それはまさに私が考えていたものです。あなたのコードベースは少し醜いようで、それをきれいにするために単一のスプリントサイクルよりも多くかかるでしょう。
それで、コービンが言ったように、
これを開発マネージャーに販売しても問題はないと思います。PMがそれを見るのに苦労している場合は、ローマが1日で構築されておらず、ローマに捨てられたすべてのゴミを片付けていることを説明してください。街も一日で終わらない。リファクタリングにはしばらく時間がかかりますが、メンテナンスの容易さ、拡張リリースの迅速化、プロダクションチケットの削減、SLAの充実という点で、結局はそれだけの価値があります。
コードをリファクタリング中に適切に機能させる方法を理解するために、1つのスプリントを割り当てます。これは、非推奨のメソッドとクラス、ラッパー、アダプターなどの形式をとることができます。リファクタリングを行うと、コードが短期間で汚れて、長期的にクリーンになる場合があります。それで大丈夫です。今、それは不可能だと言っています。私はそれが正しいとは思わない-それがあなたのプロセスがどのようになるかを考えてくださいできた行われたら、そうするためにあなたが取ることができるステップについて考えてください。その後、飛び込みます。
あなたが本当にやりたい再設計は大きなタスクですが、個々の依存関係を壊したり切り離したりするために、小さな部分をリファクタリングすることは可能でしょうか?ご存知のとおり、疑わしい場合は間接参照を追加します。これらのデカップリングのそれぞれは、完了できないマンモスよりも小さなタスクでなければなりません。
依存関係が削除されると、残りのリファクタリングタスクを分割してスプリント内で取得できるようになります。
私が現在取り組んでいるプロジェクトでは、4週間のスプリントを使用しています。また、ユーザーストーリーを完了できず、次のスプリント中に再起動するだけの場合もあります。
ただし、私見では、リファクタリングを4週間のスプリントに収まる小さなストーリーに分割することができるはずです。 4週間以内にコードを一貫した状態にすることができない場合、アプリケーションをリファクタリングするのではなく、書き直しているように感じます。
私たちのコードベースの一部(これも少し大きい)で同じ問題を最近経験したので、いくつかの洞察をあなたと共有できればと思います。私の状況では、コードベースは別のチームによって開発されていたため、元の開発者の誰もこのリファクタリングに関与していませんでした。私のコードベースでの経験は約1年で、もう1人の開発者がそれを2年間担当しました。
ここで、他の回答に関する2つの小さなメモを許可します。
2週間以上「予約外」のように見えても、気づかれることはありません。プロジェクト管理、さらに重要なのはチームに支えられていることを確認する必要があります。チームがこのリファクタリングに取り組んでいない場合(つまり、遠い将来ではなく、今すぐ実行すること)、問題が発生します。
単独で行うのではなく、ペアプログラミングを使用してください。これは、常に同じキーボードの前に座る必要があることを厳密に意味するわけではありませんが、小さくて狭いタスク(このクラスの動作をキャプチャするテストの作成など)を個別に処理できます。
スクラッチリファクタリングを実行し、そのように扱います。 (一種の「使い捨て」プロトタイプリファクタリング、「使い捨て」ビットは重要です!)正直なところ、リファクタリングが持つすべての影響を知ることはほとんどありません。スクラッチリファクタリングは、特定の点で役立ちます。
スクラッチリファクタリングが完了したら、すべてを変更してすべてを変更することはできないことに気付くでしょう。あなたは気分が悪くなるでしょう、それはただ大きな脂肪の混乱であり、あなたはスイッチを切り替えるだけではそれを機能させることができません。これは私に起こったことです、それはあなたの状況では異なるかもしれません。
しかし、私のパートナーと私は私たちのシステムをはるかによく理解していました。これで、個々の小さい(まだ大きい)リファクタリング/再設計を識別することができました。システムのビジョンを図に取り込み、そのビジョンを実装するために思いついたバックログ項目とともに、それをチームと共有しました。共通の合意に基づいて、次の反復の過程で実装する項目を決定しました。
私たちを助けた最後の1つは、大きなホワイトボードの使用でした。あなたの頭の中に保つにはあまりにも多くのものがあります。メモを取ることは非常に重要です。 1日の終わりに、説明用のメモを書いて、今日やったこと、そして明日やりたいことを記録します。それは大きな時間をリラックスさせるのに役立ちます、そしてあなたが仕事に追いついたければあなたはリラックスした時間が必要です。幸運を!
特定のタスクが2週間のスプリントサイクルよりも長くかかる場合は、タスクを別の時間に予定することをお勧めします。あなたのチームはリファクタリングの必要性を認識しており、それは重要です。時々、他に選択肢がない...そして、はい、それは嫌です。
リファクタリングを開始するときが来たら、通常のスプリントを一時停止します。選択肢はありません。スマートバージョン管理を使用する-ブランチ、リファクタリング、テスト、マージ。一部の大規模プロジェクトのリファクタリングは、機能よりも常に優先される時点があります。可能であれば、柔軟性を高めるために懸念事項を分離することも試みます。
それ以上の開発が行われないメンテナンスウィンドウを開始します。再設計を実行してから、開発スプリントを再開します。
役立つ可能性がある1つの提案:2週間のスプリント内でリファクタリングおよびするために十分な時間がないテストされていないコードがある場合、最初に他の無関係な小さな変更をコードに加えて、最初の1つか2つのスプリントのテストの作成に集中できるようにします。おそらく、リファクタリングするコードのテストされていないクライアントをいくつか特定できます。 1つのクライアントを選択し、ビジネスに他の変更を加えて、そのクライアントのテストを作成するように強制します。コードの操作に慣れ、コードの操作に慣れ、テストが増え、マイナーなリファクタリングをいくつか完了すると、リファクタリングと(今では簡単に) )1回の反復で両方をテストします。
別のアプローチは、問題のあるコードのコピーを作成し、それをリファクタリングしてから、クライアントを一度に1つずつ新しいコードに移動することです。この作業は、イテレーション全体で分割できます。
そしてあきらめないでください。大規模なリファクタリングを小さなステップに分解できないことを単に受け入れないでください。最も簡単/最速/最良のアプローチは、反復よりも時間がかかる場合があります。ただし、これは、反復サイズのチャンクを実行する方法がないという意味ではありません。
私たちの手元には2種類の作品があります。
多くのメソッドは [〜#〜] dry [〜#〜] 、 [〜#〜] srp [〜#〜] 、 [〜#〜] ocp [〜#〜] 、 [〜#〜] di [〜#〜] など。プロジェクトのリファクタリングに2か月かかる場合2か月かかるだけ、それを回避する方法はありません。したがって、私の提案は、元のプロジェクトをリファクタリングせず、現在の状況で機能させることです。 利害関係者と製品所有者からの新しい要求と要件の受信を停止します。次に、チームがプロジェクトをリファクタリングして準備ができるまで作業を続けます。