Sat Jan 29 08:39:27 EST 2005
Programming Perl, 3rd edition, Larry Wall, Tom Christiansen, Randal L. Schwartz. The definitive reference, though not nearly as clear, organized or crisp as a reference should be. The second edition is a fine and cheaper alternative; the first edition is obsolete and should be avoided.
The C++ Programming Language, 3rd edition, Bjarne Stroustrup. The definitive reference by the inventor of the language. Each edition has been significantly bigger than the previous, reflecting growth in the language and more recently growth in standard libraries. The slightly newer "special" edition (white cover) is even bigger and more expensive but includes more material on internationalization.
The Java Programming Language, 3rd edition, Ken Arnold, James Gosling. Gosling is the main inventor of Java. The first and second editions were a reasonable introduction to the language but not to much of the vast array of libraries; I have not looked at the third edition. I also liked the first edition of Java in A Nutshell, by Flanagan; later editions are less satisfactory because many of the examples were removed to make room for library descriptions. Sun Microsystems maintains a large online collection of Java documentation, including tutorials and reference material; the JFC Swing Tutorial by Campione and Walrath is useful for building graphical interfaces, and their Java Tutorial: A Short Course... is quite helpful too (though it's a sad commentary that a short course takes nearly 600 pages). Josh Bloch's Effective Java is a very good reference for more experienced Java programmers.
(Advertisement.) The C Programming Language, Brian Kernighan, Dennis Ritchie.
(Advertisement.) The AWK Programming Language, Al Aho, Brian Kernighan, Peter Weinberger.
The Mythical Man Month, Fred Brooks. The great classic of software engineering, one of the few computer science books that repays frequent reading.
Code Complete, 2nd edition, Steve McConnell. McConnell gives practical advice, clearly derived from real experience, in all his books. Code Complete is for individual programmers. His books on software project management, Rapid Development and Software Project Survival Guide, are also very much worth reading if you ever become involved in any kind of software project. The COS 333 project planning is based in large part on ideas derived from these books.
Writing Solid Code, Steve Maguire. This is a good shorter companion for McConnell's Code Complete, also full of good advice.
Programming Pearls, 2nd edition, Jon Bentley. Lots of good insight into how to approach programming tasks, with an emphasis on algorithms.
Go To ..., by Steve Lohr, relates some really interesting material about people who have made major contributions to software, from languages and tools to operating systems, written for the layman. It seems very accurate in the places where I know the story, and it's often fascinating.
Web Security & Commerce, Simson Garfinkel & Gene Spafford, O'Reilly, 1997. The level is a bit erratic, but much of it should be accessible to non-experts.
How to Set Up and Maintain a Web Site, Lincoln Stein, Addison Wesley, 1997. Lots of good material in this; my copy is falling apart from heavy use. His Web Security book is also good, a useful complement to Garfinkel & Spafford. I have also found Stein's Network Programming with Perl useful. Stein is an exemplary writer when it comes to combining explanation and examples.
Secrets and Lies: Digital Security in a Networked World, Bruce Schneier, Wiley, 2000. A long litany of scary stories about security and privacy threats and breaches, quite accessible to the non-specialist. In the end, there's too much complaining and not enough explanation and assessment. But well worth reading. Much the same comments could be made about Schneier's more recent Beyond Fear: Thinking Sensibly about Security in an Uncertain World.
Security Engineering: A Guide to Building Dependable Distributed Systems, Ross J. Anderson, Wiley, 2002. I prefer this to Schneier. Occasionally more technical, but most parts will be accessible to anyone. The bottom line? Security is exceptionally hard, and many of the problems are people problems (which is also Schneier's conclusion).
Building Secure Software, John Viega and Gary McGraw, Addison-Wesley, 2001. Very practical guide to doing things better, especially for C programmers. Writing Secure Code (2nd edition), Michael Howard and David LeBlanc, Microsoft Press, 2002. A more Microsoft-focused take on the same problem, and a nice complement to Viega and McGraw.
These are books that I found worth reading as background or for alternate views, or just because they were interesting. No particular order. You might find the ones on life in various programming environments to be particularly germane. This list originally was created for COS 109; the COS 109 bibliography lists some other books worth looking at.
You should learn how to write well. The best small book on the topic is Strunk and White's The Elements of Style, well worth the minuscule price.
How to Lie with Statistics, Darrell Huff, Norton, 1954 (reissued in 1993). A wonderful little book that will immunize you for a lifetime against statistical chicanery and meaningless numerical presentations.
The Victorian Internet: The Remarkable Story of the Telegraph and the Nineteenth Century's On-Line Pioneers, Tom Standage. Walker & Co, 1998. Fascinating story of the development and spread of a new technology and its effects in society; the parallels with today's Internet are many.
The Early History of Data Networks, Gerard Holzmann, Bjorn Pehrson. IEEE Press, 1994. (I'm biased, since the first author is a good friend.) A more scholarly but still interesting description of the optical telegraph, which 50 years before the "Victorian Internet" encountered many of the same issues and had some similar effects on society.
Many of the technical and social issues seen in today's Internet showed up in earlier networks, notably the telegraph network (Standage) and the optical telegraph networks of 50 years earlier (Holzmann). Among the topics: coding, error detection and recovery, privacy and security, spies and cryptography, bandwidth, congestion, money and speculation, social change, and ultimately, the end as something better comes along. The optical telegraph was killed by the electrical, which in turn was killed by the telephone.
ENIAC: The Triumphs and Tragedies of the World's First Computer, Scott McCartney, Walker & Company, 1999. Compact description of the invention of the first stored program computer (not invented by von Neumann, a case made fairly compellingly by the author). Surprisingly, he omits any mention of the work of Konrad Zuse in Germany.
The Difference Engine: Charles Babbage and the Quest to Build the First Computer, Doron Swore, Penguin USA, 2002. A very good short biography of Charles Babbage and his difference and analytical engines. The last third of the book is a modern tale of trying to build one of the difference engines using the technology and materials of the 1840's, for display at the Science Museum in London. Some things do not change.
Dealers of Lightning: Xerox PARC and the Dawn of the Computer Age, Michael A. Hiltzik, Harper, 1999. A very detailed look at how Xerox's Palo Alto Research Center invented many of today's basic technologies -- personal computers, bitmap displays, graphical user interfaces, the Ethernet, the laser printer -- and how Xerox managed to capitalize on only one. Careful fact-checking, according to my source.
The Bug, Ellen Ullman, Doubleday, 2003, is by far the best fiction work about programmers and programming that I have read. It's almost like a detective story in places, and the technical denouement is totally believable and satisfying to a programmer. The story is quite good too.