This section does not attempt to list the “best” books in the field. Instead, it lists some of the more general items in a typical professional library — mine. Many of these works are out of print, but are still available through, for example, Amazon.com.
I do not apologize for the age of some of these books. The mid- and late-1970s were a golden age of computer science: the fundamental concepts developed then are powerful, effective, and to a large extent have yet to penetrate to the practitioner level. This is unfortunate. The fields of computer science, software engineering, and programming have roughly the same relationships to one another as do physics, civil engineering, and construction. While the fields are vastly different in scope and purpose, each has gems to offer the others. Most of these books are gems; all are at least semi-precious stones.
Beizer, Boris. Software Testing Techniques, 2nd ed. New York: Van Nostrand Reinhold, 1990.
—. Software System Testing and Quality Assurance. New York: Van Nostrand Reinhold, 1984.
These books are absolutely invaluable explanations of the concepts and techniques of testing software. These works belong on every programmer’s book shelf.
Dijkstra, Edsger W. A Discipline of Programming. Englewood Cliffs, New Jersey: Prentice-Hall, 1976.
This is a classic work in computer science, and should be read by anyone aspiring to be a serious programmer. One of the reviews of this work on Amazon.com notes that it is not a book about programming. Instead, it is a book about reasoning about programs. The overall thrust of this book is to encourage the use of programs that are provably correct. Even if you are not interested in program correctness proofs, however, this book in invaluable. Applying the concepts of loop invariants, pre- and post-conditions, and so forth, will improve your programming tremendously — in both reliability and maintainability.
This book is heavy going. Reading, and understanding, a chapter a month is a substantial accomplishment. The investment in time and effort, however, is worth it.
Charette, Robert N. Software Engineering Risk Analysis and Management. New York: Intertext Publications, 1989.
This book is an excellent introduction to risk analysis and risk management in software development. Software development is inherently risky, both due to its immaturity as a field of endeavor (the species has only fifty years’ experience with software), and due to managers’ predisposition to disbelieve practitioners’ warnings and predictions. Risk analysis and management is a large part of the software development project leader’s job. This book belongs on every project leader’s book shelf.
Peters, Lawrence J. Software Design: Methods and Techniques. New York: Yourdon Press, 1981.
Every few years, a new software design technique comes along that promises to revolutionize the software world. None have done so, primarily because none are actually used. Different design techniques of course have different attributes, and have differing levels of effectiveness in various problem domains. However, any design technique is substantially better than none. The differences among what the various techniques would do become irrelevant when compared to what is. In a world of panicked thoughtless reactive code slinging — now formalized as “iterative development” and “extreme programming” — even these stodgy old techniques — all of which boil down to “think first” — would be an improvement.
Wirth, Niklaus. Algorithms + Data Structures = Programs. Englewood Cliffs, New Jersey: Prentice-Hall, 1976.
If you had this book, you would not need this web course — except perhaps to give you enough background to appreciate the points this book makes. This classic of computer science simply and beautifully explains the complementary roles of algorithms and data structures, and also gave the world the dictum, “make your data structures do your work for you.” This is an invaluable work that belongs on every programmer’s bookshelf — where it should be placed only after having been read thoroughly.
Brooks, Frederick P. The Mythical Man-Month: Essays on Software Engineering, Anniversary Edition. Reading, Massachusetts: Addison-Wesley, 1995.
Carnegie Mellon University Software Engineering Institute. The Capability Maturity Model: Guidelines for Improving the Software Process. Reading, Massachusetts: Addison-Wesley, 1994.
DeMarco, Tom. Controlling Software Projects: Management, Measurement & Estimation. New York: Yourdon Press, 1982.
A classic. If you are going to base a software development management career on reading only one book, this is the one.
Holdsworth, Jacqueline. Software Process Design: Out of the Tar Pit. London: McGraw-Hill Book Company, 1994.
Copyright © 2001 Brian Hetrick
Page last updated 30 December 2001.
Data Structures I
Building Blocks II
Data Structures II