#1. Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, Richard, Helm, Ralph Johnson, and John Vilssides
The book is compiled by four top-notch designers. Design Patterns contains a catalog of simple and succinct solutions to commonly occurring design problems. The book talks about 23 design patterns allowing developers to create more flexible, elegant, and ultimately reusable designs. The authors have started by describing what patterns are and how they can help you design object-oriented software.
#2. Head First Design Patterns: A Brain-Friendly Guide by Eric Freeman, Bert Bates, Kathy Sierra, and Elisabeth Robson
Programmers often struggle with software design problems. The first edition of Head First Design Patterns is updated for Java 8. The book shares true, and road-tested patterns used by developers to create elegant, reusable and flexible software. The book will help you follow the best design practices, experiences, and experiences from those who have fought best of design problems.
#3. Working Effectively with Legacy Code by Michael C Feathers
This book collects start-to-finish strategies for working effective with large legacy code bases. The book draws on material that Michael created for his own seminars and techniques that he uses. This book also compiles a catalog of twenty four dependency breaking techniques that help you with program elements.
#4. Art of Computer Programming by Donald E. Knuth
This is a series of four books recommended for developers that are serious about learning the art of programming. The four volume set goes in depth and detail of computer science. If you really want to learn in-depth about algorithms and you are prepared for some heavy mathematics to follow, you must invest your time in reading this book.
#5. Compilers: Principles, Techniques, and Tools by Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman
This book is known as the 'Dragon Book' to professors, students, and developers around the world. Every chapter in this book is unique and revised to reflect the modern development trends in software engineering, computer architecture, and programming languages.