Murga

個人的に言いたいコト・主張・気持ち。

工数見積にはフィボナッチ数を使う

工数を見積もる時はフィボナッチ数を使うと良いよ、という、今更な話を書く。自分は何気なく使っていたのだが、知らない人もいるみたいだったので書いてみる。

フィボナッチ数とは、

0, 1, 2, 3, 5, 8, 13, 21

といった数列。「2つ前の数」と「1つ前の数」を足した数を並べていったモノだ。

この数列をグラフにすると、いわゆる「指数関数的な」形を示す。最初はゆるやかに増加している曲線が、段々と急激な増加を示す、アレである。

このフィボナッチ数を使って工数を見積もると、ズレが少なく済むというのだ。

大きな数は細かく見積もっても意味がない

自分はこうした数学的な知識に疎いので、理屈がちゃんと理解できていないが、大きな数の中で小さな差を比べてもよく分からんから、大きな数は大雑把に扱えばいい、という意味合いになるのかなと思う。

例えば、ある作業を完了するのに1時間かかるか1週間かかるか、という単位は大きな差がある。しかし、100日かかるのか101日かかるのか、といった単位だと、1日という単位は大した差ではなくなる。それに、それほど大きな規模の場合に、果たしてそれが見積どおりに実現されるかは疑問である。

だったら最初から「100か101か」で悩むことは止めて、「だいたい100」と見積もれば良いだろう、ということだ。

見積と実績のズレが均される

勿論コレは、そもそもそんな大きな粒度で見積をするな、という忠告でもある。

見積で使う数字は、フィボナッチ数列の最初の方の小さな方に留めるよう工夫すれば、その間でのズレは比較的小さく済む。

例えば、1つのタスクは1日で完了する粒度に分割すれば、そのタスクが1時間・2時間・3時間・5時間・8時間のどのくらいで終わるか、と見積もれるようになる。この数で考えていれば、「1時間で済むと思ったら2時間かかった」というズレも、「8時間かかるとおもったら5時間で済んだ」というズレも、結果的に大きなズレにはならず、中和されるというワケだ。

時間で見積もる際は「0.5」も使うと良いかと

フィボナッチ数を使った見積は、「時間」を単位にしても良いし、「作業の難易度」を評価する値に使っても良い。時間で見積もる場合は、0.5時間を加えてやると、より見積もりやすいだろう。すなわち、

  • 0.5時間 (すぐに終わるタスク)
  • 1時間
  • 2時間
  • 3時間 (この量のタスクを2・3こなすのが1日の限度)
  • 5時間 (半日はかかるタスク)
  • 8時間 (まる一日かかるタスク)

という度合いだ。

そして、8時間を超えそうだと判断したタスクは、2つ・3つに細分化すれば良い。

似たような指数・対数を使った考え方

フィボナッチ数は

  • 1・2・3・5・8・13…

という数だったが、見積に使えそうな指数・対数は他にもあるようだ。

サイトが消えているので Archive.org で紹介するが、BugbearR さんの「開発規約」より。

  • 10n (とても大雑把に考える場合)
    • 1, 10, 100, 1000, 10000, 100000, 1000000
  • ほぼ 2.2n (おすすめ)
    • 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000
  • 2n (機械的に処理する場合)
    • 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024

一番上の「10n」を除くと、フィボナッチ数列とよく似た数に収まっていると思う。フィボナッチ数が覚えにくい場合は、「1・2・5・10」や、倍々ケームの「1・2・4・8」でも大差は出ないので、これらを使っても良いだろう。

ちなみに、こうした見積がうまくいく理由も数学的に説明されていた。

なぜ対数だとうまく行くか?

常に2倍の見積もり誤差が発生すると仮定すると、

n ≒ N n/2 <= N <= n*2 n: 見積もった値 N: 実際の値

となる。

変形すると、

2^t ≒ N 2^(t-1) <= N <= 2^(t+1) ただし t = log_2(n)

となる。

実際の工数が見積から2倍ズレていたとしても、こうした対数を使っておけばその範囲内に収まるから、大きなズレは起こりにくいということですな。


というワケで、数学が苦手な人も、「フィボナッチ数」だけは覚えておいて損はないだろう。

Neo's Release Notes v29.05.1 (2020-05-03)

5月に入りました。先週は書きそびれました。

先週立てた「今週の目標」と振り返り概要

2020-04-26 ~ 2020-05-02 の目標を振り返る。

…が、先週書き忘れていたので省略。あったことだけ振り返る。

  • 故障していたガレリア XG 君が原因不明なまま返されるが、自宅でやはり電源が付かず。再度送ると電源の故障と判明。3万程度で修理してもらい、今は復旧している
  • まる1ヶ月、フルリモートで仕事していたが、特に問題なし。変に口頭コミュニケーションを取りたがるズレた奴がいて辟易しているが、それ以外は問題なし
  • Netflix 視聴履歴 : 10本
    • ポセイドン・アドベンチャー
    • 300
    • 300 帝国の進撃
    • コンテイジョン
    • キックボクサー
    • Super 8
    • V・フォー・ヴェンデッタ
    • アニー
    • Ray
    • シャイニング
  • テレビでの映画視聴履歴 : 4本
    • ハンニバル
    • ネバーセイ・ネバーアゲイン
    • 美女と野獣
    • イレイザー
  • この2週間での視聴履歴をまとめて書いた
  • Netlify Functions を使ってみた。AWS Lambda を無料で使える感じでよきよき。Misskey、Mastodon などにクロスポストするスクリプトを書けた

そして昨日 5/2 (土)、一日不調だったことから連絡してみると、いよいよ「出動命令」が。5/3 (日) の今朝がたには状況が進んだようで、11時から「最後の部屋」に向かうと、11:39 に「リリース」できたそうだ。とても早かった…!自分はコロナの影響もあり現場にいられなかったが、全て無事に完了したそうで、一安心。よかつたよかつた。

今週の予定

2020-05-03 ~ 2020-05-09 の目標。コレまで適当な順番で並べていたが、今週からは、一番大事な「生活」、次に大事な「個人」、最後に「仕事」という順番で考えるようにしようと思う。

  1. 生活
    • まずは妻に感謝。ねぎらう。直接会いに行けないのが残念だが、ゆっくり休んでもらおう
    • 「新メンバ」のネーミング
    • しばらく一人暮らしになるので、自分で体調崩したりしないよう過ごす
  2. 個人
    • あまり個人的なことはやっていられないかも。暇があったらブログ記事を書き溜めようかな
  3. 仕事
    • 今週は GW でほとんど休みだが、全部休みにしちゃうかも。会社に早めに連絡して調整してもらう

色々とボカして書いているが、落ち着いたらまたまとめて書こうかなと思っている。今日は素晴らしい日だ。一人で頑張ってくれた妻にも、とても感謝している。自分もできることをやらねば。


角松敏生 夜の蝉 (NO TURNS TOUR)

NO TURNS(初回生産限定盤/Blu-spec CD)

NO TURNS(初回生産限定盤/Blu-spec CD)

  • アーティスト:角松敏生
  • 発売日: 2009/03/18
  • メディア: CD

Neo's Release Notes v29.04.4 (2020-04-26)

2020-04-26 ~ 2020-05-02。

やってしまった。先週の予定立てそびれた。数合わせのために遅れながら書く。

先週立てた「今週の目標」と振り返り概要

2020-04-19 ~ 2020-04-25 の間の目標としていたモノを振り返る。

  • 仕事
    • 粛々と開発を進める → 達成
  • 生活
    • レンタルの手配を行う → 達成
    • 連絡先・段取りの再確認をしておく → 達成
  • 個人
    • ブログ記事の下書き・予約投稿を進める : あちこちに下書きが散在していそうなので、要整理 → 達成

生活関連の準備が一番の重要事項。嫁さんが一番影響するので嫁さん自身にやってもらったところがほとんどだが、一応達成。

今週の目標

2020-04-26 ~ 2020-05-02 の間の目標、ということだが、過ぎてしまったので割愛。

生活関連の変化が大きいので、ドキドキ。