These philosophical principles aren't just vague generalities. In the Unix world they come straight from experience and lead to specific prescriptions, some of which we've already developed above. Here's a by no means exhaustive list:
Everything that can be a source- and destination-independent filter should be one.
Data streams should if at all possible be textual (so they can be viewed and filtered with standard tools).
Database layouts and application protocols should if at all possible be textual (human-readable and human-editable).
Complex front ends (user interfaces) should be cleanly separated from complex back ends.
Whenever possible, prototype in an interpreted language before coding C.
Mixing languages is better than writing everything in one, if and only if using only that one is likely to overcomplicate the program.
Be generous in what you accept, rigorous in what you emit.
When filtering, never throw away information you don't need to.
Small is beautiful. Write programs that do as little as is consistent with getting the job done.
We'll see the Unix design rules, and the prescriptions that derive from them, applied over and over again in the remainder of this book. Unsurprisingly, they tend to converge with the very best practices from software engineering in other traditions.[12]