「人月の神話」の個人的まとめ

このページはこちらに移転しました。 このページは更新を停止しています。今後更新があれば移転先で行います。

始めに

以下の文書は、フレデリック・ブルックスの「人月の神話」を個人的視点でまとめたものです。日本語版も参考にはしていますが、基本的には英語の原著をベースにまとめています。また、以下で出てくるページ番号は日本語版ではなく原著のページ番号です。 原著に書かれていないことは、極力書かないようにしましたが、日本語に訳す関係や内容をまとめる関係で、意訳のようになっているところもあります。

この本の1~15章は1975年、16章は1986年、17~19章は1995年に書かれています。著者は、後に書いた章で以前に書いた章の内容について追補したり撤回したりしています。このまとめではそれらのフィードバックをあらかじめ反映し、内容の足し引きを行った後の状態を提示しようと試みています。ただ、この試みは完璧ではありません。特にウォーターフォールモデルに関しては、第19章で著者は、ウォーターフォールモデルは誤っている、だが、1~15章の文章はウォーターフォールモデルを暗黙の内に想定してしまっておりその影響が全般に及んでいると述べています。したがって、ウォーターフォールモデル以外の開発モデルを念頭に置いて1~15章の個々の内容を吟味するような作業は、最終的には読者1人1人が注意深く元の本を読んで行うしかないと思われます。

なお、この本を読む場合には、まず18章に目を通すことをおすすめします。18章は、1~15章における著者の主張を抜き出し箇条書きでまとめたのものです。 また、18章の内容がこのようなものであるため、このまとめに18章はありません。

参照した原著と日本語版

第1章 開発コストと開発の喜びと苦しみ

プログラムシステム製品の開発コスト

大規模システムプログラム開発において、設定されたゴール、スケジュール、及び、予算を全て満たした事例は少ない。 一方で、大きな開発チームが作った製品を上回るプログラムをガレージの2人組が作った事例はある。 この対比について考えるには、何が作られているのかに目を向ける必要がある。

プログラムシステム製品の開発チームという体制に対して、ガレージの2人組という体制が取って代わらない理由がここにある。

(「少なくとも何倍」というのは著者による推定である。)

開発の喜び

開発の苦しみ

第2章 見積もり失敗の原因と対処法

ソフトウェア開発の失敗の原因は開発期間の不足によるものが圧倒的に多い。その理由と対策は以下の通りである。

原因1 楽観主義などの要因により、コストを低く見積もる傾向がある(見積もったコストが量的に不足している)。

原因2 人月が開発の進捗を表すという誤った考え(順序的制約と人員数によるコスト変動の軽視)。

農作物の収穫は、多数の人で取りかかれば早く終わる。一方で、どんなに多くの人が手助けしても、妊娠期間を短くすることは出来ない。この違いはどこから来るのだろうか。

定量的研究による裏付け(第19章 pp. 273-274より)

Barry Boehmが63のソフトウェアプロジェクトに対して行った定量的研究では、以下が示された。

原因3 顧客の要望を書いただけの開発完了予定日。 

原因4 他の工学分野に比べ、進捗が適切にモニタリングされていない。

他の工学分野では立証され日常的に利用されている技術が、ソフトウェアエンジニアリングでは革新と考えられている。

原因5 開発の遅れに対して人員を追加するという不味い対応が行われやすい。

人員追加と開発完了時期の簡単な計算例

関連研究(第19章 pp. 274-275より)

対処法1 開発期間の半分をテスト期間に割り当てる。

(ここでの議論は特に、ウォーターフォールモデルが暗黙的前提になってしまっていることに注意が必要である。後に書かれた第19章で言及されているように、ウォーターフォールモデルがそもそも間違っている。ウォーターフォールモデルの一巡ではなく、別の開発モデルであるスパイラルやアジャイルのイテレーションにおいても、それぞれの論点が成立するのかは読者の判断に任されるのであろう。)

対処法2 遅れがはっきりしたときは、人員追加ではなくスケジュールの立て直しを。機能削減も有効。

対処法3 見積もりに関するデータと手法の共有。

生産性や不良発生についての数値指標や見積もり手法などを開発し、公表して、ソフトウェア開発者全体で共有する。

対処法4 気を強く持つ。

良いデータと手法が共有されるまでは、気を強く持って、自分の見積もりを弁護するしかない。 言われた希望に従っただけの見積もりと比べるならば、勘と変わらない程度であっても、まだまともだと信じて。

対処法5 開発期間短縮より開発コスト低減を優先したスケジュールを立てる。

第3章 職務の専門化を用いたチーム編成:優秀な開発者でも少数では開発できない規模の開発を行うために

少数で開発できるならそうすれば良いが、そうできない規模の開発もある。 少なくない人数で開発するにはチーム編成の工夫が重要となる。

前提の整理

少数の優秀な開発者で開発できるならそうした方が良い。

多数の平凡な人達より、少数の優秀な人達で開発した方が良いと、 コンピュータの学会の集まりに来るような人達は皆そう思っている。 その主な理由は以下の2つ。

また、単なる大量動員で開発すると、コストは上昇し、開発は遅れ、効率は悪化し、出来上がる製品は統一感に欠けるというのは、過去の事例(OS/360、Exec 8、Scope 6600、Multics、TSS、SAGEなどなど)が示すことでもある。

優秀な開発者でも少数では開発できないほどの規模は存在する。

ミルズの案:一人の主開発者を皆が助けるチーム編成

以下のように、仕事を上手く分化・特化させ、開発の根本的な部分は1人が行い、それをその他の人達が助けるチーム編成。 例えるなら、外科手術において1人の執刀医が手術するのを麻酔科医や看護師が助けるのに近い。

主開発者:根本的に開発を行う人。チーフプログラマ。手術で例えれば執刀医。

副開発者:主開発者を代行可能な補佐役。航空機運航で例えれば副操縦士。

事務官:主開発者が開発に集中することを可能にする人事や庶務のプロ。

編集者:ドキュメント作成の監督者。

秘書2人:事務官と編集者、それぞれに対する秘書。

開発庶務係:開発環境の整備・運用やプログラム製品の全ての技術情報の記録・管理などを行う人。

プロジェクト管理や開発環境の整備・運用のために以下のような業務を行い、全てのチームメンバーに対して、必要な開発環境が利用でき、必要な情報が閲覧できるようにする。

上記のうちバッチ化(自動化)されていない部分について手を動かすのも、開発庶務係の仕事である。

(残存しているバグやどのバージョンでバグが修正されたかの情報の管理であるバグ管理について著者は言及していないが、プログラム製品の全ての技術情報を管理するとしているので、バグ管理も開発庶務係の仕事に含まれると考えて良いだろう。)

ツール担当者:チームのニーズに合ったツールを用意する人。

テスタ:テストケースの作成とテストフレームワークをセットアップする人。

言語技師:開発に使用する言語のエキスパート。

ミルズの案の効果

「プログラマ2人による従来の開発」(以下「従来」)と「主開発者と副開発者による開発」(以下「主副」)との比較

スケールアップの方法

ミルズ案の10人のチームを20用意すれば200人が投入できる。チーム内で10人が7つの専門領域で働いていても、開発するシステムを考える主体は1つなので、各チームの担当部分の概念的整合性(conceptual integrity)は劇的に改善している。よって、200人中のたった20人の主開発者がどう調整を行えば良いかを考えれば良い。

この調整に必要なテクニックの詳細は後の章で述べるが、要点は以下の通り。

(組織構成、特に主開発者と事務官の関係は、ミルズの案に限られるわけではない。詳細は第9章の「Organization in the Large Programming Project」とそれに続く項を参照のこと。)

第4章 アーキテクチャと実装の分離:使いやすいシステムを作るために最も考慮すべきこと

使いやすさの指標

(著者は、システム設計において最も考慮すべき重要なことは、概念的な整合性だと主張している。)

アーキテクチャとは(実装とはどう違うのか)

少数にアーキテクチャをまかせて大丈夫な理由

アーキテクチャの作業時期と実装の作業時期

第5章 アーキテクトの暴走を防ぐ方法と2回目の設計の危険性

アーキテクチャと実装を分離したときに、実装不可能な仕様やコストを度外視した機能をアーキテクトがアーキテクチャに盛り込むのを防ぐ方法として以下のものがある。

続いて以下は、後述の「The Second-System Effect」を念頭に置いた対策である。

以下は、プロジェクトマネージャーの立場からの対策である。

The Second-System Effect

2つめのシステム設計は、設計しすぎになりやすく、最も危険である。著者はこれを「The Second-System Effect」と名付けた。 その理由は以下の通りである。

第6章 仕様を正しく伝える方法

どうすればアーキテクトが決めた仕様の通りに実装が行われるのか。どうすれば多数の人が開発に参加する状況で概念的な整合性を維持できるのか。これらを達成するための技術について概略を以下に示す。詳細は原著のこの章を参照のこと。

仕様書としてのマニュアル

形式的記述を用いた定義

アーキテクトによるソースコードのインターフェイス部分の記述

会議と意思決定の工夫

始めから複数の実装を開発することが持つ仕様を守る効果

アーキテクチャに対する質問への回答記録の公開

製品テスト部門との早期からの連携

第7章 コミュニケーションと組織と文書

コミュニケーションは重要である。そのため、組織が重要である。コミュニケーションを円滑にするためには、電話、電子メール、技術的打ち合わせといったものから、グループ間の依存関係の明確化や文書管理まで、あらゆる手段を活用すべきである。

文書管理

組織

組織の目的は、関係者間で必要なコミュニケーションと調整の量を減らすことにある。

ツリー構造を成している組織を考えたときに、その一部を成している部門の効率性の鍵となるのは技術ディレクターの役割とプロデューサーの役割である。

この2つの役割の割り振り方には以下の3パターンがある。どのパターンを採用するかは人材次第である。利用可能な人材に合わせて組織は作るべきなのだ。

第8章 見積もり

第9章 リソース配分の決め方

それぞれのコンポーネントやチームにリソースを割り振るときには、以下に気をつけること。

メモリスペースと処理速度のトレードオフにうまく対処するためにできることとして以下の2つがある。

メモリ不足で困ったときには、データやテーブルの表現を考え直すとうまく行くことがある。

第10章 マネジメントにおけるドキュメントの構成と重要性

ドキュメントの構成

マネジメントで重要なことは以下の5項目であり、各項目の右側のものが対応する文書である。

各文書の内容の詳細は第10章の「Documents for a Computer Product」と「Documents for a software Project」の項を参照のこと。

マネジメントの仕事では、何らかの形のコミュニケーションを行っている時間が長く、頭の中にないデータを必要とする仕事はそう多くない。そのデータが必要な仕事では、一握りの書類が提供するデータが本当に必要なデータであり、また、十分なデータでもある。

ドキュメントの重要性

組織の構成とその組織が作ったシステムの関係

Conwayの法則:

組織が作るシステムは、その組織のコミュニケーション構造のコピーにしかならない。

第11章 ソフトウェアの一生:初期の失敗、メンテナンス、そして終焉

変化と開発

変化と組織

プログラムのメンテナンス:2歩進んで1歩下がる

プログラムの終焉:1歩進んで1歩下がる

第12章 機材やツール、ソース管理など開発の道具立てについて

第13章 設計とテストとデバッグの戦略

バグが入らないように設計する方法

テストとデバッグ

第13章に関する補足事項

第14章 スケジュールが破綻する原因とその対策

Q. どうしたらプロジェクトが1年も遅れるのか?

A. 1日ずつが重なって。

ちょっとしたことによる半日や1日の遅れが積み重なってスケジュールは大幅に遅れていく。例えば、病欠、故障、納入待ち、雪、裁判員、家庭の事情、緊急顧客対応、社内監査、などなどが積み重なって遅れるのである。

マイルストーンの文言

PERT図やクリティカルパススケジュールの利用と「ハッスル」

現場から適切に情報が上がるようにするには

現場の管理職からさらに上位の管理職へ全ての情報が伝えられる必要は無い。しかし、教育に関する状態を把握するための情報と計画に無く処置が必要なことに関する情報は、上位の管理職が必要な情報である。そして、何も対策をしないと必要な情報であっても上に伝えられず隠されてしまう。

対策1 役割の衝突の緩和

対策2 マイルストーンレポートの作成

第15章 人間がプログラムを理解できるようにドキュメントを書く

ドキュメントに必要な記載内容

それぞれの記述項目の詳細は第15章の「What Documentation Is Required?」の項を参照のこと。

プログラムを使用するときに向けて

プログラムが正常か確認するときに向けて

(回帰テストという言葉を著者は用いていないが、修正後に走らせる徹底的なテストは回帰テストと考えて良いだろう。また、2と3のテストは境界値テストと捉えても良いだろう。)

プログラムを変更するときに向けて

プログラムを変更したり修正したりするときには、内部構造を始めとしたプログラムの完全な詳細情報が必要となる。この中でも特に概観(overview)に関する情報が重要であり、これは以下の5つからなる。また、これらの情報は、コメント使ってソースコードに統合することが可能である。

  1. フローチャートまたはサブプログラム構造図(フローチャートについては後述の点に注意。また、サブプログラム構造図がどのような図であるかは第15章の「The Flow-Chart Curse」の節とFig. 15.1を参照のこと。)
  2. アルゴリズムの完全な説明、もしくは、それが記載されている文献の情報
  3. ファイルレイアウトの説明
  4. 記憶デバイスなどからのデータ移動経路の構造の概観と各経路で何が完了するかの概観
  5. 元の設計の観点から考えた修正に関する議論、プログラムの起点(hooks)と終点(exits)の性質と位置、プログラムを最初に書いた人がどのような修正が望ましくそれをどのように行おうと考えていたかについての広範な議論、及び、隠れた危険についての所見

フローチャートはほとんど必要ない

ソースコードとドキュメントはなるべく1つのファイルにまとめる。

1つのファイルにまとめる利点

第16、17章 本質的な難しさのため、生産性・信頼性・単純さ(simplicity)のどれにおいても劇的な改善をもたらす特効薬は存在しない

(これらの章における「本質的」といった言葉の用法について、17章の「Accident」の項で著者は補足をしている。著者は実装作業を本質的でない仕事に分類しているが、実装作業を軽視しているわけではない。開発の難しさを2種類に分けて考えたということが要点である。)

ソフトウェアの本質的な難しさ

複雑さ

周りに合わせることを要求されること

頻繁な変更

目に見えない

本質的な難しさへの対策

既製品のソフトウェアを買う。

パッケージソフトを1つのコンポーネントとして利用する。

(以下、第19章の「Buy and Build - Shrink-Wrapped Packages As Components」より)

ラピッドプロトタイピングを用いて仕様の改良を繰り返し行う。

育てるように少しずつソフトウェアを作っていく。

優れた設計者を育成する。

17章で触れられているその他の対策

まとめ作成者の個人的メモ

オブジェクト指向プログラミングについて

第19章 人月の神話を発表した後の20年を振り返って

ウォーターフォールモデルは間違っている。

ウォーターフォールモデルの前提にある誤った考え

ウォーターフォールモデルが広まった背景とその後

上流工程へのフィードバックが必要だ。

インクリメンタル開発、つまり、少しずつ追加しながら作るやり方の方が優れている。

インクリメンタル開発の方法

インクリメンタル開発の利点

マイクロソフトのデイリービルド

モジュールやクラスの内部はそれらの利用者には隠すべきだ。

成功するかは、ほとんど人にかかっている。

まとめ作成者の個人的メモ