I'd like to offer an empirical counter-point: Java.
Java, while a good quality language overall, is deliberately missing some important features like function passing (possible these days...). This is an effort to make it easy to learn and to encourage people to build simple software.
Its library ecosystem (with a few superb exceptions) is the epitome of over complex mediocrity. Java defines "Enterprise Bullshit".
Why has this happened? I think it's the missing features. You get a sort of jenga tower where the foundations aren't quite right, so you build some other abstraction on top of it. But then that's not quite right either, so you build the next layer back in a different direction.
More powerful languages means you need fewer layers. And, it's easier to rebuild those layers if they turn out to be wrong.
> Why has this happened? I think it's the missing features.
I have a more, I guess, cynical explanation.
I think developers, even the ones who proclaim otherwise, love complexity. It suits their egos to think they are working on something really complicated that only they understand. They will still say its simple, but it is only so after transcending some barrier of understanding that nobody except them has.
So this is how things work: if a technology is created that actually is simple (eg: Java), developers will immediately start adding layers of complexity. They will add more and more layers right up until the point where they themselves, can no longer understand it. This is what I think of as the "complexity budget". Only when the complexity budget is fully consumed, intellectually satisfied, they will stop, and start to refactor, to make it "simpler".
If you want a second example, take a look at the React ecosystem. React fans will tell you how simple it is. How you can use React by only knowing Javascript and two or three simple rules. Then have a look at what any real world React project actually looks like and observe the 17 layers of complexity they added on top.
The java ecosystem is great. One of the best of all languages in existence.
Software development in big companies and outsourcing firms is usually terrible and it gave a bad reputation to everything they use, including that language.
Java has pretty good and very rich ecosystem, including huge open source community. And also, it is not that difficult. Even current "Enterprise" part of that eco system is not that difficult. As for complexity of some frameworks, that was:
a.) Learning step with new tools available.
b.) Result of people attempting much ambitions projects then before with zero experience.
People always loved to hate Java. Nevertheless, it performs in environments where attempting to something else invariably fails.
> b.) Result of people attempting much ambitions projects then before with zero experience.
Disagree. A lot of Java frameworks are genuinely complex because the language is too simplistic to implement them, so each framework ends up having to build what's effectively its own extension to the language. Even well-designed frameworks are like this. Jackson's module registry and annotation-mixin interfaces aren't there because Jackson's developers are inexperienced or overambitious, they're there because to implement a JSON serializer you need that kind of functionality and there's no sane way to implement it in the language proper. Likewise Spring's magical autowiring, or its bytecode-manipulation-generated magical proxies that are used to implement things like @Transactional. Likewise Jersey's resolution from annotation classes to .service files with magical filenames to find out how to serialize a given entity. And so on. The frameworks are complex because the problems they're solving are complex; simplifying the language beyond the point where it can express the complex problem doesn't make the problem any more complex.
> People always loved to hate Java. Nevertheless, it performs in environments where attempting to something else invariably fails.
I've had a great career replacing Java with Scala, where the language is powerful enough that you don't need any magical frameworks, only plain old libraries with plain old datatypes and functions. It's much nicer to work with.
Spring's auto-wiring isn't like that because of language limitations. You don't need DI to write Java. It's like that because some people love writing reflective frameworks. It's easier than modifying compilers but harder than just doing it the "obvious" way, so it satisfies a lot of programmers i-want-to-stretch-myself itch.
Java, while a good quality language overall, is deliberately missing some important features like function passing (possible these days...). This is an effort to make it easy to learn and to encourage people to build simple software.
Its library ecosystem (with a few superb exceptions) is the epitome of over complex mediocrity. Java defines "Enterprise Bullshit".
Why has this happened? I think it's the missing features. You get a sort of jenga tower where the foundations aren't quite right, so you build some other abstraction on top of it. But then that's not quite right either, so you build the next layer back in a different direction.
More powerful languages means you need fewer layers. And, it's easier to rebuild those layers if they turn out to be wrong.