This might be an old argument that's long dead... but I do not think “more declarative” is automatically the right goal for expressive code.

Likewise, you can know all the patterns you want, overapply them, and end up in the old OOP world of writing classes like the MyCoolClassBuilderTemplateBean.

The DRY principle sometimes becomes a source of this. People are overeager to reduce what feels like duplication when they see the same lines of code multiple times. They library-ify something only to immediately start putting in tons of conditionals to handle different use cases for different consumers. The rule of three is a good rule of thumb, but nothing can save you from making this mistake but time and observation.

Hiding things in abstractions can become so magical it becomes brittle and hard to grok.

One of the core questions we should ask when we decide to abstract something is: “did we make this easier for humans to understand, verify, and change?” Maybe even more so in the age of AI. I'm not sure yet.

Better goals than declarative purity or conformity to known patterns

  • Easy to read
  • Easy to learn
  • Hard to misuse
  • Easy to verify
  • Good at conveying intent

I do not care if an abstraction wins a philosophy argument if it loses the plot for the specific humans reading this specific abstraction in this specific moment.

Abstraction is doing its job when it preserves or improves narrative clarity. If it creates spooky action at a distance, hidden coupling, or ceremony that makes intent harder to follow, it may be elegant in theory and hostile in practice.