There are so many programming books out there, but most focus on specific technologies and their half-life is incredibly short. Others focus on process or culture. Very few focus on the timeless principles of writing good code, period. The following five books had the biggest influence on my programming style and development:
Some other lesser known books that some of my programmer friends and I have found helpful: Quality is Free, Conceptual Blockbusting, Peer Reviews in Software, Standing up to Experts and Authorities, and Coders at Work.
The books about writing are fantastic suggestions. I suggest On Writing Well at least once a day and The Elements of Style is the best reference to have on hand when writing anything long form. Both were given to me by my publisher when I decided to write a non-fiction book.
But what do I mean by programming books? Well, rather than something language-specific, like books on Python programming, HTML, CSS, or Ruby, here I'll cover general programming books with information and skills you can apply in all languages.
For me, this isn't just about programming but a definitive guide for any software development professional. I love Martin's approach to agile software craftsmanship, as he emphasizes the significance of clean, well-written code. This is like music to my ears!
Taking the next place on my list of programming books is Introduction to Algorithms. For any programmer or aspiring software developer, there comes a time when you need to take on the mastery of algorithms, and this is a great place to begin.
This is an interesting choice because while it's more than 25 years old, Structure and Interpretation of Computer Programs is a classic textbook for computer science education and learning programming, especially at MIT.
The second edition introduced major changes to reflect the authors' experience and lessons at MIT, including objects with state, concurrent programming, and sections on higher-order procedures in graphics and stream processing.
I particularly appreciate its insightful approach to functional programming and the way it connects mathematical logic with programming by focusing on pure functions and recursion. These are all key skills for any aspiring programmer.
Being an MIT textbook (of sorts), you should expect a rigorous yet engaging style that not only keeps you interested but also transforms your perspective on programming. It's especially great if you'd like to gain a deeper understanding of functional programming and its mathematical roots.
The main idea of this programming book is to take a deep dive into computational thinking and problem-solving, skills that any programmer needs to have. Plus, it's nice that this book takes a somewhat unique approach to demystifying complex concepts.
If you want to understand the philosophy and aesthetics of programming, this is a great read that can change how you think and code while also giving you a new perspective on abstraction, encapsulation, and coding style.
Unlike traditional programming books, Uncle Bob focuses on the attitude, discipline, and professionalism required in software development. I really like how he intertwines practical advice with a deep understanding of what it means to be a true software craftsman.
From handling conflicts and tight schedules to mastering the flow of coding and avoiding burnout, this programming book provides a true blueprint for professional conduct in the often stressful and challenging world of software development.
What really stands out to me is that this programming book presents a catalog of 23 design patterns! That's a lot! It also offers simple and succinct solutions to commonly occurring design problems in object-oriented systems.
I also really appreciate that this programming book takes a systematic approach to explaining and cataloging design patterns. Each pattern is described in detail, including its applicability, implementation, and the trade-offs involved.
The Pragmatic Programmer is, without a doubt, one of the best books for all programmers! Trust me, it is an invaluable addition to any bookshelf if you want a go-to resource for practical and timeless advice from authors who have distilled years of coding experience into accessible pearls of wisdom.
If you're not familiar with their series of programming books, the head-first series takes a metacognitive approach by combining text, humor, images, and games to make complex design patterns understandable and fun to learn.
Rounding out my list of programming books, I've actually added a book series from Donald Knuth, who just happens to be a Turing Award laureate (this is like the Nobel Prize for computing) for his contributions to the analysis of algorithms and programming language design:
This comprehensive collection makes up the Art Of Computer Programming. Known for its thoroughness and depth, these volumes cover a wide range of topics, from basic programming concepts to more advanced algorithms and data structures.
In fact, for many, Knuth's work is not just a series of books but more a monumental contribution to the field of computer programming, offering unparalleled insights into algorithmic thinking and problem-solving.
This series is also unique for its rigorous mathematical approach, blending theory with practical examples. It's a go-to resource for anyone serious about delving into the complexities of algorithms and programming techniques.
Kobo and Barnes and Noble were always so easy to work with, friendly, and had a real appreciation for the book industry. They really seemed to be the folks that, ya know, read books. Amazon cared about the money. Apple cared about the iPad and their new business model that got everyone in trouble. Kobo and BN cared about the books. Maybe not the best eReader hardware, but good enough!
Scrolling is decent and navigation back is fine too, probably 2-3 seconds. Overall the Oasis is not as fast as a phone but still MUCH faster than earlier kindles. Honestly I think just about any large tablet would be better for technical books, but I mostly read fiction.
I tend to read technical books on my Macbook Pro or iMac. The main reason is that I can switch back and forth between the book and the terminal following the exercises along the way. The best setup is a split fullscreen between iTerm on one side and iBooks on the other. The terminal has constant focus and I use trackpad gestures to turn pages. This works especially well on the iMac.
I seem to manage to read books when I am travelling or on holiday. Laptop is my devise to go to watch talks and to read articles and docs while I am programming and need a solution for particular challenge.
The first three books below are all slightly different takes on the same advice. No matter what your profession or education or task, effective people tend to share a similar mindset and employ similar techniques. Read the book that resonates with you the most.
You need data analysis skills to measure your results. Many programmers lack the statistics knowledge and the skills required to correctly apply statistical tests to data and come up with sound conclusions. These books will help.
This is a list of topics and books where I've read the book, am familiar enough with the topic to say what you might get out of learning more about the topic, and have read other books and can say why you'd want to read one book over another.
If you keep up with what's trendy, this book might seem a bit dated today, but only because so many of the ideas have become mainstream. If you're wondering why you should care about this "functional programming" thing people keep talking about, and some of the slogans you hear don't speak to you or are even off-putting (types are propositions, it's great because it's math, etc.), give this book a chance.
Why should you care? Having a bit of knowledge about operating systems can save days or week of debugging time. This is a regular theme on Julia Evans's blog, and I've found the same thing to be true of my experience. I'm hard pressed to think of anyone who builds practical systems and knows a bit about operating systems who hasn't found their operating systems knowledge to be a time saver. However, there's a bias in who reads operating systems books -- it tends to be people who do related work! It's possible you won't get the same thing out of reading these if you do really high-level stuff.
This book is about art and how productivity changes with age, but if its thesis is valid, it probably also applies to programming. Galenson applies statistics to determine the "greatness" of art and then uses that to draw conclusions about how the productivty of artists change as they age. I don't have time to go over the data in detail, so I'll have to remain skeptical of this until I have more free time, but I think it's interesting reading even for a skeptic.
This is one of those books where they regularly crank out new editions to make students pay for new copies of the book (this is presently priced at a whopping $174 on Amazon)2. This was the standard text when I took probability at Wisconsin, and I literally cannot think of a single person who found it helpful. Avoid.
It also makes a lot of sense from a programming standpoint, since a lot of the value I get out of calculus is its applications to approximations, etc., and that's a lot clearer when taught in this sequence.
Another one of those books where they crank out new editions with trivial changes to make money. This was the standard text for non-honors calculus at Wisconsin, and the result of that was I taught a lot of people to do complex integrals with the methods covered in Apostol, which are much more intuitive to many folks.
Unlike the other books in this section, this book is about practice instead of theory. It's a bit like Windows Internals, in that it goes into the details of a real, working, system. Topics include hardware bus protocols, how I/O actually works (e.g., APIC), etc.
Of the books that I've liked, I'd say this captures at most 25% of the software books and 5% of the hardware books. On average, the books that have been left off the list are more specialized. This list is also missing many entire topic areas, like PL, practical books on how to learn languages, networking, etc.
dca57bae1f