# 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