Java is easy to do right, and easy to do simple.<p>Until you ever start interfacing with enterprise libraries.<p>As a novice, you&#x27;ll just decide not to interface with them. Then you decide to build makros that make interfacing with them simpler, and then you build just another abstraction over them, using the very same AbstractSingleFactoryBeans that the library itself used.<p>The reason why Java managed to be usable by modders of Minecraft — kids who&#x27;ve never seen code before — and enterprise people at the same time is that Java gives you the tools to build all the abstractions in simple ways, inside the language.<p>In other languages you build a small hack using the preprocessor, or even decide to build a DSL. With Java, you just build an abstraction over the existing things.<p>As a result, you have 20 years of abstractions right on top of each other.