誠ブログは2015年4月6日に「オルタナティブ・ブログ」になりました。
各ブロガーの新規エントリーは「オルタナティブ・ブログ」でご覧ください。

実務経験者なら、仕事算問題にはこう解答すべき

実務経験者なら、仕事算問題にはこう解答すべき

島田 徹

株式会社プラムザ 代表取締役社長。システムコンサルタント。1998年に28歳で起業し、現在も現役のシステムエンジニア、コンサルトとして、ものづくりの第一線で活躍しつつ、開発現場のチームとそのリーダーのあり方を研究し続けている。

当ブログ「そろそろ脳内ビジネスの話をしようか」は、2015年4月6日から新しいURL「​http://blogs.itmedia.co.jp/noubiz/」 に移動しました。引き続きご愛読ください。



読売新聞の就活ON!というコーナーにこんな記事が載っていました。


【問題】

完成するのにA1人だと40日、B1人だと120日かかる仕事がある。

[1] この仕事をAとBの2人で協力して行った場合、完成までに何日かかるか。

[2] Aが1人で仕事を始め、途中からBと交代して、Bが1人で仕事を行ったところ、ちょうど100日目で完成した。Aが仕事を行ったのは何日か。

[3] AとBの2人が協力して20日、仕事をした後、Cも参加して3人で6日で仕事を完成させた。この仕事をCが1人で行った場合、何日で完成するか。

難易度 ★☆☆ 制限時間 (3問で)4分


(読売新聞 2014年5月13日 朝刊 就活ON! 筆記試験セミナーより)

この正解が

正解:[1]30日、[2]10日、[3]45日 (計算式略)

とのこと。

ふむふむ、なるほど。

この手の計算は、物事を単純化して定量的に比較できるかどうかを測る上では有効なのかもしれません。

が、しかし!

こんな計算が適合するシチュエーションというのは、データ入力やレジ打ち業務ならあるかも知れませんが、本当の意味で『チームで協力してやる』ような業務だとかなり非現実的です。

うちの採用面接はこういったペーパーテストは行わず、口頭ベースで和やかに進めていくわけでございますが、もし応募者が1000名とかになってしまい、気の迷いからやってしまったとしましたら、期待する答えはかなり違います。

難易度 ★★★ 制限時間 (3問で)30分

今回、こんな感じで難易度や制限時間を変えまして、ちょっとやってみたいと思います。

 

[1] この仕事をAとBの2人で協力して行った場合、完成までに何日かかるか。


【リソース分析】

まず、投入可能な人的リソースを分析します。

設問の前提条件を見ると、AとBは開発速度に3倍のスピードがあります。

ただ、本当に優秀なプログラマは、それ以外の並のプログラマの10倍以上のパフォーマンスの違いがあり、経験上、そのスーパーサイヤ人なプログラマと並のプログラマの中間層というのは極めてレアですので、AもBも「並」レベルのプログラマであり、Bはプログラム経験が1年未満の初心者、Aは3年以上のそこそこやる中級者と考えられます。


【作業規模分析】

次に本プロジェクトの規模ですが、中級者であるAが1人でやって40日かかるボリュームとのことなので、40人日(=2人月)とします。


【作業方針】

さて設問では、これをAとBで協力して作業すると何日かかるか?と問うて来てます。

協力すると言っても、開発業務において同じ作業を等しく分担して行うことことはまず100%ありません。クラス設計やDB設計、コーディングや命名則のポリシーが衝突して、ろくなものができません。

そこで、Aが詳細設計を行い、かつほとんどの実装作業も行ってしまいます。Bは初心者ですからマスタメンテナンス機能の実装などを行いながらAの設計思想を学びます。また帳票や集計などがあれば、そこについては途中までAが実装して、Bが引き継ぐという手伝いも可能だと思います。


【工数予測】

しかしながらこのような体制で作業を行った場合、それほど工数の削減は見込めません。

工数があまり減らない原因は、

・Aの詳細設計がある程度まとまるまでBが作業を開始できない

・Aの設計思想をBが吸収するのにオーバーヘッドがかかる

・Bからの質問応対によってAの手が止まってしまう

・AからBへ作業指示を出したり相互に進捗の確認を行う必要がある

・ソースのマージやコンフリクトの解決に手間取ることがある

そういったことを勘案すると、全体の工期は現実的には10~5日程度しか削減できないと思います。

今回のような小規模案件ではなく、4人月、8人月といったもう少し大きな規模のプロジェクトだと2名投入するメリットが大きく現れてくると思いますが。


答え 30~35日



[2] Aが1人で仕事を始め、途中からBと交代して、Bが1人で仕事を行ったところ、ちょうど100日目で完成した。Aが仕事を行ったのは何日か。


【リソース分析】

[1]と同様

【作業規模分析】

[1]と同様

【状況分析】

設問に、先にAが先行して実装作業を開始して、途中でBに引き継いだとあります。

これは詳細設計や簡単な処理の1系統の実装あたりまでをAが行い、その開発思想をBに引き継がせれば、大きく脱線することはないとマネージャとAとで判断したものと思われます。

これ発想自体は悪くありません。おそらく2人月規模のプロジェクトですから、初めの1/4くらい(10人日)を設計とサンプルプログラムの開発にあて、Bに引き継いだものと思いますね。

しかしながら、全体の工数が100日かかってしまっています。

中級者Aが実装して40日で済む作業を、100日もかけてしまっているわけですが、これが内部的な問題になっていないはずがありません。(ここに注目しない解答はかなりの減点になってしまうと思われます。)

通常、パフォーマンスの差が3倍あっても給料は1.5倍程度しか違わないものです。仮にAの給与が45万、Bが30万とすると、Aが単独で行っていれば人件費が90万円で済んだところを、Bが途中で引き継いだことにより少なくとも30*(100/30)=100万円以上かかってしまっています。Bも「これはやばい」と思って毎日早朝出社し、終電まで頑張ったはずですので、この会社がホワイト体質であれば、残業代や深夜手当もプラスされ、部署内でかなりの問題になったはずです。

また、2人月規模の仕事に対して3ヶ月以上の工期を費やしてしまったことによる顧客からの信用失墜も大きいことが予想され、マネージャは「これが上層部に漏れるとまずい」ということで、この100日の途中で顧客のところには菓子折を持っていくとともに、なんらかのテコ入れをしたと考えるのが自然です。

本来の目論見としては、BはAから作業を引き継いで一人で完了させるはずで、マネージャもBをせっついたことでしょうが、実装開始から60日を過ぎたあたりで、『こりゃどうにもならん』と判断してAを密かに引き戻したのではないでしょうか。

プロジェクトに引き戻されたAは、Bの作業によってぐっちゃぐちゃになったソースを見て、途中まで頑張って直していったが、70日目の段階で初めから作った方が早いと判断して、かつてBへ引き継いだ段階のブランチに戻しました。

そこからまた作り始め、なんとか実装を完了したというわけなので、Aの実質的投入工数は初めの10日と、60日目から100日までの40日の、合計50日です。

Aは本来このプロジェクトを40日で仕上げる能力がありますので、これはかなりしっくりくる値です。

ただし、Aの工数はまったく別の保守作業案件に計上されており、マネージャからは本件について一切口外しないようにと緘口令が敷かれていますので、本設問に対する答えとしては初期の「10日」が正解で、それ以外のいかなる事情説明も許されません。


答え 10日

(偶然、読売新聞の模範解答と合致しましたが、式が違います)




[3] AとBの2人が協力して20日、仕事をした後、Cも参加して3人で6日で仕事を完成させた。この仕事をCが1人で行った場合、何日で完成するか。


【リソース分析】

AとBの実力は[1]と同様。

さて、Cについてですが、[1]の設問の回答にあった通り、AとBが協力して作業しても30~35日という工期がかかる状況で、20日目から突然アサインされて、6日でプロジェクトを終わらせています。

通常、他人が決めた設計思想を吸収し、それに慣れ、パフォーマンスを出すのには3~4日はかかりますから、アサインされて6日で終わらせてしまったというのであれば、Cが前述のスーパーサイヤ人系のプログラマの可能性が高いです。

おそらくCはAの10倍の実装速度を出します。そうでなければ、20日も進んでしまったプロジェクトに突然アサインされて驚異的な工期削減を実現する説明がつきません。


【作業規模分析】

[1]と同様

【状況分析】

Cはそれまで別のプロジェクトにアサインされていたが、マネージャの予測を遥かに短い工期で終わらせてしまったので、暇つぶしがてら社内の出退勤システムを音声で打刻できるプログラムを開発していたと推測します。

そこへマネージャがやってきて「そんないかりや長介の真似で『おいっす!』と言うと出勤打刻がされるプログラムとかいいから、ちょっとAとBがやってるプロジェクトを見てやってよ」と言います。

Cは「まあ音声認識は昼、サバ煮定食を食べてる時に左手でやればいいや」と思い、本プロジェクトのリポジトリを見てみると、突然眩暈に襲われたはずです。

「この思想を引き継いでやり続けることは無理…」

そう判断したCは、AとBに「マネージャから作業を手伝ってほしいと言われたのですが、こことこことこことこのあたりのクラス、それとこことこことこことこことこの辺のDB定義を直したいんですが」と相談します。

Aは「馬鹿なことを言うなよ。もうこれで1カ月もやってきてるんだよ。影響範囲が大きすぎる。」と突っぱねます。

Cは「わかりました。。じゃあ僕は僕で同じシステムをゼロから作ってみますから、早く出来上がった方を納品してはどうでしょう。」と言い、Aは「なにふざけたこと言ってんだ。やってみてこっちの方が早かったら俺はマネージャにCはまったく手伝わなかったと言うからな。」と言って対決の火蓋は切って落とされたものの、Cはそれから連日の徹夜をし、あっという間に作業を完了してしまった。

それがCがアサインされてから4日後というところでしょう。

涙目のAから報告を受けたマネージャは怒り、

「おいC!そういうスタンドプレーをやれって言ったんじゃないぞ!」

とは言ったものの、Cは自席でPCに向かって『おいっす!』『おいーっす!』とばかり言っており埒があかず、確かに出来上がったシステムは完成度が高くバグもほとんど見つけられず、またAとBの進捗はまだまだ完成の目処が立たない状況だったために、その後の2日間でAとBをなだめ「今回はCのやつで納品させてくれ。Cは人格的に問題があるが腕は超一流なので写経してみるのも勉強になるかもしれないよ。」などという話になった。

それで、26日目で完成となったという状況と思われます。

スーパーサイヤ人系プログラマは、並のプログラマの10倍のパフォーマンスを出します。

よって、40人日の仕事は4日で終わらせます。これは上記の一連の推論にちょうど符合する値です。

ただし、開発会社の経営は属人性排除、カバー体制の確保の視点も重要でしょうから、Cのとった行動は許されるべきものではないと思います。


答え 4日

以上、どうでもいいお話にお付き合いいただきましてありがとうございました。