最近、非常に古いモノリシックアプリケーションをマイクロサービスベースのアーキテクチャに移行するプロジェクトに取り組み始めました。
レガシーコードベースは非常に乱雑です (( 'spaghetti code') で、明らかに単純な関数(たとえば、 "multiplyValueByTen"と名付けられている)は後に、 "3行にわたる10テーブルを含む数千行の検証コード別のスキーマ」。
現在、上司は(正しい)新しいアーキテクチャで機能Xを作成するのにかかる時間を見積もるように求めています。しかし、現実的な見積もりを出すのに苦労しています。多くの場合、私は非常に上で述べた理由によりタスクを過小評価し、時間内に完了できないために自分を困惑させます。
賢明なことが実際にコードに入り込んで、すべてのブランチと他の関数の呼び出しを記録し、時間コストを見積もるように見えるかもしれません。しかし、古いコードを文書化することと、実際に新しいバージョンを書き留めることとの間に、非常に小さな違いがあります。
このようなシナリオにどのように取り組むべきですか?
レガシーコードのリファクタリングがどのように機能するかは完全に理解していますが、私の質問は「リファクタリング/リライトを行う方法」ではありません。しかし、「パーツXのリファクタリング/リライトにはどのくらい時間がかかりますか?」に対して現実的な答えを出すことについて。
Bob Martinの「Clean Coder」(および、「Clean Code」)をお読みください。以下は記憶からのものですが、私は強く自分のコピーを購入することをお勧めします。
あなたがする必要があるのは、3点加重平均です。作業ごとに3つの見積もりを行います。
あなたの見積もりは(a + b + 2c)/ 4
編集:
私がこれに答えたときの私の仮定:
この場合、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は、承認を得るためにプロジェクトボードに短い見積もりを与え、プロジェクトチームをいじめ、彼らが約束した非現実的な締め切りに到達しようとします。唯一の防御策は、あなたの見積もりを与え、それらに近づくのを見ることができるように記録してください。
これは、準アジャイルアプローチを導入する良い機会かもしれません。時間/日で見積もる代わりに、フィボナッチタイプのスケールを割り当て、各タスクにその大きさに基づいた値を与えた場合:
次に、このような一連のタスクを推定したら、それらに取り組みます。アジャイル環境では、たとえば1週間に達成するポイント数の尺度である「速度」を開発します。数週間のテストと学習が完了したら(これをプロセスの一部として上司に販売できます-「数週間のテストが必要で、見積もりプロセスを理解するために学習します」)毎週プッシュできるポイントの数が増えるため、ポイントの見積もりをより簡単に時間に変換できます。
https://stackoverflow.com/questions/9362286/why-is-the-fibonacci-series-used-in-agile-planning-poker
セレモニーが関係しないので、これは本当に機敏ではありませんが、私はOPから彼が独力でいるという考えを得ました。うまくいけば、このアプローチはいくつかのより信頼できる見積もりを与えるかもしれません。
あなたが最初に行うことは、あなたが今何かを成し遂げるのにどれくらいの時間がかかるかについてのデータを集め始めることです。チームのパフォーマンスに関するデータが多いほど、優れています。それは全面的になるでしょうが、今は心配する必要はありません。それは真実であり、上司の現実を示す必要があります。
次に、あなたは数冊の本を買いに行くつもりです。
McConnellの本は、データの収集を開始し、それを使用してより正確な見積もりを取得する方法を説明するように指示します。 常に3ポイントの見積もりを提示してください!常に。コードの品質が悪いと見積りがどの程度失敗するかについて説明している本の部分を必ず強調してください。上司に見せてください。
会社にとって正確な見積もりが重要な場合は、Featherの本から学んだことを適用し始める必要があることを説明します。すばやく、スムーズに、予測どおりに実行したい場合は、コードのリファクタリングを開始して、テストハーネスに組み込む必要があります。私はあなたがどこにいるのか正しいです。何を壊すことができるかわからないので、開発時間は完全に予測不可能ですよね?テストハーネスに入れます。これらのテストを実行するCIサーバーも害を及ぼすことはありません。
最後に、上司に説明してください。しばらくの間はまだ少し予測できません。おそらく数年ですが、その開発は毎日簡単になり、データが増えてコードが改善されるにつれて、見積もりはより正確になります。これは同社にとって長期的な投資です。私は最近これを経験しました、ほとんど予測可能になるまでに2年近くかかりました。
見積もりよりもコードの改善について話したことを知っていますが、難しい真実は、レガシーコードベースを使いこなせるようになるまで見積もりがお粗末になることです。それまでの間、履歴パフォーマンスを使用して、所要時間を測定してください。時間が経つにつれ、見積りの仕様にコードが適合しているかどうかを考慮する必要があります。
今私の上司は、新しいアーキテクチャで機能Xを書くのにどれくらい時間がかかるかについての見積もりを私に正しく尋ねています。しかし、現実的な見積もりを出すのに苦労しています。しばしば、上で述べた理由のためにタスクを過小評価し、時間内に完了できないために自分を困らせます。
one見積もりを送信するボックスで考えている可能性があります。私はレガシーコードで作業する必要があり、より正式な見積もりを行う場合、通常2つまたは3つを作成します。
3つすべての見積もりは、機能自体の難易度、その一般的なコードベースでの経験、および変更についての私の直感を考慮に入れています(私が見つけた)できます非常に正確です)
これらの見積もりが出た後、私は私のマネージャーを最新の状態に保ちますどれが私たちが扱っているように見えるかについてです。深遠な機能を検討していることが判明した場合、それを犠牲にする必要があるかもしれません-それは起こりました。上司がレガシーコードの特定のチャンクに深遠な機能があることを受け入れられない場合、私は彼らに非常に困難でイライラする人生を送ることになるので、幸運を祈ります。
私がこの種の問題に直面したとき、私は私の見積もりに範囲を与えることに依存してきました。私は上司に「このコードベースですぐに使える正確な見積もりを行うのは困難です。頼むと、非常に広い見積もりになるでしょう」と言って、私は逃げました。見積もりとして「3日〜3年」を1回は頂きました。言うまでもありませんが、一般的な見積もりではありませんでした。
その鍵となるのは、作業の進捗に応じて見積もりを更新するという合意です。したがって、「XYZを実装する場合、どのくらい時間がかかりますか?」私の答えは「1日から4か月の間にあるかもしれません。しかし、実際にコードを数時間見てもらいましょう。そのウィンドウの不確実性を減らすことができます。」次に、コードを確認し、「2〜4週間」で戻ってきます。それはまだ理想的なウィンドウではありませんが、少なくとも管理できるものです。
これにはいくつかの鍵があります:
私が行くにつれて更新される範囲を受け取ることに抵抗がある上司がいる場合、私は彼らに単一の番号と私の方法論を与えます。私の方法論は、私が若い開発者として言われた経験則と ホフスターダーの法則 の組み合わせです。
タスクにかかる時間を見積もり、その数を4倍にして、それを見積もりとして与えます。
そして
ホフスタッターの法則:「ホフスタッターの法則を考慮しても、常に予想よりも時間がかかります。」
賢明なことが実際にコードに入り込み、すべてのブランチと他の関数の呼び出しに注意して、時間コストを見積もるように見えるかもしれません。しかし、古いコードを文書化することと、実際に新しいバージョンを書き留めることとの間に、非常に小さな違いがあります。
これが問題の解決策です。要件がない場合は見積もりできません。コーディングを開始する前に、これを行う必要があることを上司に伝えてください。いくつかの関数とモジュールの後で、それらすべてが一貫してコーディングされている(この場合は不十分)ことに気付く場合があるため、将来の見積もりを決定するためのベースラインがあります。コーディングが悪化した場合は、見積もりを調整してください。
あなたの上司は見積もりを望んでいると思いますが、この情報がどのように使用されているのかを知らなければ、見積もりがどれほど正確である必要があるのかわかりません。彼と会話して、調べてください。彼が上司に与える数字だけが必要な場合は、見積もりを少し大きくして数字を指定できます。これが完了するまでコードの支払いを待っているクライアントの場合、ハードラインの納期が大幅な収益をもたらすかどうかを確認してください。
このような状況では、良い見積もりを出すことができるとは思いません。基本的な問題は、多くの場合、それを行うことの大部分が、何を行う必要があるかを正確に把握することです。
私はこのようなケースを、それが伴うように見えるものに基づいて見積もりを出すことによって処理しますが、驚くべきことである可能性があります。レガシーコードの方法であまり処理する必要はありませんでしたが、入力処理で非常に厄介な驚きがありました。かなり掘り下げて、あるケースでは十分なデータがないことを理解しました。それを図面に戻します。)幸い、上司はそのような見積もりを行ったときに理解しています。