Everything that can be a source- and destination-independent filter should be one.
Complex front ends (user interfaces) should be cleanly separated from complex back ends.
Whenever possible, prototype in an interpreted language before coding C.
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]