All software sucks
“And folks, let’s be honest. Sturgeon was an optimist. Way more than 90% of code is crap.” – Al viro
“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.” – C.A.R. Hoare, The 1980 ACM Turing Award Lecture
“One of my most productive days was throwing away 1000 lines of code.” – Ken Thompson
“..At first I hoped that such a technically unsound project would collapse but I soon realized it was doomed to success. Almost anything in software can be implemented, sold, and even used given enough determination. There is nothing a mere scientist can say that will stand against the flood of a hundred million dollars. But there is one quality that cannot be purchased in this way -and that is reliability. The price of reliability is the pursuit of the utmost simplicity. It is a price which the very rich find most hard to pay.” – C.A.R. Hoare
“It’s a curious thing about our industry: not only do we not learn from our mistakes, we also don’t learn from our successes.” – Keith Braithwaite
This is a work in progress, much is missing.
|Harmful things||Less harmful alternatives|
|SGML, XML, YAML.||JSON, CSV, ndb(6), plain(UTF-8) text.|
|NFS, SMB, AFS, WebDAV.||9p.|
|C++, Java, Vala, D, Python, Ruby.||C, Go, Limbo.|
|pthreads (PoSix threads).||CSP-style concurrency: Go, libthread, libtask, Limbo, Erlang, ...|
|Perl, Ruby.||rc, awk.|
|PCRE||Structural Regular Expressions or plain classic/extended regexps (as used in awk, sed, grep, etc.).|
|Bash, tcsh, zsh.||rc, OpenBSD's pdksh, ash/dash.|
|GNU Coreutils.||Plan 9 from User Space.|
|GNU info.||Man pages.|
|glibc.||musl, ucLibc, DietLibc.|
|GNU autoconf/automake, CMake, imake, scons, waf.||mk, or plain old portable makefiles.|
|Glib.||libc (see above), p9p's C libraries.|
|GTK, Qt, VxWindows.||Tk, textual interfaces.|
|Vim, Emacs, nano, Eclipse, ...||Acme, Sam, ed.|
|UTF-16, UTF-32, Latin-1, other encodings.||UTF-8..|
|iSCSI, FCoE.||AoE (ATA over Ethernet).|
|PAM (Pluggable Authentication Modules).||Factotum.|
|Jabber and XMPP.||IRC (for IM), STOMP (for general distributed messaging).|
|IMAP.||SMAP(Simple Mail Access Protocol).|
|SQL databases.||Tutorial D, pq, BigTable, plain old hierarchical filesystems.|
|Subversion, aka svn.||Git, Mercurial (aka hg); hell, even CVS or plain old tarballs would be better than svn.|
|FreeBSD, NetBSD, Solaris.||OpenBSD.|
|Apache, lighttpd.||thttpd, OpenBSD's fork of apache 1.3, nginx, or best of all: don't use HTTP.|
|GPL, LGPL, Apache Software License, MPL, CC.||ISC, MIT/X, BSD, CC0, public domain.|
Harmful things that are so superfluous and useless that require no alternative:
- Unicode BoM in UTF-8.
- Dynamic linking, in particular in Unix systems.
- PoSix locales.
- Adobe Flash.
- GNOME and KDE.
Note: At the moment a detailed rationale is not provided for most of this, so figuring out why some things are considered more or less harmful than others is left as an exercise for the reader. Here is a hint: complexity is the bane of all software, simplicity is the most important quality. See also: Worse is Better by Richard Gabriel.
JWZ’s Law of Software Envelopment: “Every program attempts to expand until it can read mail. Those programs which cannot so expand are replaced by ones which can.”
Most so called ‘features’ are either useless or worse than useless.
- Not Implementing Features Is Hard - By Robert O'Callahan.
- Why I Hate Frameworks - By Benji Smith.