This post has a selection of software engineering books I’ve found to be particularly useful.
The internet is great and there are plenty of blog posts and MOOCs online, so why bother with books? For me there are a few reasons: books by their nature bring together knowledge on a particular theme from a particular time. Books also give more space for the author to flesh out their explanations and arguments. This gives us as readers the opportunity to understand things in more detail, and potentially spot situations where the book’s premise may not apply.
One thing I really like about books is that you can see a whole coherent argument about why something makes sense at the time it was written. Technology moves fast, and trends change over time and there can be a tendency to rubbish everything that came before the present. Books give a level of context that is more difficult to achieve in blog posts and articles.
I’ve tried to identify some essential themes of software engineering. There is of course some overlap with themes: craftsmanship and architecture, people management and product management etc. Hopefully though the software engineering books I suggest for each theme will be a good grounding in those areas. I have ordered the themes roughly
- Fundamentals– concerning lower-level design decisions and quality
- Testing – ways to effectively and efficiently check that software is doing what was expected
- User needs and requirements – remembering that software typically only becomes valuable if someone can use it effectively
- Architecture and design – concerning higher level design decisions.
- Dev Ops – Concerning deployment
- Product/project management – about how to actually get a software product delivered
Some books related to the art and craft of building software. I have tried to capture the main message that stays in my memory from each of the books. I can’t guarantee that’s the message the author was aiming for, but it is the one I took away…
My short summaries do not at all do justice to the messages actually in the books, so I recommend you get your hands on a copy if you can. Getting hard copies of the books new can be expensive, so I’d suggest looking for used versions or considering getting the eBooks where possible.
Software Engineering Books
In this section I’ve picked out books which cover some of the fundamental aspects of software engineering.
Clean Code – This book is about the fundamentals of writing code. One of the big themes of this book is readability by abstracting code into methods and keeping those methods short.
A Philosophy of Software Design– combating complexity & the deep module. A good counter point to clean code – emphasises reducing complexity by keeping modules ‘deep’ rather than ‘wide’. Read a review of this book
Refactoring: Improving the design of existing code – the refactoring process: test – break – build – refactor. Realising that refactoring is a natural and necessary process for making good quality code can be liberating – you don’t need to get it ‘right’ first time.
Working Effectively With Legacy code – filled with practical advice for dealing with legacy code: code without tests. Topics include :
– don’t make changes until you’ve put in some tests.
– how to make progress if there isn’t any structure
– how to add tests to code not designed for testing
– ways to bring design and forethought to code that has lost it or never had it
Grokking Algorithms: an illustrated guide – There are many books on algorithms and data structures out there, but I found this light-hearted introductory example to be a good start.
More Agile Testing – I found this more accessible than its predecessor and has a good introduction to the testing quadrants.
Complete guide to test automation – a good grounding in the what why and how of test automation.
User Needs And Requirements
Behaviour-Driven Development With Cucumber – This book is as much about understanding user needs as it is software engineering.
The Inmates Are Running the Asylum – This book is all about recognising that technical people often default to building something that doesn’t satisfy the needs of the user. (The inmates running the asylum are the technical people!)
Architecture And Design
Clean Architecture – Like ‘Clean Code’, this is another book from Robert Martin, and sets out some basic principles for designing and implementing programs.
Software Craftsmanship – This book is all about enjoying your work by achieving autonomy, mastery and purpose.
Enterprise Integration Patterns – This one is perhaps more of a reference book than some of the others mentioned, but it is good to be aware of the many ways that large software can be integrated effectively. There is also an accompanying website.
Deployment and Dev-ops
The Dev-ops Handbook – an easy to read intro to the thinking and philosophy behind DevOps. The principles grew out of lean manufacturing and seek to remove waste and shorten feedback cycles between customers, developers and testers.
Balancing Agility An Discipline – the upsides and downsides of agile and the skill level of a team you need for agile to be successful. Read more about this trade off.
Death March – the importance of triage, prioritisation and saying “no”.
Mythical Man Month – The perils of adding new people to a project (they often slow it down as existing team members need to train them before they can be useful…)
A few books that I’m not so familiar with, but seemed worth a mention:
Practical Object Oriented Design: An Agile Primer Using Ruby, 2/e – This book and videos of the author’s talks on Youtube were very useful – does she also talk about the design/complexity trade off? Good chapter on effective test-driven development.
Rapid Development – taming wild software schedules – introduces some essential ideas about software projects and project management
Growing Object-Oriented Software, Guided by Tests More on the ‘mockist’ approach to TDD.
Peopleware – not really about software engineering per se, but is a popular text in the area of working with people in and around software development.