|
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
 |
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! |
|