“Adding manpower to a late software project makes it later.” – result of the fact that the expected advantage from splitting development work among N programmers is O(N) (that is, proportional to N), but the complexity and communications cost associated with coordinating and then merging their work is O(N^2) (that is, proportional to the square of N) – Brooks’ law
In 1975, Fred Brooks wrote a classic book on software project management called The Mythical Man-Month. Brooks’s observations are based on his experiences at IBM while managing the development of OS/360. He had mistakenly added more workers to a project falling behind schedule. The tendency for managers to do such errors in project development led Brooks to quip that his book is called “The Bible of Software Engineering” because “everybody reads it but nobody does anything about it!”
Sequential development method
The Waterfall Model is a widely popular software development method used by many large software houses. This approach applies the insights from mature engineering disciplines (mechanical, electrical) to software.
The perfectly sound idea is to construct systems by first gathering requirements, then doing the design, then implementing it, then testing, and finally getting it out the door in one linear sequence. Progress is generally measured in terms of deliverable artifacts –requirement specifications, design documents, test plans, code reviews and the like.
The heavy process waterfall shops have elaborate responsibility matrices. Architects do all the design upfront in comprehensive documents and developers code what they’re told.
The requirements will never be correct
The origin of the term “waterfall” is often cited to be an article published in 1970 by W. W. Royce. Ironically, Royce was actually presenting this model as an example of a flawed, non-working model.
The Waterfall Model is flawed because it is too rigid and unrealistic. In the real world, software projects have ill-defined and constantly evolving requirements, making it impossible to think everything through at once.
Software now needs to be built faster and more correctly. It needs to constantly change to address the changing nature of the market and meet customer demands. Using the Waterfall Model, these changes are impossible, the development cycle is too long and iterations too expensive. Systems are over engineered and ends up costing a fortune.
Software is not a product
The core issue with the business of software is that we repeatedly misunderstand what software really is. Software is thought of as being a product, it is looked at as being a product, it is mostly managed as if it were a product. But it’s not a product, it’s a process.
The systems we ship to our customers are actually the byproducts of the real activity, which is to learn. The business imperative is that the real product is the knowledge that is in the systems we ship to the customer, and we don’t manage that at all.
Software is an ongoing practice, a recital between the computer and the mind. It begins in the developing brain with a child’s apprehension of logic and continues from technique to innovation to tradition. No software anywhere is a work on its own, and most software is an amalgam of library techniques, usually written by other people based, in turn, on work by their predecessors.
Iterative development model
In the late nineties a number of agile software development methods emerged. While they differed in details, they agreed at large that software development needed a major rethinking. First, software has to embrace change. To meet the challenge, agile approaches advocate focusing on simplicity. Make the simplest possible system that satisfies today’s requirements and when tomorrow comes, be ready to adapt.
Agile development principles:
- focus on simplicity
- embrace change
- release often
- communicate and get feedback
- test and refactor
- remember to have fun
Refactoring is what allows agile systems to embrace change, while remaining elegant. Code is constantly changed to make sure we end up with the simplest, and best possible system that reflects our current needs. Agile methods emphasize working software as the primary measure of progress.
Programming is a creative process, not an industrial one.
Since early days of software development people have struggled to build good systems. More and more people where thrown at the problem, making matters worse. But with the recent explosion of social web we’ve witnessed a new and interesting phenomenon: a handful of developers are now able to build systems that are used by millions of people. How can this be?
The secret is that programmers should not be considered as factory workers. An army of code monkeys and non-coding IT-architects doesn’t usually deliver better products than a smaller group of motivated individuals. Give your developers more leeway in their approach and decent amount of coaching, and their code is consistently better because they’re thinking while they code.
Ironically, we are coming full circle with the mythical man-month. What was true twenty years ago is true of course today, but for a whole new set of reasons. An impressive array of modern programming languages and infrastructure libraries combined with agile methods has allowed us to break free of inadequate software development dogmas and be more productive.
Less is more applies equally to code and the number of people working on it.
