"No Silver Bullet — Essence and Accident in Software Engineering” [PDF] is a famous software engineering paper written by Turing Award winner Fred Brooks in 1987. This post summarizes the key ideas.
The essence of a software entity is a construct of interlocking concepts: data sets, relationships among data items, algorithms, & invocations of functions. This essence is abstract in that such a conceptual construct is the same under many different representations.
I believe the hard part of building software to be the specification, design, and testing of this conceptual construct, not the labor of representing it and testing the fidelity of the representation. [Syntax errors are fuzz compared to conceptual errors in most systems.] If this is true, building software will always be hard — there is inherently no silver bullet.
The following are inherent properties of this irreducible essence of modern software systems:
100 milliseconds. Beyond that threshold, no benefits are to be expected.
Perhaps the biggest gain yet to be realized from programming environments is the use of integrated database systems to keep track of the myriad details that must be recalled accurately by the individual programmer and kept current for a group of collaborators on a single system.
The composition and editing of programs and documents are fully supported by today's speeds. Compiling could stand a boost, but a factor of 10 in machine speed would surely leave think time the dominant activity in the programmer's day.
Zhongmin wang time of task = Sum(Frequency * Time)
ncopies of a software system effectively multiplies the productivity of its developers by
n(cutting down the per-user development cost).
Systems should first be made to run, even if it does nothing useful except call the proper set of dummy subprograms. Then, bit by bit, it should be fleshed out, with the subprograms, in turn, being developed — into actions or calls to empty stubs in the level below. [...] Enthusiasm jumps when there is a running system, even a simple one.
Whereas the difference between poor conceptual designs and good ones may lie in the soundness of the design method, the difference between good designs and great ones surely does not. Great designs come from great designers. Software construction is a creative process. Sound methodology can empower and liberate the creative mind; it cannot inflame or inspire the drudge.