Books for CS 251

Required Books

Bentley, Jon Louis. Programming pearls. Reading, Mass: Addison-Wesley, 2000.
A fine overview of programming principles and practice, available in bite-size pieces. Only Part I is required for the course; you may prefer to read it in the library.

Kernighan, Brian W and Pike, Rob. The practice of programming. Reading, Mass: Addison-Wesley, c1999.
The best available ``depth'' book---it picks a few important topics and covers them at length. Written by master programmers from Bell Labs (sometimes known as Smart Canadian Programmers).

Hunt, Andrew and Thomas, David. The pragmatic programmer: from journeyman to master. Reading, Mass: Addison-Wesley, c2000.
A fine ``breadth'' book, focused on process and attitude more than the details of programming. I've chosen it because of the many useful principles and the well-informed and practical approach to software tools.

Recommended Books

Beck, Kent. Extreme programming explained: embrace change. Reading, MA: Addison-Wesley, c2000.
The manifesto for the current fad in software process. I read Extreme Programming as a backlash against the heavyweight, ineffective software process of the 1970s and 1980s. There are some interesting programming practices, one or two of which we will apply in class. There's lots of material on the web, but the book is still Recommended for those interested in software process.

Hanson, David R. C Interfaces and Implementation: Techniques for Creating Reusable Software. Addison-Wesley Longman, Incorporated, Aug 1996.
Highly recommended for anyone who will use C, and may be useful for C++ as well. Everyone advises you to reuse code. I advise you to reuse Hanson's code.

Gamma, Helm, Vlissides, and Johnson. Design patterns: elements of reusable object-oriented software. Reading, Mass: Addison-Wesley, c1995.
A combination of good programming practice, new vocabulary, and band-aids for the warts on C++. Recommended for those using C++ or Java. (The vocabulary has become an essential part of the object-oriented community.)

Kernighan, Brian W and Pike, Rob. The UNIX programming environment. Englewood Cliffs, N.J: Prentice-Hall, c1984.
Even pithier advice from the masters. The best concise introduction to Unix. Highly recommended for those with limited Unix experience.

Liskov, B and Guttag, John. Program development in Java: abstraction, specification, and object-oriented design. Boston: Addison-Wesley, c2001.
Not quite as dense with great stuff as the earlier book, but still very good, and the best treatment of data abstraction I know of in print. Recommended for those using Java or C++ or those unsure of their skills.

Other Suggested Books

Bentley, Jon Louis. More programming pearls: confessions of a coder. Reading, Mass: Addison-Wesley Pub. Co, c1988.
More of Bentley's columns from CACM.

Brooks, Frederick P. The mythical man-month: essays on software engineering. Reading, Mass: Addison-Wesley Pub. Co, [1975].
The classic book on why software projects go wrong.

Jackson, Michael. Software Requirements and Specifications: A Lexicon of Practice, Principles and Prejudices. Addison-Wesley Longman, Incorporated, Aug 1995.
What happens before coding? What happens in real software shops? How shall we think about software? In this collection of short essays, Jackson addresses these and many other questions. Highly recommended for those interested in learning more about software engineering.

Kernighan, Brian W and Plauger, P. J. The elements of programming style. New York: McGraw-Hill, c1978.
A great classic, which uses improvement of bad examples to illustrate timeless principles of program structure. Out of print, but Kernighan may be able to put it on the web.

Liskov, Barbara and John Guttag. 1986. Abstraction and Specification in Program Development. MIT Press / McGraw-Hill.
The best introduction to abstract data types. Also a good introduction to relevant formal methods. Unfortunately out of print. The Java book above is the best alternative.

Steve McConnell, Code Complete. Microsoft Press, 1992?.
(Disclaimer: I haven't read the whole book.) I'm not sure I agree with the presentation (starting with routines rather than modules or data), but this book is very thorough and concrete, if somewhat lengthy. The book is highly recommended by people I respect, and I recommend it for those who expending a lot of effort to get just poor or adequate results, particularly if you are not sure what you need to do to improve. Also recommended for those who like everything spelled out step by step.

Van der Linden, Peter. Expert C programming: deep C secrets. Englewood Cliffs, N.J: SunSoft Press, 1994.
One of the most fun computer books I've ever read. Highly recommended if you are unsure of your C skills.

Reference Material

Kernighan, Brian W. and Dennis M. Ritchie. The C Programming Language. Second edition. Englewood Cliffs, NJ: Prentice Hall, 1988.
To introduce yourself to C, read the original (and still best).

Harbison, Samuel P. and Guy L. Steele, Jr. C: A Reference Manual. fourth edition. Englewood Cliffs, NJ: Prentice Hall, 1995.
The favorite reference of serious C programmers.

Jones, Richard and Rafael Lins. Garbage collection: algorithms for automatic dynamic memory management. New York, NY, USA: Wiley, 1996. Reprinted in 1999 with improved index and corrected errata.
A fine reference on garbage collection.

Levine, John R. Linkers and loaders. San Francisco: Morgan Kaufmann, c2000.
The enduring principles behind linkers and loaders.

Plauger, P. J. The Standard C Library. Englewood Cliffs, NJ: Prentice Hall, 1992.
Companion reference for the library---with code!

Books on software design

Glenford J. Myers, Composite/Structured Design, Van Nostrand Reinhold, 1978.
The lesser-known work on structured design.

Glenford J. Myers, Reliable Software Through Composite Design, Van Nostrand Reinhold, 1975.
Myers's earlier work, which we have at Harvard.

Ed Yourdon and Larry L. Constantine. Structured Design: Fundamentals of a Discipline of Computer Program and Systems Design. Englewood Cliffs, NJ: Prentice Hall, 1979.
The better-known work on structured design.

Master works by Master Programmers

Knuth, The Stanford GraphBase.
A collection of graph algorithms and supporting libraries, all written as literate programs. The most accessible of Knuth's literate software. Recommended for those who want to absorb the Knuthian view of the world.

Knuth, TeX: The Program.
The complete source code to TeX, written as a literate program. Probably most instructive for its very careful attention to portability; this code runs on an astonishing variety of computers and operating systems, including machines that don't even support ASCII! Recommended for those who like Knuth's style and want a deep draught.

Lion's Commentary on 6th Edition Unix.
An underground classic, finally published a few years ago (regrettably, published posthumously). Thorough commentary of the last Unix mortals could understand :-) Disclaimer: I have not read this book.

Fraser, Christopher W. and David R. Hanson. A Retargetable C Compiler: Design and Implementation. Redwood City, CA: Benjamin/Cummings, 1991.
A very nearly complete picture of a production C compiler. This compiler was heavily used before Linux and gcc took over the world. Uses the same literate-programming techniques we use in class. Highly recommended for those who will write a compiler in C or who want a deep understanding of how C works.