Better alive than right

“Better alive than right” is a kind of proverb I try to remind myself of when cycling in London on a daily basis. A sizeable minority of drivers in London have a disregard for people on bikes and break traffic rules in various ways around them.

A common one is drivers pulling out from a junction in front of someone on a bike, which requires the person cycling to stop to avoid a collision, even though the driver is at fault. The idea of “better alive than right” is to focus on keeping yourself safe above all, even when it’s frustrating as the driver is in the wrong in this situation.

This is largely the same as “better safe than sorry”, but made a bit more vivd.

It also reminds me of Eliezer Yudkowsky’s “Rationality is Systematized Winning” post on Less Wrong:

“I have behaved virtuously, I have been so reasonable, it’s just this awful unfair universe that doesn’t give me what I deserve. The others are cheating by not doing it the rational way, that’s how they got ahead of me.”

Sometimes it is tempting to believe that following rules, seeking certainty or being “right” is going to bring the best results. That is true in a tautological sense – the right way is the one that is right, after all.

But real situations are rarely that simple or clear. In the cycling example, the person on the bike is “in the right”, and should be able to carry on without a car driver pulling out in front of them. But if they take that approach, they might get hit by a car, which is a far worse outcome, regardless of what the “rules” actually are.

Similarly, we can spend a lot of time and energy trying to exhaustively prove or guarantee that something is right. This might be worthwhile in some situations. A lot of the time, though, there is a cheap and effective check or fix that would prevent the hypothetical problem without being concerned about how correct it is.

If we focus on proving that the problem can never happen, there is a very high cost (energy spent on deduction and proof), and a very small reward – the system is perhaps slightly less complex. If we just assume we can never be too careful and put the unnecessary safety catch in anyway, there is a small cost of a little extra complexity, but a potentially large reward of the problem never occurring.

One example is the Therac-25 radiation therapy machine. This machine had software controls to prevent accidentally activating the radiation without a protective target in place, which could be lethal. Because of the presence of the software controls, no physical safety catches were put in place to prevent the potential accident. Infamously, it turned out that the software safeties could actually fail, and several patients were killed in accidents.

I don’t know what the design and planning process was like for the Therac-25, but we can imagine the argument being made that the “extra” hardware safeties were provably unnecessary, because it could be shown that the software guaranteed that such accidents would be impossible. If the seemingly less logical “might as well” approach had been taken instead, then superfluous hardware safeties would have been added anyway and the accidents would have been avoided.

Let’s make up some numbers. The “might as well” approach is cheap as it requires very little thought or rationalisation, say a cost of 0 to 5 whatevers. The potential reward ranges from 0 to 100 whatevers if it prevents a problem. The “this is provably unnecessary” approach has an upfront cost of 10 to 20 as it requires more planning and design effort to make the proof. It has a potential reward of say, 10 to 20 if it prevents extra complexity. It looks like it’s generally a better pay off to put the extra safety catches in. Looked at this way, it’s clearer that we’re gambling, and in most systems I would rather gamble towards safety and low cost than away from those.

I get the impression that redundancy is a more respected concept in physical engineering than it is in software engineering, which I’m thankful for. In software, it’s not uncommon to see objections to extra checks and safeties for things that “cannot happen”.

For example:

function fooBar(whateverInput) {
        if (someSafetyCheck(whateverInput)) {
                // Prevent the problem.
        }
        // Carry on as normal.
}

This will attract objections if the potential problem “should never happen”. But we should be thinking about balancing risks, costs and rewards, not what seems to be absolutely correct. What is the cost of the check? It looks pretty low – a negligible amount of extra complexity. What is the reward? Potentially preventing a bigger problem.

Looked at this way, we don’t need to care if the potential problem is actually permitted in the rules of the situation or not. We’re just balancing risk and reward. It’s better to be alive than right.