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.
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.
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.
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!
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.
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.