Modern programming languages allow building sophisticated modular systems, where everything is in the right place and feels good. Enthusiastic engineers invent more and more powerful abstractions so we can build our software with ease and confidence.
However, there is a caveat. Power of abstractions is often considered by one factor only: the formal one, that qualifies how much things are “normalized” and “decomplected”. I would argue that there are a few other, no less important factors. For instance, mental overhead and convenience. When formalism is pushed to the limit, the usability of the framework usually goes to nil.
The key to success is, as usual, 80/20. If you keep your formalism at 80% towards Absolute Perfection, you have a chance of keeping the whopping 80% of usability and other nice properties. Think of this as Perl in reverse: Perl pushes convenience well over 80%, making programs hard to analyze formally. Watch for all factors, but stay humble, so radical improvements in one direction do not destroy all the others.