← All books
Theme
Using automatic theme
Back to top
Cover of The Mythical Man-Month: Essays on Software Engineering

Book notes

By Fred Brooks

View on Amazon

Listen

Audio version

A direct reading of the notes, with clickable timestamps throughout the article.

Total length: 6:51
6:51 remaining

In one sentence

Software development is limited less by available labor than by coordination, communication, design complexity, and the need to make many interdependent decisions coherently. Adding people can increase rather than reduce schedule pressure; successful projects protect a clear product concept, organize communication deliberately, and learn through staged construction.

Overview

First published in 1975, the book is a collection of essays based largely on Brooks’s IBM project experience. The 1995 anniversary edition adds reflections on the original arguments, the essay “No Silver Bullet,” and a reassessment of which propositions held up. Its best insights concern human coordination and system design; its technology-specific examples are historically dated.

Core ideas

Brooks’s Law: staffing is not interchangeable with time

A late project does not become on schedule simply by adding people. New staff require training, create more communication paths, and may disrupt experienced contributors. The practical lesson is conditional, not absolute: add people early when work can be cleanly partitioned; late additions are most dangerous when the work is tightly coupled or the team is already overloaded.

The mythical man-month

A person-month is not a dependable unit of output. Software tasks have sequential dependencies, uncertain discovery, and different levels of difficulty; nine people cannot necessarily accomplish in one month what one person would do in nine months.

Conceptual integrity

A system is easier to understand and use when its major design ideas form a coherent whole. Brooks therefore favors strong architectural ownership and deliberate simplification, while separating system design from implementation work. This is a design-governance argument, not a claim that one person should make every decision.

The surgical-team model

For tightly integrated work, Brooks proposes concentrating the most consequential design and coding decisions in a highly capable lead, supported by specialists handling tools, testing, documentation, and peripheral components. It addresses coordination overhead, but can understate the value of distributed ownership and modern team practices.

Communication and structure

Large projects need explicit communication mechanisms: shared documentation, defined interfaces, clear responsibilities, milestones, and controlled change. Brooks treats the project manual and organizational structure as engineering tools rather than administrative paperwork.

Build a pilot, then replace it

A first implementation often teaches the team what the real problem is. Planning for a throwaway or pilot system can prevent the common mistake of turning an exploratory prototype into an accidental permanent architecture.

The second-system effect

After a constrained first system, designers may overcorrect by loading the successor with every postponed feature and abstraction. The second system is therefore vulnerable to excess ambition; explicit scope control is essential.

No Silver Bullet

Brooks distinguishes essential complexity—the difficulty inherent in the problem—from accidental complexity caused by tools, processes, or implementation choices. Better tools can reduce accidental complexity, but no single technique should be expected to deliver a tenfold improvement across productivity, reliability, and simplicity.

Practical takeaways

Caveats and counterpoints

Questions worth revisiting

Return to this when…

Return to the book when a software project is late, a team is growing rapidly, a second-generation product is accumulating scope, or a new tool or methodology is being presented as a universal productivity cure.

Highlights

The Mythical Man-Month More software projects have gone awry for lack of calendar time than for all other causes combined. Why is this cause of disaster so common? First, our techniques of estimating are poorly developed. More seriously, they reflect an unvoiced assumption which is quite untrue, i.e., that all will go well. Second, our estimating techniques fallaciously confuse effort with progress, hiding the assumption that men and months are interchangeable. Third, because we are uncertain of our estimates, software managers often lack the courteous stubbornness of Antoine's chef. Fourth, schedule progress is poorly monitored. Techniques proven and routine in other engineering disciplines are considered radical innovations in software engineering. Fifth, when schedule slippage is recognized, the natural (and traditional) response is to add manpower. Like dousing a fire with gasoline, this makes matters worse, much worse. More fire requires more gasoline, and thus begins a regenerative cycle which ends in disaster.


Gutless Estimating Observe that for the programmer, as for the chef, the urgency of the patron may govern the scheduled completion of the task, but it cannot govern the actual completion. An omelette, promised in two minutes, may appear to be progressing nicely. But when it has not set in two minutes, the customer has two choices—wait or eat it raw. Software customers have had the same choices. The cook has another choice; he can turn up the heat. The result is often an omelette nothing can save—burned in one part, raw in another. Now I do not think software managers have less inherent courage and firmness than chefs, nor than other engineering managers. But false scheduling to match the patron's desired date is much more common in our discipline than elsewhere in engineering. It is very difficult to make a vigorous, plausible, and job-risking defense of an estimate that is derived by no quantitative method, supported by little data, and certified chiefly by the hunches of the managers.


The conclusion is simple: if a 200-man project has 25 managers who are the most competent and experienced programmers, fire the 175 troops and put the managers back to programming.


Mills proposes that each segment of a large job be tackled by a team, but that the team be organized like a surgical team rather than a hog-butchering team. That is, instead of each member cutting away on the problem, one does the cutting and the others give him every support that will enhance his effectiveness and productivity.


Even though they have not taken centuries to build, most programming systems reflect conceptual disunity far worse than that of cathedrals. Usually this arises not from a serial succession of master designers, but from the separation of design into many tasks done by many men. I will contend that conceptual integrity is the most important consideration in system design. It is better to have a system omit certain anomalous features and improvements, but to reflect one set of design ideas, than to have one that contains many good but independent and uncoordinated ideas.


The first is a careful division of labor between architecture and implementation. The second is the new way of structuring programming implementation teams discussed in the previous chapter. The separation of architectural effort from implementation is a very powerful way of getting conceptual integrity on very large projects. I myself have seen it used with great success on IBM's Stretch computer and on the System/360 computer product line.


Written Specifications—the Manual The manual, or written specification, is a necessary tool, though not a sufficient one. The manual is the external specification of the product. It describes and prescribes every detail of what the user sees. As such, it is the chief product of the architect.


For these reasons, I think we will see future specifications to consist of both a formal definition and a prose definition. An ancient adage warns, ''Never go to sea with two chronometers; take one or three.'' The same thing clearly applies to prose and formal definitions. If one has both, one must be the standard, and the other must be a derivative description, clearly labeled as such. Either can be the primary standard.


So it is today. Schedule disaster, functional misfits, and system bugs all arise because the left hand doesn't know what the right hand is doing. As work proceeds, the several teams slowly change the functions, sizes, and speeds of their own programs, and they explicitly or implicitly change their assumptions about the inputs available and the uses to be made of the outputs.


The producer and the technical director may be the same man. This is readily workable on very small teams, perhaps three to six programmers. On larger projects it is very rarely workable, for two reasons. First, the man with strong management talent and strongs technical talent is rarely found. Thinkers are rare; doers are rarer; and thinker-doers are rarest.


I have earlier suggested ratios that seem to apply to planning time, coding, component test, and system test. First, one must say that one does not estimate the entire task by estimating the coding portion only and then applying the ratios. The coding is only one-sixth or so of the problem, and errors in its estimate or in the ratios could lead to ridiculous results.


He found his programming teams missing schedules by about one-half—each job was taking approximately twice as long as estimated. The estimates were very careful, done by experienced teams estimating man-hours for several hundred subtasks on a PERT chart. When the slippage pattern appeared, he asked them to keep careful daily logs of time usage. These showed that the estimating error could be entirely accounted for by the fact that his teams were only realizing 50 percent of the working week as actual programming and debugging time. Machine downtime, higher-priority short unrelated jobs, meetings, paperwork, com- 90 Calling the Shot pany business, sickness, personal time, etc. accounted for the rest. In short, the estimates made an unrealistic assumption about the number of technical work hours per man-year. My own experience quite confirms his conclusion.®


It is common sense to take a method and try it. If it fails, admit it frankly and try another. But above all, try something. FRANKLIN D. ROOSEVELT^


There is nothing in this world constant but inconstancy, SWIFT


Where a new system concept or new technology is used, one has to build a system to throw away, for even the best planning is not so omniscient as to get it right the first time. The management question, therefore, is not whether to build a pilot system and throw it away. You will do that. The only question is whether to plan in advance to build a throwaway, or to promise to deliver the throwaway to customers. Seen this way, the answer is much clearer. Delivering that throwaway to customers buys time, but it does so only at the cost of agony for the user, distraction for the builders while they do the redesign, and a bad reputation for the product that the best redesign will find hard to live down.


Once one recognizes that a pilot system must be built and discarded, and that a redesign with changed ideas is inevitable, it becomes useful to face the whole phenomenon of change. The first step is to accept the fact of change as a way of life, rather than an untoward and annoying exception.


Nevertheless, he offers a great insight. He observes that the reluctance to document designs is not due merely to laziness or time pressure. Instead it comes from the designer's reluctance to commit himself to the defense of decisions which he knows to be tentative. ''By documenting a design, the designer exposes himself to the criticisms of everyone, and he must be able to defend everything he writes. If the organizational structure is threatening in any way, nothing is going to be documented until it is completely defensible."


The barriers are sociological, and they must be fought with constant vigilance. First, managers themselves often think of senior people as ''too valuable" to use for actual programming. Next, management jobs carry higher prestige. To overcome this problem some laboratories, such as Bell Labs, abolish all job titles. Each professional employee is a ''member of the technical staff."


Managers need to be sent to technical refresher courses, senior technical people to management training.


Whenever talents permit, senior people must be kept technically and emotionally ready to manage groups or to delight in building programs with their own hands. Doing this surely is a lot of work; but it surely is worth it! The whole notion of organizing surgical-type programming teams is a radical attack on this problem. It has the effect of making a senior man feel that he does not demean himself when he builds programs, and it attempts to remove the social obstacles that deprive him of that creative joy. Furthermore, that structure is designed to minimize the number of interfaces. As such, it makes the system maximally easy to change, and it becomes relatively easy to reassign a whole surgical team to a different programming task when organizational changes are necessary. It is really the long-run answer to the problem of flexible organization.


The total cost of maintaining a widely used program is typically 40 percent or more of the cost of developing it. Surprisingly, this cost is strongly affected by the number of users. More users find more bugs.


'Things are always at their best in the beginning,'' said Pascal.


The most pernicious and subtle bugs are system bugs arising from mismatched assumptions made by the authors of various components. The approach to conceptual integrity discussed above in Chapters 4, 5, and 6 addresses these problems directly. In short, conceptual integrity of the product not only makes it easier to use, it also makes it easier to build and less subject to bugs.


How does a project get to be a year late? . . , One day at a time.


Yesterday a key man was sick, and a meeting couldn't be held. Today the machines are all down, because lightning struck the building's power transformer. Tomorrow the disk routines won't start testing, because the first disk is a week late from the factory. Snow, jury duty, family problems, emergency meetings with customers, executive audits—the list goes on and on. Each one only postpones some activity by a half-day or a day. And the schedule slips, one day at a time.


"The Other Piece Is Late, Anyway" A schedule slips a day; so what? Who gets excited about a one-day slip? We can make it up later. And the other piece into which ours fits is late, anyway. A baseball manager recognizes a nonphysical talent, hustle, as an essential gift of great players and great teams. It is the characteristic of running faster than necessary, moving sooner than necessary, trying harder than necessary. It is essential for great programming teams, too. Hustle provides the cushion, the reserve capacity, that enables a team to cope with routine mishaps, to 156 Hatching a Catastrophe anticipate and forfend minor calamities. The calculated response, the measured effort, are the wet blankets that dampen hustle. As we have seen, one must get excited about a one-day slip. Such are the elements of catastrophe.


circumstance or purpose. To use a


To use a program. Every user needs a prose description of the program. Most documentation fails in giving too little overview. The trees are described, the bark and leaves are commented, but there is no map of the forest. To write a useful prose description, stand way back and come in slowly: 1. Purpose. What is the main function, the reason for the program? 2. Environment. On what machines, hardware configurations, and operating system configurations will it run? 3. Domain and range. What domain of input is valid? What range of output can legitimately appear? 4. Functions realized and algorithms used. Precisely what does it do? 5. Input-output formats, precise and complete. 6. Operating instructions, including normal and abnormal ending behavior, as seen at the console and on the outputs. 7. Options. What choices does the user have about functions? Exactly how are those choices specified? 8. Running time. How long does it take to do a problem of specified size on a specified configuration? 9. Accuracy and checking. How precise are the answers expected to be? What means of checking accuracy are incorporated? Often all this information can be set forth in three or four pages. That requires close attention to conciseness and precision. Most of this document needs to be drafted before the program is written, for it embodies basic planning decisions.

References

  1. The mythical man-month by Frederick P. Brooks | Open Library
  2. goodreads.com
  3. No Silver Bullet
  4. Mythical Man-Month, The: Essays on Software Engineering, Anniversary Edition
  5. onlineacademiccommunity.uvic.ca
  6. everything.explained.today
  7. openarchives.gr
  8. books.google.com
  9. daniel.haxx.se
  10. home.cs.colorado.edu
  11. Second-system effect
  12. en.wikipedia.org
  13. en.wikipedia.org
  14. martinfowler.com
  15. pne.people.si.umich.edu