skip to main content
Skip header Section
The Art of UNIX ProgrammingSeptember 2003
Publisher:
  • Pearson Education
ISBN:978-0-13-142901-7
Published:01 September 2003
Pages:
512
Skip Bibliometrics Section
Bibliometrics
Skip Abstract Section
Abstract

"Reading this book has filled a gap in my education. I feel a sense of completion, understand that UNIX is really a style of community. Now I get it, at least I get it one level deeper than I ever did before. This book came at a perfect moment for me, a moment when I shifted from visualizing programs as things to programs as the shadows cast by communities. From this perspective, Eric makes UNIX make perfect sense." --Kent Beck, author of Extreme Programming Explained, Test Driven Development, and Contributing to Eclipse"A delightful, fascinating read, and the lessons in problem-solvng are essential to every programmer, on any OS." --Bruce Eckel, author of Thinking in Java and Thinking in C++Writing better software: 30 years of UNIX development wisdomIn this book, five years in the making, the author encapsulates three decades of unwritten, hard-won software engineering wisdom. Raymond brings together for the first time the philosophy, design patterns, tools, culture, and traditions that make UNIX home to the world's best and most innovative software, and shows how these are carried forward in Linux and today's open-source movement. Using examples from leading open-source projects, he shows UNIX and Linux programmers how to apply this wisdom in building software that's more elegant, more portable, more reusable, and longer-lived.Raymond incorporates commentary from thirteen UNIX pioneers: Ken Thompson, the inventor of UNIX. Ken Arnold, part of the group that created the 4BSD UNIX releases and co-author of The Java Programming Language. Steven M. Bellovin, co-creator of Usenet and co-author of Firewalls and Internet Security. Stuart Feldman, a member of the Bell Labs UNIX development group and the author of make and f77. Jim Gettys and Keith Packard, principal architects of the X windowing system. Steve Johnson, author of yacc and of the Portable C Compiler. Brian Kernighan, co-author of The C Programming Language, The UNIX Programming Environment, The Practice of Programming, and of the awk programming language. David Korn, creator of the korn shell and author of The New Korn Shell Command and Programming Language. Mike Lesk, a member of the Bell Labs development group and author of the ms macro package, the tbl and refer tools,lex and UUCP. Doug McIlroy, Director of the Bell Labs research group where UNIX was born and inventor of the UNIX pipe. Marshall Kirk McKusick, developer of the 4.2BSD fast filesystem and a leader of the 4.3BSD and 4.4BSD teams. Henry Spencer, a leader among early UNIX developers, who created getopt, the first open-source string library, and a regular-expression engine used in 4.4BSD.

Cited By

  1. ACM
    Ma Z, Detor S and Zhong L Offloading Operating System Functions to the Cloud Proceedings of the 25th International Workshop on Mobile Computing Systems and Applications, (40-46)
  2. ACM
    Taeumel M and Hirschfeld R Relentless Repairability or Reckless Reuse: Whether or Not to Rebuild a Concern with Your Familiar Tools and Materials Proceedings of the 2022 ACM SIGPLAN International Symposium on New Ideas, New Paradigms, and Reflections on Programming and Software, (185-194)
  3. ACM
    Wang J, Jiang Y, Su T, Li S, Xu C, Lu J and Su Z Detecting non-crashing functional bugs in Android apps via deep-state differential analysis Proceedings of the 30th ACM Joint European Software Engineering Conference and Symposium on the Foundations of Software Engineering, (434-446)
  4. ACM
    Wu R, Chen M, Wang C, Fan G, Qiu J and Zhang C Accelerating Build Dependency Error Detection via Virtual Build Proceedings of the 37th IEEE/ACM International Conference on Automated Software Engineering, (1-12)
  5. ACM
    MacInnis M, Baysal O and Lanza M Terminals all the way down Proceedings of the ACM/IEEE 44th International Conference on Software Engineering: New Ideas and Emerging Results, (86-90)
  6. Paradis C and Kazman R Building the MSR Tool Kaiaulu: Design Principles and Experiences Software Architecture, (107-129)
  7. ACM
    Hollerweger F Streaaam: A fully automated experimental audio streaming server Proceedings of the 16th International Audio Mostly Conference, (161-168)
  8. Hüls J, Niehaus H and Remke A hpnmg: A C++ Tool for Model Checking Hybrid Petri Nets with General Transitions NASA Formal Methods, (369-378)
  9. van den Burg G, Nazábal A and Sutton C (2022). Wrangling messy CSV files by detecting row and type patterns, Data Mining and Knowledge Discovery, 33:6, (1799-1820), Online publication date: 1-Nov-2019.
  10. Schmidt A and Scholz S Powerful Data Analysis and Composition with the UNIX-Shell Web Engineering, (582-585)
  11. Seyedtalebi N Algorithms for Provisioning Edge Computing Resources to Minimize Data Transport Costs 2019 16th Annual IEEE International Conference on Sensing, Communication, and Networking (SECON), (1-9)
  12. Licker N and Rice A Detecting incorrect build rules Proceedings of the 41st International Conference on Software Engineering, (1234-1244)
  13. Schütz F, Fabro J, Ronszcka A, Stadzisz P and Simão J (2018). Proposal of a declarative and parallelizable artificial neural network using the notification-oriented paradigm, Neural Computing and Applications, 30:6, (1715-1731), Online publication date: 1-Sep-2018.
  14. ACM
    Celińska D Coding together in a social network Proceedings of the 9th International Conference on Social Media and Society, (31-40)
  15. Padilha B, Roberto R, Schwerz A, Pu C and Ferreira J WED-SQL: An Intermediate Declarative Language for PAIS Execution Web Services – ICWS 2018, (407-421)
  16. ACM
    Schmidts O, Kraft B, Schreiber M and Zündorf A Continuously evaluated research projects in collaborative decoupled environments Proceedings of the 5th International Workshop on Software Engineering Research and Industrial Practice, (2-9)
  17. Conte de Leon D, Goes C, Haney M and Krings A (2018). ADLES, Computers and Security, 74:C, (12-40), Online publication date: 1-May-2018.
  18. ACM
    Utsumi M, Tazaki H and Esaki H /dev/stdpkt Proceedings of the 13th Asian Internet Engineering Conference, (8-15)
  19. Kjolstad F, Chou S, Lugato D, Kamil S and Amarasinghe S taco: a tool to generate tensor algebra kernels Proceedings of the 32nd IEEE/ACM International Conference on Automated Software Engineering, (943-948)
  20. ACM
    Krisper M, Iber J, Rauter T and Kreiner C Physical Quantity Proceedings of the 22nd European Conference on Pattern Languages of Programs, (1-20)
  21. ACM
    Spinellis D, Louridas P and Kechagia M The evolution of C programming practices Proceedings of the 38th International Conference on Software Engineering, (748-759)
  22. Yalcin M, Elmqvist N and Bederson B (2015). AggreSet: Rich and Scalable Set Exploration using Visualizations of Element Aggregations, IEEE Transactions on Visualization and Computer Graphics, 22:1, (688-697), Online publication date: 31-Jan-2016.
  23. ACM
    Hall C Rethinking the human-readability infrastructure Proceedings of the Workshop on Future Programming, (1-6)
  24. Soriano-Salvador E, Muzquiz G and Ballesteros F (2015). Optimistic semaphores with non-deterministic choice operation for heterogeneous manycore systems, Concurrency and Computation: Practice & Experience, 27:14, (3676-3701), Online publication date: 25-Sep-2015.
  25. Spinellis D A repository with 44 years of Unix evolution Proceedings of the 12th Working Conference on Mining Software Repositories, (462-465)
  26. Nanz S and Furia C A comparative study of programming languages in Rosetta code Proceedings of the 37th International Conference on Software Engineering - Volume 1, (778-788)
  27. ACM
    Taeumel M, Perscheid M, Steinert B, Lincke J and Hirschfeld R Interleaving of Modification and Use in Data-driven Tool Development Proceedings of the 2014 ACM International Symposium on New Ideas, New Paradigms, and Reflections on Programming & Software, (185-200)
  28. ACM
    Hall C HCI metacomputing Proceedings of the companion publication of the 2014 ACM SIGPLAN conference on Systems, Programming, and Applications: Software for Humanity, (21-24)
  29. ACM
    Gardner A and Unger J Depends Proceedings of the Fourth Symposium on Digital Production, (19-24)
  30. ACM
    Yuan P, Guo Y and Chen X Towards an operating system for the campus Proceedings of the 5th Asia-Pacific Symposium on Internetware, (1-4)
  31. ACM
    Rakić P, Stričević L and Rakić Z Statically typed matrix Proceedings of the Fifth Balkan Conference in Informatics, (217-222)
  32. ACM
    Ziegler J, Hussein T, Münter D, Hofmann J and Linder T Generating route instructions with varying levels of detail Proceedings of the 3rd International Conference on Automotive User Interfaces and Interactive Vehicular Applications, (31-38)
  33. Eilers D and Koskinen T Adapting ACATS to the Ahven testing framework Proceedings of the 16th Ada-Europe international conference on Reliable software technologies, (75-88)
  34. West R Distributed creativity within a community of student instructional designers Proceedings of the 9th International Conference of the Learning Sciences - Volume 1, (341-348)
  35. Capra E, Francalanci C and Merlo F (2010). The economics of community open source software projects, Advances in Software Engineering, 2010, (1-17), Online publication date: 1-Jan-2010.
  36. ACM
    Treinen R and Zacchiroli S Expressing advanced user preferences in component installation Proceedings of the 1st international workshop on Open component ecosystems, (31-40)
  37. Cafer F and Misra S Effective Project Leadership in Computer Science and Engineering Proceedings of the International Conference on Computational Science and Its Applications: Part II, (59-69)
  38. ACM
    Ye Y, Yamamoto Y, Nakakoji K, Nishinaka Y and Asada M Searching the library and asking the peers Proceedings of the 5th international symposium on Principles and practice of programming in Java, (41-50)
  39. ACM
    Lim S and Lucas P JDA Companion to the 21st ACM SIGPLAN symposium on Object-oriented programming systems, languages, and applications, (586-601)
  40. ACM
    Bachmann P Static and metaprogramming patterns and static frameworks Proceedings of the 2006 conference on Pattern languages of programs, (1-33)
  41. ACM
    Johnson T and Eigenmann R Context-sensitive domain-independent algorithm composition and selection Proceedings of the 27th ACM SIGPLAN Conference on Programming Language Design and Implementation, (181-192)
  42. ACM
    Johnson T and Eigenmann R (2006). Context-sensitive domain-independent algorithm composition and selection, ACM SIGPLAN Notices, 41:6, (181-192), Online publication date: 11-Jun-2006.
  43. Winikoff M Towards Making Agent UML Practical Proceedings of the Fifth International Conference on Quality Software, (401-412)
  44. Theunissen W, Boake A and Kourie D In search of the sweet spot Proceedings of the 2005 annual research conference of the South African institute of computer scientists and information technologists on IT research in developing countries, (268-277)
  45. ACM
    Nelson J Structured programming using processes Proceedings of the 2004 ACM SIGPLAN workshop on Erlang, (54-64)
Contributors

Recommendations

Reviews

Don Goelman

I found this book enjoyable, but it is difficult to classify its purpose. According to the author, communities for whom it's intended include my own: Unix programmers with some experience who are educating novices, as well as other groups from various backgrounds who would profit from learning Unix history, philosophy, and style. The place of the book is somewhere in the convex hull of the related references Raymond cites [1,2,3,4]. Note their wide range! I would say Zen flesh, zen bones [1], while different from this book, is maybe its nearest neighbor in the set. The book is a mix of history, culture, philosophy, and technical material. There are appropriately positive descriptions and support for open source software and portability. There is, by design, no detailed code (in stark contrast with The Unix programming environment [2] and with The art of computer programming [3], which influenced the name of the present book), but there are meta-level descriptions of important programs and links to code. The top two levels of the table of contents aren't terribly helpful in reflecting the material that they contain. There are four main units: "Context," "Design," "Implementation," and "Community." The chapters in the "Context" unit are "Philosophy," "History," and "Contrasts." The first four chapters in "Design," for example, are "Modularity," "Textuality," "Transparency," and "Multiprogramming." Fortunately, the table goes down another couple of levels, providing more assistance to the reader regarding what she or he should expect. For example, Emacs can be found as a topic by browsing those lower levels of the table. In fact, it appears in some form in several different chapters. The difficulty in finding specific topics is exacerbated by the lack of an index. Admittedly, I am reviewing a prepublication draft of the book, but the presence of some appendices (including a useful Glossary of Abbreviations) leads me to conclude that no index is planned. The historical accounts are interesting, the illustrations of the ongoing influence of Unix (even in the Windows generation) are impressive, the pitch for open source is appropriate, and some of the plain fun of Unix is captured. Further, there are several entertaining quotations. I hope that some of the typos will be spotted and fixed, and the bibliographic entries formatted consistently by publication time. Besides the lack of an index, some other shortcomings, in my opinion, are the absence of a timeline in the otherwise good historical account, and the book's size. Exceeding 500 pages may not be excessive these days, but The Unix programming environment [2], which Raymond correctly characterizes as "a classic [that] shows its age a bit," managed to provide nontrivial code, pose challenging and instructive exercises, and convey the aesthetic beauty of the Unix environment, all in 357 pages. Online Computing Reviews Service

Diomidis Spinellis

Raymond is often described as the unofficial spokesperson of the Open Source community. In his new book, 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 in the book's title, Raymond covers a wider and deeper ground. The first part of the book explains the Unix development context 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 building them (economy, generation, representation, and distrust for optimization). The first part ends with two chapters that provide a historical overview of Unix, and an instructive comparison of Unix with 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 programming languages, and the use of tools. Each principle is illustrated by numerous case studies (a dozen, in the case of minilanguages), and is accompanied by prescriptive guidelines for applying the principle in practice. Importantly, the author is never shy in identifying 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 techniques they discuss. Raymond uses the idea of open-source software as a unifying principle behind this book. He argues that Unix began its history as an effectively open-source system (AT&T, being restrained from selling it, distributed Unix along with its source code to universities and research institutes for only a nominal fee). He also argues that Unix's current popularity and versatility stem, again, from open source systems such as GNU/Linux and FreeBSD. The book's last part, "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, "Futures: Dangers and Opportunities," discusses the problems facing Unix, with respect to its design, environment, and culture, presenting the challenges in the road ahead. As many readers already know by experience, Raymond's writing is fluid, free from unnecessary technical jargon, and remarkably perceptive. All these qualities make this book a joy to read, and a valuable contribution to the Unix community. Online Computing Reviews Service

Access critical reviews of Computing literature here

Become a reviewer for Computing Reviews.