後期プロジェクトに人を追加すると、なぜそれが後になるのですか?


25

遅いプロジェクトにプログラマを追加すると事態が悪化するというのはかなり一般的な格言です。どうしてこれなの?


14
この用語は、ブルックスの法則です(en.wikipedia.org/wiki/Brooks's_law)。
マクニール

7
アドバイス:ブルックスの「The Mythical Man-Month」を読んでください。これは、その格言がどこから来たのかを示し、非常に読みやすい本であり、フィールドの誰もがそれを読むべきです。
デヴィッドソーンリー

そのウィキペディアのページは非常によく書かれています。
ヘンリー

生産性は、チームのサイズとともに減少するかの証拠について(7人のチームメンバーを超えて使用すると、収穫逓減に入る)、参照qsm.com/process_improvement_01.htmlを
Joeri Sebrechts

回答:


33

導入オーバーヘッド

新しい開発者はそれぞれ、コードベースと開発プロセスを紹介する必要があり、新しい人の時間だけでなく、[a]シニア開発者からの支援も必要です(ビルドプロセスのガイド、テストプロセスの説明、支援コードベースの落とし穴、より詳細なコードレビューなど)

したがって、プロジェクトに追加する新しい開発者が増えるほど、プロジェクトに実際に貢献できるポイントに到達するまでに多くの時間が費やされます。


「はじめに」を最適化すると、影響は少なくなりますか?
ヘンリー

9
@Henry:問題は、通常、その側面をボトルネックでない程度に最適化できないことです。新しいプログラマーは、最初はプロジェクト、コード、プロセスについて正確に0を知っています。新しいチームメンバーを追加するときに常に必要となるオーバーヘッドと同じです。しかし、プロジェクトがすでに遅れている場合、チームは適切な紹介を行う時間がないことが多く、その場合、実際の開発には時間が足りません。したがって、それは通常、チームにとって負けの状況であり、新しい人がプロジェクトに有意義に貢献できるようになるまで、はるかに長い時間がかかります。
Baelnorn

導入のコストについては、一度ビデオ録画してから多くの人にブロードキャストして、多数の新しいプログラマーを一度にトレーニングできるのではないでしょうか?(例:開発者の会議または会議。)
rwong

7
@rwong:それは悪い考えではありませんが、これは通常実用的ではありません。情報を提示するだけではなく、新しい人にそれを理解してもらう必要があります。さらに、それらが本当に新しい(最近の卒業生)の場合、通常一度にすべてを提示するには情報が多すぎます。Wikiはすべての情報が1つの場所にあり、理解できない部分がある場合は質問を投稿できるため、Wikiがうまく機能することがわかりました。
TMN

1つの可能性は、非常に有能な新しい人を割り当て、他の人を煩わせることなく特定のタスクを実行させることです。彼らはひどくヒラメし、ゆっくりと働き、一部のマネージャーやチームはこれを見ることができません。ただし、この方法で管理する場合、新しい開発者はネットプラスになる可能性があります。
デビッドソーンリー

32

他の答えに加えて、考慮すべきもう1つの要素はコミュニケーションです。

チームのコミュニケーションチャネルの量の最悪のケース(珍しいことではありません)は、完全なグラフです。ご想像のとおり、1人の開発者を追加するだけで、コミュニケーションチャネルを大幅に増やすことができます。より合理化された通信方法を使用すると、影響は少なくなりますが、それでも増え続けます。


私はほぼ同時に同じことを書いていました!しかし、私はそれが名前(完全なグラフ)を持っていたことを新しくしませんでした、そして、あなたの説明はより良いです、それで私の投票に行きます。
ミゲルベロソ

+1。同意します。これは、チームメンバーを追加する際の最大の問題です。
マーティンウィックマン

プロジェクトへの人の追加に伴うより長期的な問題に対して+1。
indyK1ng

23

この法律で最初に公布された本「神話の男月」に引用されている問題はコミュニケーションです。彼は言うことから始めます:

男性と月は、タスクを多くのワーカー間でコミュニケーションなしで分割できる場合にのみ交換可能な商品です。これは小麦の刈り取りや綿の摘み取りにも当てはまります。システムプログラミングについてもほぼ当てはまりません。

彼は問題の一部としてトレーニングに言及しています:

コミュニケーションの追加の負担は、トレーニングと相互コミュニケーションの2つの部分で構成されています。各従業員は、テクノロジー、取り組みの目標、全体的な戦略、および作業計画についてトレーニングする必要があります。このトレーニングは分割できないため、作業のこの部分はワーカーの数に比例して変化します。

...しかし、相互通信がはるかに大きな要因であることに注意してください:

ソフトウェアの構築は本質的にシステムの努力であるため(複雑な相互関係の演習)、コミュニケーションの努力は多大であり、パーティション分割によってもたらされる個々のタスク時間の短縮をすぐに支配します。男性を追加すると、スケジュールが短くなるのではなく、長くなります。

フレッドブルックス(著者)が彼が何について話しているかを知る背景を持っていることも注目に値します。この本の大部分は、IBMのOS / 360プロジェクトの管理経験に基づいています。何十年もの支持者があらゆる方法で「改善された」管理方法を説き、一部の人はそれに慣れるとクールな名前(eXtreme、Agile、Scrumなど)を思いつきますが、それ以来本質1はほとんど変わっていないようです。

1「本質」の定義については、The Mythical Man-Month 20th Anniversary Editionに含まれている同じ著者の「No Silver Bullet:Essence and Accident in Software Engineering」を参照してください。


12

単なる格言ではありません。検証可能です。ブルックスの「The Mythical Man-Month」をご覧ください。


1
それは格言です。検証可能であってもなくても、それが格言であることを止めるわけではありません。
ピーターボートン

3
私はこの本を持っていません(明らかに)。これはハードナンバーでバックアップされていますか、それとも逸話ですか?
ヘンリー

2
@Henry:読んでからしばらく経ちましたが、IIRCの両方とも、結論を出すのに十分な量です。
スティーブンエバーズ

@ピーター:私の答えを編集しました。
ジョン

@PeterBoughtonそれは格言です。また、単なる格言ではありません。
-SantiBailors

6

この問題に関するいくつかの考えがあります...

  • 現在のリソースを使用して、プロジェクトで何が行われているかについて新しいリソースをスピードアップする必要があります。
  • 新しいリソースはコードベースに慣れていない可能性があるため、コードに慣れるにはさらに時間が必要です。

現在、テスト用の新しいリソースを追加することは悪い考えではないかもしれません...テストプロセスを高速化する可能性があります(テストケースが適切に記述されている場合)。テストツールを使用することも役立ちます。


1
開発ではなく、テストにリソースを追加するための+1。
Baelnorn

4

プログラミングは基本的な生産ラインの仕事ではないからです。ソフトウェアプロジェクトの速度を上げるには時間がかかります。新規の人々は、否定的な生産性につながる多くの質問をする必要があります(すなわち、新しい人が学習し、古い人がそれらを教える->実際の作業が完了しない)。

それを単純化するために、1週間行く予定の比較的単純な1人のプロジェクトを想像してください。その時点で別のプログラマーを追加する場合、プログラマー1と少なくとも数時間または1日程度作業する必要があり、多くの質問をして速度を上げるなどする必要があります。週の残りの期間の純生産性。新しいプログラマーは(プログラマー1と同様に既存のコードも知らないので)いくつかの余分なバグを導入する可能性があります。そのため、実装とテストのサイクルがあと1、2日で吹き飛ばされます。このプロジェクトは、元のプロジェクトの代わりに2週間で簡単に継続します!


さて、あなたの例は、プロジェクトに残された非現実的な短い期限によって少し工夫されています。それを1か月に変更すると、それは必ずしも必要ではないことがわかります。個人的には、引用は悪用されたと思います。普通のプログラマー、平均的/貧弱なプログラマーを考えるとき、それは真実です。優れたプログラマーがいて、締め切りが1日または1週間のような非現実的なものではない場合、引用は間違っています。
n1ckp

@ n1ckその一般化-「あまりにも多くの料理人」のように-重要な点は、単にプロジェクトに人材を投入するだけでは、必ずしもそれがより速く解決されるとは限らないということです。1人から2人?おそらくそうなります。2から4?変数が多すぎる-プロジェクトのサイズと構造に依存します。4-> 8?間違いなく限界に達している(少なくとも費用対効果の点で)。
マーフ

@Murph:あなたは私とほとんど同じことを考えているように見えますが、あなたはあなたの方程式で非常に重要な変数を1つ忘れました:追加された人材のスキルレベル。それは私の最後のコメントにあったので、あなたがそれを見逃したのは奇妙だと思います。もちろん、人力を盲目的に追加することは解決策ではありません。非常に専門化された人材(多くは必要ありません)を追加することはもちろん役立ちますが、それは神話上の月間見積もりに欠けていたものです。それが私のポイントでした。それ以外の場合、引用が何を意味するかについてはすでに知っています。
n1ckp

わかりました、例はより良いかもしれませんが、一般化はまだ有効ですか?
マーフ

1
MIGHTが非常に特殊なケースで機能することの1つであることを知るのに十分な時間を過ごしましたが、99%の時間は機能しません。当時の理論上は、どんなに良く見えても。そうは言っても、それは白黒の絶対的なものではありません。もっとオープンな関係がうまくいかないというようなものです。理論は素晴らしく、魅力的です;)....しかし、獣の性質は、ほとんどの場合、それが失敗するようなものです。「例外がルールを証明する」ことの並べ替え。
ボビーテーブル

4

フレッド・ブルックスは、この質問に答える本「The Mythical Man-Month」全体を書きました。

クイックアンドダーティバージョンは次のとおりです。

1)より多くのプログラマーに割り当てるために、プロジェクトを個別の部分に分割できる量には制限があります。

2)プロジェクトをより多くの人に分割すると、アプリケーションのすべての部分を調整するために必要なコミュニケーションの量が増えます。より多くのコミュニケーション=より多くの仕事。

3)プロジェクトに追加するすべての人に対して、チームにナビゲートする必要がある複数のコミュニケーションチャネルを追加します。この数は幾何学的に増加し、発生しなければならないコミュニケーションの量を増やします。より多くのコミュニケーション=より多くの仕事。

4)各チームメンバーを追加すると、「Jカーブ」があります。つまり、既存の生産的リソースは、新しい人々がプロジェクトに取り組むのに費やす可能性のあるスピードに時間を費やす必要があります。最終的には容量を増やすことができますが、プロジェクトが一時的に遅くなります。プロジェクトの後半で学習する必要があるものが多いほど、効果がより顕著になります。


4

私が言及しなかった別の要因は、いくつかのタスクが特定の順序で実行される必要があるということです。タスク3は3に依存しているため、タスク3が完了するまでタスク4を実行することはできません。誰かがタスク3を実行すると同時にタスク4を実行する人を雇うことは何の役にも立ちません。 、他のタスクを最初に完了する必要があるタスクが残りのタスクです。

また、多くの場合、実行が必要な最も複雑なタスクの一部であり、すでに完了したものを壊さないように設計全体を最もよく理解する必要があるタスクです。また、通常、最も広範なビジネスドメインの知識も必要です。プロジェクトに数ヶ月取り組んだ後、1​​週間以内にタスクを実行できるようになるかもしれません。新しい人は1週間以上かけてスピードを上げ(質問に答えるためにその時間に十分な注意を払ってタスクから引き離します)、非常に熟練していてもタスクを実行するのに時間がかかります。彼または彼女は有能ではありませんが、プロジェクトまたはデータベースバックエンドの実際の構造に不慣れなためです。


+1。これは私の最後の仕事での大きな問題でした。経営陣は、物事を熟考することなく、大規模なプロジェクトを大々的に「人月追加」する熱狂でした。ある時点で、私たちのチームはその速度が遅いために訓練を受けました-私たちのものはその主要なプロジェクトと統合する必要があったからです。ので、しかし、その後、主要なプロジェクトの新入社員は、十分に速い速度まで得ることができなかった私たちはあまりにもはるか先(必要なものになった彼らのバックエンドが完成します)。ある時点で、私たちは中途半端なバックエンドとテストハーネスのフロントエンドを開発していました。良い流れではありません。
ボビーテーブル

2

私のためにいつも働いている格言は、1か月で9人の女性に赤ちゃんを作ることはできないということです。


ソフトウェアプロジェクトが赤ん坊のようだと思うなら、あなたは現実の世界に住んでいません。引用にはいくつかの真実がありますが、これはコンテキストから物事を取り出す完璧な例です:-1
n1ckp

1
明らかにそうではありません。しかし、タイムラインを販売している人々もソフトウェア開発を理解していません。アナロジーは、まさにその目的のために、未知の概念を既知のエンティティに関連付けます。
再実行

2
ブルックスのもう1つの例えは、レストランで食事をすることです。よく調理されたキッチンはたくさんの食事を並行して作ることができますが、調理不足や焦げ付きなしで1回の食事をどれだけ速くできるかには限界があります。
デビッドソーンリー

@rerun:アナロジーの問題は、妊婦の労働者アナロジーがないことです。あなたの場合の女性は、労働者ではなく会社に比べて簡単です。私の意見では、それがそんなに失敗する理由です。私が考えることができる最も近いものは食べ物ですが、それはよりコードラインに似ているので、いや、労働者ではありません。
n1ckp

1
@ n1ck:私の印象では、正直に言って、あなたはそれを理解していないので、あなたは同意しないということです。ブルックスは、役に立たない人を有能な人に置き換えることについて話していませんでした。
デビッドソーンリー

2

DeMarcoとListerの「Peopleware」もお勧めします。

そして、DeMarcoによる「The Deadline」は、これと、他の多くのソフトウェアプロジェクト管理の病気と誤fallを、軽快で非常に読みやすい方法で提示します。

また、プロジェクト/チームワークを行う人々のダイナミクスを掘り下げ、コミュニケーションや紹介のようなものがチームの利用可能な労働時間をどのように枯渇させるかについても詳細に説明します。

これらの本は非常に安いので、入手して(AmazonまたはThe Book Depositoryにある)読んでもらうことをお勧めします。ここでの短い答えは、質問に対する正義を実際に行うことはできません。


2

誰もプログラマーを雇用、トレーニング、開発、監督するだけでなく、特定のプロジェクトでスピードアップするために、熟考、計画、テストされたプロセスを持つ時​​間がありません。

あなたが開発者のチームを管理している場合、あなたはあなたがオープニングを持っている場合、あなたが雇いたいと思う人々の今いくつかの連絡先を持っている必要があります。開発者グループに参加します。

まったく新しい開発マシンのセットアップをどれくらい早く取得して、すぐに使用できますか?

別のプロジェクトの開発者に見せることで、プロジェクトのドキュメントと仕様をテストしたことがありますか?彼らはそれを見て、必要に応じてプロジェクトの作業を開始できると判断しましたか?

プロジェクトのスケジュールはどのくらい最新ですか?

プロジェクトが遅れると、ハリケーンのようになるため、雨の日のために節約しましょう。


1

コミュニケーションの問題(他のすべての答えが話していると思います)以外に、プロジェクトに追加された人がバグを作成する可能性もあります。彼らはまだコードをよく知らないからです。

プロジェクトに追加されるたびに、常に物事を壊さないように一生懸命努力します。これは、最初は物事を修正するのがはるかに遅いことを意味します。


0

他の回答ではこれまで完全に無視されていたものを指摘したいと思います。

人々が後期プロジェクトに追加される頃には、通常、組織全体で多くの問題が発生しています。管理者とクライアントは満足していません。人々はそれに取り組むよう圧力をかけられています。物事はかなり緊張しています。

今、あなたがそのチームにいると想像してください。明らかにこれはあなたのせいではありません。計画(どれもあなたのものではありませんでした)は楽観的すぎました。すべての間違った決定は、あなたに相談することなくなされました。あなたはそれを最大限に活用しようとしていますが、突然多くの新しい人々が巻き込まれています。これはどのようなメッセージを伝えていますか?

2階の人々は明らかにあなたに対する信頼を失っています。彼らはあなたが台無しにしたものを補うために大きな男の子を呼びました。

あなたはまだこれを成功させる意欲がありますか?または...あなたはこれまでよりもイライラし、結局すべてがクラッシュするのを見るでしょうか?

ゆっくりしてください :-)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.