Software programming is the only engineering discipline, where the complexity of the constructed system is limited not by physical qualities of the parts, but rather by the ability of our minds. Parts in software are those abstract entities, which I know and control as precisely as I like; therefore, there’s not that much difference between what I can build, and what I can imagine. Computer science is a kind of engineering where one can ignore the constraints imposed by reality.