Disclosure: The book links below are affiliate links. If you buy anything, I earn a commission, at no extra cost to you.
The following books have shaped the way I code. I bought them for myself, and recommend them to you.Refactoring: The Improving the Design of Existing Code (2nd Edition) by Martin Fowler
The first edition completely changed the way I code. Started my whole journey. Essential.Working Effectively with Legacy Code by Michael Feathers
The second book that changed the way I code. “Legacy code” is any code without unit tests.Clean Code: A Handbook of Agile Software Craftsmanship by Robert Martin
The third book that changed the way I code. Made my “clean code” so much cleaner.Test-Driven iOS Development by Graham Lee
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.xUnit Test Patterns: Refactoring Test Code by Gerard Meszaros
A wealth of information on how to write, organize, and refactor test code.Dependency Injection in .NET by Mark Seemann
Don’t be put off that it says “.NET” in the title. This is the best book on the subject.The Art of Unit Testing: with examples in C# by Roy Osherove
Don’t be put off by the “C#” in the title. This is good, good stuff.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.Refactoring to Patterns by Joshua Kerievsky
How to refactor towards a pattern, and also away from a pattern.Domain-Driven Design: Tackling Complexity in the Heart of Software by Eric Evans
Rethink Object Oriented Design by shaping your code to express the domain.The Art of Agile Development by James Shore and Shane Warden
A practical handbook about applying Extreme Programming.