First I write some sample code in exactly the syntax I'd like to use, in an ideal way ignoring whether it's possible or not to produce. Then I create a macro to transform that syntax into code, iterating the sample code if I encounter barriers (usually unparseable syntax). It has really helped me (a poor to mediocre scheme programmer) create good macros very quickly, improving the expressive power of my code dramatically.
- "this is wrong", "that line can't be right", "the shadow doesn't work"
or
- "how does this line relate to this other line?", "how does the light hit this plane", "what shapes does this decompose into?"
The critical dialog option leads to bad and abandoned drawings. The constructive dialog option leads to restatements and completed work.
I would go so far as to say that they are the only thing that matters.
You can look at a problem from one mindset and see that it's going to take you 5 days or 5 weeks. Change your mindset and you might see that it's going to take you 5 minutes.
If this sounds new-agey, well, perhaps it is. It's a mindset thing. But mindsets can be extremely critical. There's a huge difference between someone who sets out to succeed and prepares for failure, and someone who sets out to avoid failure and hopes for success. The former will exhaust every option to circumvent the obstacles; the latter will almost look at the obstacles as vindication of a deep-seated suspicion that he's wrong.