web-dev-qa-db-ja.com

レガシーコードベースでの時間コストの見積もり

最近、非常に古いモノリシックアプリケーションをマイクロサービスベースのアーキテクチャに移行するプロジェクトに取り組み始めました。

レガシーコードベースは非常に乱雑です (( 'spaghetti code') で、明らかに単純な関数(たとえば、 "multiplyValueByTen"と名付けられている)は後に、 "3行にわたる10テーブルを含む数千行の検証コード別のスキーマ」。

現在、上司は(正しい)新しいアーキテクチャで機能Xを作成するのにかかる時間を見積もるように求めています。しかし、現実的な見積もりを出すのに苦労しています。多くの場合、私は非常に上で述べた理由によりタスクを過小評価し、時間内に完了できないために自分を困惑させます。

賢明なことが実際にコードに入り込んで、すべてのブランチと他の関数の呼び出しを記録し、時間コストを見積もるように見えるかもしれません。しかし、古いコードを文書化することと、実際に新しいバージョンを書き留めることとの間に、非常に小さな違いがあります。

このようなシナリオにどのように取り組むべきですか?

レガシーコードのリファクタリングがどのように機能するかは完全に理解していますが、私の質問は「リファクタリング/リライトを行う方法」ではありません。しかし、「パーツXのリファクタリング/リライトにはどのくらい時間がかかりますか?」に対して現実的な答えを出すことについて。

87
JuniorDev

Bob Martinの「Clean Coder」(および、「Clean Code」)をお読みください。以下は記憶からのものですが、私は強く自分のコピーを購入することをお勧めします。

あなたがする必要があるのは、3点加重平均です。作業ごとに3つの見積もりを行います。

  • 最良のシナリオ-すべてが正常に行われていると想定します(a)
  • 最悪のシナリオ-すべてがうまくいかない場合(b)
  • 実際の推測-それがおそらく取ると思うもの(c)

あなたの見積もりは(a + b + 2c)/ 4

  • いいえ、正確ではありません。推定にはより良い方法がありますが、この方法は迅速で理解しやすく、最悪の場合を考慮させることで楽観性を緩和します。
  • はい、あなたは上司に、コードに不慣れであり、予測を改善するために毎回コードを調査するために長い時間を費やすことなく、正確で正確な推定を行うことは予測不可能であることを説明する必要があります(これを提供するがあと何日かかるかを正確に見積もるには、n日が必要だと言います)。あなたが「JuniorDev」であれば、これは合理的なマネージャーには受け入れられるはずです。
  • また、最高のケース、最悪のケース、および可能性の高いケースに基づいて推定値が平均化されることをマネージャーに説明し、エラーバーを提供する数値を与える必要があります。
  • 見積もりについて交渉しないでください-マネージャーがすべての見積もりに対して最良のケースを使用しようとする場合(それらはばかげていますが、私はそのような人に会いました)、締め切りに間に合うようにいじめたりやる気を起こさせたりします。時々がっかりするだろう。推定の背後にある理論的根拠(最良の場合、最悪の場合、および可能性のある場合)を説明し続け、ほとんどの場合加重平均に近づき続けるので、大丈夫です。また、あなた自身の目的のために、見積もりの​​スプレッドシートを保管し、完了したら実績を追加してください。これにより、見積もりを調整する方法についてより良いアイデアが得られます。

編集:

私がこれに答えたときの私の仮定:

  1. OPはジュニアデベロッパーです(選択したユーザー名に基づく)。したがって、与えられたアドバイスは、開発環境の成熟度に応じてより高度な見積もりを実行できると期待されるプロジェクトマネージャーまたはチームリーダーの観点からのものではありません。
  2. プロジェクトマネージャーは、プロジェクトの計画を作成しました。プロジェクト計画は、実行に数か月かかる予定のかなり多数のタスクで構成されています。
  3. OPは、プロジェクトマネージャーに適度に正確な数(確率曲線ではない)を求めてプロジェクト計画にフィードし、進捗状況の追跡に使用することを望んでいるプロジェクトマネージャーによって割り当てられたタスクの推定数を提供するよう求められています。
  4. OPは各見積もりを生成するのに数週間はなく、楽観的すぎる見積もりを出すことによって以前に燃やされており、指を空中に突き刺して「2週間」と言うよりも正確な方法を望んでいます。以上"。

この場合、3ポイントの加重平均が適切に機能します。それは迅速で、非技術的なものに理解可能であり、いくつかの推定値を超えると、平均に近づいて精度に近づくはずです。特にOPが見積もりと実績の記録を保持することについて私のアドバイスをする場合。実際の「ワーストケース」と「ベストケース」がどのように見えるかがわかっている場合は、将来の見積もりに実績をフィードし、最悪のケースが思ったより悪い場合はプロジェクトマネージャーの見積もりを調整することもできます。

実際に動作する例を見てみましょう:

  • 最良の場合、経験から、私が実際に行った最速のものは、1週間の開始から終了(5日)でした。
  • 最悪の場合、経験上、至る所にリンクがあり、結局6週間(30日)かかりました。
  • 実際の見積もり、おそらく2週間(10日)かかります

5 + 30 + 2x10 = 55

55/4 = 13.75これはあなたがあなたの首相に言うことです。たぶん、あなたは14日間に切り上げます。時間の経過とともに(たとえば、10個のタスク)、それは平均値になるはずです。

式を調整することを恐れないでください。たぶん、タスクの半分は悪夢に終わり、10%だけが簡単です。つまり、エストメイトをa/10 + b/2 + 2c/5にします。あなたの経験から学びましょう。

注、私はPMの品質について何も想定していません。悪いPMは、承認を得るためにプロジェクトボードに短い見積もりを与え、プロジェクトチームをいじめ、彼らが約束した非現実的な締め切りに到達しようとします。唯一の防御策は、あなたの見積もりを与え、それらに近づくのを見ることができるように記録してください。

110
mcottle

これは、準アジャイルアプローチを導入する良い機会かもしれません。時間/日で見積もる代わりに、フィボナッチタイプのスケールを割り当て、各タスクにその大きさに基づいた値を与えた場合:

  • 0-インスタント
  • 0.5-クイックウィン
  • 1-単純な変更
  • 2-いくつかの簡単な変更
  • 3-より挑戦的
  • 5-について考える必要があります
  • 8-かなりの量の作業
  • 13-おそらく分解する必要がある作業の大きな塊
  • 20-分解する必要のある大量の作業

次に、このような一連のタスクを推定したら、それらに取り組みます。アジャイル環境では、たとえば1週間に達成するポイント数の尺度である「速度」を開発します。数週間のテストと学習が完了したら(これをプロセスの一部として上司に販売できます-「数週間のテストが必要で、見積もりプロセスを理解するために学習します」)毎週プッシュできるポイントの数が増えるため、ポイントの見積もりをより簡単に時間に変換できます。

https://pm.stackexchange.com/questions/4251/why-would-teams-use-the-fibonacci-sequence-for-story-points

https://stackoverflow.com/questions/9362286/why-is-the-fibonacci-series-used-in-agile-planning-poker

セレモニーが関係しないので、これは本当に機敏ではありませんが、私はOPから彼が独力でいるという考えを得ました。うまくいけば、このアプローチはいくつかのより信頼できる見積もりを与えるかもしれません。

30
amelvin

あなたが最初に行うことは、あなたが今何かを成し遂げるのにどれくらいの時間がかかるかについてのデータを集め始めることです。チームのパフォーマンスに関するデータが多いほど、優れています。それは全面的になるでしょうが、今は心配する必要はありません。それは真実であり、上司の現実を示す必要があります。

次に、あなたは数冊の本を買いに行くつもりです。

  1. ソフトウェア推定:スティーブマッコネルによるブラックアートの謎解き
  2. Michael Feathersによるレガシーコードの効果的な使用

McConnellの本は、データの収集を開始し、それを使用してより正確な見積もりを取得する方法を説明するように指示します。 常に3ポイントの見積もりを提示してください!常に。コードの品質が悪いと見積りがどの程度失敗するかについて説明している本の部分を必ず強調してください。上司に見せてください。

会社にとって正確な見積もりが重要な場合は、Featherの本から学んだことを適用し始める必要があることを説明します。すばやく、スムーズに、予測どおりに実行したい場合は、コードのリファクタリングを開始して、テストハーネスに組み込む必要があります。私はあなたがどこにいるのか正しいです。何を壊すことができるかわからないので、開発時間は完全に予測不可能ですよね?テストハーネスに入れます。これらのテストを実行するCIサーバーも害を及ぼすことはありません。

最後に、上司に説明してください。しばらくの間はまだ少し予測できません。おそらく数年ですが、その開発は毎日簡単になり、データが増えてコードが改善されるにつれて、見積もりはより正確になります。これは同社にとって長期的な投資です。私は最近これを経験しました、ほとんど予測可能になるまでに2年近くかかりました。

見積もりよりもコードの改善について話したことを知っていますが、難しい真実は、レガシーコードベースを使いこなせるようになるまで見積もりがお粗末になることです。それまでの間、履歴パフォーマンスを使用して、所要時間を測定してください。時間が経つにつれ、見積りの仕様にコードが適合しているかどうかを考慮する必要があります。

14
RubberDuck

今私の上司は、新しいアーキテクチャで機能Xを書くのにどれくらい時間がかかるかについての見積もりを私に正しく尋ねています。しかし、現実的な見積もりを出すのに苦労しています。しばしば、上で述べた理由のためにタスクを過小評価し、時間内に完了できないために自分を困らせます。

one見積もりを送信するボックスで考えている可能性があります。私はレガシーコードで作業する必要があり、より正式な見積もりを行う場合、通常2つまたは3つを作成します。

  1. 主要な見積もり-少し時間を費やす必要があるが、アーキテクチャでは必要な変更が可能であると想定
  2. Angelic Estimate-すべてが透過的/簡単に見つけられると想定し、マイナーな変更のみを行う必要があります(これは時々省略します...特に、特定のコードベースに悪魔しかないことがわかっている場合)
  3. Abyssal Estimate-レガシーコードの基本構造が要求された機能と互換性がないと想定し、物事を機能させるために大幅なリファクタリングを行う必要があります

3つすべての見積もりは、機能自体の難易度、その一般的なコードベースでの経験、および変更についての私の直感を考慮に入れています(私が見つけた)できます非常に正確です)

これらの見積もりが出た後、私は私のマネージャーを最新の状態に保ちますどれが私たちが扱っているように見えるかについてです。深遠な機能を検討していることが判明した場合、それを犠牲にする必要があるかもしれません-それは起こりました。上司がレガシーコードの特定のチャンクに深遠な機能があることを受け入れられない場合、私は彼らに非常に困難でイライラする人生を送ることになるので、幸運を祈ります。

7
Jeutnarg

私がこの種の問題に直面したとき、私は私の見積もりに範囲を与えることに依存してきました。私は上司に「このコードベースですぐに使える正確な見積もりを行うのは困難です。頼むと、非常に広い見積もりになるでしょう」と言って、私は逃げました。見積もりとして「3日〜3年」を1回は頂きました。言うまでもありませんが、一般的な見積もりではありませんでした。

その鍵となるのは、作業の進捗に応じて見積もりを更新するという合意です。したがって、「XYZを実装する場合、どのくらい時間がかかりますか?」私の答えは「1日から4か月の間にあるかもしれません。しかし、実際にコードを数時間見てもらいましょう。そのウィンドウの不確実性を減らすことができます。」次に、コードを確認し、「2〜4週間」で戻ってきます。それはまだ理想的なウィンドウではありませんが、少なくとも管理できるものです。

これにはいくつかの鍵があります:

  • 作業中にタスクがどのように表示されるかについてするため、これらの見積もりは会話としてより適切に扱われることを上司に納得してください。これは、上司が単一の見積もりを求めただけでは得られなかった情報を入手する機会です。
  • 見積りの改善と比較して、どの取引コード開発速度を進めるかに関するオプションを提供します。回転できる追加のノブを与えます。時々、ボスはタスクが完了する必要があることを知っており、彼らは大まかな見積もりしか必要としません。また、タスクの長所と短所を実行している場合もあり、見積もりを調整する機能は貴重です。
  • 可能であれば、シナジーボーナスも提供します。多くの場合、多くのタスクにメリットをもたらすアーキテクチャの改善があります。 「今では1〜2か月かかりますが、アップグレードXでは2週間かかる」という10のタスクがある場合、アップグレードXにかかる20週間を販売する方が簡単です。

私が行くにつれて更新される範囲を受け取ることに抵抗がある上司がいる場合、私は彼らに単一の番号と私の方法論を与えます。私の方法論は、私が若い開発者として言われた経験則と ホフスターダーの法則 の組み合わせです。

タスクにかかる時間を見積もり、その数を4倍にして、それを見積もりとして与えます。

そして

ホフスタッターの法則:「ホフスタッターの法則を考慮しても、常に予想よりも時間がかかります。」

3
Cort Ammon

賢明なことが実際にコードに入り込み、すべてのブランチと他の関数の呼び出しに注意して、時間コストを見積もるように見えるかもしれません。しかし、古いコードを文書化することと、実際に新しいバージョンを書き留めることとの間に、非常に小さな違いがあります。

これが問題の解決策です。要件がない場合は見積もりできません。コーディングを開始する前に、これを行う必要があることを上司に伝えてください。いくつかの関数とモジュールの後で、それらすべてが一貫してコーディングされている(この場合は不十分)ことに気付く場合があるため、将来の見積もりを決定するためのベースラインがあります。コーディングが悪化した場合は、見積もりを調整してください。

あなたの上司は見積もりを望んでいると思いますが、この情報がどのように使用されているのかを知らなければ、見積もりがどれほど正確である必要があるのか​​わかりません。彼と会話して、調べてください。彼が上司に与える数字だけが必要な場合は、見積もりを少し大きくして数字を指定できます。これが完了するまでコードの支払いを待っているクライアントの場合、ハードラインの納期が大幅な収益をもたらすかどうかを確認してください。

2
JeffO

このような状況では、良い見積もりを出すことができるとは思いません。基本的な問題は、多くの場合、それを行うことの大部分が、何を行う必要があるかを正確に把握することです。

私はこのようなケースを、それが伴うように見えるものに基づいて見積もりを出すことによって処理しますが、驚くべきことである可能性があります。レガシーコードの方法であまり処理する必要はありませんでしたが、入力処理で非常に厄介な驚きがありました。かなり掘り下げて、あるケースでは十分なデータがないことを理解しました。それを図面に戻します。)幸い、上司はそのような見積もりを行ったときに理解しています。

1
Loren Pechtel