Recommended Reading

These are some of my favorite computer-related books, organized into General Computing, Learning Python and Advanced Python The images link to the author's or publisher's sites.

I generally buy books from Bookpool though it's worth checking BestBookDeal as well.

General Computing


Robert C. Martin: Agile Software Development: Principles, Patterns, and Practices. Prentice Hall, 2002, 0135974445.
The best book I know for learning object-oriented design the way I do it ;) - a very agile, pragmatic approach. It shows you the nitty-gritty details of how to create classes as you develop a solution. Also a good introduction to the agile development style.

Much of the content of the book is available as essays on the ObjectMentor website.

Erich Gamma, Richard Helm, Ralph Johnson, John M. Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software. Addison Wesley Professional, 1995, 0-201-63361-2.
The book that brought the software design pattern movement into the mainstream. The authors are known as the "Gang of Four" and the book is sometimes called simply GoF. The patterns are instructive in their own right and also serve as examples of good object-oriented design.

Andrew Hunt and David Thomas: The Pragmatic Programmer: From Journeyman to Master. Addison-Wesley, 1999, 020161622X.
An eclectic compendium of practical knowledge on the nuts-and-bolts of successful, real-world programming. Among other things, this book kicked me out of my if-I-can't-do-it-in-my-IDE-it's-not-worth-doing mentality and prompted me to learn Python (after a brief fling with perl).

Kent Beck with Cynthia Andres: Extreme Programming Explained: Embrace Change, Second Edition. Addison Wesley Professional, 2005, 0-321-27865-8.
The manifesto of Extreme Programming is back in a second edition. The first edition of this book introduced XP to the world with Bible-thumping enthusiasm. Now that Agile Development is more mainstream, the second edition seems to have toned down the rhetoric a bit. Some of the ideas from the original book are now accepted practice, such as test-driven development and short iterations. Others, such as pair programming, are still controversial and little used. A thought-provoking look at what happens when you take best practices and "turn all the knobs up to 10."

Ron Jeffries, Ann Anderson and Chet Hendrickson: Extreme Programming Installed. Addison Wesley Professional, 2001, 0-201-70842-6.
A more accessible introduction to Extreme Programming, this book has the tone of one developer talking to another, explaining how he works and why.

Martin Fowler: Refactoring: Improving the Design of Existing Code. Addison-Wesley Professional, 1999, 0201485672.
Refactoring and unit testing are core practices of agile development. This seminal book on refactoring will help you to see your code as fluid and malleable and give you tools to shape it into a thing of beauty. (You did write those unit tests, didn't you?) The catalog of code smells will help you cast a critical eye on your existing work.

Michael Feathers: Working Effectively with Legacy Code. Prentice Hall, 2005, 0-13-117705-2.
To Michael Feathers, "legacy code is simply code without tests." Most programmers will have to deal with legacy code at some point. This book shows many ways to introduce unit tests into code that was not written to be testable. It might just be the help you need to go from "There's no way I can write a test for this" to "Hmmm, what if I..."

Judith S. Bowman, Sandra L. Emerson and Marcy Darnovsky: The Practical SQL Handbook. Addison Wesley Professional, 2001, 0-201-70309-2.
I learned most of I needed to know about SQL from this book. I'm not a heavy-duty DBA type so maybe that isn't much ;) but I know my way around SQL well enough to get the job done. It's an easy read and works as a reference as well as a tutorial.

John Lakos: Large-Scale C++ Software Design. Addison-Wesley Professional, 1996, 0201633620.
One of the few books to deal with problems of dependencies between modules and packages. It is a difficult read but for me it was an eye-opener.

Learning Python


Michael Dawson: Python Programming for the absolute beginner. Thompson, 2005, 1-59863-112-8.
A good book for someone learning Python as a first programming language. It starts from scratch and introduces Python features by developing a series of simple games. In the process you learn the basics of the Python language and a little about graphics and GUIs. A second edition came out in November 2005; I haven't seen it yet.

John Zelle: Python Programming: An Introduction to Computer Science. Franklin, Beedle and Associates, 2003, 1-887902-99-6.
Another good first programming book. It covers the basics of Python from a computer science perspective. It is intended as a textbook but it is quite readable and suitable for self-study.

Mark Lutz and David Ascher: Learning Python, Second Edition. O'Reilly, 2003, 0596002815.
A good book for beginners with a programming background, it gives a comprehensive introduction to Python.

Samuele Pedroni and Noel Rappin: Jython Essentials. O'Reilly, 2002, 0596002475.
An introduction to Python and Jython.

Advanced Python and Reference


Alex Martelli: Python in a Nutshell, Second Edition. O'Reilly, 2006, 0-596-10046-9.
An excellent descriptive summary of the Python language and libraries. It gives a short overview of the language and much of the standard library. It can also be used as an accellerated tutorial.

Alex Martelli, Anna Ravenscroft and David Ascher: Python Cookbook, Second Edition. O'Reilly, 2005, 0-596-00797-3.
This book has many useful and idiomatic recipes for specific tasks. I recommend reading it when you have mastered the basics of Python and want to stretch your knowledge and learn to write Python the way the experts do. Originally based on the on-line Python cookbook which is another source for useful code snippets.

John Goerzen: Foundations of Python Network Programming. Apress, 2004, 1-59059-371-5.
A good survey of network-related modules, mostly from the standard library. Includes client- and server-side examples from low-level sockets to libraries for protocols such as email and FTP and the simple server frameworks that come with Python.