Sometimes we think we can make a decision, but it turns out the decision is already made for us by the consequence of earlier choices.

Mathematics is filled with great examples. One of my favorites is: e^{πi} = -1 (that’s e^pi*i == -1). (See proof from wikipedia) At first glance, an exponent to an imaginary number seems undefined and so we would be free to define it any way we please. But let the mathematicians play their games and they find amazing implications. Afterall, is it really undefined, or are we just insufficiently clever to realize that it’s actually defined?

Practically, this type of thing can really simplify your life by making the hard decisions for you. You can put the stakes in the ground on the issues you know, and then the hard decisions will fall into place from the consequences.

We hit the same issue when designing parts of the runtime. For example, some questions about how to extend the type-system for generics in V2 were already answered when we designed arrays in V1. Afterall, T[] could have been Array<T> instead (like in the new MC++ syntax)