I have recently noticed something that I’m dubbing “the turing complete framework”. It is not a good thing if your framework is “turing complete”. Examples of such frameworks are AngularJS, Meteor, Ember.js, ExtJS, Rails, Django, etc. All my examples are from the web development world because that is what I’m most familiar with but I’m sure every domain has their own set of “turing complete frameworks”.
Frameworks are supposed to limit and restrict the programmer’s expressivity and guide them in the right direction by providing a set of composable abstractions with strong guarantees for solving a specific set of problems. Type systems in statically typed languages are an excellent example of what all frameworks should strive to be. In exchange for giving up some dynamic run time behavior a well designed type system gives me strong guarantees about my code and allows the compiler to make it faster. Another good example of something that frameworks should strive for is your favorite parser generator. A parser generator is tailor made for describing textual patterns. Now some are better than others but they all have the same unifying principle guiding them. I give a parser generator a pattern description and out comes a program in my host language of choice with strong guarantees for memory and runtime usage for recognizing and transforming those patterns.
What kind of guarantees do the abstractions in any of the above mentioned “turing complete frameworks” give you? If you can’t answer that questions then that framework is useless and should be thrown out.