This is an HTML rendering of a working paper draft that led to a publication. The publication should always be cited in preference to this draft using the following reference:

The document's metadata is available in BibTeX format.

This material is presented to ensure timely dissemination of scholarly and technical work. Copyright and all rights therein are retained by authors or by other copyright holders. All persons copying this information are expected to adhere to the terms and constraints invoked by each author's copyright. In most cases, these works may not be reposted without the explicit permission of the copyright holder.

Diomidis Spinellis Publications

Copyright © 2003 by the Association for Computing Machinery, Inc. Permission to make digital or hard copies of part or all of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for components of this work owned by others than ACM must be honored. Abstracting with credit is permitted. To copy otherwise, to republish, to post on servers, or to redistribute to lists, requires prior specific permission and/or a fee. Request permissions from Publications Dept, ACM Inc., fax +1 (212) 869-0481, or

Book review: The Art of UNIX Programming

Diomidis Spinellis
Athens University of Economics and Business

Eric S. Raymond
The Art of UNIX Programming
Addison Wesley, Boston, 2003
496 pp.

Eric Raymond is often described as the unofficial spokesperson of the Open Source community. In his new book titled The Art of UNIX Programming he successfully tackles a much grander task: that of articulating and explaining the guiding design, implementation, and social principles behind the success, adaptability, and durability of the Unix operating system. Although the word programming appears on the book's title, Raymond covers a lot more and deeper ground. The book's first part provides the context of Unix development by outlining the most important positive features of Unix and the 17 guiding elements of the Unix philosophy. These elements prescribe the structure of systems following the Unix way (modularity, composition, separation, diversity, and extensibility), their behavior (clarity, simplicity, parsimony, silence, transparency, robustness, repair, and least surprise), and the approach to build them (economy, generation, representation, and distrust for optimization). The first part ends with two chapters providing a historical overview, and an instructive comparison of Unix to other systems.

In the book's next two parts, Design and Implementation, the author manages to distill the accumulated wisdom of programming following the Unix philosophy into concrete principles such as the use of text-based protocols, the utilization of domain-specific minilanguages, the structure of user interfaces, the choice of a programming languages, and the use of tools. Each principle is illustrated by numerous case studies (a dozen in the case of minilanguages), and contains prescriptive guidelines for applying it in practice. Importantly, the author is never shy to identify a particular technology as a dead end, advising us to steer away from it. Many chapters can be read as mini surveys and concise tutorials for the technique they discuss.

Raymond uses the idea of open-source software as unifying principle behind this book. He argues that Unix began its history as effectively an open-source system (AT&T, being restrained from selling it, distributed Unix accompanied with source code to universities and research institutes for only a nominal fee), and that its current popularity and versatility stem again from open-source systems such as GNU/Linux and FreeBSD. The book's last part, titled "Community" explores this aspect in depth by examining the elements around which the Unix community is built. Here Raymond discusses portability (providing an excellent roadmap of the, typically obtuse and contradicting, Unix-related standardization efforts), documentation (giving solid advice for choosing and using the appropriate documentation format), and open source (offering guidelines for contributing, developing, and distributing open source software). A final chapter titled "Futures: Dangers and Opportunities" discusses problems facing Unix in the areas of its design, environment, and culture presenting the challenges in the road ahead.

As doubtlessly many readers already know by experience, Raymond's writing is fluid, free from unnecessary technical jargon, and remarkably perceptive. All these qualities make The Art of UNIX Programming a joy to read and a valuable contribution to the Unix community.