When I write programs, I rely on feeling. If it doesn't feel right, I keep going until it does.
What I'm working on right now is a new, very large replacement for an existing (competing) product. The existing product has been deemed (by me) as unsatisfactory. It feels kind of like Microsoft Windows in nature; I can tell its architecture isn't all that great underneath. Don't get me wrong -- it was a great product when it first came out around ten years ago -- but by now, I've begun to see their approach to certain things, and while it appears that their code base may be clean (unlike, perhaps, Windows), it is also large, and most certainly inflexible. There is too much specialization in the wrong places. I can tell they are not generalizing nearly enough.
I can tell this intuitively, rather than logically. I just know, based upon what I see their software do, and what kinds of behaviors and little quirks it has, how it thinks of things. And intuitively, I know it is not the best approach.
It is ironic, then, that my first instinct always seems to be to attempt to imitate them. Thankfully, my feelings usually intervene, and instead of just doing what they did, I do things completely differently, in a way I can feel is much improved.
In this way, my approach to designing software is more artistic and design driven than logic-driven. The same feelings which tell me that a design looks right tell me when a piece of a program is designed correctly -- or, at least, as correctly as I can conceive at that time.
