リファクタリングとマージの必要性の間の緊張をどのように処理しますか?

StackOverflow https://stackoverflow.com/questions/200757

質問

新しいバージョンを提供する際のポリシーは、VCSにブランチを作成し、QAチームに処理することです。後者が青信号を出すと、製品にタグを付けてリリースします。技術リリースを作成できるように、ブランチはバグ修正(のみ)を受け取るために保持されます。これらのバグ修正は、その後トランクでマージされます。

この間、トランクは主な開発作業を確認し、潜在的にリファクタリングの変更の対象となります。

問題は、安定したトランクを持つ必要性の間に緊張があることです(そのため、バグ修正のマージが成功します-通常、コードが別のメソッドに抽出されたか、別のメソッドに移動された場合はできませんクラス)、新しい機能を導入するときにリファクタリングする必要があります。

代わりに、十分な時間が経過してブランチが十分に安定するまでリファクタリングを行わないというポリシーがあります。この場合、トランクでリファクタリングの変更を開始し、トランクとブランチの両方でバグ修正を手動でコミットする必要があります。

ただし、これは、開発者がトランクでリファクタリングの変更をコミットする前にかなりの時間待機する必要があることを意味します。これにより、ブランチからトランクへの後続のマージが中断される可能性があるためです。また、ブランチからトランクにバグを手動で移植するのは苦痛です。これは開発を妨げるように思えます...

この緊張にどう対処しますか?

ありがとう。

役に立ちましたか?

解決

これは実際の問題です。サポートする必要のある複数のバージョンがあり、それぞれに分岐している場合はさらに悪化します。純正のR& Dブランチもある場合は、さらに悪いことになります。

メイントランクを通常の速度で進め、リリースタイミングが商業的に重要な環境ではコードを安定させるべきだと主張することはできなかったので(" what 、不安定な状態でリリースしたということですか?")。

重要なのは、バグ修正のために作成されたユニットテストが、バグがメインブランチに移行されたときに移行されたことを確認することでした。新しいコードの変更が純粋にリファクタリングである場合、古いテストも同様に機能するはずです。変更が有効でなくなった場合、どのような場合でも修正を移植することはできません。新しいコードストリームの修正について誰かに一生懸命に考える必要があります。

この種の問題を管理して数年後、適切なサポートとカバレッジを提供するために少なくとも4つのコードストリームと、それら全体のコードを管理するためのかなり厳密なプロセスのコレクションが必要になると結論付けました。地図を4色で描くことができるという問題に少し似ています。

このテーマに関して本当に良い文献を見つけたことはありません。必然的に、リリース戦略と顧客と署名するSLAにリンクされます。

補遺:ブランチをメインブランチのリリーススケジュールに特定のマイルストーンとしてマージする必要があったことにも言及する必要があります。勤勉な開発者が機能を実装する仕事をしている場合は、ブランチをまとめるのに必要な作業量を過小評価しないでください。

他のヒント

私が働いている場所では、些細でない変更(機能の追加やバグ修正)ごとに、一時的で短命な(1日未満-数週間)作業ブランチを作成します。トランクは安定しており、(理想的には)いつでも解放できる可能性があります。 完了アイテムのみがマージされます。トランクからコミットされたすべてが毎日作業ブランチにマージされます。これは大幅に自動化できます(Hudson、Ant、Subversionを使用しています)。 (この最後のポイントは、通常、競合を後より早く解決するほうが通常は良いためです。)

現在使用しているモデルは、優れた記事(の影響を大きく受けています。以前にプラグインした)Henrik Kniberg: バージョン管理複数のアジャイルチームの場合

(私たちの場合、2つのスクラムチームが1つのコードベースで作業していますが、このモデルは1つのチームでも有益であると考えるようになりました。)

余分な分岐とマージにはいくらかのオーバーヘッドがありますが、実際に慣れてツールを使いこなせば、それほど多くはありません(例: svn merge --reintegrate が便利です) 。いいえ、一時的なブランチを常に作成するわけではありません。トランクへの1回のコミットで簡単に完了することができる、小規模でリスクの低いリファクタリング(現在作業中の主要アイテムとは無関係)。

また、重要なバグが時々修正される古いリリースブランチも維持しています。確かに、ブランチと比較してコードの特定の部分がトランクで大幅に進化している場合、手動の(時には退屈な)マージ作業があるかもしれません。 (これは、トランクから(内部的に)増分を継続的にリリースし、マーケティングと製品管理が外部リリースをいつ行うかを決定できるようになるにつれて、問題が少なくなることを願っています。

これがあなたの質問に直接答えるかどうか、またはあなたの環境にこれを適用できるかどうかはわかりません(個別のQAチームと全員)-しかし、少なくともあなたが説明する緊張は私たちには存在しないと言えますいつでもリファクタリングできます。がんばって!

開発プロセスに次の要素を追加することで、緊張に対処できると思います:

  1. 継続的な統合
  2. 自動化された機能テスト(すでにユニットテストでカウントされていると思います)
  3. 自動配信

継続的インテグレーションでは、すべてのコミットはすべてのユニットテストが実行されるビルドを意味し、何か問題が発生した場合は警告されます。 headを使用して作業を開始すると、コードベースを分岐する傾向が少なくなります。

自動機能テストを使用すると、ボタンをクリックするだけでアプリケーションをテストできます。通常、これらのテストには時間がかかるため、夜間に実行されます。 これにより、バージョニングの古典的な役割は重要性を失い始めます。バージョンとその成熟度に基づいていつリリースするかを決定するのではなく、ビジネス上の決定の多くです。単体テストと機能テストを実装し、チームがテスト済みのコードを送信している場合、headは常にリリース可能な状態である必要があります。バグは継続的に発見され、修正され、リリースされますが、これはもはや循環的なプロセスではなく、継続的なプロセスです。

これは、2つのタイプの中傷者がいることを意味します。これは、長い根ざした慣行を変えることを意味するためです。第一に、継続的デリバリーのパラダイムシフトは、マネージャーにとって直観に反しているようです。 “ Aren’大きなバグを出荷するリスクはありませんか?” LinuxまたはWindowsのディストリビューションを見ると、これがまさに彼らが行っていることです。つまり、リリースを顧客に向けてプッシュすることです。また、一連の自動化されたテストでカウントされるため、危険性はさらに減少します。

次に、QAチームまたは部門。 (問題はそれ自体の存在であると主張する人もいます!)彼らは一般的にテストの自動化を嫌います。それは、新しく複雑なツールを学ぶことを意味します。ここで、最善を尽くして説教することです。開発チームは継続的な統合に取り組み始め、同時に Selenium を使用して一連の機能テストを作成しました。 QAチームがツールの動作を確認したとき、その実装に反対することは困難でした。

最後に、私が説明したプロセスは、開発プロセスに追加する3つの成分ほど単純ではないということです。これは、ソフトウェアの開発方法に大きな変化があることを意味します。

Maybe Git(または他のDVCS)は、ファイルを比較するだけでなく(実際に)変更を管理するという事実のおかげで、更新されたコードへのマージの処理に優れています... As ジョエルは言う

  

分散バージョン管理を使用すると、マージは簡単で正常に機能します。そのため、実際には安定したブランチと開発ブランチを作成したり、展開前にテストを行うQAチームの長命ブランチを作成したり、短期間ブランチを作成して新しいアイデアを試したり、どのように機能するかを確認したりできます。

まだ試していません...

私が働いているところでは、メインブランチのリファクタリングを続けています。マージがトリッキーになる場合は、アドホックに対処する必要があり、すべて実行可能ですが、時々少し時間がかかります。

たぶん私たちの問題は、非常に長い寿命(最大18か月)を持たなければならないブランチがあるという事実に由来し、それらに対して行わなければならない多くの修正があります。

非常に安定したコードからのみ分岐するようにすることはおそらく役立ちますが、それほど簡単ではありません...:(

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top