A Philosophy of Software Design

John Ousterhout

I liked this book because it’s grounded on research done by the author during this tenure as an instructor at Stanford University. There, he taught students a course on software design and how to write quality code. The book compiles design principles which the author presents as solutions to common design issues and code anti-patterns identified his students’ assignments.

The book focuses on concepts that help simplifying software complexity. Although it’s a short book, it is packed with good advice. The chapters that resonated with me the most include his take on error handling, where he argues that most exceptions are unnecessary, proposing alternatives to reduce code complexity. In sections about information hiding and abstractions he advocates for interfaces that are simple in design yet rich in functionality. Finally, hhe abundant addition of code examples makes the author’s ideas easier to follow.

You can see most of the ideas on the book in this presentation by the author:

The Pragmatic Programmer

David Thomas / Andrew Hunt

I liked this book because it’s the classical handbook on the craft of software development. First published in 1999, it still remains relevant for all professionals in the industry and indeed I use a lot of its advice in my daily work. For example, I always write a failing test before fixing a bug. I also make sure I know my tools (like the IDE and debugger) really well. The book teaches to use interfaces instead of inheritance, to let objects do their own work (’tell, don’t ask’), and to be careful with using global data and shared state. There are many more great tips in it.

I read “The Pragmatic Programmer” from cover to cover when I first got it because I liked it so much. However, I often come back to it because I find fresh insights every time I pick it up. It’s also been super helpful when I’m giving advice to someone who’s newer to programming, because a lot of what I share, I learned from this book.


Martin Fowler

I liked this book because it offers a very detailed explanation of different refactoring techniques, covering over 60 different types. “Refactoring” is filled with code examples and clearly explains the ‘code smells’ that each refactoring technique addresses.

Improving the design of existing code is an invaluable skill to learn as a professional developer, and this book has greatly increased my confidence when handling both large and small refactoring projects. As such, “Refactoring” is a book that I used as reference in my work many times.