I’ve tolerated too much magic in my code. Metaclass programming, convention over configuration, lazy loaded proxies, <insert your own here> techniques that promise to make your prototyping even quicker and your short code even shorter.
Magic sure looks sexy in short tutorials.
In a complex product with complex requirements that needs to be maintained over the long run, however, it tends to cause more trouble than it’s worth. I’ve mostly enjoyed working with Grails, AngularJS and Hibernate, to name just some examples, but I’ve had their magic spells change behaviour after dependency updates, perfectly sensible code refuse to work for arcane reasons, otherwise excellent tools utterly confused by all that magic and having to fight frameworks because I needed to do some small thing differently.
And so after avoiding updates, navigating pitfalls, changing my tools, fighting frameworks and sometimes just banging my head against a desk I’ve realized what should have been obvious in hindsight: I would rather solve my own problems
So lately I tend to choose simple libraries instead of frameworks and plain old code instead of metaprogramming. I may have to write more glue code and create my own helpers, but that’s OK - I need those to solve my problem and I love solving my problems!