ソフトウェア開発における日常的な作業の量は、無視できないほどではないにしても、比較的少ないはずであり、これはソフトウェア推定の根本的な問題であると私は確信しています。
この結論に至るまでの経緯を説明し、議論に重大な欠陥があるかどうかを教えてください。
高精度で推定できるのは、日常的な作業、つまり以前に行われたことだけです。研究と創造性を含む他のすべての種類の作業は、少なくとも+/- 20%の精度では、実際には推定できません。
ソフトウェア開発はすべて、反復的なタスクを回避することです。その基本原則の1つはDRY(自分を繰り返さないでください)です。プログラマーが繰り返しのことをしていることに気付いたときはいつでも、この繰り返しを回避する抽象化を見つけるときがきました。これらの抽象化は単純なものでもかまいません繰り返しコードを関数に抽出したり、ループに入れたりするのと同じです。ドメイン固有の言語を作成するように、コードをより複雑にすることもできます。いずれにせよ、それらを実装するには、調査(以前にこれを行ったことがありますか?)または創造性が伴います。
これらの2つの点から、上記の結論を導き出します。
実際、私はこの関係がソフトウェアの見積もりに関する他のすべてのディスカッション、ブログの投稿、または記事で言及されていない理由をかなり長い間疑問に思ってきました。理論的すぎる?私の仮定は間違っていますか?それともささいなことですが、なぜ私が知っているほとんどの開発者は+/- 20パーセント以上の精度で見積もりを行うことができると思いますか?
与えられた単一のプロジェクトでは、これは本当かもしれません。ただし、長年にわたってさまざまな会社の複数の類似したプロジェクトに取り組んでいる場合は、基本的に同じ問題を何度も「解決」しているだけで、わずかな違いしかありません。
たとえば、データアクセスレイヤーを何度も作成してきたため、今月の人気のORMを使用するのではなく、「ロングハンド」を使用することを好みます。サードパーティのコンポーネントの新しい癖を見つけて解決するよりも、既知のソリューションで「日常的な問題」に対処する方が早くて簡単です。
明らかに、私は自分のORMを記述して、他の誰かのシステムに未知の癖を追加せずに反復的なコードを簡略化することができましたが、このコードは、当時私がたまたま働いていた会社に属し、他の開発者はそれと同じように風変わりですその他のサードパーティORM。
同様に、私の経験では、ほとんどのプログラミングはビジネスプロセスの自動化であり、各ビジネスは自分たちのプロセスがそれらに固有であると考えるのを好みます。実際にはそうではありません。
お見積りは簡単!簡単なことですが、最近の見積もりの問題は、コーディングに費やされた時間ではなく、要件の不備が原因であることがわかりました。
要件は3つのカテゴリに分類される傾向があります。
「私をWebサイトにしてください。クールでウィジェットを販売する必要があります」
予期しない難しい問題が発生した場合は、要件を機能的に同等なものに変更するだけで問題を回避できるため、これらは最も簡単に推定できる傾向があります。
「ヘッダーの背景色を#ff1100にします」
非常に迅速で、繰り返しになりますが、見積もりも簡単です。だが!要件は変更される可能性があります。 「ふたたび考えてみて、この別の赤を試してみてください」または「待ってください!私はその1ページだけを意味しました!」したがって、「ヘッダーの色に満足するまでの時間」のリアルタイムスパンは、コーディングの見積もりとは関係ありません。
「(フェイスブックのように)私をウェブサイトにしてください」
ここでは、「もちろん、別のロゴが必要になる」、「無限にスクロールする必要がある」、「10億人のユーザーに拡張可能でなければならない」という多数の明言されていない仮定があります。見積もりを効果的に制御します。開発者がすべてを考え、予想を「1ミーリオンマン時間」を超えて押し上げるか、または基本機能のみが必要であると考えて/想定し、低すぎる見積もりを出します。 「1週間か2週間、フェイスブックをiframeに入れたいだけだと思いますか?」
経験のあるコーディングは非常に高速ですが、設計要件は(通常)ハードビットであり、これはますます非コーダーに押し戻されます。アジャイル手法では、この責任を開発者ではなく「ビジネス」に移すことにより、コーディングの速度を上げています。
私が知っているほとんどの開発者が+/- 20%またはそれ以上の精度で見積もりを行えると信じているのはなぜですか?
なぜなら、実際の問題よりもはるかに多くの問題に対する忍耐力を推定しているからです。
ボールが跳ねるアニメーションを作成する場合、1日、1週間、1か月、または1年を費やしても、跳ねるボールのアニメーションを表示できます。うまくいけば時間をかけるほど見栄えが良くなると思いますが、ある時点で私はとんでもないことをしています。
ボールをバウンドさせるために私がどれだけの努力をしたかは、それに費やすのに妥当な時間の関数です。私のスキルレベルがそれをカットしていない場合、私はただそこに座っているボールになるかもしれません。しかし、期限が来たら、期限を遅らせるか、少なくとも画面上でボールを獲得する必要がありますか?滝はボールの跳ね返りを強く要求したため、スケジュールがずれました。アジャイルはただボールをそこに出すと言います。少なくとも、バウンスを気にかけている人がどれだけいるかがわかります。したがって、品質が低下しました。
ボールが確実に跳ね返るように心がけていますが、締め切りが迫ったときは、何もしないよりは静的なボールを作成する方が良いでしょう。そのため、代替案について話す前に、問題に費やす妥当な時間に基づいて時間を見積もります。時々、ボールはバウンドしないでしょう。時々それは大丈夫です。一ヶ月消えるのは良くない。