An Ordered and Curated Reading List for Software Craftsmanship Growth
This list is the order I wished I had read these books when I started reading programming books. I have tried to maximize learning per page in this list. It will take years to read them all, so don’t stress it and take your time. Remember, It’s not a competition; It’s about learning and improving skills in our craft.
All links to Amazon on this website are affiliate links. I’m grateful for anyone who wants to use them to support this website.
1. Novice
Novice programmers knows how to program but has yet to build something substantial, like taking an idea to a finished and released application. If you are a beginner start by reading this article.
Practice is essential to get good at programming. This programming book contains no solutions, is language agnostic, and will take you from small programs that display “hello, {name}” in a terminal to complete applications that utilize network, persistence, and UI, all without ever overwhelming you. It does this by introducing new concepts and challenges gradually for each exercise.
Explaining something to someone shows a great understanding of the subject matter. Why? Because you will have to be sure you have no assumptions and only facts. Doing this for programming and distributed systems is no easy task, but this programming book does it excellently, and I’m sure this will prove most useful to any developer.
The Command-Line Interface (CLI) can initially be intimidating. This short little book will show you how to navigate the filesystem and list, create, move, and remove files. The CLI will be an invaluable tool throughout your career as a software developer.
Edit text faster and more confident by utilizing the time tested editor Vim
2. Apprentice
Apprenticeship is about learning and getting comfortable with the basics. As an apprentice, you should focus on taking control of your education and seek ways to improve.
We all struggle with the same issues in our journey to mastery, especially early in our careers when we are apprentices. This programming book contains common problems for developers and discusses how to go past them. Knowing this early in your career will give an immense advantage to those who don’t. I’m sure the advice given here will be helpful indefinitely throughout your career as a software developer.
Test code is essential for a healthy software project. If you have no tests, you can’t refactor your code safely or avoid regression effortlessly.
Poorly written tests can become a burden instead of an advantage if one is not careful. Writing good tests is a skill like any other, and this is a great resource to learn how to improve your test writing skills.
An Illustrated Guide for Programmers and Other Curious People
Aditya Bhargava
Understanding algorithms is understanding how to decompose problems and using the right tools for the job. For example, being good at memorizing sorting algorithms will bring you nowhere, but understanding how and why they work will always be helpful and make you a better problem solver. This programming book is an easy and friendly introduction to algorithms with playful illustrations that make it easy to learn algorithms and data structures.
Functional Programming is growing in popularity, and it’s a paradigm with a lot to teach about how to design a system. This book covers how to minimize mutability and separate concerns, and the last chapter briefly introduces reactive programming and the onion architecture.
Thinking like a functional programmer can help you write simpler code and reduce system complexity.
The fundamentals of Object-Oriented Programming (OOP) are easy to overlook. Don’t do that; there is plenty to learn from OOP. There are many misconceptions about OOP; it can be an excellent tool for designing maintainable applications if appropriately used.
You will always need to learn new things that will never stop. Understanding how we think and learn will make your journey as a developer more manageable. Knowing how to optimize your brain for learning is well invested and will payoff immensely through the years.
3. Journeyman
A journeyman has a solid foundation of the basics and can stand on one’s own two feet. Now it’s time to broaden one’s skills. It’s time to leave the comfort zone and explore other ways to do things and new perspectives.
Agile development isn’t scrum or any other process for that matter. Instead, it’s a collection of values and principles guiding your team and organization to work better.
This programming book discusses the first 20 years of agile development, what went wrong, and what worked, giving concrete examples and advice on what practices you and your team can adopt to become more agile.
There are bad and good coding habits. This programming book documents many and gives them context. Understanding what makes code difficult to read and change will help keep the codebase maintainable.
Everyone won’t always agree with everything a programming book states, which is fine. But be careful to jump to conclusions without some reflections. You can read more about that in my article When programming books are wrong.
The Hidden Language of Computer Hardware and Software
Charles Petzold
Code is what you as a developer writes to solve problems for users, but what is code, and why does it work? This programming book explores the origins of code and takes you on a computer-building journey starting from logic and gates.
The right tool for the right problem is the name of the game. For smaller projects, the choice of databases has little impact. In distributed systems, what database you use can make a huge difference in response times.
Building Extensible and Maintainable Object-Oriented Software
Eric Freeman & Elisabeth Robson
A gentle but thorough introduction to design patterns.
Design patterns describe a problem and a general solution that can be applied in many variations depending on your context. Pattern familiarity can significantly enhance your ability to design modular and decoupled code.
Knowing your way around SQL and databases is vital for most projects. This fun introduction to designing and using databases will not make you a database guru, but it will give you enough to get stuff done and prepare you for other database books if you wish to learn more.
This programming book will define and give you the recipe to be a pragmatic programmer. So don’t expect to be one just because you read it once. Instead, you need to follow their advice and take it to heart without
being dogmatic.
I’m sure your definition of a pragmatic programmer will change after you have read this programming book, and it will likely change again after reading it another time a few years down the road.
Refactor isn’t rewriting as much as it’s evolving the code in small steps to improve the code.
Since we seldom get something right the first time and our code will need to change (That’s why we call it software), refactoring is something we need to do as new requirements come.
Being good at refactoring and knowing how and when to do it can make it or break it for the quality of your code.
This book introduces a vocabulary for code smells and refactorings that will help your team talk about code and how to change it.
A Pragmatic Guide to Learning Programming Languages
Bruce A. Tate
This programming book introduces seven paradigms through seven programming languages. The ideas and concepts from these languages have influenced many modern languages today. Without Haskell there would surely be no Swift, Kotlin, or Elm.
Exposing oneself to new ideas and concepts is helpful for perspective and problem-solving. For example, Prolog and Erlang might seem like strange programming languages with little application, but understanding them might be more beneficial than you first might think.
You might want to revisit Exercies for Programmers and try to work through it with one of these languages.
Test-Driven Development (TDD) is the idea of writing test code before production code and letting that drive your design. TDD is one of the most rewarding technics one can learn. Learning TDD is tough and will take time and I can’t think of a better place to start than with this book.
Comprehensive guide of patterns and smells to help build a maintainable test suite
4. Master
A master should display excellent problem-solving skills while producing well-written code, showing communication capabilities and deep knowledge of their craft. More importantly, a master helps her peers and wants others to surpass them. You will find these books more demanding, but they will also be more rewarding.
The road to mastery is never over. Like the black belt in martial arts, this is the beginning of something, not the end. So continue reading and learning! You can find more books I recommend on the more page.
Programming languages compile to machine code for the computer to run. Deconstructing how we build programming languages will give an understanding that can make learning new programming languages trivial.
The Big Ideas Behind Reliable, Scalable, and Maintainable Systems
Martin Kleppmann
Distributed systems backed by databases are extremely common. Designing a distributed system is nontrivial because, by nature, it involves many components and external interfaces that bind you to early mistakes.
Domain-Driven Design (DDD) is a big topic, and this is the book that started it. It explains everything you need to know to make a difference in how your business communicates and your team writes code.
Remzi H. Arpaci-Dusseau & Andrea C. Arpaci-Dusseau
Don’t neglect how operating systems work, as they are the mediator of all software running on the machine. Understanding operating systems gives you an insight into the interplay of devices and software that can be hard to grasp otherwise.
Sometimes we treat people like machines. In some occupations, this can work. In software projects, it creates problems that can be hard to fix.
People are what make software projects succeed or fail. Few problems are technical. Having a well-functioned team is more important than a modern tech stack.