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.