One Programmer's Library
I have always enjoyed the posts where people list out all of the books they think are important, given some subject. They vary wildly. For example, some are very to-the-point while others are rich in detail (and Danielle makes one of those each year).
I began to wonder what my list would look like. Below I've tried to make those decisions. I was surprised by just how hard it is to restrict myself to the bare essentials. A lot of things that I read influence me in some way.
I'll start with the super obvious titles you've likely heard mentioned before.
- Refactoring: Improving the Design of Existing Code is probably the classically great programming text that had the biggest effect on me. This book teaches you how to turn the code you have into the code you want. It doesn't get much more essential than that.
- Smalltalk Best Practice Patterns is the book I learned a new language just to read. It's worth that. This is The Field Manual of Object-Oriented Tactics and it helps you know what to do line-by-line.
- Patterns of Enterprise Application Architecture is the book you should read so you can see how much great knowledge we've had about building programs for over a decade. Odds are that this book can teach you multiple strategies for problems you face regularly.
- The Pragmatic Programmer: From Journeyman to Master is one of those rare books that can make you a better person, in addition to a better programmer. Advice like "Fix Broken Windows" and "Make Stone Soup" have universal scope. This is a must read.
- Programming Pearls (2nd Edition) is a book about algorithms and, eventually, all programmers need to learn some algorithms. The upside of this title is that it's fun from page one. That helps to keep you interested in what can be a dry topic.
- Growing Object-Oriented Software, Guided by Tests is almost surely the single biggest influence on how I do Test-Driven Development. There are other schools of thought but pick one and dig deep enough into TDD until you're confident about when and how to use it. This is a tool everyone needs in their toolbox.
Most of my favorite programming books are hyper focused on some topic.
- Programming Ruby 1.9 & 2.0: The Pragmatic Programmers' Guide (The Facets of Ruby) is still my favorite book to learn Ruby from, despite the surplus of choices available today. I prefer language books like this that teach you the basics and give you enough of a foundational reference to start building on. Oh, and you should definitely learn Ruby, or an equivalent dynamic language.
- Mastering Regular Expressions is a book about some black magic that is supported in many text editors, programming languages, and command-line tools. Strangely, many programmers are afraid of them. That was all the reason I needed to read this one and it really did turn me into a wizard.
- From Bash to Z Shell: Conquering the Command Line has been reviewed in detail on this blog before. All you need to know though is that this one can teach you a lot about modern shells. All programmers can benefit from knowing how shells work. Plus, you won't be able to escape learning a bit about how computers manage processes and share information.
- Network Programming with Perl was a major part of the reason I became a programmer. This taught me how to build servers and got me coding up MUDs in my spare time. I'm sure you have different inspirations, but it's critical to have them. You need pet projects to guide your learning.
- Understanding Computation: From Simple Machines to Impossible Programs could be called Computer Science: The Handy Parts. If you didn't go to school for computers, this excellent book can teach you some of what you missed and do need to know. I won't kid you, it's a challenging read. It's totally delivers though.
- Java Thread Programming is the book that taught me how to do thread programming and I'm super glad that I learned it in Java. Each language has things they do well and things they don't. You'll need to shop for some topics in other lands.
At some point I assume most of us find areas to call our own. If you read this blog, you know that I'm a Rubyist. These are my favorites from that world. Some of them may be worth a side trip for non-Rubyists while others likely have equivalents in other worlds.
- Practical Object-Oriented Design in Ruby: An Agile Primer (Addison-Wesley Professional Ruby Series) is a vital book that teaches you how to think about Object Design. Java may be the right place to learn threading, but Ruby lives and breaths objects and I doubt this book would be so great in another language.
- Ruby Under a Microscope: An Illustrated Guide to Ruby Internals is a super cool How VM's Work book. You don't have to read this one for Ruby, but do find and read one like it. Such books help bridge the significant gap between what you type and what computers actually do.
- Exceptional Ruby teaches you that there's a huge difference between learning a language's syntax for trapping errors and writing code that properly addresses error states. There's a lot of value in spending some time learning about the latter. Read this book if you can't find an equivalent for your language of choice.
- Confident Ruby: 32 Patterns for Joyful Coding, or a similar title, is essential to learning how to structure code. You don't want to be wasting energy worrying about all the problems a given section of code might have. This book teaches you where to apply the right amount of paranoia, so you can trust the rest of your code.
Understanding Your Brain
Learning how to learn is one of the biggest challenges of mastering any skill. A large part of that is figuring out exactly how your brain works.
- Pragmatic Thinking and Learning: Refactor Your Wetware (Pragmatic Programmers) could be called You're Brain: The Owner's Manual. This title got me started learning a vital set of facts about what you can do well, what you can't, and how to compensate for those weaknesses. I've reviewed it in detail here before.
- So Good They Can't Ignore You: Why Skills Trump Passion in the Quest for Work You Love is the book you need to read when you begin to realize that the traditional advice, "Follow your passion," doesn't actually tell you what to do. This book does. It tells you how to grow, improve, and make plans for career.
One aspect of brain mechanics than has been the most helpful to get a handle on is motivation. This has really helped me use my time better and to understand the needs of those I am working with.
- Punished by Rewards: The Trouble with Gold Stars, Incentive Plans, A's, Praise, and Other Bribes is a great place to start decoding motivation if you don't yet know how rewards and punishments affect us. I didn't and I really needed this powerful data dump about what we've observed for over 40 years.
- Drive: The Surprising Truth About What Motivates Us is the book you read once you've been convinced that you need to understand this stuff. This covers how motivation really works and gives practical actions we can take to use this knowledge to our advantage.
- Added 10/21/2014: Maverick: The Success Story Behind the World's Most Unusual Workplace can be a tough book to find a copy of these days, but it's worth the hunt. Aside from being the ultimate guide to autonomy, it includes managing tips, a nice example of the perils of waterfall development, and some social justice. I love how the author doesn't have all the answers and you get to see him make plenty of mistakes.
- Mastery focuses in on just one of the pillars of pure intrinsic motivation. This covers the whole process of achieving mastery in something, starting all the way back at selecting the right something. It even goes into emotional responses likely to trip you up at each stage. It's thorough.
Many of us like to think that we just talk to machines all day long, but that's silly. We pair program, plan features with stakeholders, etc. If you don't know how to communicate, you don't know how to do part of your job. It's that simple.
- Nonviolent Communication: A Language of Life honestly contains plenty of material I don't like. It's filled with anecdotal evidence, what it says about praise is half-right at best, and it would have us all talking via a magic formula. That said, everyone should read this book. It's just hard to be aware of how judgmental our language can be, how to talk about emotions, or how to get the intended message across until you do.
- Lying is a book I debated leaving off this list. However, I think it's important to think about concepts like "Lies of Omission" for our communication and even our code. This book will get you asking the right questions.
If you want to develop a communication A-game, parenting is the big league show. Sadly many, many parenting books are just junk. Here are a couple that aren't.
- Brain Rules for Baby (Updated and Expanded): How to Raise a Smart and Happy Child from Zero to Five has so much to teach. This book could be called The Science of Parenting. It'll tell you how brains develop and what the research says. That's nice, but the real win is how it gets you practicing empathy or understanding praise. Again, this book can make you a better person.
- Free-Range Kids, How to Raise Safe, Self-Reliant Children (Without Going Nuts with Worry) shows that our natural tendencies are to panic over most things and it's so not worth it. It actually does harm. Reading this helps you decide when you need to worry and when you don't. That lesson helps with programming and life in general.
I reserve the right to add to this list when I discover new tomes of power. I'll note the changes as I make them.