Table of Contents
- 4. Modularity
-
- Encapsulation and Optimal Module
Size
- Compactness and Orthogonality
-
- Compactness
- Orthogonality
- The SPOT Rule
- Compactness and the Strong
Single Center
- The Value of
Detachment
- Software Is a Many-Layered
Thing
-
- Top-Down versus
Bottom-Up
- Glue Layers
- Case Study: C Considered as
Thin Glue
- Libraries
-
- Case Study: GIMP
Plugins
- Unix and Object-Oriented
Languages
- Coding for Modularity
- 5. Textuality
-
- The Importance of Being Textual
-
- Case Study: Unix Password File
Format
- Case Study: .newsrc
Format
- Case Study: The PNG Graphics File
Format
- Data File Metaformats
-
- DSV Style
- RFC 822 Format
- Cookie-Jar Format
- Record-Jar Format
- XML
- Windows INI Format
- Unix Textual File Format
Conventions
- The Pros and Cons of File
Compression
- Application Protocol Design
-
- Case Study: SMTP, the Simple
Mail Transfer Protocol
- Case Study: POP3, the Post
Office Protocol
- Case Study: IMAP, the Internet
Message Access Protocol
- Application Protocol
Metaformats
-
- The Classical Internet
Application Metaprotocol
- HTTP as a Universal
Application Protocol
- BEEP: Blocks Extensible
Exchange Protocol
- XML-RPC, SOAP, and
Jabber
- 6. Transparency
-
- Studying Cases
-
- Case Study: audacity
- Case Study: fetchmail's -v
option
- Case Study: GCC
- Case Study: kmail
- Case Study: SNG
- Case Study: The Terminfo
Database
- Case Study: Freeciv Data
Files
- Designing for Transparency and
Discoverability
-
- The Zen of
Transparency
- Coding for Transparency and
Discoverability
- Transparency and Avoiding
Overprotectiveness
- Transparency and Editable
Representations
- Transparency, Fault Diagnosis,
and Fault Recovery
- Designing for Maintainability
- 7. Multiprogramming
-
- Separating Complexity Control from
Performance Tuning
- Taxonomy of Unix IPC Methods
-
- Handing off Tasks to
Specialist Programs
- Pipes, Redirection, and
Filters
- Wrappers
- Security Wrappers and
Bernstein Chaining
- Slave Processes
- Peer-to-Peer Inter-Process
Communication
- Problems and Methods to Avoid
-
- Obsolescent Unix IPC
Methods
- Remote Procedure
Calls
- Threads - Threat or
Menace?
- Process Partitioning at the Design
Level
- 8. Minilanguages
-
- Understanding the Taxonomy of
Languages
- Applying Minilanguages
-
- Case Study: sng
- Case Study: Regular
Expressions
- Case Study: Glade
- Case Study: m4
- Case Study: XSLT
- Case Study: The Documenter's
Workbench Tools
- Case Study: fetchmail
Run-Control Syntax
- Case Study: awk
- Case Study:
PostScript
- Case Study: bc and dc
- Case Study: Emacs
Lisp
- Case Study:
JavaScript
- Designing Minilanguages
-
- Choosing the Right Complexity
Level
- Extending and Embedding
Languages
- Writing a Custom
Grammar
- Macros - Beware!
- Language or Application
Protocol?
- 9. Generation
-
- Data-Driven Programming
-
- Case Study: ascii
- Case Study: Statistical Spam
Filtering
- Case Study: Metaclass
Hacking in fetchmailconf
- Ad-hoc Code Generation
-
- Case Study: Generating Code
for the ascii Displays
- Case Study: Generating HTML Code
for a Tabular List
- 10. Configuration
-
- What Should Be Configurable?
- Where Configurations Live
- Run-Control Files
-
- Case Study: The .netrc
File
- Portability to Other Operating
Systems
- Environment Variables
-
- System Environment
Variables
- User Environment
Variables
- When to Use Environment
Variables
- Portability to Other Operating
Systems
- Command-Line Options
-
- The -a to -z of Command-Line
Options
- Portability to Other Operating
Systems
- How to Choose among the Methods
-
- Case Study:
fetchmail
- Case Study: The XFree86
Server
- On Breaking These Rules
- 11. Interfaces
-
- Applying the Rule of Least
Surprise
- History of Interface Design on
Unix
- Evaluating Interface Designs
- Tradeoffs between CLI and Visual
Interfaces
-
- Case Study: Two Ways to Write
a Calculator Program
- Transparency, Expressiveness, and
Configurability
- Unix Interface Design Patterns
-
- The Filter Pattern
- The Cantrip Pattern
- The Source Pattern
- The Sink Pattern
- The Compiler Pattern
- The ed pattern
- The Roguelike Pattern
- The 'Separated Engine and
Interface' Pattern
- The CLI Server
Pattern
- Language-Based Interface
Patterns
- Applying Unix Interface-Design
Patterns
-
- The Polyvalent-Program
Pattern
- The Web Browser as a Universal Front
End
- Silence Is Golden
- 12. Optimization
-
- Don't Just Do Something, Stand
There!
- Measure before Optimizing
- Nonlocality Considered Harmful
- Throughput vs. Latency
-
- Batching Operations
- Overlapping
Operations
- Caching Operation
Results
- 13. Complexity
-
- Speaking of Complexity
-
- The Three Sources of
Complexity
- Tradeoffs between Interface
and Implementation Complexity
- Essential, Optional, and
Accidental Complexity
- Mapping Complexity
- When Simplicity Is Not
Enough
- A Tale of Five Editors
-
- ed
- vi
- Sam
- Emacs
- Wily
- The Right Size for an Editor
-
- Identifying the Complexity
Problems
- Compromise Doesn't
Work
- Is Emacs an Argument against
the Unix Tradition?
- The Right Size of Software