Looking for a different subject? Take a look at a directory of all of our Developer Reading Lists.
David Chisnall is a freelance writer and software developer who has worked on compilers for numerous languages ranging from Smalltalk to GPU-based C++. He is an active contributor to a number of open source projects and occasionally visits academia to teach. David lives in Swansea, Wales.
Trying to pick just a handful of books that I'd recommend is a difficult challenge. I tend to work on a fairly wide variety of projects, ranging from high-level Smalltalk code down to C code for embedded systems, and a variety of things in between.
Citing my own books would probably be bad form, and I'll also avoid books on the more theoretical side of computer science and focus on ones of real practical use. The remaining list is a selection of the five that I think are more important for any programmer to have read.
Smalltalk-80: The Language and its Implementation, by Adele Goldberg, David Robson (Addison-Wesley, 1983)
The first book on my list, unfortunately, is currently out of print. Fortunately, the authors have made it available as a free PDF (accessible via the links above). This book covers the implementation details of the Smalltalk-80 virtual machine, along with the rationale behind all of the design decisions in both the language and its implementation. Even if you never touch Smalltalk, you'll find it hard to get away from using at least one of its descendants: Objective-C, Java, Ruby, and so on. If you really understand Smalltalk, then picking up any of these languages is trivial. This is also the only book that I've found that really covers the process of language design in an intelligent way. In the modern world any relatively complex application is going to find itself either embedding an existing language for scripting or developing its own domain-specific language, making this a very important and often overlooked field.
Advanced Programming in the UNIX® Environment, 2nd Edition, by W. Richard Stevens, Stephen A. Rago (Addison-Wesley Professional, 2005)
My university computer society had a copy of the first edition of this, and I borrowed it for about a year when I was an undergraduate. W. Richard Stevens, the original author, sadly died in 1999, but Stephen A. Rago did a superb job of updating it. The original talks about the differences between BSD and System V, which is interesting from an historical standpoint, but not so relevant today. The second edition covers FreeBSD, Mac OS X, Solaris, and Linux. If you do any development on any of these (including iOS, which shares the same UNIX underpinnings as OS X) then you'll find this invaluable. Apparently it comes in a paperback edition, but I've never seen one. Given how much use mine gets, I imagine that all of the paperback copies have been worn away to nothing. Most of the time you get away with using a tiny fraction of the UNIX system APIs. For the rest of the time, I've yet to find anything that beats this book as a reference. Apparently there's a third edition due soon, which I'm looking forward to immensely. Also available in Safari Books Online.
Mac OS X Internals: A Systems Approach, by Amit Singh (Addison-Wesley Professional 2006)
Also available in Safari Books Online.
The Design and Implementation of the FreeBSD Operating System, by Marshall Kirk McKusick, George V. Neville-Neil (Addison-Wesley Professional, 2004)
Also available in Safari Books Online.
Modern Operating Systems, 3rd Edition, by Andrew S. Tanenbaum (Prentice Hall, 2007)
I'm cheating a little bit with my next recommendation, because it's three books. If you have time, I'd thoroughly recommend all of them, but if not then pick the one that's most relevant to you. I'd recommend either of the first two over Tanenbaum's MINIX book because, while the latter is well written, MINIX is a rather idealised operating system. FreeBSD and Mac OS X both had to make significant compromises in the name of efficiency, and understanding these (and the fact that any operating system will make similar trade-offs) makes you a better programmer. The Modern Operating Systems book is without peer as a high-level overview of how an operating system works, while the other two are more detailed but less general. Any time you interact with anything outside of your process's private memory area, you are going via the operating system and you can't be a good programmer — in any language — without understanding how it works.
The Humane Interface: New Directions for Designing Interactive Systems, by Jef Raskin (Addison-Wesley Professional, 2000)
Most software, at some point, has to interact with a human. Unlike most libraries and languages, users tend not to come with a manual. This book is the closest thing I've found. Not all of the ideas are universally applicable, as the book focusses a little too heavily on text, but it's still the best book on human-computer interaction that I've found. No one who hasn't read it should be allowed to design a user interface. While I was looking up the publication details for this book, I noticed that InformIT still sells the 1992 edition of the Macintosh Human Interface Guidelines. If you read the version on Apple's site, you find lots of things saying "always do this, except where this would look pretty." The 1992 edition comes from an era when human-computer interaction specialists, rather than graphic designers, were in charge at Apple and is still immensely relevant today.
C Programming Language, 2nd Edition, by Brian W. Kernighan and Dennis Ritchie (Prentice Hall, 1988)
There are two reasons to learn C. The obvious reason is that you intend to write programs in C. The more important reason is that a low-level language like C gives you a greater understanding of how higher-level languages work. C is also the lingua franca of most modern systems, so interfacing two high-level languages often involves going via C.
This book is the definitive reference to C, and is the second edition of the book that introduced the "hello world" program. The second edition proudly tells you that it supports ANSI C. Unfortunately, it supports the first version of ANSI / ISO C, commonly known as C89. This was superseded in 1999 by C99, which in turn is about to be followed by C1x in the near future. If you're planning on doing any serious work in C, then I wouldn't recommend such an old dialect. On the other hand, if you want to understand low-level programming, this is one of the clearest and simplest books that will help you. Most of what it will explain is still valid and relevant today, it just lacks some of the convenient enhancements in the newer versions of the language.