IDC
Recommended Books

Home Publications Teaching Recommended Books

This is an annotated list of my favorite Computer Science books.  Those are the books that influenced me the most (or, for the "fun" category, that I enjoyed the most).

Contents

Textbooks

If you only buy two CS books, these first two are the ones I recommend:

Programming Paradigms

Harold Abelson and Gerald J. Sussman, with Julie Sussman: Structure and Interpretation of Computer Programs, 2nd ed., MIT Press, 1996.

(Also available online.)

The best book I know for learning how to think about programs.

Object-Oriented Programming and Design

Object-Oriented Software Construction, 2nd ed (1997)

Bertrand Meyer: Object-Oriented Software Construction, 2nd ed., Prentice Hall, 1997.

An excellent introduction to the creation of high-quality (object-oriented) software.

Design by Contract, by Example

Richard Mitchell and Jim McKim: Design by Contract, by Example, Addison Wesley, 2002.

An excellent discussion of the principles of design-by-contract, with many examples (in Eiffel,  some also shown in Java).  After you've read Meyer's book, read this one for a more thorough discussion of design-by-contract.

Essentials of Programming Languages

Daniel P. Friedman, Mitchell Wand, and Christopher T. Haynes: Essentials of Programming Languages, 2nd ed., MIT Press, 2001.

An advanced investigation into the principles of programming languages, interpretation, and compilation.  Uses program transformations as essential tools.

This is the book to turn to after you have mastered Abelson and Sussman's Structure and Interpretation of Computer Programs.

Books for the Working Programmer

General

These books should be in close reach of every OO programmer.

Design Patterns

Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software, Addison-Wesley, 1995.

As an OO developer, you will find yourself professionally handicapped if you don't know what design patterns are and how to use them.

This is not a book to read from cover to cover; instead, you need to know what it contains, and refer to specific patterns as you need them.  Patterns are properly learned only by using them for solving real problems.

Refactoring

Martin Fowler, Kent Beck, John Brant, William Opdyke, and Don Roberts: Refactoring: Improving the Design of Existing Code, Addison Wesley, 1999.

Regardless of which methodology you use, this is something you need to do.  Read the first five chapters to know what refactoring is; then use the specific refactorings in the rest of the book in your daily work.

The Classic Reference

Donald E. Knuth: The Art of Computer Programming, 3 volumes, Addison-Wesley.

Everything you always wanted to know about algorithms...

 

For Java Programmers

Joshua Bloch: Effective Java Programming Language Guide, Addison Wesley, 2001.

A list of 57 items on the proper use of Java.  If you don't know these, you can't call yourself a serious Java programmer.

Joshua Block and Neal Gafter: Java Puzzlers: Traps, Pitfalls, and Corner Cases, Addison Wesley, 2005.

A list of 95 puzzles with important lessons on the proper use of Java.  An excellent companion to Effective Java.  Contains material on the new Java 5 features.

Usability

Everybody should read these.  They will explain why you are always so frustrated with things you use (software and other), and how you can make things easier for other people in your own designs.

Donald A. Norman: The Design of Everyday Things, Basic Books, 2002.

Why can't we use the hold feature in our phones, find the correct light switch in an auditorium, open doors in public places?  Read this book to be enlightened.

Steve Krug: Don't Make Me Think: A Common Sense Approach to Web Usability, Que, 2000.

A short but penetrating explanation of what is wrong with most web sites you see and how to do it right.

Jeff Johnson: Web Bloopers: 60 Common Web Design Mistakes and How to Avoid Them, Morgan Kaufmann, 2003.

If you enjoyed Don't Make Me Think and want to get deeper into the subject, this is the next step.

High-Level Reflection

These books are not for everyday use, but provide a high-level view of important aspects of the profession.  I recommend reading these at least once.

The Ethics of the Profession

The Classic

Joseph Weizanbaum: Computer Power and Human Reason: From Judgment to Calculation, W.H. Freeman, 1976.

This book may be out of print, in which case you should look for it in a library.  It is a fascinating reflection on what should and should not be done instead of what can or cannot be done.  Technologically somewhat out-of-date, but the issues it raises are still as relevant as they were when the book was written.

The Killer Robot

Richard Epstein: The Case of the Killer Robot, Wiley, 1996.

(Also available online.)

A modern look at ethics in Computer Science, using a series of thought-provoking stories.

The Risks of Using Computers

Peter G. Neumann: Computer-Related Risks, Addison-Wesley, 1995.

An analysis of many computer-related failures, including some of the most spectacular ones, and recommendations on how to avoid such risks.

Philosophy, Artificial Intelligence, Etc.

Douglas R. Hofstadter: Goedel, Escher, Bach: an Eternal Golden Braid, Basic Books, 1979.

A masterpiece, exploring the relationships between art, computer science, and artificial intelligence.  Well-worth the time.

Object Technology

Ian Joyner: Objects Unencapsulated: Java, Eiffel, and C++, Prentice-Hall, 1999.

An in-depth investigation of object-oriented programming languages, comparing the most influential languages today.

The Craft of Programming

Jon Bentley: Programming Pearls, 2nd ed., Addison-Wesley, 2000.

A collection of Bentley's columns in CACM.  Each pearl is an essay about programming well.  A book to read and re-read.

Be on the lookout for the second edition of the second volume.

Human Factors

The human factor is all-important but often overlooked in software engineering.  These books will give you an appreciation of these issues.

Gerald M. Weinberg: The Psychology of Computer Programming: Silver Anniversary Edition, Dorset House, 1998.

This 1971 classic has been reissued with new commentary from the author.  Still as fresh and relevant as the day it was written.  Entertaining as well as thought-provoking.

Gerald M. Weinberg: Understanding the Professional Programmer, Dorset House, 1988.

An essential book for you to understand yourself as a professional programmer (even if you call yourself a "software engineer").

User Interface

Jef Raskin: The Humane Interface, Addison-Wesley, 2000.

An exposition of user interface from the author of the Mac GUI.  You will never design user interfaces the same way after reading this book.

Research in Automated Software Engineering

The Programmer's Apprentice

Charles Rich and Richard C. Waters: The Programmer's Apprentice, ACM Press and Addison-Wesley, 1990.

If you want to develop intelligent tools in general, and for software engineering in particular, this is a must read.

Paper Collections

Charles Rich and Richard C. Waters (eds.): Readings in Artificial Intelligence and Software Engineering, Morgan Kaufmann, 1986.

M. R. Lowry and R. D. McCartney (eds.), Automating Software Design, AAAI Press, 1991.

Stories from the Trenches

These books tell stories of real successes and failure, and of subcultures in the industry.  Read these mostly for fun.

Tracy Kidder: The Soul of a New Machine, Harpercollins, 1995.

A fascinating description of the development of Data General's 32-bit Eclipse supermini under an impossible deadline.  The computer itself is obsolete, but the human factors haven't changed a bit.

Steven Levy: Hackers: Heroes of the Computer Revolution, Penguin, 2001 (updated edition).

A story of the 1960s software hackers at MIT, the silicon valley hardware hackers of the 1970s, and the game hackers in the 1980s.  An interesting look into three related but different cultures, which have had a great influence on the profession, for example, on the open software movement.  (The word "hackers" here is used in the original, positive sense of a wizard programmer.  See also the Hacker's Dictionary below.)

Clifford Stoll: The Cuckoo's Egg: Tracking a Spy Through the Maze of Computer Espionage, Doubleday, 1989.

A 75-cent accounting discrepancy that led astronomer-turned-programmer Cliff Stoll into a long chase that finally led to a group of German hackers (in the bad sense of the word) looking for sensitive material to sell to the KGB.

Resources for Writers

Lyn Dupre: BUGS in Writing: A Guide to Debugging Your Prose, 2nd ed., Addison-Wesley, 1998.

Essential reading for anyone interested in writing high-quality theses, papers, or other documents.  Also very entertaining, unlike most books of this kind.

William Strunk, Jr., and E.B. White: The Elements of Style, 4th ed., Pearson, 2000.

Short and concise writing instructions, if you don't have time for reading a longer book.

 

Just for Fun

Some CS-related fun stuff.

Eric S. Raymond, ed.:The New Hacker's Dictionary, 3rd ed., MIT Press, 1996.

Contains "The Story of Mel, a Real Programmer", among other gems.

 
Robert W. Lucky: Lucky Strikes... Again, IEEE Press, 1993.

This is a collection of articles about what it means to be an engineer, written for IEEE Spectrum.  They are certainly funny, but they contain barbed truth nonetheless!