To top it off, pretty much everything
in Unix is a file: terminals, standard input,
standard error, standard output, random
number generators, audio devices, and even
power switches manifest as files5. Having
composable programs that deal with contents of files puts the problem, the data,
and the tools to realize solutions in the same
dimension.
To build systems, programmers must
first create modules and tools that they can
themselves use with tranquility. I think the
Unix philosophy can be generalized to apply to modules inside a program. It teaches
us to
1) Design modules that do one thing
and do it extremely well, in isolation. Modules that are simple, general, minimal, robust, and parsimonious with resources6.
2) Allow for simple but powerful ways
to combine these modules so that you can
compose complex systems easily with your
simple modules, i.e., strive for composablility.
This involves creating uniform input and
output formats, and making use of polymorphic functions7,8.
Following these principles will let you
build systems that you can easily modify, debug and maintain. It will take you one step
closer to being at peace with what