The Original Principles
Doug McIlroy summarized the Unix philosophy in 1978:
Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new “features.”
This seems almost quaint in 2024, where we have IDEs that are web browsers, text editors that run Docker containers, and build tools that include their own package managers.
The Unix philosophy emerged from a world of 16KB RAM and 1MHz processors. Yet its principles scale up remarkably well.
Composability in Practice
The power of Unix pipes lies in their uniform interface: text streams. Modern equivalents include:
| Unix Concept | Modern Equivalent |
|---|---|
Pipes (|) | Message queues, gRPC streams |
| Files | Object storage, databases |
| Signals | Webhooks, events |
| Shell scripts | CI/CD pipelines |
Where Monoliths Win
I’m not dogmatic about this. Monolithic tools win when:
- Discoverability matters — new users need a guided path
- Integration is the product — the value is in combining features
- Performance requires coupling — when abstraction boundaries add unacceptable overhead
The Composable Alternative
But for power users and automation, composable tools remain king:
# Find all TODO comments added in the last week
git log --since="1 week ago" --all -p \
| grep "^+" \
| grep -i "todo\|fixme\|hack" \
| sort -u
No single tool does this. The composition of git, grep, and sort gives you something that would take hours to build into a monolithic UI.
Applying This to System Design
When building the distributed-scheduler, we applied Unix philosophy at the architecture level:
- Each service does one thing
- Services communicate through well-defined interfaces (protobuf)
- Any service can be replaced independently
- The system works even when parts are missing (degraded mode)
The constraint propagation ideas from constraint-propagation also connect here — by constraining each component’s responsibility, we reduce the overall system complexity.
When components are well-isolated, the sum is much less than a monolithic equivalent.