“No Silver Bullets” is an oft-cited paper in the annals of Software Engineering. While technology has changed significantly since the paper was first published there are still some pearls of wisdom that are worth reflecting upon.
Tracing to Aristotle, Brooks (1986) breaks down the difficulties in solving a complex problem into two categories. Essential difficulties are those that are inherent to the problem. Accidental difficulties arise out of the inadequacy of the tools we employ to deal with them. The paper states that the four distinguishing features of a software engineering problem are:
- Changeability and
Complexity and conformity are inherent to any engineering problem, but it is more pronounced in software engineering. Conformity means that software has to adapt to existing hardware and infrastructure. Changeability refers to the fact that software is almost always modified after it is delivered and invisibility refers to lack of diagramming tools. Software is abstract. There is no diagramming standard like a floor plan or circuit diagram to document the design. Documenting and communicating software design remains a challenge and Brooks claims that advances in this area will play a significant role in addressing the essential complexity. (Brooks often uses the term complexity to mean difficulty)
Brooks claims that most the tools are geared towards addressing the accidental complexities. Some of these tools include better programming languages, better development environments, and better hardware and storage technologies. For example syntax directed highlighting is now the norm in almost all Integrated Development Environments and editors like Vim and Emacs that are mainly used for programming. He claims that Object Oriented Programming could help if languages could infer the types. He dismisses Artificial Intelligence as a non-solution although Expert Systems can be of use in that expert developers can help build code generators or code checkers to improve the productivity of the average programmer.
There have been many attempts to deal with essential difficult such as designing new languages, Ada being one such. However as he points out, the long lasting benefit of Ada programming language is not so much the language itself as the many ideas it has spawned such as “modularization, abstract data types, and hierarchical structuring.” Many of these ideas have now been incorporated into other languages like C++/Java/C#. Brooks likes some of the ideas that Object Oriented Programming encourages such as data hiding and inheritance and points out that the two concepts are independent. For example ‘C’ always had FILE*. The exact type-definition of FILE was hidden from the user of FILE*. Data hiding can thus be done in pure C. Brooks claims that programmer spends a lot of time keeping track of types and productivity can be improved if type is deduced. Functional Programming languages like Lisp and ML allowed the programmer, by and large, to ignore declaring the type of a variable. In recent times C++ and C# go a long way through the use of auto and var to reduce the need for having to declare the types of variables, by using the type of the value to which the variable is initialised.
In conclusion, some of Brooks ideas are relevant to this day. Improving accidental complexity is easier and hence a lot of effort has been expended in that direction. The challenge of addressing the essential complexity is difficult partly because it requires a new way of thinking and any significant improvement is likely to be ignored without sustained effort.
Brooks, Fred P. (1986). No Silver Bullet — Essence and Accident in Software Engineering. Proceedings of the IFIP Tenth World Computing Conference: 1069–1076.