I recently finished a cover-to-cover reading of Frederick Brooks’ classic book on large software project management, The Mythical Man-Month (TMMM). Originally published in 1975, TMMM details Brooks’ management philosophy, which he developed as manager of the IBM OS/360 operating system from 1964-1965. I read the 20th anniversary edition (published 1995), in which two additional chapters were added that update the philosophy put forth in the original edition from the beginning of the timesharing era up to the PC era of computing.
My impression of TMMM is very positive overall; it is easy to see why this is still a required text on software project management, even nearly 50 years after Brooks finished his stint managing the OS/360 project. There are many interesting anachronisms in TMMM that would necessitate a history lesson in computing for today’s college-age audience, e.g., software development in pencil and paper (since machine time was rare and expensive), separate punch-card readers from computers, development primarily in machine code, a preoccupation with memory size of programs, a view that structured programming might be a good idea that likely goes too far, etc. Clearly, a very different world technologically than that which we work in now. But despite all the differences in computing technology from 1965 to today, the fundamental problems in large software projects and the structural solutions to combat them that Brooks presents have not changed all that much. It is rather fascinating–when I was teaching, there were always a few students who went into conniptions if an assignment required them to use a terminal interface instead of a graphical IDE, a 10 year change in development habit historically. But current techniques for building large software systems remain fundamentally quite similar over 50 years of computing history.
In TMMM, Brooks posits, quite rightly in my opinion, that conceptual complexity is the primary hindrance to quick and quality software development. In addition, conceptual complexity is a problem that can never be truly solved. Conceptual complexity here means the number of logical components in a software system coupled with the the amount of communication required between these components. Because of the complex interrelationships between the components, a particular component could interact with hundreds or thousands of other components, requiring a huge amount of communication overhead between the people building these components. This communication eats up a lot of time for the people involved, which in turn requires more people to get the project done in a timely manner, which in turn adds more necessary communication…and so forth. The cycle is recursive. The curse of complexity is that at some point, when more people are added to a project, the amount of time the project takes actually gets longer, instead of shorter. This is why big software is almost always late and over budget.
Brooks presents a number of management techniques in TMMM to tame the overhead brought on by this complexity. Many of these are standard industry practice today for large projects: Brooks recommends having a rigidly hierarchical top-down design and development process, a chief architect at whom the buck stops for design decisions, a separation of implementation from design, teams dedicated to testing and finding bugs, a team dedicated to keeping documentation up-to-date, keeping track of the project through document maintenance, starting the design with a user manual/model, source control, and regression testing. Brooks also presented some ideas that are not really used today, including his small “surgical team” concept, an insistence on the Waterfall design method (which he renounced in the 1995 retrospective chapter), and fairly hands-off upper management (which might exist somewhere?).
While reading TMMM, it seemed to me that Brooks had an idea of future developments that actually did eventually show up. This includes documentation contained within the source code itself (Javadoc and the like), Git-style version control, a Wiki-like system for managing project documents, and in some sense Agile development (at least for individual components). While reading through the original chapters, I noticed a few places where Brooks hinted at object-oriented-like abstraction, but in the 1995 retrospective, he claimed to have not seen that coming. Brooks consistently reads as being ahead of his own time throughout.
As Brooks points out in TMMM, large software projects are the most complex things that humanity has ever built, and this complexity makes them very difficult to build on time and on budget. Further, we have collectively already solved most of the easy problems in tackling the software project overhead, which means that most of the time spent on large software projects now is simply inherent to the problem being solved. But despite this, TMMM ended on an optimistic note: we may not ever solve the tractability problems in building large software, but we continue to build large software, producing ever more wondrous marvels of human ingenuity.