| |
| |
Preface | |
| |
| |
| |
Context | |
| |
| |
| |
Philosophy: Philosophy Matters | |
| |
| |
| |
Culture? What Culture? | |
| |
| |
| |
The Durability of Unix | |
| |
| |
| |
The Case against Learning Unix Culture | |
| |
| |
| |
What Unix Gets Wrong | |
| |
| |
| |
What Unix Gets Right | |
| |
| |
| |
Basics of the Unix Philosophy | |
| |
| |
| |
The Unix Philosophy in One Lesson | |
| |
| |
| |
Applying the Unix Philosophy | |
| |
| |
| |
Attitude Matters Too | |
| |
| |
| |
History: A Tale of Two Cultures | |
| |
| |
| |
Origins and History of Unix, 1969-1995 | |
| |
| |
| |
Origins and History of the Hackers, 1961-1995 | |
| |
| |
| |
The Open-Source Movement: 1998 and Onward | |
| |
| |
| |
The Lessons of Unix History | |
| |
| |
| |
Contrasts: Comparing the Unix Philosophy with Others | |
| |
| |
| |
The Elements of Operating-System Style | |
| |
| |
| |
Operating-System Comparisons | |
| |
| |
| |
What Goes Around, Comes Around | |
| |
| |
| |
Design | |
| |
| |
| |
Modularity: Keeping It Clean, Keeping It Simple | |
| |
| |
| |
Encapsulation and Optimal Module Size | |
| |
| |
| |
Compactness and Orthogonality | |
| |
| |
| |
Software Is a Many-Layered Thing | |
| |
| |
| |
Libraries | |
| |
| |
| |
Unix and Object-Oriented Languages | |
| |
| |
| |
Coding for Modularity | |
| |
| |
| |
Textuality: Good Protocols Make Good Practice | |
| |
| |
| |
The Importance of Being Textual | |
| |
| |
| |
Data File Metaformats | |
| |
| |
| |
Application Protocol Design | |
| |
| |
| |
Application Protocol Metaformats | |
| |
| |
| |
Transparency: Let There Be Light | |
| |
| |
| |
Studying Cases | |
| |
| |
| |
Designing for Transparency and Discoverability | |
| |
| |
| |
Designing for Maintainability | |
| |
| |
| |
Multiprogramming: Separating Processes to Separate Function | |
| |
| |
| |
Separating Complexity Control from Performance Tuning | |
| |
| |
| |
Taxonomy of Unix IPC Methods | |
| |
| |
| |
Problems and Methods to Avoid | |
| |
| |
| |
Process Partitioning at the Design Level | |
| |
| |
| |
Minilanguages: Finding a Notation That Sings | |
| |
| |
| |
Understanding the Taxonomy of Languages | |
| |
| |
| |
Applying Minilanguages | |
| |
| |
| |
Designing Minilanguages | |
| |
| |
| |
Generation: Pushing the Specification Level Upwards | |
| |
| |
| |
Data-Driven Programming | |
| |
| |
| |
Ad-hoc Code Generation | |
| |
| |
| |
Configuration: Starting on the Right Foot | |
| |
| |
| |
What Should Be Configurable? | |
| |
| |
| |
Where Configurations Live | |
| |
| |
| |
Run-Control Files | |
| |
| |
| |
Environment Variables | |
| |
| |
| |
Command-Line Options | |
| |
| |
| |
How to Choose among the Methods | |
| |
| |
| |
On Breaking These Rules | |
| |
| |
| |
Interfaces: User-Interface Design Patterns in the Unix Environment | |
| |
| |
| |
Applying the Rule of Least Surprise | |
| |
| |
| |
History of Interface Design on Unix | |
| |
| |
| |
Evaluating Interface Designs | |
| |
| |
| |
Tradeoffs between CLI and Visual Interfaces | |
| |
| |
| |
Transparency, Expressiveness, and Configurability | |
| |
| |
| |
Unix Interface Design Patterns | |
| |
| |
| |
Applying Unix Interface-Design Patterns | |
| |
| |
| |
The Web Browser as a Universal Front End | |
| |
| |
| |
Silence Is Golden | |
| |
| |
| |
Optimization | |
| |
| |
| |
Don't Just Do Something, Stand There! | |
| |
| |
| |
Measure before Optimizing | |
| |
| |
| |
Nonlocality Considered Harmful | |
| |
| |
| |
Throughput vs. Latency | |
| |
| |
| |
Complexity: As Simple As Possible, but No Simpler | |
| |
| |
| |
Speaking of Complexity | |
| |
| |
| |
A Tale of Five Editors | |
| |
| |
| |
The Right Size for an Editor | |
| |
| |
| |
The Right Size of Software | |
| |
| |
| |
Implementation | |
| |
| |
| |
Languages: To C or Not To C? | |
| |
| |
| |
Unix's Cornucopia of Languages | |
| |
| |
| |
Why Not C? | |
| |
| |
| |
Interpreted Languages and Mixed Strategies | |
| |
| |
| |
Language Evaluations | |
| |
| |
| |
Trends for the Future | |
| |
| |
| |
Choosing an X Toolkit | |
| |
| |
| |
Tools: The Tactics of Development | |
| |
| |
| |
A Developer-Friendly Operating System | |
| |
| |
| |
Choosing an Editor | |
| |
| |
| |
Special-Purpose Code Generators | |
| |
| |
| |
make: Automating Your Recipes | |
| |
| |
| |
Version-Control Systems | |
| |
| |
| |
Runtime Debugging | |
| |
| |
| |
Profiling | |
| |
| |
| |
Combining Tools with Emacs | |
| |
| |
| |
Reuse: On Not Reinventing the Wheel | |
| |
| |
| |
The Tale of J. Random Newbie | |
| |
| |
| |
Transparency as the Key to Reuse | |
| |
| |
| |
From Reuse to Open Source | |
| |
| |
| |
The Best Things in Life Are Open | |
| |
| |
| |
Where to Look? | |
| |
| |
| |
Issues in Using Open-Source Software | |
| |
| |
| |
Licensing Issues | |
| |
| |
| |
Community | |
| |
| |
| |
Portability: Software Portability and Keeping Up Standards | |
| |
| |
| |
Evolution of C | |
| |
| |
| |
Unix Standards | |
| |
| |
| |
IETF and the RFC Standards Process | |
| |
| |
| |
Specifications as DNA, Code as RNA | |
| |
| |
| |
Programming for Portability | |
| |
| |
| |
Internationalization | |
| |
| |
| |
Portability, Open Standards, and Open Source | |
| |
| |
| |
Documentation: Explaining Your Code to a Web-Centric World | |
| |
| |
| |
Documentation Concepts | |
| |
| |
| |
The Unix Style | |
| |
| |
| |
The Zoo of Unix Documentation Formats | |
| |
| |
| |
The Present Chaos and a Possible Way Out | |
| |
| |
| |
DocBook | |
| |
| |
| |
Best Practices for Writing Unix Documentation | |
| |
| |
| |
Open Source: Programming in the New Unix Community | |
| |
| |
| |
Unix and Open Source | |
| |
| |
| |
Best Practices for Working with Open-Source Developers | |
| |
| |
| |
The Logic of Licenses: How to Pick One | |
| |
| |
| |
Why You Should Use a Standard License | |
| |
| |
| |
Varieties of Open-Source Licensing | |
| |
| |
| |
Futures: Dangers and Opportunities | |
| |
| |
| |
Essence and Accident in Unix Tradition | |
| |
| |
| |
Plan 9: The Way the Future Was | |
| |
| |
| |
Problems in the Design of Unix | |
| |
| |
| |
Problems in the Environment of Unix | |
| |
| |
| |
Problems in the Culture of Unix | |
| |
| |
| |
Reasons to Believe | |
| |
| |
| |
Glossary of Abbreviations | |
| |
| |
| |
References | |
| |
| |
| |
Contributors | |
| |
| |
| |
Rootless Root: The Unix Koans of Master Foo | |
| |
| |
Index | |