I enjoyed this book as an anecdotal account of how the software engineering profession has developed over the past 4 decades. The structure of the book largely follows the progression of the industry’s repeated failed attempts to apply rigor to the field of software engineering. Barr provides a survey of a number of hurdles that the industry has overcome in recent decades such as the abolishment of GOTO programming and the subsequent transition to (ill-defined) “structured programming” a la higher level programming languages, the rapid takeover of OOP, the idea of unit testing, code reviews, agile methodologies, software architecture design processes, and several more key ideas that Barr thinks are the main areas the industry has improved.
Overall, Barr presents nothing novel, but rather highlights others’ contributions to the field, framing said contributions in the light of his experience riding the ever evolving software engineering (SWE) practice, progressing from a self-taught BASIC programmer, to Princeton CS student, to Microsoft Windows NT developer, ultimately arriving at a position in Microsoft in which he was dedicated to thinking about improving the SWE process for a more than a decade. The topics covered offer an intriguing insight into the attempts of a number of proponents to legitimize SWE as a true engineering discipline, but Barr does a good job of qualifying those attempts by highlighting the ways in which they consistently fell short and shedding light on the ways in which the SWE discipline still lacks a standard body of knowledge other engineering disciplines enjoy.
In several chapters, Barr introduces concepts like goto statements, OOP, interfaces, and other common design patterns, and expends considerable effort to explain these concepts to the laymen with prose and relevant code snippets. Barr’s goal is to elucidate how clearly these design patterns can improve software implementation, correctness, and maintainability. If the reader is a SWE like myself, these sections will fee redundant to some extent; However, I did find it enjoyable to read an experienced SWE’s approach to explaining the concepts to the layman audience. Additionally, Barr adds historical context to some of these design patterns, and thus the chapters containing these elaborations will still engage a broad audience to some extent.
In summary, I would recommend this book to anyone wanting to learn more about the collective SWE field as a whole, from historical anecdotes of programming in the 80s, to state of the art software design and implementation practices of today employed by a number of FAANG companies. For some reason, software engineering is still as hard as it was decades ago, but it’s largely changed in line with the information age it ushered in: early software engineering was performance focused resulting from a dearth of computing resources, whereas today’s software engineering is done in a context with immense computing resources and benefits more from complexity management. If you can accept the irony that this book never really gives a clear answer to exactly why smart engineers write bad code other than “because complexity management is hard, and here are all the types of complexity SWEs face”, then you will probably enjoy this book as a quick read that provides intriguing insight into the history and current state of software development practices employed in the modern tech industry. Somehow, software is still eating the world, apparently apathetic to how hard companies or SWEs they employ think it is to build it.