The following books have shaped the way I code. I bought them for myself, and recommend them to you.
Disclosure: The book links below are affiliate links. If you buy anything, I earn a commission, at no extra cost to you.
The Art of Agile Development: Pragmatic Guide to Agile Software Development
by James Shore and Shane Warden
A handbook for applying Extreme Programming (XP). XP is the foundational agile approach focusing on technical practices.
The Art of Unit Testing: with examples in C#
by Roy Osherove
This book gave me a solid foundation. Don’t be put off by the “C#” in the title. This is good, good stuff.
Beyond Legacy Code: Nine Practices to Extend the Life (and Value) of Your Software
by David Scott Bernstein
A practical guide to technical agile practices.
Clean Code: A Handbook of Agile Software Craftsmanship
by Robert Martin
I thought my code was already clean. Then I read this book, and it helped make my code so much cleaner. Some chapters are written by other folks.
Dependency Injection Principles, Practices, and Patterns
by Mark Seemann and Steven van Deursen
This book helped me get a handle on Dependency Injection. I read the first edition, and look forward to getting this update. The examples are in C# on .NET—don’t let that put you off.
Design Patterns: Elements of Reusable Object-Oriented Software
by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
You can’t claim expertise in OOP without being familiar with this book.
Domain-Driven Design: Tackling Complexity in the Heart of Software
by Eric Evans
This book explores Object Oriented Design (OOD). Can you shape your code to express your domain?
The Mikado Method
by Ole Ellnestam and Daniel Brolund
An effective technique for tackling multi-step refactoring.
Refactoring: Improving the Design of Existing Code
by Martin Fowler
The first edition completely changed the way I code, and started my whole journey. The second edition is better still. Essential.
Refactoring to Patterns
by Joshua Kerievsky
How to refactor towards a pattern, and also away from a pattern.
Test-Driven iOS Development
by Graham Lee
The original iOS TDD book. The examples are in Objective-C, but the concepts go much deeper.
See my post Test-Driven iOS Development: The Book That Fills a Big Hole for more thoughts.
Test-Driven iOS Development with Swift 4
by Dominik Hauser
Don’t just read this; actually work through the example yourself.
Working Effectively with Legacy Code
by Michael Feathers
This book taught me how to break the cycle of fear with approaching legacy code: “I can’t refactor without tests, but I can’t add tests without refactoring.” The author defines “legacy code” as any code without unit tests.
xUnit Test Patterns: Refactoring Test Code
by Gerard Meszaros
This is the Unit Testing Bible. A wealth of information on how to write, organize, and refactor test code.