Review: "Modern Software Engineering" by David Farley
All the principles behind building better software faster
Software engineering—defined by the author—is applying an empirical, scientific approach to finding economical solutions to practical problems in software. But is it actual engineering1? David gallantly defends software engineering as a proper engineering discipline by arguing that software is a direct model of the reality of a system. This is unique to software. We don’t need to deal in “production engineering” as a civil engineer would build one final bridge due to upfront design work. Software engineering affords us the ability to focus on “design engineering.” So, it is the software engineers' job to monitor a system's performance rather than wait for failure in production.
“The art of programming is the art of organizing complexity, of mastering multitude and avoiding its bastard chaos as effectively as possible.”
Edsger W. Dijkstra - Notes on Structured Programming (1970)
How can we utilize an engineering approach to building software? Two vital metrics should be tracked to judge the effectiveness of our strategy:
Stability - the quality of our system
Change failure rate
Recovery failure time
Throughput - the efficiency of our system
Lead time (idea to working product)
Frequency (change to production)
A rational, scientific approach requires us to measure our system as we iterate diligently. According to a classical cost of change graph, we are tempted to make all the crucial decisions at the beginning of a project, but we will reject our measurability.
An agile approach awards us valuable feedback to improve the system in a timely manner! If we’re being rigorous in our approach to software, we must evaluate the pros and cons of ideas as a result of feedback.
One form of feedback is through our automated testing, which the author continuously reaffirms throughout the book. If I have one takeaway from “Modern Software Engineering,” it’s a new reverence for TDD and a desire to implement it in every project I tackle going forward! I recall the statistic offered: TDD had resulted in a 44% to 250% defect reduction2. The author notes that when a test is difficult to write, it indicates that the system’s design should be improved.
“Modern Software Engineering” highlights various design principles and why they matter to all software: modularity, cohesion, separation of concerns, abstraction, and managing coupling. I am impressed with the expertise and stories of professional experience David includes! However, I would love to have read more about strategies for implementing great designs. The Ports and Adapters3 design pattern is mentioned many times, but many more are general enough and probably deserve to be mentioned. The code snippet examples are perspicuous and easily understood — very helpful to give concrete examples of the concepts!
While I am too young to grasp the old waterfall style of development and have first-hand experience of the challenges organizations faced, this book marks a turning point, consolidating decades of battle-tested agile practices that propelled software engineering into a mature discipline. It's an essential addition to the bookshelf of any dedicated software engineer!
Universal Set is never written with generative AI. All merits and shortcomings of ideas posed in these articles are mine alone.
Interested in what I’m reading next? Friend me on Goodreads!
I often see students/technologists argue CS majors don’t qualify as engineers (mechanical, electrical, chemical, etc…). This is irksome, and I studied computer engineering.
One of the various studies the book sites from IEEE: https://ieeexplore.ieee.org/document/1251029
An Adapter design pattern allows for different objects to interface: https://refactoring.guru/design-patterns/adapter