Several months ago I sent out an e-mail on my approach to language design where I mentioned that I consider language design to not be very important due to the fact that one can always migrate oneself out of a bad language later. I wrote this at the end:

Apart from reading, the best way to learn good language design is to simply experiment. Remember that undoing language engineering mistakes is usually not a big deal.

And Markus Völter, whom I mentioned in the e-mail, then disagreed with me on Twitter:

Yesterday, Markus has published Thinking vs. Coding, where he offers his view of the balance between the two extremes of drowning in heavily documented up-front design versus running off to code something after talking to customer for a few minutes.

Markus suggests specific topics to focus on when talking to the customer, as well as who are the best people to talk to, and that there comes a point where you stop talking. Towards the end, he writes:

A final very important ingredient for these “thinking sessions” is that you recognize when you have to stop thinking and start coding.

I want to add that the transition between thinking and coding can be gradual. In an intermediate step you can take the domain expert, open a text editor, and try to express together a few key examples in the syntax of the future DSL in plain (or rich) text. This low-tech approach can help quickly figure out the right amount of detail or the best paradigm to use.

Read the full article by Markus here: Thinking vs. Coding.