Books related to programming or Software Engineering can be divided into two categories: the ones that are outdated shortly after printing and those which are still valuable after decades.

In this article I would like to present you books that will help you skill up at Software Engineering. I once heard that a good book is like accomplishing a software project. In my opinion some of the books I’ve listed below are worth more than several projects.

Disclaimer: Most of the books below should apply to every programming language and all programming sectors (game, frontend, distributed). But I’m a Backend Software Engineer that specializes in so called “business applications”, so don’t be surprised that it’s reflected in the list below.

Fundamentals

Books - Fundamentals

The books in this category contain knowledge that should be obvious to any senior software engineer and will help you achieve that level or strengthen your skills.

The Pragmatic Programmer: From Journeyman to Master - Hunt Andrew, Thomas David

  • It’s often recommended to devs who aren’t seniors yet as a “must read”. But it’s so often cited and referenced that I wouldn’t be ashamed to read it as a senior as well. I’m not sure if it’s true, but I think this book laid the foundation for the software craftsmanship movement. This book shows you what it means to be a professional Software Engineer.

Modern Software Engineering: Doing What Works to Build Better Software Faster - Dave Farley

  • One of the newest books here, but it’s something the industry was longing for. The books is more general than The Pragmatic Programmer. It talks about the process of software engineering: feedback, empiricism, experiments, continuous integration. The most important part is on managing complexity (modularity, cohesion, etc). It’s valuable for regulars/seniors (the content could be overwhelming for juniors).

Agile Software Development, Principles, Patterns, and Practices - Robert C. Martin (.Net edition: Agile Principles, Patterns, and Practices in C#)

  • I’ve put this book in Fundamentals, because it’s quite lightweight and at the same time it talks about so many subjects: Agile Design, Design Patterns and diagrams. It also covers: Agile, XP, Iterations, TDD/Tests and Project Management.
  • Although this book doesn’t mention SOLID (which has a bad press recently for a reason) it does explain its principles. But on that level you shouldn’t be bothered by that.

The Art of Unit Testing - Roy Osherove

  • Testing your code is one of the core skills to possess and this book is comprehensive in that subject. Another good points about this title are: it touches TDD; it clearly says that “unit” in “unit testing” is not a class; and it encourages you to avoid mocks.

Software Design

Books - Software Design

This category is dedicated to titles that teach you how to design software programs, applications, services or systems.

Applying UML and Patterns - Craig Larman

  • Don’t be scared by the words “UML” or “Patterns”. This book uses them as a tool to show how to design a software system. How to go from a vision to the code. Furthermore, it shows the whole software lifecycle (inception, requirements gathering, etc). (Some methods are a bit dated, but it’s good to know them).

Code Complete: A Practical Handbook of Software Construction, 2nd ed - McConnell Steve

  • That is The Book. It covers all aspects of software construction in a comprehensive way. It teaches you how to think about programming, how to approach problems, how to build quality in. If you find some dated stuff, just treat it as a history lesson. It was the most recommended book before “Clean Code” came.

Refactoring: Improving the Design of Existing Code - Kent Beck

  • The problem with some programmers is that they never saw what a good code looks like (so they just repeat what they find in the current codebase). That’s one of the problems this book solves. It teaches you about the “code smells” and shows alternatives. Don’t think that since you don’t refactor the code that often, this book will be useless for you. It teaches how to write code that doesn’t need refactoring.

A Philosophy of Software Design - John Ousterhout

  • That’s the newest book in this list, and also one of the best.
  • It shows the results of research in the subject of software design. It touches heavily on the modular design, complexity and red flags that reveal a bad design. It’s quite advanced, but quite compact at the same time. You have to study it, not just read, because a lot of knowledge is packed into few examples.

Clean Architecture: A Craftsman’s Guide to Software Structure and Design - Robert Martin

  • I had doubts about whether this book should be on my list or not. I’m not a fan of Martin’s Clean Code book as it’s too prescriptive or SOLID principles (that were sold as class design rules). The “A Philosophy of Software Design” book (mentioned above) is much better resource on this.
  • Nevertheless, this book is unique when it comes to description of Application Architecture in a holistic way. It’s even hard to find a modern book that can compete on this topic with this one. I recommend reading everything from chapter 12 onward.

Patterns of Enterprise Application Architecture - Martin Fowler

  • This book was very popular in the era of monolith systems and fat clients. So you might think that design advice from PoEAA can’t be applied nowadays. To a degree that’s true, but the value of that book comes from the reasonings and design techniques that show how simple design building blocks can be used to compose a complex design.
  • Some of the topics covered in that title: Optimistic concurrency control, First Law of Distributed Object Design, Domain Model, DTOs, Transaction Scripts. Also this book might be a shock to people who think that Domain Model, Value Objects or Repositories didn’t exist before DDD.

Software Architecture

Intentionally blank page. (See: Honorable mentions).

Technical leadership

Books -  Technical leadership

Here we come to the category dedicated to Seniors and Team/Tech Leads. These books will help you manage the team and the project by yourself (project setup, managing stakeholders, requirements, team aligning, etc).

The Mythical Man-Month: Essays on Software Engineering - Frederick P. Brooks

  • Almost 50 years old, but still often recommended! I remember the wow effect it made on me. How come the problems described so long ago still happen in modern IT? This book will teach you that the problem we have with our projects is a people problem.

Rapid Development: Taming Wild Software Schedules - Steve McConnell

  • I think that this book made the biggest impact on my professional career as a tech lead. The author of Code Complete did it again and wrote a comprehensive, valuable, actionable resource that I regard as a “must read” when we talk about Senior+ roles.
  • Browse for “The 10 Most Deadly Mistakes in Software Development” and you will see a poster taken from that book. And when you see it and realize that the book is almost 30 years old… (no spoilers).

The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win - Gene Kim, Kevin Behr, George Spafford

  • It’s definitely a fun read. It’s quite similar to “The Goal” (Goldratt) in the sense that it doesn’t serve you principles and techniques directly. But rather puts them into a novel-like narrative. You can read here about creating a real DevOps Culture (where DevOps means someone who develops and takes care of the production environment). I reckon it might be labeled as a classic in the future.

Leadership

Books - Leadership

That’s the category for soft-skills. Don’t be surprised that they are required in Software Engineering.

How to Win Friends & Influence People - Dale Carnegie

  • An intro to people interaction guide. Should be read by everybody, but it will be especially valuable for team leaders and seniors who manage people.

Peopleware: Productive Projects and Teams - Tom DeMarco, Timothy Lister

  • That’s another classic. It concentrates on human factors in project and team management. You can learn from it what drives people’s productivity and fosters teamwork.

What’s not on the list

Honorable mentions

The books here are valuable, they just didn’t make it to the top picks, because I know people don’t have unlimited reading time.

  • 97 Things Every Software Architect Should Know - Richard Monson-Haefel - Nice read, but it’s not the kind of book that will change your software engineering skills.
  • Fundamentals of Software Architecture - Neal Ford - It’s a good book. Probably the best on the software architecture I’ve found. But when I’ve gone through the notes I’d taken from it I realized there’s not much stuff I can use in my daily work that I hadn’t known already.

My reading queue

In progress:

  • Software Engineering at Google - T. Winters, T. Manshreck, H. Wright
  • Designing Event-Driven Systems - Ben Stopford
  • 100 Go Mistakes - Teiva Harsanyi

Pending

  • The Staff Engineer’s Path - Tanya Reilly
  • An Elegant Puzzle: Systems of Engineering Management - Will Larson

Books that I don’t recommend

I’ve read a lot of books that weren’t good enough to recommend, but the books below are ones I am opposed to recommending:

  • Clean Code - Robert C. Martin - I think this book is deprecated. In modern software design SOLID principles are more a cargo-cult than useful design techniques. Golang’s approach to get back Unix Philosophy or Dan North’s CUPID - have shown that simple design wins with tons of abstraction layers.
  • Design Patterns: Elements of Reusable Object-Oriented Software - GoF. This book is valuable, but I wouldn’t recommend it with a clear conscience. Online resources (like sourcemaking.com) are just enough. And “real-life” applications are described in many of the books I’ve presented above.
  • Working Effectively with Legacy Code - Michael Feathers. It’s often recommended and the cover is just awesome, but I’ve found there is nothing new for me.
  • Domain-Driven Design: Tackling Complexity in the Heart of Software - Eric Evans - I know it’s risky to put this book in a “not recommended” bucket. And I won’t discuss it further, because there’s a cult around that book. By the way, I can bet that the Blue Book put more people to sleep than all of the above combined :)

Final remarks

The books in the list are presented in the proposed reading order. If you think that it seems like a lot of books to read (it’s at least 3-4 years worth of study), think first how much time it takes to become a Senior Software Engineer or Tech Lead. You have time.

Remember to make notes when you read a book. If you don’t write even a single bullet-point from a chapter it means it was a waste of time. If you do, you can place your notes in Evernote (or similar app) and build your own browsable knowledge base.

Books won’t substitute the work experience. You have to work on good projects with real problems. Books will speed up your progress, but there’s no magic. (Make sure that your 5-years-long project is not just a 1 year × 5 times).

This article will be a living document. I hope to update it in several months.


Andrzej Nowik, v1/2024.04.14
.