In my last book list, I looked at three books about programming, books that should make you think about the practice of programming. This time I'd like to look at three programming books, books about technical skills that will make you a better programmer — these still aren't specific to a specific language, I'm planning on posting a Ruby specific list soon.
Refactoring, by Martin Fowler, was suggested in a comment on the last book list, and I couldn't agree more. Understanding, and exercising, the art of refactoring will make a huge difference in the quality of your programs in the long run. The only downside to this book is that so many people talk about refactoring without having read it (or understanding what refactoring really is), leading to all kinds of jargon abuse. If you haven't read it yet, you owe it to yourself to grab a copy and spend some quality time with it.
Code Reading, by Dimidis Spinellis, is a recent addition to my bookshelf. It's pretty tightly tied to the C/C++/Java triad, but the concepts it covers will also be of use to a programmer using dynamic and/or functional languages. Chapters on dealing with large projects, understanding project architecture, and tools for code reading (not to mention a 19 page example) are reason enough to pick up a copy. If your C skills are as weak as mine, the ample coverage of reading C is a wonderful bonus.
Everyone uses regular expressions, but not many people take the time to really get comfortable with them. Jeffrey Friedl's Mastering Regular Expressions is a great way to develop a good understanding of them. It also make a handy reference for the darker corners of regexp use.