Spiral Energetics

Fishy fun

I love fish shell.

The syntax is simple and consistent, and the behaviour straightforward and predictable. There are comparatively little magical symbols, and there are no real "gotchas" or ways to screw yourself over.

fish has autocomplete and history search that just works. I can type something and press tab, or press the up arrow, and it just works. It's night-and-day compared to bash. Any time I'm unfortunate enough to ssh in to a machine that defaults to bash, I sit there mashing the tab key, only for nothing to happen.

I've never once had to "configure" fish. It just works out-of-the-box. It was designed to be useful and optimal from the start.

Configuration is what happens when you have a bad design, and you are either too obstinate to admit to your mistake, or too deficient in essential virtues to acknowledge that there exists a gradient from bad things to good. Either way, you double down on the mistake, and demand users "configure". At the moment you are creating configuration opportunities, two things have gone wrong. Reliance on configuration is cowardice.

Why not just make it work out of the box?

There's no one in a better position to do this "configuration" than the programmer himself, at the time the program is being written. Why be so rude to your users that they must either put up with the bad behaviour, or invest time in to fixing it?

As the user, what you need to do to fix the machine isn't even novel. Everyone else needs to do the same thing. How much time is collectively wasted?

It's not a gift that you have the superficial ability to fix the machine's poor initial behaviour, if it comes at the expense of your own time and effort. Configuration has not put you in control. Quite the opposite.

Supporting the additional behavioural modes also brings complexities for the codebase itself. It's harder to maintain, and brings about more bugs. It's a vicious cycle: the more configuration you demand, the harder it is to change any defaults, because it breaks people's configurations. The codebase quickly becomes sclerotic.

Caution, the configurater

Many human lives have been forfeit to "configuration".

My uncle got lost in his zsh profile and died.

I've exclusively been a fish user for half a decade, and the only things I've ever modified in my fish profile are PATH, and a handful of aliases.

On the other hand, the rabbit hole of zsh configuration is so large that people triple-down and create meta-configurators to configure their configurations. Not once did anyone stop and realise that they are stuck in a local optimum.

We'll never get these people out again. What a waste!

Works, wonderously

fish wants nothing from you, but gives everything in return.

It doesn't tell me that directories are directories:

bash-3.2$ /foo/
bash: /foo/: is a directory

It doesn't tell me it doesn't have permission:

shire@shire ~ % /foo/
zsh: permission denied: /foo/

It just works:

shire@shire ~> /foo/
shire@shire /foo/>

If I type something incorrect, it doesn't warn me that the file isn't infinitely long:

if [[ -f "foo" ]]; then
    echo bar
else
    echo baz
bash.sh: line 5: syntax error: unexpected end of file

Instead, it simply points out the problem:

if test -f "foo"
    echo bar
else
    echo baz
fish.fish (line 1): Missing end to balance this if statement
if test -f "foo"
^^

Complexity, perplexity

The complete reference manual for bash is 486,971 characters long.

The complete reference manual for zsh is 1,332,241 characters long.

The complete reference manual for fish is 94,364 characters long.

What does this all get us? Is bash five times more expressive than fish? Five times more performant? Five times more powerful? Five times more featureful? Clearly not. So, what exactly are we getting for five times more complexity?

And is zsh fourteen times better?

What can be done about this?

hashtag #make_fish_the_default_shell_in_{$current_year}