I've been engaged in an electronic conversation with some of my fellow Rationalites and ex-Rationalies today, and on the topic of writing software that writes other software, Scott Johnson offered the following (which I quote with his permission):
But the real problem comes when we conclude we have stumbled upon a Great Idea and invite several of our best friends to use it as well. At that point our beautiful theory gets assaulted by a gang of ugly facts. Once we widen our installed base, we discover first that our framework isn't nearly as general as we thought it was. Everything we thought was constant somebody needs to change, and every parameterization variable we thoughtfully included gets set to the same value by all our users, because it turns out there's only one value that actually works. Worse, as we tweak our framework to incorporate the feedback from each user, we discover the other users don't much care for programming in a language whose syntax changes on the odd-numbered days and whose semantics changes on the even ones.
Well said, Scott.