janc@uofm-cv.UUCP (Jan Wolter) (01/16/84)
What are your favorite books on computer science? The sort of books that you feel any computer scientist should own? I can name three, but would like to hear the opinions of others. (1) Knuth. The Art of Computer Programming. Addison Wesley. Multitudinous fundamental algorithms thoroughly analized. A book any hacker can curl up with and enjoy. Too well known to discuss in detail. (2) Brooks. The Mythical Man-Month. Addison Wesley. The man who was project manager on OS/360 discusses software engineering. Brooks Law (adding manpower to a late soft- ware project makes it later) is a cornerstone of this book. A thought provoking examination of the realitys of the programming "art". Hackers will be less comfortable with this one. (3) Dijkstra. Selected Writings on Computing: A Personal Perspective. Spring-Verlag. This is a large collection of short monographs by the man best known for igniting the goto-less programming debate. This is a mixed bag of techical texts and informal commentaries. A few typical quotations to wet the taste: Programming is one of the most difficult branches of applied mathematics. Besides a mathematical inclination, an exceptionally good mastery of one's native tongue is the most vital asset of a competent programmer. By claiming that they can contribute to software engineering, the soft scientist make themselves even more ridiculous. The informal commentaries are delightful, but the reader should take the time to study the techical pieces too. They are beautiful in themselves, and do much to back up Dijkstra's criticisms of the work of others. No hacker could survive reading this book. Comments on these and other computer science books are invited. Jan Wolter -- University of Michigan
rpw3@fortune.UUCP (01/19/84)
#R:uofm-cv:-46100:fortune:22600004:000:8166 fortune!rpw3 Jan 18 19:56:00 1984 Let's see, given Knuth, Brooks, and Dijkstra,... I would rave about the following seven: William A. Wulf, Roy Levin, and Samuel P. Harbison, "HYDRA/C.mmp" This is an essential reference for operating systems and network architects in the 80's, even if the systems they build do not closely reflect the principles presented here. HYDRA/C.mmp was an experimental (but fully functional) multi-processor timesharing computer system built at Carnegie-Mellon (CMU) between 1971 and 1977. C.mmp was the computer (16 PDP-11's plus 32 Mbytes of shared memory); HYDRA was the operating system. The basic protection mechanism was the "typed object" and the "capability" (a kernel protected handle) to apply a operation (procedure) to an object. (The "root" of the system was the object whose type is "Type".) Such UNIX concepts as "read", "write", "execute", "send", "receive", "create", "lookup", "rename", and "delete" are easily mapped into this framework. But HYDRA did not supply these operations; they were supplied by user-level procedures. The file systems, debuggers, scheduler policies, and network interfaces were all (unpriviledged) user level programs. The principle of policy/mechanism separation guided most of the major design decisions. The most valuable feature of the book (besides the introduction of clear models and definitions) is the "Retrospective" section at the end of each chapter and a whole chapter of "Reflections" at the end. Here the authors ruthlessly examine the material just presented from the viewpoint of what they learned, what they would do differently, which assumptions proved out and which did not, and thorny problems that are still not solved. As always, it is helpful to know where others have stumbled (and succeeded). Butler W. Lampson, M. Paul, and H. J. Siegert (editors), "Distributed Systems" This is one of the Springer-Verlag Lecture Notes in Computer Science series, publishing notes from courses (generally given in Europe). The full title is "Distributed Systems: Architecture and Implementation, an Advanced Course". Unlike most of the others in the series, in this one the readability has benefited greatly from Lampson's access to Xerox PARC's Alto/Star fonts and graphics. Even with 20 chapters (500 pages) and over eight contributers the content is well integrated, and nicely surveys what was known (and not known) about distributed systems and networks in the state-of-the-art in 1980. It is still quite up-to-date. After presenting a "distributed system architecture model", the book covers IPC, hardware, link protocols, hierarchy issues, end-to-end IPC, naming, protection, atomic transactions, synchronization, the multi-copy update problem, and applications and their protocols. A view of the layering of a complete application is given in the chapter "Ethernet, Pup, and Violet", which describes a distributed, replicated calendar system. But my favorite chapter is the last, by Ken Thurber, which has section titles: - What we have defined - What we think we know - What we conjecture - What we think we don't know - What we advise - What you should know - What we don't agree upon. This final chapter alone is worth the price of the book, which is cheaper if you get it in the "Springer Study Edition". Dan Siewiorek, Gordon Bell, and Allen Newell, "Computer Structures" Second edition: "Principles and Examples". 926 pages. This is THE classic encyclopedia of computer architecture; it presents a taxonomy of computer structures and examples of machines which fit one or more catagories. Mandatory reading and re-reading for practicing and would-be architects. "All of the machines discussed in this book have actually been constructed and evaluated. The papers, wherever possible, are written by the specific machine architects or people closely associated with the architectures. Several of the machines are presented in elaborate detail, enabling the reader to appreciate the design complexities encountered and design methodologies employed by the architects." Articles include the IBM 360/91, Illiac IV, B5500, Manchester Mark I, PDP-8, Tandem 16, Aloha packet radio, Xerox Alto, PDP-11, CDC 6600, VAX, HP 9845A, IBM System 38, Cray-1, TI ASC, Ethernet, the SYMBOL machine, ARPAnet IMP, Intel 8008 through 8086, and many many more. C. Gordon Bell, J. Craig Mudge, and John E. McNamara, "Computer Engineering" Subtitled "A DEC view of hardware systems design", it is exactly that. From "In the Beginning" (1957) through "The PDP-8 and Other 12-bit Computers" and "The Evolution of the PDP-11" to "VAX-11/780" this book lays out the DEC engineering methodology and style. In the chapter "Impact of Implementation Design Tradeoffs on Performance: The PDP-11, A Case Study" the register/ALU/data-path diagrams are given for every machine from the LSI-11 (PDP-11/03) to the PDP-11/60 with discussion of technology, microcode, tradeoffs, and performance. Papers on caches, buses, threaded code, Register Transfer Modules (later called PDP-14), C.mmp and Cm* (CMU's multi-processors), the PDP-10 (PDP-6, KA-, KI-, and KL-10), and packaging and manufacturing flesh out a feast for historians. Hardware architects would do well to consider the lessons here, especially the "Wheel of Reincarnation" discussed in the section on the DEC 338 display computer. R. C. Holt, "Concurrent Euclid, The UNIX System, and Tunis" Good intro to concurrency. The EUCLID simulation kernel is a good model for simulation systems in general (we have used a "C" adaptation for doing I/O system simulations). The description of the UNIX file system has helped several beginners unscramble the ideas of directories, i-nodes, and files. The model of interrupt handlers as processes is impeccable (Down with interrupts! Bring back the 6600!) and even efficient. The two pages of PDP-11 assembler which is called a "kernel" (EUCLID's use of the word) would be called "save/resume" in UNIX. The idea (and in the case of Tunis, practice) of building systems that can have additional processors added to them without changing anything is much needed in this world of fast micros. David Gries, "The Science of Programming" The ideas and methods of Dijkstra's "Discipline of Programming" made accessible to mere mortals. I must confess I didn't really believe/understand the proof of the loop invariant theorem until I read the version presented here. Full of goodies like a "checklist for understanding a loop" and "ways of weakening a [loop invariant] predicate". The "balloon theory" of loops is great! (You start with a loop predicate [balloon] which includes both the pre-condition and the post-condition, then "deflate the balloon" as you iterate the loop until it just encloses the post-condition.) Tom DeMarco, "Controlling Software Projects" A solid book about software development, and its pitfalls. Subtitled "Management, Measurement, & Estimation", the book opens with "You can't control what you can't measure. In most disciplines the strong linkage between measurement and control is taken for granted. But I fear the idea may be news to many software managers, otherwise rational men and women who harbor an illusion of control, even though they never measure anything." He goes on to discuss WHY we are so poor at measurement and estimating (chiefly the political problem of estimates being used to create incentives). Rather than an estimate being "the most optimistic prediction with non-zero probability of coming true", he proposes "a prediction that is equally likely to be above or below the actual result". My only reservation is that it may be hard to find (upper) management willing to face the truth about their software disasters. (Dijkstra has asked, "How do you tell truths that might hurt?") After all, years after Brooks's Law, we still pour more people on late projects. Rob Warnock UUCP: {sri-unix,amd70,hpda,harpo,ihnp4,allegra}!fortune!rpw3 DDD: (415)595-8444 USPS: Fortune Systems Corp, 101 Twin Dolphins Drive, Redwood City, CA 94065
stewart@ihldt.UUCP (01/20/84)
Here's another book everyone should have on their shelf, no matter what kind of programming they do: The Art of Software Testing by G.J. Myers John Wiley & Sons, 1979 This is one of those rare, refreshing books that makes you look at a subject in a completely different way. It's short and easy to read, without oversimplifying or leaving things out. I've talked to others who have read it, and they have all agreed that it's a book of exceptional value.