A Programmer's Bookshelf
A first year student at a nearby university wrote to me asking for advice on becoming a hacker (according ESR's definition, he clarified). He sent me a laundry-list of 18 programming languages he aimed to learn by the time he graduated, and asked for other recommendations. I've learned a lot from reading books, so I compiled two reading lists for him.
The first list has must-read books that aspiring programmers should put under their belts; the second one contains nice-to-have books one can read as time permits. Most of the books (or, unfortunately, their earlier editions) are on my bookshelf. Any programmer should complement these lists with books dealing with application domains (for instance, operating systems, databases, graphics), and specific programming languages.
Obligatory Reading
- Harold Abelson, Gerald Jay Sussman, and Jullie Sussman. Structure and Interpretation of Computer Programs. MIT Press, Cambridge, second edition, 1996.
- Alfred V. Aho, Monica S. Lam, Ravi Sethi, and Jeffrey D. Ullman. Compilers, Principles, Techniques, and Tools. Addison-Wesley, Reading, MA, second edition, 2006.
- Ken Arnold and James Gosling. The Java Programming Language. Addison-Wesley, Boston, MA, third edition, 2000.
- Jon Louis Bentley. Programming Pearls. Addison-Wesley, Reading, MA, second edition, 1999.
- F. P. Brooks. The Mythical Man Month. Addison-Wesley, Reading, MA, 20th anniversary edition edition, 1995.
- Tom DeMarco and Timothy R. Lister. Peopleware: Productive Projects and Teams. Dorset House Publishing, second edition, 1999.
- Martin Fowler and Kendall Scott. UML Distilled: Applying the Standard Object Modeling Language. Addison-Wesley, Boston, MA, second edition, 2000.
- Martin Fowler. Refactoring: Improving the Design of Existing Code. Addison-Wesley, Boston, MA, 2000. With contributions by Kent Beck, John Brant, William Opdyke, and Don Roberts.
- Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, Reading, MA, 1995.
- David Harel. Algorithmics: the Spirit of Computing. Addison-Wesley, third edition, 2004.
- John L. Hennessy and David A. Patterson. Computer Architecture: A Quantitative Approach. Morgan Kaufmann, San Francisco, fourth edition, 2006.
- Andrew Hunt and David Thomas. The Pragmatic Programmer: From Journeyman to Master. Addison-Wesley, Boston, MA, 2000.
- Aviel William Strunk Jr. and E. B. White. The Elements of Style. Macmillan Publishing Co., New York, 1979.
- Brian W. Kernighan and Rob Pike. The UNIX Programming Environment. Prentice Hall, Englewood Cliffs, NJ, 1984.
- Brian W. Kernighan and Rob Pike. The Practice of Programming. Addison-Wesley, Reading, MA, 1999.
- Brian W. Kernighan and P. J. Plauger. The Elements of Programming Style. McGraw-Hill, New York, second edition, 1978.
- Brian W. Kernighan and Dennis M. Ritchie. The C Programming Language. Prentice Hall, Englewood Cliffs, NJ, second edition, 1988.
- Leslie Lamport. LATEX: A Document Preparation System. Adisson-Wesley, Reading, MA, second edition, 1994.
- Steve C McConnell. Code Complete: A Practical Handbook of Software Construction. Microsoft Press, Redmond, WA, second edition, 2004.
- Eric Steven Raymond. The Art of Unix Programming. Addison-Wesley, 2003.
- W. Richard Stevens. Advanced Programming in the UNIX Environment. Addison-Wesley, 1992.
- Bjarne Stroustrup. The C++ Programming Language. Addison-Wesley, Reading, MA, third edition, 1997.
- Gerald M. Weinberg. The Psychology of Computer Programming. Dorset House Publishing, New York, silver anniversary edition, 1998.
Recommended Reading
If your time and budget allows it, you can't go wrong splurging on the following books.- Andrei Alexandrescu. Modern C++ Design: Generic Programming and Design Patterns Applied. Addison-Wesley, Boston, MA, 2001.
- Scott W. Ambler. The Elements of UML 2.0 Style. Cambridge University Press, Cambridge, 2005.
- Ross Anderson. Security Engineering: A Guide to Building Dependable Distributed Systems. Wiley, New York, 2001.
- Joshua T. Bloch. Effective Java. Addison-Wesley, Boston, MA, 2001.
- David Candevoorde and Nicolai M. Josuttis. C++ Templates: The Complete Guide. Addison-Wesley, Boston, MA, 2003.
- Pete Goodlife. Code Craft: The Practice of Writing Excellent Code. No Starch Press, San Francisco, 2007.
- Daniel M. Hoffman and David M. Weiss, editors. Software Fundamentals: Collected Papers by David L. Parnas. Addison-Wesley, Boston, MA, 2001.
- Brian W. Kernighan and P. J. Plauger. Software Tools. Addison-Wesley, Reading, MA, 1976.
- Donald E. Knuth. The Art of Computer Programming, volume 1: Fundamental Algorithms. Addison-Wesley, Reading, MA, third edition, 1997.
- Donald E. Knuth. The Art of Computer Programming, volume 2: Seminumerical Algorithms. Addison-Wesley, Reading, MA, third edition, 1997.
- Donald E. Knuth. The Art of Computer Programming, volume 3: Sorting and Searching. Addison-Wesley, Reading, MA, second edition, 1998.
- John Lions. Lions' Commentary on Unix 6th Edition with Source Code. Annabooks, Poway, CA, 1996.
- Robert C. Martin. Agile Software Development: Principles, Patterns, and Practices. Prentice Hall, Upper Saddle River, NJ, 2003.
- Marshall Kirk McKusick and George V. Neville-Neil. The Design and Implementation of the FreeBSD Operating System. Addison-Wesley, Reading, MA, 2004.
- Scott Meyers. Effective C++. Addison-Wesley, Reading, MA, second edition, 1998.
- Scott Meyers. Effective STL. Addison-Wesley, Reading, MA, 2001.
- Trevor Misfeldt, Gregory Bumgardner, and Andrew Gray. The Elements of C++ Style. Cambridge University Press, Cambridge, 2004.
- William H. Press, Saul A. Teukolsky, William T. Vetterling, and Brian P. Flannery. Numerical Recipes in C++. Cambridge University Press, Cambridge, second edition, 2002.
- W. Richard Stevens, Bill Fenner, and Andrew M. Rudoff. UNIX Network Programming, volume 1. Pearson Education, 2003.
- Herb Sutter and Andrei Alexandrescu. C++ Coding Standards: 101 Rules, Guidelines, and Best Practices. Addison Wesley, 2004.
- Herb Sutter. Exceptional C++ Style: 40 New Engineering Puzzles, Programming Problems, and Solutions. Addison Wesley, 2004.
- Allan Vermeulen, Scott W. Ambler, Gregory Bumgardner, Eldon Metz, Trevor Misfeldt, Jim Shur, and Patrick Thompson. The Elements of Java Style. Cambridge University Press, Cambridge, 2000.
- Henry S. Warren Jr. Hacker's Delight. Addison-Wesley, Boston, MA, 2003.