What is amazing to me is that Java could attract such a huge community, so much so that top talents could produce an amazing array of libraries, frameworks, and systems. The ecosystem of Java simply makes lots of daily work really easy. And no, I've never used Spring or Hibernate or those "enterprise" frameworks. That said, many enterprise software engineers, or so I heard, do like the productivity brought forth by Spring. Frankly, I don't understand why people keep mentioning Spring as if it's the culprit of Java. Spring is just one of the huge number of choices in Java's ecosystems. To me, Java offered great productivity tools at the right time over the years. Let's not even talk about communities or successful systems. Just a few seemingly small things:<p>1. IDE. When Eclipse was released back in the early 2000's, it was an amazingly productive tool. Refactoring is a one or two keystrokes away. Java's simple yet mostly sufficient type system allows us to jump around definitions, references, usages, and declarations easily. The built-in compiler of Eclipse allows really accurate auto completions. I could easily learn a new code base by walking through the code with a debugger while jumping around the source code by semantics.<p>2. Standards. First its servlet, but soon web containers. Even in its early days, such standard made it much easier to write web applications. Engineers just needed to remember a few simple rules before producing concurrent web services.<p>3. JVM and all the toolchains. All the jconsole, jstack, jmap, gc logs, etc and etc. They may be norm now, but when they were productivity boosters when they first came out.<p>4. Java's standard libraries, especially the concurrency libraries. All those containers and high-level synchronizers are so much easier than the vanila mutex. This is something I don't quite understand about the Go community: why are people fine with using Mutex everywhere?<p>5. All kinds of JSRs, such as JAX-RS. You may hate them personally and passionately, but they do provide easy enough APIs and most importantly a standard for all kinds of frameworks to support. A Java programmer can easily switch from one framework to another without much learning curve.