Inspired by my dad's recent blog post, Pat and I figured we'd take a swing at the same topic. It would be fascinating to see this done for every profession: a codification of which works have been particularly influential in a person's development.
To be honest, books are just a component of my development. I've arguably learned more from professors, mentors, and co-workers than from books, and in my day-to-day struggles, I'll more often turn to online sources. Still, books do form a crucial foundation for software development. I can break the good ones down into two categories. First, there are books that teach a technology. These are valuable because they can take you from 0 to 60: by focusing on a single source, you can methodically learn the syntax, structure, and best practices for a new language or technique. A good book won't be impatient or have the blind spots that a more experienced in-person mentor might exhibit. The second class of books are those that teach a way of thinking. These become increasingly important as you grapple with larger projects and organizations. In programming, doing development by yourself is orders of magnitude easier than working in a team, but all of the interesting projects left are sufficiently complex to be beyond any individual's reach. And so, we need to learn how to design and structure our code and our work practices such that someone other than us can interact with the code. This has been, and remains, one of the industry's greatest challenges.
To this, I should probably add the third category of cultural books. I'll never be able to point to a line of code and say, "This book is what inspired me to write that," but there's a definite body of literature out there that has helped me define what it means to be a software developer, helped clarify my sense of mission, and helped me to enjoy my career even more.
Anyways! Without further ado, let's take a look.
Hackers, Heroes of the Computer Revolution, by Stephen Levy. I checked this book out from the Burnhaven Library in Burnsville, Minnesota, and it had an enormous influence on my understanding of programming. No longer was it just a fun thing that one did in front of a computer; for the first time, I started to see myself as part of a long tradition of innovation that started long before I was born and was spread throughout the world. This book also helped steep me in the myth and folklore of computing; I can chat with old hands about the PDP-1, the Game of Life, the TMRC, and the Altair. The book was divided into rough thirds, and the middle section was grounded in the birth of the consumer computing industry in Silicon Valley, and so has a particular resonance for me today.
Core Java, volumes I and II. These tomes were crucial tools in my Computer Science 101 class, which was single-handedly responsible for my transformation from a procedural, self-taught, idiosyncratic, not-very-good programmer into the object-oriented, thoughtful developer I am today. These books did a great job at the very difficult task of teaching both Java syntax and the more abstract concepts behind object-oriented programming. The way I approach programming underwent a sea-change as a result, and I've never looked back. (Some day I need to pick up one of the more recent incarnations of these books - Java has changed a lot since I was a freshman.)
The Cathedral and the Bazaar. This is the seminal tome on the ethos behind the Open Source Software movement. If you're reading this post on Firefox, you should thank Erik Raymond; this essay planted the seeds that led to the open-sourcing of Netscape and the eventually rebirth of Firefox. For me, it helped me understand the moral and ethical dimensions involved in distributing software. At the same time, the book diverges from the purely ethical foundation of the earlier Free Software movement, and is instead based on empirical considerations. Raymond examined real-live cases, and convinced me that open source not only felt good, it also produced superior software. The conditions of corporate employment keep me from honoring this book as much as I would like, but it has given me a strong position from which to make my case.
Programming Perl, 3rd Edition. Also known as The Camel Book, this is the authoritative book on Perl development, and may be the best-written programming book ever. Larry Wall, the creator of Perl and one of the most interesting characters in a pantheon of interesting people, is also a linguist, and his his particular skill with words elevates this book far above the competition. It may be the only book out there that can be all things to all people: it is a useful primer on the language, an exhaustive reference book, an overview of Perl culture and history, a guide to design, and more. This book taught me how to write Perl, and makes me a better programmer every time I crack it open. His rich use of interesting examples and clever language make it a pleasure to read.
Effective C++ by Scott Meyers. Another entry from the disturbingly small class of well-written programming guides. I first "learned" C++ back around 1998, but didn't really grok it until after I picked up Java. Scott Meyers' book, which I picked up on the advice of Raviant people from my wonderful summer internship, helped me take my skills to the next level. Meyers breaks out of the convention of describing how things work, and instead focuses on specific solutions to particular problems. This book is to coding what Design Patterns is to architecture. As with Larry Wall, I can gladly read chapters of this book at a time for the pure pleasure of his authorial voice, even if I'm not immediately facing the problems he describes.
Design Patterns by the Gang of Four. I think this is the book that separates the programmers from the software engineers. The former class can make something work; the latter class will make something that will work for twenty years, under a variety of maintenance programmers, as it responds to evolving requirements. This was the one book I read in academia that most impressed on me the need to future-proof my designs. As soon as I reached the real world, I realized that this may be the most important skill of all.
Tag, you're it! If you are a professional and have a blog, I hope you'll take some time to think about the books which have shaped your understanding of your chosen career. Please shoot me a link, I'd love to read about it.