| Yeah. I've come to realize that the hard way. It is also what it comes down to w.r.t. code-over-config. To make a system sufficiently configurable, you end up having to re-invent a turing complete language inside it's configuration files, so it starts looking more like lisp. This is due to the [1] Inner Platform effect. The only interfaces I know of that's expressive enough to drive a turing complete language is either flowcharts, or actual code. This is kind of why I feel that systems like gulp are just superior to grunt, because ultimately the config format can never be expressive enough to solve all the problems, and there's just so much less work to write-what-you-mean, the first time. properly. This also relates my newly adopted philosophy w.r.t. software complexity. [2] Simple vs Easy. [1] - http://en.wikipedia.org/wiki/Inner-platform_effect [2] - http://daemon.co.za/2014/03/simple-and-easy-vocabulary-to-de... |
You need dependency injection too, unless you're going to let people just smash the definitions of existing code.
A good demonstration of safe, powerful, and type-checked configurability is Xmonad.
http://xmonad.org/