Head First Design Patterns: A Brain-Friendly Guide.
This book is filled with great visualizations to help you to learn new concepts easily. It shows you the tried-and-true, road-tested patterns, and best practices used by developers to create functional, elegant, reusable, and flexible software.
Eric Freeman, Elisabeth Robson, Bert Bates and Kathy Sierra.
Refactoring: Improving the Design of Existing Code.
With this book, you will be able to understand the process and general principles of refactoring that you can quickly apply to your codebase. It will help you recognize “bad smells” in code that signal opportunities to refactor, tradeoffs, and obstacles to refactoring.
Kent Beck and Martin Fowler
The Pragmatic Programmer.
This book is a classic that will help you create better software and rediscover the joy of coding. You'll learn how to approach tackling different problems in your future professional career.
Andy Hunt and Dave Thomas
Working Effectively with Legacy Code
This book will teach you how to get legacy code ready for testing and how to identify where the code needs to be changed. It will help you understand the general mechanics of software change like adding features, fixing bugs, optimizing performance, and improving the design.
Michael C. Feathers