These are the top books on programming I’ve read. Each has majorly improved my quality of life as a programmer.

Links take you to InformIT, a distributor where you can buy physical books or DRM-free ebooks.

As of right now these are not affiliate links: I don’t make any money if you buy through them. They are just recommendations.

  • Extreme Programming Explained

    Extreme Programming Explained

    How can we write software in a way that is ready to flex with change, instead of treating change as an unexpected problem?

  • Growing Object-Oriented Software, Guided by Tests

    Growing Object-Oriented Software, Guided by Tests

    How can we write tests that ensure our system behaves as it should and that our code is easy to work with?

  • Object Thinking

    Object Thinking

    Why are some developers drawn to statically-typed languages and upfront planning, and others drawn to dynamically-typed languages and agile methodologies?

  • Practical Object-Oriented Design: An Agile Primer Using Ruby

    Practical Object-Oriented Design: An Agile Primer Using Ruby

    How can you write software that stays easy to change over time? (The principles apply to any programming language, although non-object-oriented languages will take a bit more work to get there.)

  • Refactoring

    Refactoring

    How can you make improvements to software without having to do large, sweeping, risky changes?

  • Smalltalk Best Practice Patterns

    Smalltalk Best Practice Patterns

    What small decisions can we make arranging our code to make it easier to maintain? (The principles and way of thinking apply to any programming language.)

  • xUnit Test Patterns

    xUnit Test Patterns

    What can you do when your tests are having problems and you aren't sure how to fix them?

Extreme Programming Explained

Extreme Programming Explained

How can we write software in a way that is ready to flex with change, instead of treating change as an unexpected problem?

Growing Object-Oriented Software, Guided by Tests

Growing Object-Oriented Software, Guided by Tests

How can we write tests that ensure our system behaves as it should and that our code is easy to work with?

Object Thinking

Object Thinking

Why are some developers drawn to statically-typed languages and upfront planning, and others drawn to dynamically-typed languages and agile methodologies?

Practical Object-Oriented Design: An Agile Primer Using Ruby

Practical Object-Oriented Design: An Agile Primer Using Ruby

How can you write software that stays easy to change over time? (The principles apply to any programming language, although non-object-oriented languages will take a bit more work to get there.)

Refactoring

Refactoring

How can you make improvements to software without having to do large, sweeping, risky changes?

Smalltalk Best Practice Patterns

Smalltalk Best Practice Patterns

What small decisions can we make arranging our code to make it easier to maintain? (The principles and way of thinking apply to any programming language.)

xUnit Test Patterns

xUnit Test Patterns

What can you do when your tests are having problems and you aren't sure how to fix them?