And we're in this mentality, I think, where we try to oversimplify everything. And, the first thing you've got to do is deal with the complexity of the problem that you're trying to program around, and accept that fact that it's not altogether simple. Too often, somebody writes a little program that works just fine in isolation, and you sort of put your finger on the problem that when you put it together with something else it doesn't quite do what it's supposed to do. The real beauty of this whole thing is to try and develop some sort of structure to the program that you're developing so that it has some simplicity to it if you look at it from a fairly abstract point of view, and that the details are down in the individual little pieces rather than in the interconnections. As soon as you build something where all of the complexity is in the interconnections, it fails.
Human systems do the same thing.
Because it doesn't work that way. People are not capable of performing perfectly on very tight time schedules. Well, computers don't either. The first shuttle launch is a fine example, where they discovered that the backup computer was not synchronized properly with the four primary computers and they had to delay the launch for two days 'till they could find out what the problem was. Very, very subtle error, and it was very hard to find, even after they began to suspect what it was.