“Modern Software Engineering” by David Farley

I have just finished reading “Modern Software Engineering” by David Farley.

Before I share my thoughts, I want to acknowledge the intentions behind this book, at least as I have perceived them: it aims to distill and articulate the principles and practices that have shaped modern software development.

I can appreciate the effort to make these concepts accessible, especially for those who might be newer to the field or looking to formalize their understanding.

However, I must admit that, as someone with 26 years of experience in software engineering, I found this book to be rather underwhelming. The practices and principles discussed – such as continuous delivery, test-driven development, and the importance of automation – are undeniably vital. Yet, for many of us who have been in the industry for a while, these ideas are well-established and, frankly, quite obvious.

David Farley’s emphasis on what he considers “modern” practices is, in my view, a summary of common industry standards that most experienced professionals are already familiar with and actively implementing. The concepts presented do not offer much in the way of new insights or innovative approaches.

Many of the practices discussed, such as continuous integration, iterative development, and the engineering mindset, are not just modern but have been industry staples for years. For a seasoned professional, these topics might feel more like a refresher course than a cutting-edge discourse.

Initially, I considered that this book might hold significant value for those who are newer to software engineering or working in environments where these practices are not yet fully adopted. However, upon closer reflection, I believe that even this audience might find the book lacking.

One of the main issues I encountered is the book’s theoretical nature. While it discusses important concepts, it does not delve deeply into how these ideas can be applied in real-world scenarios. For someone new to software engineering, understanding the practical application of these principles is crucial, and unfortunately David Farley does not provide the hands-on guidance that would be most beneficial.

The absence of concrete, real-world examples is a significant shortcoming. Examples from actual projects, case studies, or even hypothetical scenarios could have greatly enhanced the value of the content. This would help readers understand not just the “what” and “why” of these practices, but, more importantly, the “how.”

As a result, I am concerned that even those who are still building their foundational knowledge might struggle to extract practical, actionable insights from this book. Without these, the theoretical discussions remain abstract and may not translate well into everyday practice.

In conclusion, while I find “Modern Software Engineering” to lack new material or fresh perspectives, and to be overly theoretical, I can see how it might be beneficial for those seeking to review or formalize their understanding of established practices. However, the absence of practical examples and real-world applications diminishes its value for both seasoned professionals and those new to the field.

I look forward to hearing your thoughts and discussing different perspectives on this material. Perhaps together we can uncover nuances that I might have overlooked, or better yet, explore how we can continue to push the boundaries of software engineering beyond these well-trodden paths.

 

Fabio Scagliola,