はじめに
本稿では、仕事をする上での作業工数の見積もり方法について説明します。
工数とは何か
工数(こうすう1)というのは、仕事において、あるひとつの作業を完了するまでにかかる総累計時間のことです。情報処理技術者試験に出てくるTAT(ターンアラウンドタイム)とは意味合いが異なります2。
例えば、ある作業に40時間(40H3)かかるとした場合、工数は40時間であるといえます。1日8時間勤務だとした場合、40時間は5人日(にんにち)と表現することができます。さらに、1ヶ月20日勤務だとした場合、0.25人月(にんげつ)と表現することもできます。
一般的に工数の単位は「人日」および「人月」で扱います。
学生時代は工数を気にすることはないですが、ITエンジニアとして会社で働くようになると、かならず工数を意識する必要があります。
なぜ工数を意識する必要があるのか
なぜ工数を意識する必要があるのかというと、社員が仕事できる勤務時間には限りがあるからです。
会社を経営している側ではなく、会社に所属しているサラリーマンは労働基準法により、労働時間の上限が決まっています。2015年の某大手の違法残業事件をきっかけに、残業規制が一段と厳しくなってきています。過労死ラインとなる時間外労働時間は80時間(1ヶ月あたり)とされています。
また、予算の都合もあります。一般的にサラリーマンは時間給4で、社員の働いた時間を給料として支払われるので、労働基準法的にセーフでも予算が不足していると、残業規制がかかることがあります。
20年以上前のバブルの時代は、「働き方改革」といった言葉もなかったですし、会社もお金がたくさんあったので、社員は異常なほどの残業をして働くのが当たり前でしたが、今はもうそのような時代ではなくなっています。
QCDのC
ITエンジニアは仕事をする際、常にQCDを意識する必要があります。
- Q=Quality, 品質
- C=Cost, 工数
- D=Delivery, 納期
本稿はQCDのうちの"C"に関するものとなります。
工数の見積もりの重要性
作業に着手する前に、まず作業にかかる工数の見積もりを行います。
前述した通り、ITエンジニアがプロとして仕事する場合、その作業に無限大の時間をかけて取り込んでよいわけではなく、かけられる時間に限りがあります。
また、ひとつの作業とは並行して別の作業を行わないといけない場合もあるため、ひとつの作業に予定以上の工数をかけてしまうと、他の作業に回す工数が足りなくなって、結果として作業進捗が遅れる原因となります。
そこで、最初に作業にかかる工数の「予測値」を決めるわけです。そして、この予測値(見積もり工数)は実際にかかる工数よりも超えない値にする必要があるため、この見積もりという作業は実は案外難易度の高い作業になり、苦手な人が多いです。
つまるところ、
実工数<見積もり工数
が成立することが重要です。
もし、実工数が見積もり工数より増えてしまった場合、その作業が完了するまでそのまま作業を進めていくしかなく、それにより他の作業に回す工数が減ってしまったとしても、どこからから工数が補充されるわけでもないため、ITエンジニアはより苦しい状況に追い込まれます。
いわば、見積もり工数は自分自身を守る盾となるため、実工数より少なくならないようにしておくことが大事です。また、実工数が見積もり工数より増えてしまった場合、たいていは見積もりを出した人の責任になります5。
工数を見積もらなくてもよいケース(?)
上長から、作業工数の見積もりもなしに、
- 急ぎの案件だから、MM/DDまでにやるように。
と作業依頼を受けた場合は要注意です。
納期優先となっている可能性があり、納品まで工数度外視な働き方をせざるを得ないことがあります。むちゃくちゃな働き方をしても問題ないというのであれば、それでもよいのかもしれませんが、おすすめはしないです。
見積もりの仕方
概要
作業工数の見積もりは論理的に計算式で表現することが大切です。一番ダメなのが適当に見積もることです。
例えば、ITエンジニアの職種がプログラマだったとして、「ソフトウェアのバグ修正」にかかる工数を見積もるとしましょう。
- とりあえず、やってみないと分からないけど、3日間ぐらいかな。
3日間なので3人日(24H)という見積もり工数となりますが、この数字に何の根拠もないので、まったく信用性がありません。ただし、仕事ができるベテランエンジニアであれば、このやり方でも問題ないです。見積もり工数が適当ではなく、経験に基づく直感によるものだから信憑性があるからです。
適当ではなく、精度が高い見積もりを行うには、以下がポイントです。
- 作業を細分化して個々に数字を出す。
- 過去の実績をフィードバックする。
- バッファを加算する。
- 上長のクロスチェックを受ける。
作業の細分化
趣味でソフトウェア開発をしている場合は、ただひたすらにプログラミングするだけであることが多く、概ね以下の流れになります。
- バグの原因を調べる
- バグのコードを修正する
- プログラムを動かして修正確認する
これが仕事となると、作業工程が大きく変わってきます。会社やプロジェクトにより文化が異なりますが、一般的には以下の流れになります。
- バグの原因を調べる。
- 原因が根本原因6であるかを判断する。根本原因でなければ1へ戻る。
- なぜ、そのバグが摘出されたのかを見解を作る。
- バグの修正方法を検討する。もっとも影響範囲が少なくなるように。
- 設計バグであれば設計書を修正する。
- ソースコードを修正する。
- エビデンス7のクロスレビューを行う。レビューが完了するまで5と6を繰り返す。
- 修正箇所に関して、プログラムの単体テストを行う。
- 修正箇所に関して、プログラムの機能テストを行う。
- 修正箇所に関して、レグレッションテスト8を行う。
以上のように、単純にソースコードを直せばよいとはならないことを理解する必要があります。一口に「バグ修正」と言っても、複数の項目に細分化されます。項目ごとに工数を見積もります。
項目 | 工数(人H) |
---|---|
原因調査 | 8 |
修正検討 | 3 |
設計書修正 | 2 |
コード修正 | 2 |
テスト項目作成 | 2 |
レビュー対応 | 2 |
単体テスト | 3 |
機能テスト | 5 |
退行テスト | 3 |
合計 | 30 |
過去の実績
作業はやはり実際にやってみないと分からないところがあるので、過去の実績があると、見積もった工数との乖離がないかを事前にチェックすることができます。
例えば、バグ修正にかかる作業の平均値が30時間であるのに、見積もった工数が20時間だとすると、乖離があり、さらに平均値より少ないため、本当にそんな少ない工数でやりきれるのが分かりません。
バッファの加算
見積もった工数にかならずバッファを足し込みます。バッファというのは余剰工数のことです。見積もりなんて、所詮は予測値でしかないため、実際に作業を進めてみると、事前に予想していなかった作業が出現することがありますし、思いのほか時間がかかる作業項目があるかもしれません。
そういったトラブルに対応するために、工数に余裕を持たせておくのです。
見積もった工数を1.5倍しておくとよいです。この「1.5倍」という数字に意味はなく、単なる筆者の経験則です。
見積もった工数×1.5
先の例では30人Hと算出されましたので、1.5倍して45人Hとします。
クロスチェック
最終的に算出した見積もり工数は上長のクロスチェックを受けます。
作業項目の見落としがないか、工数が少なすぎないかという観点で確認してもらい、問題があれば再度見積もり工数を見直します。
あとは上長にも見積もり工数に対して責任をもってもらうという意味合いもあります。
おわりに
工数は生ものです。プロジェクトが進んでいくと、当初余っていたはずの工数がだんだん足らなくなっていきます。原因は様々ですが、見積もり工数が少ないことがよくあります。
「どうして見積もり工数が少ないんだ!」と怒られないようにするためにも、きっちり見積もってから仕事を進めていきたいものですね。
-
英語表記ではMan-hours。 ↩
-
ひとつのタスクの開始から終了までの時間のことを示すが、途中割り込みが発生した場合、その割り込みも含めての総時間となるため、TATのことを工数とは言わない。 ↩
-
時間のことをHと表記する。Hourの頭文字。 ↩
-
裁量労働制になると、月の残業がみなし時間となり、例えば20時間固定となる。 ↩
-
本来は、担当者の算出した見積もり工数を承認した上長が責任を取るべきですが、現実はそうではないことが多い。 ↩
-
英語表記ではroot cause。 ↩
-
エビデンス(evidence)とは設計書やテスト項目表、レビュー記録票など目に見える形の成果物のこと。 ↩
-
退行テスト、デグレードテストとも呼ぶ。 ↩
見積もり工数∝見積り金額
になるような仕事の場合は
営業や経営に携わる上長から
「工数が高すぎる(金額が高すぎる)のでもっと少なくしてくれ」と言われることがありますね・・・
それで怒られることもしばしばあるのがつらい
記事の趣旨には同意しますが、2点気になりました。
・1点目は例にバグ修正を使っているところです。この例はまずいように思います。。
バグの原因調査の8人Hに根拠がないのではないでしょうか。
また、原因がわかっていないとその後の工数も根拠がないものになると思います。
バグの原因調査はバグの種類・内容によって概ね調査方法が限定されると思います。
その場合は大抵1,2人日で終わりますが、1、2日で判明しなかった場合や、全く意味わからん。。というバグの場合どれだけ調べても原因がわからないということもあります。
私の場合、バグの修正案件であればまずは日数を区切って原因調査のみをさせてもらいます。
上述したようにバグの原因調査は正確には見積もれないものだと思っているので最大〇〇日までと期限をきめて
調査します。そして、調査結果をまとめて報告すること。ここまでを1つのタスクと考えます。
そして、原因が判明したらその対応方法をどうするかはいくつか方法が具体的に考えられるのでそれに対して
修正工数を出すことにします。
原因がわかんなかった場合は、上司と相談してそもそもバグ修正しない他の方法というのも踏まえて対応を考えます。
↑書いてて思ったのですが、私は多分、「工数だせないような作業の場合はタスクの分割も考慮するのが正しい工数算出につながるよ」って言いたいんだと思います。
・2点目はバッファです。
社外に出す工数には営業コストなども含めて結構バッファをのせますし、それが大事だと思います。
ただし、社内で出す工数に関してのバッファは少し考え方を変える必要があると思います。
工数内に収まらない=工数出した人の責任で怒られる という図式は間違いではないですが、社内なので、遅れそうだなぁというのは早めに判断して報告するということの方がバッファを多くとることよりも大事だと思うのです。
実際には上司の考え方次第なのかもしれませんが。
また、社内工数でバッファを多くとることに対して私が問題視するのは、
「バッファを多くとる人はコスト意識は持っているのだろうか」という疑問があるからです。例えば給料が月30万の人は最低でも倍程度の利益を上げないと自分の給料を稼げていないのです。
例のバグ修正が45人Hだとすると大体5.5人日、1/4人月強といったところです。なので、15万~20万くらいの利益がでてないと採算が合ってないことになります。
だから見積もり工数を少なくしろとかバッファは多くとるな。と言いたいわけではないのです。
ないのですし、採算あってるかどうかは上司側が判断することだから気にしなくてもいいじゃん。
とも思うのです、ですが、コストのことなくして工数のバッファの話だけをするのはwagaseさんのコメントにある状況に直結する人が増えそうでよくないのかなと思った次第です。
工数はスケジュールも関係しますが線表を引き際に1人日=6hや7h換算で引くとそこでバッファが取れるので例えば工数は3人日だけど納期的には4人日とっているというバッファの取り方もあるかと思います。
最近PSPが気になっている
https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%82%BD%E3%83%8A%E3%83%AB%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E5%85%A5%E9%96%80-%E3%83%AF%E3%83%83%E3%83%84-%E3%83%8F%E3%83%B3%E3%83%95%E3%83%AA%E3%83%BC/dp/4320120132
https://en.wikipedia.org/wiki/Personal_software_process
前から気になっていることなのですが、工数見積もりには多変量解析・機械学習なんかは使えないものですかねぇ?(・へ・)
スティーブ・マコネルの「ソフトウェア見積り 人月の暗黙知を解き明かす」に書いてあったことなのですが、バッファ係数(記事中では1.5としているやつ)の振り返りという段階が有用です。
見積もりの方法はいろいろあるとしても、その数字と実績値の比を取て蓄積することで「この見積もり手法は-x%〜+y%くらいの幅があるのだな」と傾向が把握でき、バッファ係数に根拠が持てるだけでなくその幅まで示せるようになりますので。
@nakataSyunsuke さん
上記の本、そういう風に見積もりを定量化するための説明変数をいろいろと挙げてくれています。
ペーペーSEですが、2点気になりました。
・1点目
「過去の実績」と「バッファの加算」に重複を感じました。
「作業の細分化」をした結果見積もられた工数が20時間であったとして、
「バッファの加算」をして20*1.5=30時間で見積もりを提出したとします。
バグ修正にかかった作業時間の実績値が30時間で、ほぼ見積もり通り完了した。という場合、
次回以降「作業の細分化」→「過去の実績」による補正→「バッファの加算」という手順には違和感がありました。
※「過去の実績」による補正が自己見直し的な役割であれば、
上長によるクロスチェックは確認がメインではなく、
上長にも見積もり工数に対して責任をもってもらうこと(承認)がメインになるように思いました。
・2点目
「バッファの加算」について、
見積もった工数の1.5倍というのは、お客さんへ見積もりの説明をする際、
余剰工数として計上するのでしょうか。もしくは「作業の細分化」した各工程を1.5倍して計上するのでしょうか。
私の場合、余剰工数として計上できるのは1.2倍程度までで、
「作業の細分化」した各工程を1.5倍した場合、
お客さん側で持ってる「過去の実績」を元に指摘を受けてしまうので、、、
そのあたりの交渉のコツ的なものもあれば教えていただけると幸いです、、、
不確実性コーンと言うものがありまして
この記事でも触れられています。
https://qiita.com/hirokidaichi/items/5a204a57a200569f755d
プロジェクトの進捗具合にもよりますね。
経験則ですが、コーディングに掛かる時間(c)を予想してその3倍を基準(3c)に見積もるようにしています。