Top Ten Books I Recommend for Programmers

Today a reader named Ryan asked me if I had ever posted a list of my top ten programming books. I haven’t, but I appreciated the suggestion and decided to write such a post today. Let me be clear: these are not my top ten books about programming. These are the top ten books I recommend to programmers, which is why you will see some non-programming books on this list.

Now then, in no particular order….

1. ‘Assembly Language Step-by-Step’ by Jeff Duntemann

I previously wrote about this book, so you may want to read that review. All I wish to add here is that the book is, in my opinion, the best book I’ve ever read on the subject of x86 architecture, which is such a common architecture in the field of programming that I recommend this book more for understanding x86 itself than for learning assembly language programming. That said, it’s also the best book on assembly language I’ve ever read.

2. ‘Lua: The Programming Language’ by Roberto Ierusalimschy

I also wrote about this book before. It is an impressively concise yet comprehensive treatment of a programming language which I consider to be one of the best introductory languages for new programmers—Python being the other language I hold in the highest regard for teaching budding developers.

3. ‘Racing the Beam’ by Ian Bogost and Nick Montfort

This one is for game developers, who need to read this book so as to truly understand how high we stand on the shoulders of others in the modern industry. If you think game development is difficult today—and it is—imagine creating a game with only one-hundred twenty eight bytes of RAM to spare. I couldn’t even describe a game to you in that many bytes of text.

4. ‘C Programming: A Modern Approach’ by K. N. King

C is a corner-stone language of the industry, and I think everyone should learn it eventually. And I recommend this book for doing so. Many people suggest ‘The C Programming Language’ by Kernighan and Ritchie, the famous ‘K&R C’. I take issue with that suggestion; the K&R book hasn’t changed since 1988, the publication year of the second edition. The C language, however, has absolutely changed since then. ‘C Programming: A Modern Approach’ covers the C99 (i.e. 1999) standard and looks ahead (at the time) to C11, finalized in 2011.

In the year 2015 I frankly think it’s irresponsible to recommend a C programming book that does not at least discuss C99. This is the only suggestion on this list which I believe some people may consider controversial. But seriously—we need to stop promoting a book that’s twenty-seven years old when the language it discusses has gone through serious changes since that time.

5. ‘Structure and Interpretation of Computer Programs’ by Abelson, Sussman, and Sussman

Yes, two Sussman’s.

Colloquially known as ‘SICP’, this book is one of the best introductory texts on computer science. It uses the Scheme programming language, and actually is a decent book for learning Scheme in my opinion, but SICP’s true value lies within its concise and clear discussion of fundamental concepts of computer science. What you can learn from this book will improve your programming abilities regardless of the languages you use.

6. ‘The Manga Guide to Databases’ by Mana Takahashi and Shoko Azuma

Seriously. Despite seeming like a joke, this is hands-down the best introductory book I’ve ever read on the subjects of relational databases, SQL, and sets (in the mathematical sense). While its style of entertainment may not be your cup of tea, the clarity with which it teaches the basics of relational databases is staggeringly surprising, given the presentation and all.

7. ‘The Everyday Writer’ by Andrea A. Lunsford

This book is seemingly one of the least programming-related books in this list. However, being a good computer programmer involves more than writing code and knowing programming languages. Writing comments and documentation and such is also a large part of our job, and to do so effectively we need to understand how to write well. I think good writing is one of the most overlooked skills in the programming field. Yet if we step back and think about how much non-code we deal with, it should become clear how valuable it is to have strong writing composition skills. And for that reason I recommend ‘The Everyday Writer’ to all programmers, because most of us write English while programming just as much, if not moreso, than we write code.

8. ‘The Calculus Tutoring Book’ by Carol Ash and Robert Ash

This is best calculus book I have ever read, without question. But what makes it valuable to programmers? Firstly, it gives the reader great insight and understanding of the functional programming paradigm. Secondly, the book is both a terrific textbook and reference for a branch of mathematics that is more commonly encountered in programming than some people would expect. For example, do you want to be a game developer? Then I promise you that knowing calculus will be an important skill. And for learning calculus you can do no better than this book, which gave me a solid understanding of differential and integral calculus at the mere age of sixteen, which is a testament to the book’s quality and not any form of boasting on my part.

9. ‘Modern Algebra’ by Seth Warner

Algebra is the other branch of mathematics I see most frequently in computer programming, and this book is a comprehensive treatment of the subject. If you’ve ever looked at languages like Haskell and thrown up your hands at all the talk over monads and isomorphisms and functors—‘Modern Algebra’ gives you a strong foundation for all of those concepts and much more. For example, I feel like its lessons on groups helped improve my object-oriented programming and my approach to create data structures and operations on them.

10. ‘Course in General Linguistics’ by Ferdinand de Saussure

This book is probably the most unexpected on this list. How does a book on linguistics help anyone be a better programmer? In some ways it’s for the same reasons as ‘The Everyday Writer’. However, if you’re the kind of programmer who strives to learn as many programming languages as possible then I genuinely believe an understanding in synchronic and diachronic linguistics assuages the challenges involved. Granted, the information on phonology is not all that useful for programming in my opinion. But understanding the evolution of morphology and syntax in natural languages carries over in large quantities when it comes to understanding the evolution of programming languages and how to compare and criticise the expressiveness of one language to another. ‘Course in General Linguistics’ is not a book I would recommend everyone rush out to purchase immediately. But reading it eventually will sharpen your insight and analyzation of programming languages, and as you start to learn more paradigms a knowledge of basic linguistics becomes a more useful tool to have in your arsenal.

Advertisements

6 thoughts on “Top Ten Books I Recommend for Programmers

  1. Wow! I just happened to hop on to see if you’d replied, and got a full post. Thank you sir! I’m going to read this one in full in a moment. The only one I’ve read part of so far is SICP, which is one powerful book. They actually define the language in terms of itself. I’ll make sure to reply when I’ve read the whole thing, but it looks like some great recommendations. I’m not sure if you’re a self-taught programmer or if you have a comp-Sci background, but I’d be interested in hearing how you feel about MIT abandoning scheme/SICP for python. I ask that question a lot, and never cease to get thoughtful responses. MIT’s new intro course is awesome btw and I think either one is great. SICP is of course more theoretical and foundational, while the python course is more practical. Both have good REPLs too.

    1. I’m self-taught; I read SICP but never took any course involving the book or anything like that. I was surprised when MIT decided to make 6.01 their introductory class using Python, but at the same time I thought it was a good decision. I would agree that Python is more practical than Scheme, which is one reason I felt like MIT was right to make that change. But the entire issue was a nice demonstration of a problem that I think we, at least in American society, have when it comes to college educations in “Computer Science”. Depending on what school one goes to, a person with a Computer Science degree might come out with a deep understanding of algorithmic complexities and yet not be able to write simple code in Java, or the person might know C# inside-out and yet be unable to explain how quicksort works on a whiteboard in psuedo-code. I think a lot of our colleges have an identity crisis of sorts when it comes to how much “Science” they put into their “Computer Science” courses. When MIT moved towards using Python I felt like many people reacted as if MIT was abandoning the entire academic aspect of computer science in favor of being yet another school that simply churns out code monkeys. Personally I think the move away from SICP was more an acknowledgement that computer science and computer programming are really two very disjoint subjects, yet we can draw a line between the two and teach them both at the same time. Or more importantly, using a more practical language like Python versus Scheme doesn’t create a barrier that all of a sudden makes it impossible to teach the material in books like SICP.

      TL;DR: MIT was right to make the change, as Python is not an inferior language for teaching compared to Scheme.

  2. Thanks for your thoughts. Mine line up pretty close to your own and I agree that choosing the ratio of theoretical to practical subject matter must be very difficult for a university program. If you went 100% practical-based you’d essentially be something like coding schools such as “the iron yard”. The other way around and you know all about compilers, logic programming, OS internals…etc, but you couldn’t write a decent sized Java app to save your life.

    I didn’t know they made a manga relational db book. That is pretty awesome, and there is no shame in those. I thought the linear algebra one was great. Teachers tend to zoom in on specific subject matter without giving good high-level overviews first. In my opinion you should always start with an ELI5 (explain it to me like I’m 5) approach followed by why it is important, then the subject matter can follow. I’m excited to check that out as I write plenty of SQL at work. The other books all look great as well. I really struggled with assembly in college and still have some trouble today. I looked at “the art of assembly programming”, but a lot of the book is in what he calls HLA and it seems a little too high level for what I’m looking for. I’m fascinated by some of the small chess programs people have been fighting over so I’ll have to check out “racing the beam” as well. I hadn’t heard of most of these, so thanks for the great recommendations! Btw: What do you usually use Lua for? Indie-game programming? I was excited to hear about 7torch for data analysis, but apparently it’s a pain to use according to some reviews I read.

    1. Oh that Manga Guide to Databases is amazing. When one character opens a book on page three and the book literally explodes, I thought, “Hell yes,” heh. It’s rare to be simultaneously interested in how Third Normal Form will help sort out the price war over apples and whether the princess is going to marry her true love interest or that jack-ass from the other kingdom who’s screwing up the apple market.

      Regarding assembly, I personally do not consider “The Art of Assembly Programming” to be a great book, nor would I ever recommend it to someone wanting to learn assembly. One of the biggest reasons is exactly what you mention: the author’s use of HLA. Furthermore, that book makes a mistake which most assembly books do: they quickly jump into learning instructions, how to reference memory addresses, etc. “Assembly Language Step-by-Step” spends an entire two-hundred pages before even once getting into example code; it stresses how memorizing all of the instructions in the world don’t matter if you fundamentally don’t understand the underlying hardware. It also doesn’t help that the x86-64 has the Mount Everest of instruction sets; the official Intel instruction reference I have is a little over 1,600 pages. If you add together all ten books I mention in that post, I don’t think they total 1,600 pages. So for assembly language programming in can also really help to start with a RISC processor, like the MOS 6502. It has a small number of instructions which is easy to memorize, and because the 6502 was used so much in games for decades there is a wealth of great information out there on the processor and learning assembly for it.

      Finally, regarding Lua, yeah right now I use it almost exclusively for game development. Lua is very, very easy to embed within C, and more importantly, C++ software, because C++ absolutely dominates the game industry. You can’t take two steps in any direction without running into C++. So languages like Lua which embed very smoothly into such software make for useful scripting languages that allow for writing (e.g.) gameplay logic in a language in which it’s easier to express those ideas compared to C++.

  3. Def will check out the database and assembly books due to your reviews. I originally wanted to write my own Forth, but quickly discovered I’d need to brush up on assembly and couldn’t find an even passably decent reference. The book you mentions sounds perfect though. In college we used an atmel avr chip that came with the cerebot II microcontroller. I think it had two pages of instructions and all I remember is increment, decrement, add, subtract, mov, comp, and jmp. The Intel processors you mention sound insane by comparison, so I’ll keep that in mind. Good luck on your game! I know it’s a difficult task due to complexity if it’s a big game or oversaturation of the market if you’re making an ios/android app. I think a lot of people enjoy the indie-type games though that give us a breath of fresh air.

    1. This may be helpful for Forth:

      https://github.com/owainlewis/awesome-forth

      I’ve implemented my own Forth before—twice actually, because I love that language, heh—but I used Python and Common Lisp for my two attempts. I have no doubt there’s already a Forth for the MOS 6502 but I’d still like to write one someday just for fun.

      Thank you re. my game! It is pretty difficult, and indie game-dev has its own family of challenges you don’t run into when working at a large studio (which is no easy thing either, by any stretch of the imagination), but it’s a lot of fun, so that always helps motivation when the development process runs into inevitable speed-bumps. I also agree with you that a lot of gamers seem to be enjoying the resurgance of indie games, which personally I haven’t seen on this scale since maybe the 1980’s? I was young then so it’s hard for me to compare. But regardless, that’s a topic I plan to blog about someday or another.

Add Your Thoughts

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s