Recommended Computer Books
by Andy Hertzfeld 2/23/97

Introduction

I love books even more than I love computers, and I am always excited to find a new book that helps me grow as a person or programmer. I also love to recommend books to friends but making a list like this one for a broad, unknown audience is much harder. A book that would be superb for an experienced systems programmer might be useless or frustrating to a user interface designer or Photoshop user. Also, the field of computer science is still evolving so rapidly that the seminal works of years ago seem more dated than in other disciplines (thirty years ago is ancient history). I tried to balance these concerns when coming up with the following list.

It's difficult if not meaningless to try to rank such differing works, so I'm listing them in mostly random order (Knuth is deservedly first). A few of them are not considered to be computer books, but I included them because they were inspiring to my work in some fashion. Sometimes, the best things come from unexpected places.


Index

The Art of Computer Programming, Volumes 1-3, by Donald Knuth
Computer Architecture: A Quantitative Approach by John Hennesey and David Patterson
The Java Handbook by Patrick Naughton
Programming Perl by Larry Wall, Tom Christiansen and Randal Schwartz
The Mythical Man Month by Frederick Brooks
Understanding Comics by Scott McCloud
Society of Mind by Marvin Minsky
Snowcrash by Neal Stephenson
The Timeless Way of Building by Christopher Alexander
Computer Graphics: Principles and Practice by Foley, van Dam, Feiner and Hughes


The Art of Computer Programming, Volumes 1-3 by Donald Knuth

The Art of Computer Programming is probably the single best series of books ever written about computer programming. Although when Knuth began writing in 1962 he planned a seven volume series covering all of computer science, only the first three volumes have been published to date (volume four, Combinatorial Algorithms, is supposed to be published soon, incrementally, after a twenty year delay). The first three volumes (Fundamental Algorithms, Seminumerical Algorithms and Sorting and Searching) are being revised this year as well. Here is an interesting interview with Don Knuth about the series.

Donald Knuth writes beautifully and thinks brilliantly and is great at addressing both theoretical and practical concerns. He uses a hypothetical instruction set called MIX to write real programs and rigorously evaluate their performance. The exercises at the end of each chapter are rated by difficulty on a logarithmic scale (greater than 45 means it's worthy of a Ph.D. thesis). The books are highly mathematical, which makes them hard for most people to read, but it's possible to skip most of the math and still get a lot out of them. I read all three volumes in grad school and probably learned more from them than everything else combined. These books are a must for anyone who aspires to be a great programmer.


Computer Architecture: A Quantitative Approach by John Hennesey and David Patterson

Computer Architecture: A Quantitative Approach is a comprehensive survey of computer architecture and design. Dave Patterson coined the term 'RISC' and led the project at Berkeley that blossomed into Sun's SPARC architecture, while John Hennesey did much the same for MIPS (now a part of Silicon Graphics).

Inspired by Knuth's use of MIX, the authors concoct a hypothetical load/store architecture called DLX (the world's second polyunsaturated computer!) and use it to analyze a variety of architectural techniques. The book is also clearly written and highly entertaining and full of anecdotes and historical perspective. There is an interesting section called 'Fallacies and Pitfalls' at the end of every chapter. Highly recommended to anyone who wants to understand what's going on underneath the hood of their computer.


The Java Handbook by Patrick Naughton

The Java Handbook is a terrific way to learn Java programming from one of the main instigators of the language. It is definitely not a reference book, so it won't serve as the only Java book you'll need, but it's an excellent introduction to the language, written with wit, humor and a big dose of rebel spirit. It's full of examples of real Java programs, including imaginative applications like DynaDraw and Magnet Poetry.

My favorite part of the book is the epilogue, called 'The Long Strange Trip to Java', which describes some of the tension, drama and intrigue that always seem to go along with breakthrough projects. It's amazing to realize that an important technology like Java almost didn't make it to market, notwithstanding its considerable technical merits. Interesting technology is usually made by interesting people, and the epilogue shows that Java was no exception.

I also have to mention The Java Language Specification by James Gosling, Bill Joy and Guy Steele, which is the definitive reference about the Java language, and a masterpiece of language specification. Each section begins with a carefully chosen quotation and the book is incredibly detailed and thorough. The authors usually explain the rationale behind their carefully considered decisions. Even if you don't plan to be a Java programmer, you can learn more from this book about the issues and trade-offs in state of the art language design, circa 1996, than any other book I'm aware of.


Programming Perl by Larry Wall, Tom Christiansen and Randal Schwartz

Programming Perl is the definitive reference manual for the Perl language. Affectionately known as the 'Camel book', its primary author is the main author of Perl (Larry Wall) and the book is teeming with his wacky 'off-the-wall' sensibility and humor. It's one of the rare books that manages to simultaneously be a comprehensive reference and a great read.

Perl has become much more popular in the last couple of years because it is great at the kind of text manipulation required for generating Web pages (that's why I started using it). Its design focus is pragmatic to a fault, in fact, the official Perl slogan is TMTOWTDI, 'There's More Than One Way To Do It'. There almost always seems to be a feature of the language that's perfect for the problem at hand.

One of the great things about Perl is that it's completely free, and distributed in source code form. Larry Wall, who now works for O'Reilly and Associates (the publisher of this book) is doing great work, and one way to help ensure that he keeps on doing it is to buy this book.


The Mythical Man Month by Frederick Brooks

The Mythical Man Month is one of the best books ever written about managing real world programming projects. Fred Brooks was the leader of the IBM OS/360 operating system project, which in its day was one of the largest programming projects ever attempted. He describes his book as "my belated answer to Tom Watson's probing question as to why programming is hard to manage."

The book is a collection of 15 classic essays that are full of practical wisdom about developing large systems. In the title essay, he explains why software schedules always slip and shows why adding manpower to a late software project always makes it later. In another essay, he offers some pragmatic wisdom that Bill Gates knows in his bones: "plan to throw one away; you will, anyhow."

Ultimately, the book is really more about human nature than computer technology, and that's why it's still so enlightening after twenty years.


Understanding Comics by Scott McCloud

Understanding Comics is a brilliant comic book about comic books, making a compelling case for the comic book medium as a uniquely expressive art form while serving as its own best example. It contains a beautiful description of the history and motivations of art; it could have just as easily been titled 'Understanding Art'.

Profoundly wise and full of humor, I also found it to be one of the most insightful books about designing graphic user interfaces ever written, even though it never discusses the subject directly. Many of the story-telling techniques discussed are straight-forwardly applicable to graphic user interface design, which after all mixes text and graphics in a similar fashion. It includes the best description of why icons work that I have ever encountered.


Society of Mind by Marvin Minsky

Society of Mind is the culmination of many years of research by one of the founders of the field of Artificial Intelligence. It describes Minsky's theory of how intelligence emerges from many non-intelligent components, assuming that any brain or machine that has a mind must be composed of smaller things that cannot think at all. The structure of the book itself serves as an example of its theory, as each page is dedicated to a single idea that exploits what other pages do. It is extremely well written and fun to read, making its fairly sophisticated concepts accessible to an average reader.


Snowcrash by Neal Stephenson

Snowcrash is the only work of fiction on this list. It is a visionary novel of the near future, in a similar vein to William Gibson's Neuromancer. It describes a shared virtual reality called the Metaverse, where characters interact with each other's avatars through computer terminals. Stephenson is nothing if not audacious (the main character is named Hiro Protagonist) and he is canny enough to describe things at a level of detail that pulls the reader in without describing enough detail to pick things apart. The novel is something of a pot-boiler, accelerating to an exciting if unlikely climax. It is a fun read that has already inspired a generation of VRML programmers, giving them a compelling target to shoot for in their work.


The Timeless Way of Building by Christopher Alexander

The Timeless Way of Building describes a revolutionary approach to architecture that applies to building things in general. It attempts to define an objective meaning for beauty, for the quality of aliveness that certain buildings and places possess, which is a subtle kind of freedom from internal contradictions that Alexander calls 'the quality without a name'. It uses the concept of pattern languages to describe design techniques that resolve the natural forces in a given situation. He identifies around one hundred patterns that can be used to generate buildings and towns that possess the elusive quality.

The concept of pattern languages is directly relevant to building computer programs, and Alexander's theories have captured the fancy of many computer scientists (one excellent book based on Alexander's ideas is Design Patterns: Elements of Reusable Object-Oriented Software by Gamma, et al; another is Patterns of Software by Richard Gabriel.). Alexander is brilliant and incredibly passionate about his ideas; the book is almost guaranteed to inspire the reader. Alexander is said to be currently finishing a new work called The Nature of Order that transcends his previous ideas, which is really exciting to me.


Computer Graphics: Principles and Practice by James Foley, Andy van Dam, Feiner and Hughes

When I was an undergraduate at Brown in the early seventies, Newman and Sproull was the computer graphics bible and Andy van Dam was already working on a text book intended to replace it - in fact, at that point it was already a joke how long he was working on it, and that was still seven years before the first edition was eventually published in 1982.

This is the second edition, which is almost twice as long. It is encyclopedic in its thorough coverage of graphics algorithms and techniques, from 2D and 3D geometry through raster graphics, solid modeling and illumination and shading techniques. This second edition was made in 1990, so it's beginning to show signs of age again, but it's still far and away the most comprehensive graphics book you can find.


written for