Simple software manifesto
We are in the midst of a complexity epidemic in software. To address this, a new
computing environment is required. We are building and promoting software
which follows the following principles:
-
All software breaks, but complicated software breaks in complicated ways,
and simple software breaks in simple ways. This is also true of the system
as a whole.
-
Constraining the user to simple tools encourages creativity and allows the
system to be more quickly understood. This supports the removal of
complicated features.
-
There is only one correct way to do something, because two ways would be
more complex. You often can't change your mind later, so take great care in
doing it right the first time.
-
The dependencies of a system are part of that system and cannot be treated
as a black box. The maintenance of the entire system is your responsibility.
-
Standards are useful, but often full of cruft. This is not a license to
write software which extends them, but rather to implement only subsets of
them.
Some of the practical implications of these principles are
described here.
Are we simple yet?
NOT REALLY
STATUS: YES!
✗ Requires non-POSIX shell ✗ Needs better docs
Version control system
git
STATUS: WE OVERDID IT
✗ Perl ✗ Spaghetti ✗ Needs be rewritten with the benefit of hindsight
STATUS: GETTING THERE
Mostly complete:
✗ VLAs ✗ Preprocessor ✗ Lots of architectures
STATUS: GETTING THERE
80% complete:
✗ Arithmetic expansion ✗ Job control ✗ Signal handling
STATUS: GETTING THERE
12% complete:
✗ Mostly incomplete
Assembler & binutils
STATUS: NOT YET
Build system
STATUS: NOT YET
Kernel
STATUS: NOT YET
libc
STATUS: NOT YET
init / supervisor
STATUS: NOT YET
High-level programming
STATUS: NOT YET
Graphical user interface
STATUS: NOT YET
Simple software in practice
C
We target C99 or C11, but do not use the following features:
-
Anything in headers except guards, prototypes, extern globals, and comments
- Macros
- typedef
- Inline assembly
- Dynamic linking/loading
- Wide characters
POSIX
We target POSIX.1-2017, but do not use the following features:
- SCCS
- UUCP
- pthreads
- posix_spawn
POSIX should probably be replaced when the time is right.
Unicode
UTF-8 is the only permissible text encoding. Software may assume all text is
UTF-8 and waste no effort on other encodings.