I am utterly incompetent when it comes to inventing a good design. Almost every single module I designed has had its interface rewritten. In many cases, there have been several rewrites of the same interface because I did not manage to get a good design going even on my second, third or fourth attempt. Mind you, after two or three rewrites, I end up awesome APIs.
So, I need a tool that helps me rewrite modules as easily as possible.
One limitation is my words-per-minute figure. A language that is short, in the sense that very little code is required to get things going, is a good thing. Javascript and OCaml qualify, but Java, C# and PHP do not because of the boilerplate involved in many operations. I guess the latest versions of C#, with lambdas and type inference, are becoming acceptable.
Another limitation is the risk of getting something wrong, and the only solution so far is having a good automated testing suite. In every programming environment, there is a sweet spot to be found between too little automated testing (you waste a lot of time hunting for bugs) and too much automated testing (you waste a lot of time writing or re-writing tests), and what matters to me is how efficient that sweet spot is. For instance, Java/C#/OCaml provide me with "undefined variable" detection for free (just compile the thing) but Javascript and PHP do not.
When written in a pure functional exception-less style, OCaml detects almost all major classes of errors simply because of its type system. Many of these would require unit tests with complete code coverage in languages like PHP or Javascript (such as calling a member function that does not exist) or Java or C# (such as preventing Null Reference errors) and some of them cannot even be verified with unit testing at all (such as forgetting to check that you are allowed to do X before doing X). In fact, I suspect the automated testing sweet spot in OCaml is precisely to have no unit tests, except for dealing with external APIs or very complex logic (regular expressions...)
Not everyone can write pure functional exception-less OCaml (or do so happily for ten hours every day), but I can. As a result, I decide on the first design that seems to be compatible with the requirements, and perform at least one or two major design changes every week. These changes involve changes to at least 5-10% of the code base (with the odd 60%) but seldom take more than an hour to perform, and so far the automated testing has caught all the errors that cropped up.