We programmers tend to think of ourselves as concrete, logical thinkers. We work from step 1 to step 2 through to step N. So we say. But real life is not like that: One minute you have no idea how the new design will come together and the next, well, there it is. One minute you haven't a clue as to why the program is doing that and the next it is all just obvious. And we have all seen code that is wonderful or horrible in some indescribable way.