My software philosophy
-------------------------------------------------------------------
Essential aspects of software that I consider good:

- Reliability:
 Software must do its job consistently every time, without crashes
 bugs or performance degradation even after running continously
 for months. There's nothing worse than having to watch software
 slow down to a crawl and having to restart it.
 Reliability should be server-grade even on desktop applications.

- Less is more:
 Tasks should be simplified into as little features as possible.
 The bigger and complex the codebase is the higher the probability
 of bugs. Complex tasks should be split into multiple tools that
 do a few things and do them well. If the code is too complex to
 be readable without splitting it into more than 2-3 files, you're
 usually doing it wrong.

- Standalone binary and source:
 Dependencies on 3rd party libraries should be minimized.
 Don't you hate it when you install a simple program and it pulls
 multiple huge libraries that use disk space and take a long time
 to build/install?
 Not to mention, the probability of breakage due to other software
 wanting other versions of that library and generating conflicts
 skyrockets.
 Ideally when I extract your code it should build out of the box
 by calling a simple build script or, at most, running configure
 and make.
 I shouldn't have to install cmake, ninja, or other crap.
 If there are any third party dependencies, they should be
 statically linked whenever possible.
 Basically, the application should be as close to a single
 executable that runs out of the box anywhere as possible.

- Command line interface:
 With the exception of tasks that absolutely require a GUI, there
 should always be a command line interface to do everything and
 the GUI should be optional.
 Ideally, the user should also be able toggle the entire GUI layer
 off when building the program to reduce dependencies, executable
 size and build times.

- Performance:
 Especially with software that needs to run continously, you don't
 want it to use more resources than it should. CPU usage should be
 minimized, with the exception of stuff like games and other stuff
 that should run as fast as possible. Even in the case of
 applications like games, framerate should be resonable for the
 amounts of resources used (ideally 120+fps on low-end machines
 for games at low settings).

- Simple config files:
 Config files that are meant to be edited by the user should be
 plain text with as little nesting as possible. Json with < 3
 levels of nesting is fine, but you usually want to stay away from
 json unless your programming language supports it without a
 third party library.
 The ideal config file simply contains default values for command
 line parameters that you would always pass to the tool. mpv's
 and livestreamer's config files are a good example.

- UI design:
 The UI should at the very least fit into a 800x600 display or
 smaller. Information should be compact and close together.
 Unless the task at hand absolutely requires images and other
 graphical stuff that terminals can't do, it's usually better to
 have a ncurses UI that you can use from the terminal (which also
 makes it more easily usable over ssh or from the tty).

- Keyboard control:
 With the exception of pointing-heavy tasks like drawing, software
 should have keybinds for everything so that advanced users can
 speed up their workflow by not having to reach for their mouse.

Also see the suckless software philosophy, which I strongly agree
with: http://suckless.org/philosophy

If you want to read a full rant with examples that explains how I
got to this mindset, read modern_software_is_at_its_worst.txt.