You probably already noticed that I'm a big fan of reading. I usually read 3-4 books per month. You can learn from knowledgeable people in two ways: to work directly with them or to read what they have written. The first is the best option, yet it is often impossible. We have books written by people who are the best at this in the world at the time of writing. If we look at the software engineering world, there are many gems here, but I will recommend the best books per area of work.
1. General
The Pragmatic Programmer by David Thomas and Andrew Hunt.
This book provides technical and professional practical advice for developers to improve. It examines what it means to be a modern developer by going through topics that range from personal responsibility and career development to architectural techniques.
Modern Software Engineering by David Farley
This book focuses on building great software, where the author offers a solid framework to connect good practices such as Continuous Delivery (CD), Hexagonal Architecture, and Test-Driven Development to the main ideas in software engineering. Also, he writes about the history of software development and ideas which changes the industry.
2. Good Practices
Clean Code by Uncle Bob Martin.
One of the most excellent software development books ever, written to teach software engineers the principles of writing clean programming code. There are a lot of examples inside, showing how to refactor code to be more readable and maintainable.
Head First Design Patterns by Eric Freeman.
The book describes the leading software design patterns to create more flexible, elegant, and reusable designs without rediscovering the design solutions. It is written similarly to the For Dummies series of books, meaning it is easy for beginners to understand.
Refactoring by Martin Fowler.
In this book, Martin Fowler writes about improving the design of an existing code. Refactoring represents changing a software system that does not alter the code’s external behavior but improves its internal structure.
3. Data Structures and Algorithms
Grokking Algorithms by Aditya Bhargava.
It is an easy-to-understand book on applying standard algorithms to our daily practical problems as developers. It starts with sorting and searching and goes up to data compression and artificial intelligence fields, with code samples in Python.
Introduction to Algorithms, by Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
One of the most famous books on all kinds of algorithms in depth (also known as CLRS). It represents a comprehensive guide for all readers, from beginners to professionals. Each chapter is relatively self-contained and can be used as a unit of study. Algorithms are described in English and pseudocode, so one can be familiar even with someone who didn’t do much coding.
4. Data
Designing Data-Intensive Applications by Martin Kleppman.
The book describes advanced data concepts, such as databases and data models, and deep dive into distributed concepts, such as transactions, replication, consistency, etc.
Learning SQL by Alan Beaulieu (Free E-book).
This introduction to SQL will get you started with SQL quickly. The book will help you quickly understand all the SQL essentials, whether you need to create database applications, carry out administrative duties, or generate reports.
5. Testing
Growing OO Software by Tests by Steve Freeman.
The authors outline their procedures, design goals, and some equipment they use to complete the task. Next, you’ll understand how TDD functions on several levels through an extended worked example, utilizing tests to direct the code's features and object-oriented structure and mock objects to find and then define links between objects.
Unit Testing Principles, Practices, and Patterns by Vladimir Khorikov.
The book demonstrates how to apply best practices to improve your unit tests. You'll discover how to tell which tests are working, which require restructuring, and which must be removed entirely!
The Art of Unit Testing by Roy Osherove.
This book is focused on unit testing as a crucial thing any developer needs to do to deliver a good piece of software. The book explains core competencies on how to unit test, scope it, and what to unit test.
TDD by Example by Kent Beck.
TDD is a software engineering technique that has proven effective over time. In this book, Kent Beck teaches programmers TDD by example.
6. Software Architecture
Fundamentals Of Software Architecture by Mark Richards and Neil Ford.
This book offers the first thorough examination of software architecture's numerous facets. Architectural characteristics, patterns, component selection, diagramming and presenting architecture, evolutionary architecture, and many other topics are covered for aspiring and practicing architects.
Clean Architecture by Uncle Bob Martin.
The book introduces necessary disciplines and practices for software architects using design principles to address function, component separation, and data management. It shows how to use different high-level structures for different kinds of applications and how to define appropriate boundaries and layers.
Software Architecture The Hard Parts by Neal Ford, Mark Richards, Pramod Sadalage, and Zhamak Dehghani.
This book reveals how to choose proper architecture for different solutions among various compromises. You will learn to analyze trade-offs, document your decisions, and understand the complexities of breaking apart monolithic applications. It also shows how to handle data in a highly distributed architecture.
Domain Driven Design Quickly by Abel Avram and Floyd Marinescu (Free E-book).
Probably the best book on DDD. The book shows the DDD approach with concrete examples which build an actual project. It also explains the hexagonal architecture typically associated with DDD.
A Philosophy of Software Design by John Ousterhout.
This book explains how to break down complicated software systems into independently implementable pieces. After that, it discusses philosophical concerns about approaching the software design process and offers a list of design guidelines to follow. The book also presents a list of warning signs for bad design. It is a great companion to the Clean Code as it offers a different perspective.
7. Distributed Systems
Understanding Distributed Systems by Roberto Vitillo.
The book teaches the fundamentals of distributed systems. This book is a great first book on distributed systems, and it introduces the network stack, data consistency models, scalability and reliability patterns, and much more.
8. DevOps
DevOps Handbook by Gene Kim, Patrick Debois, John Willis, and Jez Humble.
The book is a continuation of the earlier book, The Phoenix Project. The book makes an effort to define the guidelines for successful DevOps and, in the process, dispels any lingering misconceptions about this subject. The book is intended for everyone in the IT sector, from programmers to technology executives, and it should be attractive to seasoned practitioners and DevOps newcomers.
Continuous Delivery by Jez Humble and David Farley.
The writers present the foundations of a quick, dependable, low-risk delivery procedure. The "deployment pipeline," an automated mechanism for handling all changes from check-in to release, is then introduced. They then discuss the "ecosystem" required to support continuous delivery, including governance, infrastructure, data, and configuration management.
Accelerate by Nicole Forsgren, Jez Humble, and Gene Kim.
The authors examined what made successful technology organizations different from their less successful rivals. The book compiles years' worth of thorough research from State of DevOps Reports, which were based on 23,000 datasets from businesses worldwide. According to the study, four key metrics may be used to compare how organizations operate (Cycle Time, Deployment Frequency, Change Failure Rate, and Mean Time to Recovery).
9. Machine Learning
The Hundred-Page Machine Learning Book by Andriy Burkov
The author of this short book offers a high-level review of various machine learning subjects that will be interesting to novices and prospective students who want to quickly learn about the breadth of opportunities provided by ML algorithms before delving more deeply into the issue.
10. Technology-specific
C# in Depth by Jon Skeet.
One of the best books on C# (intermediate level). It deep dives into the C# language with some enterprise and web development techniques. You will learn more about LINQ, Async, tuples, and more.
Effective Java by Joshua Bloch.
This is a must-read book for Java developers. It teaches you how and when to use a particular Java feature. The third edition describes features from JDK 7, 8, and 9.
Please review my list of the Greatest Software Development Books of all time.
More ways I can help you
Patreon Community: Join my community of engineers, managers, and software architects. You will get exclusive benefits, including all of my books and templates (worth 100$), early access to my content, insider news, helpful resources and tools, priority support, and the possibility to influence my work.
Sponsoring this newsletter will promote you to 33,000+ subscribers. It puts you in front of an audience of many engineering leaders and senior engineers who influence tech decisions and purchases.
1:1 Coaching: Book a working session with me. 1:1 coaching is available for personal and organizational/team growth topics. I help you become a high-performing leader 🚀.
Another One: The Pragmatic Programmer by Andy Hunt and Dave Thomas
Awesome list!
In addition, I'd the suggest the following books to every engineer looking for growth and productivity.
1. "Why Programs Fail - A Guide to Systematic Debugging" by Andreas Zeller. A must read to improve debugging skills.
2. "Never Split the Difference" by Chris Voss. A must read to improve negotiation skills.