Henry Kissinger in Diplomacy, Chapter 1, p. 26-27:

In retrospect, all international systems appear to have an inevitable symmetry. Once they are established, it is difficult to imagine how history might have evolved had other choices been made, or indeed whether any other choices had been possible. When an international order first comes into being, many choices may be open to it. But each choice constricts the universe of remaining options. Because complexity inhibits flexibility, early choices are especially crucial.

I think about early choices often.

Kissinger is talking about international systems of government, but the same principle applies to many things. Culture, society, upbringing, software.

It’s not just complexity you have to deal with, it’s human resistance and investment too.

If you make an early decision to set up a religious system of government, it will be very hard to switch to the better secular system later on. Harder than if you chose a secular system from the start.

You have to change a lot of minds in parallel, and navigate bureaucracy hell when you try to change laws and constitutions. It’s not clear which you should try to change first, minds or laws.

Compare Egypt1, a country that’s in the toilet right now, to the United States, which made the correct decision from the beginning. The United States has a great head start with excellent early choices – probably the best a country has ever made. The US leads the world while countries that made the wrong early choices are finding it extremely difficult to catch up. Forget catching up, they still haven’t turned around from driving in the wrong direction.

Most people who are into programming know the same can happen with software. Especially when the software gets really popular.

I think Apple’s current migration from Objective-C to Swift, and Microsoft trying to get bash shell to run on Windows are good examples of how hard the change can be.

Even if the earlier choice wasn’t a bad one (like with Objective-C, a language loved by many, as evidenced by the amount of debate on when to move to Swift), it takes monumental effort to rework the system and migrate to a new choice.

On a smaller scale: whenever you start a project, you have to pick programming languages, frameworks, libraries, cloud platforms, etc. All are prime examples of early choices that should receive a lot of thought and should not be rushed in impulse or excitement.

You take on some risk when you try to optimize early choices. You might spend too much time trying. You might never get started on the project itself because of analysis paralysis. Sometimes you don’t have enough information to make a choice that only later you realize would have been the right one to make.

I don’t have conclusive advice on this beyond the general: spend some time on early choices, do your best with what you know, and move on knowing there is a chance you made a mistake and be prepared and willing to make error-corrections. Don’t let the risks make you think that it’s not worth doing the research, but don’t take forever to choose.

  1. Because it’s my home country and I’m familiar with it. ↩︎