No Silver Bullet--Essence and Accident in Software Engineering.
Frederick P. Brooks, Jr.
All software construction involves essential tasks, the fashioning of the complex conceptual structures that compose the abstract software entity, and accidental tasks, the representation of these abstract entities in programming languages and the mapping of these onto machine languages within space and speed constraints. Most of the big past gains in software productivity have come from removing artificial barriers that have made the accidental tasks inordinately hard, such as severe hardware constraints, awkward programming languages, lack of machine time. How much of what software engineers now do is still devoted to the accidental, as opposed to the essential? Unless it is more than 9/10 of all effort, shrinking all the accidental activities to zero time will not give an order of magnitude improvement.
- The distinction between the essential and incidental aspects of software development was very insightful and helpful for thinking about software projects from a process optimization standpoint.
- The author defines the essence of software engineering as "a construct of interlocking concepts: data sets, relationships amomg data items, algorithms, and invocations of functions". The difficult part of building software is in choosing the right abstractions and design for the system.
- The incidental aspects of software engineering are things like version control systems, programming languages, and editors
- The author argues that there is no more low hanging fruit in the 'incidental' category that will radically improve the efficiency of software developement. The only way to make great gains in software developement is to invest in growing the talent of computer programmers.