But the ecosystem around Java is very complex and hard to manage. Dealing with JVM configuration, webserver configuration, build system configuration, IDE configuration and God knows what else takes up all kinds of brain-space.
And every so often the community goes off on some crusade. Everything must be Design Patterns. Everything must be specified in XML. Everything must be a Bean. No, everything must be Injection. No, no, everything must be Annotation.
The Java culture really needs to learn the value of the simple and explicit.
You couldn't have described this better for me. This is my exact frustration with the ecosystem, and it's the only thing that keeps me from using Java as my default language of choice. The language itself can be used very well, just wish the tooling was more concise and functional.
Then you will get testing frameworks, libraries each with its own generics workaround and cool interface spaghetti that looks beautiful in UML diagrams at the scrum wall room.
People don't really get that before Java there was C EE and C++ EE, all with similar sins.
One can change the language of the enterprise, but not what those architects do with them.
Perhaps the best thing for the language would be for it not to become too popular.
Avoid (success at all cost)
Rather than what you might be (others do at least) implying:
(Avoid success at all cost)
This is the mother of all premature optimization. Other than maybe modifying heap size or setting client vs. server, most of the default JVM configurations work for almost everything.
> build system configuration
I actually find maven pretty easy to use, but maybe it's just that I am used to it.
> IDE configuration
I don't know what crazy IDE you are using, but both Intellij and Netbeans need very little, if any, configuration out of the box.
> [Java] community goes off on some crusade
As opposed to everyone else? /s
There's also the initial indexing, but I can live with that, since it enables beautifully fast jump-to-definition, which is hard to live without.
Having the webserver is useful for reasons beyond just being independant of the webserver itself, like exporting metrics. Making the logs inspectable. Getting thread dump, inspecting current state, ...
This is true for any programming community.
All language arguments aside, Go coders are usually pragmatic and humble and Go code is usually simple and explicit.
Type erasure was a pretty big one that I've felt the impact of a few times in the small amount of Java code I've written (99% being school assignments). One of the reasons I strongly prefer C#/.NET as a language/environment. What I've tried of ASP.NET coding seemed nice.
I have a love hate relationship with Java. I do have Java apps that runs 24x7, day after day without failure.
I think I protest too much.