If you’re just like me, you first learned how to code because you liked to make things (and maybe liked computers a bit too much).
Computer programming is in some regards the ultimate practice of human creativity. When I used to work as a volunteer youth counselor, we defined creativity as the process of “making something out of nothing.”
This is exactly what we do as programmers: We make something out of nothing.
Give us an empty text editor, and we’ll give you back self-driving cars, the internet, and hyperrealistic virtual reality.
Honing your craft as a programmer is no easy task, but it can be made fun.
Learning a few programming languages may seem like the endgame, but it’s just the beginning.
You have the tools, now you have to learn how to use them. Sure, it helps if you know a programming language really well, but the trick is in how you use it.
If you have a knack for solving hard problems and also have a bit of stamina, you’ll be able to get through these books and get from journeyman programmer to expert.
Note: All rights to book cover images belong to their respective owners.
Code: The Hidden Language of Computer Hardware and Software
By Charles Petzold, published by Microsoft Press.
This book will not teach you how to program, nor how to land a job in the tech industry.
It is, on the other hand, the first step toward that journey. Plenty of times I have seen people struggling with programming because they are lacking the necessary tech-savvy to get things done. This book solves this problem.
“A computer processor does moronically simple things — it moves a byte from memory to register, adds a byte to another byte, moves the result back to memory. The only reason anything substantial gets completed is that these operations occur very quickly. To quote Robert Noyce, ‘After you become reconciled to the nanosecond, computer operations are conceptually fairly simple.’”
Even if you have been working with computers for a long time, there is a chance that Petzold can teach you something new or at least show you something from a perspective you had not considered before.
This is an entry point to all things tech, and it is necessary to complete your education as an accomplished programmer.
The Pragmatic Programmer
Andrew Hunt and Dave Thomas
By Andrew Hunt and Dave Thomas, published by Addison-Wesley Professional.
In this book, Andrew Hunt and Dave Thomas give the readers a series of tips on improving their programming output.
These tips are mostly centered around the principle that programming is, at its core, a collaborative pursuit. If you aspire to work as a software engineer or programmer of any kind, much of the code that you will be working with will not be yours. Hunt and Thomas’s tips guide you through working in such an environment.
Their tips are practical and are best learned through practice. When you pick up the book, try to go slowly and reflect on the authors’ advice the next time you are programming. This is not a one-time read, but rather a workshop in good practices.
Tip 11: DRY — Don’t Repeat Yourself
Tip 30: You Can’t Write Perfect Software
Tip 44: Don’t Program by Coincidence
Tip 50: Don’t Use Wizard Code You Don’t Understand
Tip 70: Sign Your Work
“The Pragmatic Programmer” offers invaluable advice for anyone working with code, and it should be in every programmer’s library.
Introduction to Algorithms
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein
By Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, published by MIT Press.
If you have a bachelor’s degree in computer science, you probably know this one already. You have probably gone through some of the exercises as well. If you haven’t, bear with me.
It may seem daunting to go through a book like this without an instructor, but the good thing about not being in school anymore is that you get to take your time. Regardless of how long you take, the basic data structures and algorithms presented in this book are invaluable to any programmer serious about their career development.
Sure, you can survive a few years working as a software engineer without remembering the time complexity of QuickSort. You can survive without being able to code a DFS without pasting it from Stack Overflow or using a built-in library.
But the concept of not needing data structures and algorithms past school is juvenile. They are the tools with which programmers solve problems. They are the bread and butter of the modern software engineer.
You cannot hope to progress as a programmer, software engineer, or computer scientist if you are not familiar with the contents of this book (or the algorithms book of your choice).
The Art of Computer Programming: Volume 1
Donald E. Knuth
By Donald E. Knuth, published by Addison-Wesley Professional.
Much like with the previous entry in this list, getting through “The Art of Computer Programming” is a daunting task. Few have managed to go through the entire book consistently. Even fewer have taken the time to go through all the math in the first few chapters.
I haven’t gone through the entire tome, but I still could not recommend it more. It has its problems, mostly with respect to how well Knuth’s MIX language holds up for the modern audience, but if you move past that, he provides incredible insight and depth into the basic algorithms and data structures.
This book is a true challenge of intellect and perseverance, but it is also the source of a huge wealth of information.
Bill Gates himself said that if you finish this book you should send him a resume. Worth the try, right?
Cracking the Coding Interview
Gayle Laakmann McDowell
By Gayle Laakmann McDowell, published by the author.
Looking to land a job as a software engineer? Whatever your answer may be, this book is still worthwhile.
While algorithms and data structure textbooks are essential reads, they provide little to no actual practice. I am aware that both books I listed right before this one have myriad exercises for each concept they introduce, but there’s a catch: You always know what tool to use.
In the real world, software problems don’t come with a hint for what data structure, algorithm, or technique to use.
After explaining the basic data structures and algorithms (and by the way, don’t skip straight to this book), the author includes two extra sections at the end of the book, listing problems of medium and hard difficulty.
These problems come in random order and challenge the reader to figure out the best approach to solve them. If you had been paying attention while going through the earlier chapters, you would have picked up on the different patterns and cues when it comes to choosing the right data structure or algorithm to solve a problem.
This book makes you a better problem solver within the context of computer programming, so it is essential, even if you are not planning on interviewing any time soon.
The Mythical Man-Month
Frederick P. Brooks Jr.
By Frederick P. Brooks Jr., published by Addison-Wesley Professional.
This historic book about software engineering takes the spot of the must-read book about managing a software project.
If you are planning on working with a team of engineers, the concepts introduced in this book will broaden your perspective about what works and what doesn’t in the context of developing software.
The core message is that software engineering is not directly comparable to other disciplines in which manpower is directly interchangeable with time. If anything, Brooks claims that the opposite holds true. “Good cooking takes time. If you are made to wait, it is to serve you better, and to please you,” Brooks quotes as a subtitle to the second chapter of the book.
This and a dozen other essays on software engineering practices serve to illuminate any programmer on pitfalls within the discipline. This is a book to read as a way of ensuring that you are not misunderstanding your role as part of your team, organization, and tech industry as a whole.
It is a great book to read and then subtly recommend to your manager.
Algorithms to Live By
Brian Christian and Tom Griffiths
By Brian Christian and Tom Griffiths, published by Henry Holt and Co.
The last book on this list is not entirely linked to writing code, but rather to examining the problem-solving techniques derived from the design of certain algorithms (which, by getting this far down the list, you have probably already encountered).
The authors of this book make a brilliant connection between human psychology and computer science, linking the rationale behind a few hand-picked algorithms to everyday problems.
It is not uncommon for programmers to sometimes doubt how applicable the concepts they are learning are outside of writing code on a computer. Fortunately, Christian and Griffiths provide an answer to this, applying common algorithms to non-computer science problems and quantifying the answers to everyday concerns.
While learning to use algorithms and data structures for the purpose of writing better code is a worthwhile pursuit, learning how to use them in a context outside of the text editor makes it that much more fun to study them.