Software may be regarded as the crystallization of an abstraction that models a specific domain. Ideally, it should match the exact limits of that domain. But in practice (i) those limits are fuzzy, (ii) software often imposes an artificial, unnaturally rigid structure, and (iii) reality itself keeps changing.