Another important dimension along which operating systems differ
is the height of the barrier that separates mere users from becoming
developers. There are two important cost drivers here. One is the
monetary cost of development tools, the other is the time cost of
gaining proficiency as a developer. Some development cultures evolve
social barriers to entry, but these are usually an effect of the
underlying technology costs, not a primary cause.
Expensive development tools and complex, opaque APIs produce
small and elitist programming cultures. In those cultures,
programming projects are large, serious endeavors — they have to
be in order to offer a payoff that justifies the cost of both hard and
soft (human) capital invested. Large, serious projects tend to
produce large, serious programs (and, far too often, large expensive
failures).
Inexpensive tools and simple interfaces support casual
programming, hobbyist cultures, and exploration. Programming projects
can be small (often, formal project structure is plain unnecessary),
and failure is not a catastrophe. This changes the style in which
people develop code; among other things, they show less tendency to
over-commit to failed approaches.
Casual programming tends to produce lots of small programs and a
self-reinforcing, expanding community of knowledge. In a world of
cheap hardware, the presence or absence of such a community is an
increasingly important factor in whether an operating system is
long-term viable at all.
Unix pioneered casual programming. One of the things Unix was
first at doing was shipping with a compiler and scripting tools as
part of the default installation available to all users, supporting a
hobbyist software-development culture that spanned multiple
installations. Many people who write code under Unix do not think of
it as writing code — they think of it as writing scripts to
automate common tasks, or as customizing their environment.
To design the perfect anti-Unix, make casual programming
impossible.