# Computer Books
Here is a relatively short bookshelf on
programming topics. All have become
essential reference books to me. My first
advice on any topic is to see what Addison
Wesley and O'Reilly have to offer. It is
unlikely that another publisher will do
better. (Prentice Hall and Wiley are more
uneven.)
* Java *
Read Bruce Eckel's book "Thinking in Java"
(Prentice Hall) first all the way through.
I've not found a better introduction to the
language. A copy is free online.
Next you'll want to learn typical Java
patterns and idioms by looking at many
packages (libraries) and examples. The
language itself is simple enough that the
syntax should not occupy you for long.
Most people start playing with graphics and
GUI stuff. I preferred to start with
interprocess communication. If that's your
cup of tea, then you'll really enjoy the
O'Reilly book "Java Network Programming" by
E.R. Harold. Learn how to write a simple web
server or client.
If you want to make slick GUI stuff instead,
then try "Core Java Foundation Classes" by
Kim Topley, from Prentice Hall. It explains
well the underlying design shared by all GUI
elements. The Swing thread and
synchronization finally make sense. It has
the best single explanation of GridBagLayout
that I've seen. No space is wasted merely
listing javadoc information. Instead you
learn how to make it all work together, in
good style.
At some point, you'll want to read
"Concurrent Programming in Java, Second
Edition" by Lea et al from Addison Wesley.
This has the fullest treatment available of
patterns for multi-threaded Java programming.
This is the only Java book I consider
irreplaceable.
You'll want to have the JDK html
documentation downloaded on your machine as
you edit code. Until I got used to HTML
browsing, I also liked having a paper listing
of all the classes and API's called "The Java
Developers Almanac" (Addison Wesley). Get
the latest edition. The book is useful for
browsing and quick reference, but no
explanations are included.
If you are a language-lawyer like me, you
will enjoy the precision of "The Java
Language Specification" by Gosling et al,
from Addison Wesley.
If you need JNI, learn it thoroughly and
painlessly from "Essential JNI" by Rob Gordon
and Prentice Hall Books. If RMI makes you
uncomfortable, read "Java RMI" by Troy Bryan
Downing and IDG Books. Think of RMI as a
mechanism for interprocess communication, not
as distributed objects. For a good overview
of the elements of J2EE, read "Java
Enterprise in a Nutshell" by Flanagan et al,
from O'Reilly.
* Patterns and Programming style *
For pure object-oriented design, I like
"Design Patterns" by Gamma et al (Addison
Wesley), and "Object-Oriented Design
Heuristics" by Riel (Addison Wesley). Gamma
et al (known as The Gang of Four) make a
definitive inventory of patterns that
EVERYONE must know. Riel's book does a
better job of explaining where the patterns
came from.
For UML, I prefer the UML Modeling Language
User Guide by Booch, Rumbaugh, and Jacobson
(Addison Wesley). More than other
references, this book stresses constructs
that you are likely to use most often.
The ideas in "Refactoring" by Fowler (Addison
Wesley) seem almost entirely self-evident.
Nevertheless, by reading this book, I
improved my coding habits immediately. This
book shows how to evolve a design as you
code.
* C++ *
Sooner or later, you must read "The C++
Programming Language" by Bjarn Stroustrup
(Addison Wesley) all the way through. And
then you must read it again. It thoroughly
motivates the design and implementation of
C++, so that you will better remember how it
works. This is not a good reference,
however. The index is almost useless. For a
reference, get the latest ISO specification
off the web.
For C++ style, the essential books are
"Effective C++" and "More Effective C++" by
Scott Meyers (Addison Wesley). When first
learning, I enjoyed the "C++ FAQs" by Cline
and Lomow (Addison Wesley).
For advanced use of templates and exceptions
read "Modern C++ Design" by Alexandrescu and
"Exceptional C++" by Sutter, both from
Addison Wesley.
* C and POSIX *
Kernighan and Ritchie's "The C Programming
Language" is the only book you really need to
learn C.
"The POSIX Programmers Guide", by Donald
Lewine (O'Reilly) describes the mundane but
essential C library for interacting with your
OS. Without this book you may fall into less
portable syntax. I look at it more often
than Kernighan and Ritchie.
"Programming with POSIX Threads" by Butenhof
(Addison Wesley), and "Programming with
Threads" by Kleiman, Shah, and Smaalders
(Prentice Hall) are both great. I learned
from the latter and find it more exhaustive.
The first is easier to learn from and
thorough enough.
* W. Richard Stevens *
For IPC mechanisms, I love "Unix Network
Programming" Volume I and II by Stevens
(Prentice Hall). His older books "Advanced
Programming in the Unix Environment" (Addison
Wesley) and "TCP/IP Illustrated Volume 1"
still have still not been improved on.
* Algorithms *
"Introduction to Algorithms" by Cormen,
Leiserson, and Rivest (McGraw Hill) appears
too academic at first but is surprisingly
readable. More simplistic books manage to
explain the same ideas with more words and
greater ambiguity.
* Functional Programming *
If I were learning computer programming again
from scratch, I would begin first with the
masterpiece "Structure and Interpretation of
Computer Programs" by Abelson and Sussman
from the MIT Press. Their minimalistic use
of Scheme will outlast any currently popular
language. You will understand better what a
compiler does and why functional programming
matters.
Another great book in the beautiful language
of Haskell is "Algorithms: A Functional
Programming Approach" by Fethi Rabhi and Guy
Lapalme, from Addison Wesley.
Ansi Common Lisp, by Paul Graham, from
Prentice Hall is a meticulous description of
the language, and an advanced programmers
guide as well. His "On Lisp" has an
impressive explanation of macros. (Available
on-line only.)
Paradigms of Artificial Intelligence: Case
Studies in Common Lisp, by Peter Norvig, from
Morgan Kaufman, is one of the finest
programming books I've ever encountered.
Very challenging problems are solved in very
few lines of code, with programming patterns
that would seem very awkward in other
languages. If you never use Lisp, this book
will still teach you how to program in
languages of the future.
* Compilers *
If you need to compile a little language or
define a grammar, then the preferred
reference is now "Modern Compiler
Implementation" (in Java, C, or ML), by
Andrew Appel, from Cambridge University
Press. An older standard is "Compilers,
Principles, Techniques, and Tools" by Aho et
al, from Addison Wesley.
* Unix/Linux. *
My favorite reference books on Unix and Linux
are the "Unix System Administration Handbook"
by Evi Nemeth, Garth Snyder, Scott Seebass,
and Trent R. Hein, or the "Linux
Administration Handbook" by Evi Nemeth,
Garth Snyder, and Trent Hein, both from
Prentice Hall. (See http://www.admin.com/ )
For shell scripting, I prefer "Portable Shell
Programming" by Blinn, from Prentice Hall.
This shows so many patterns with the Bourne
Shell that you won't really miss any of the
bash or ksh extensions.
* Etc. *
For python, download the tutorial and
reference that come with the distribution.
These are actually enough to learn the
language. To learn some style, get the
"Python Cookbook" by Martelli and Ascher.
For HTML and related topics, I love the book
"Web Design in a Nutshell" by Niederst
(O'Reilly).
For LaTeX, I now use "A Guide to LaTeX" by
Helmut Kopka and Patrick W. Daly (Addison
Wesley), translated from German.
See my CVS page
and Gnu/Linux
page for references on those subjects.
"Applied Cryptography" by Bruce Schneier
(Wiley) is the masterpiece in this field.
For image processing, I have never found a
handier overview than "Fundamentals of
Digital Image Processing" by Jain (Prentice
Hall). This book covers an amazing number of
algorithms very concisely. Just browsing the
book will generate useful ideas.
Bill Harlan, 1999-2004