| Disclaimer: I come from C++ and PHP world, but in the last few years, have been working in Java after a long gap. So here are the pros and cons of Java I see (not comprehensive but somethings that I tend to care about): Pros: 1) The strongly typed features does help in finding potential bugs during compile time. 2) The Generics and Container frameworks seems fairly sane when compared to the complexity of C++ templates. 3) Concurrency features are nicely standardized now - Executor framework, concurrent container frameworks and so on. 4) In short, 'stock java' (without all the heavy-weight frameworks) seem nice comfortable and sane to work with. Cons: 1) Fairly large and legacy XML-driven frameworks like Spring and Hibernate is a huge time-sink to figure out all their intricacies, not to mention very hard to debug things esp. when some 'business logic' resides in these mysterious XML incantations. 2) While not really a Java problem, but due to these humongous frameworks, there is a tendency to build giant war files with code and configs all bundled together. Need to make a config change? Check it in some xml file, and then build to deploy wars/jars. It takes some work to separate code from configs, and convincing traditional Java engineers to move away from this model - i.e. check configs separately, deploy them independently, restart servers etc.. without any need to build and deploy process. 3) Legacy app-server based architectures where there is apache in the front with IPC overheads to a Java app-server. The way I get around some of the cons is to convince the engineers to sparingly use the frameworks (just enough to get some basic routing rules to map urls to controller entry points in the MVC setups), use more lightweight servers like Jetty (directly listening on socket ports), esp. when it is just handling some API requests, and sticking with JSON as the payload format. It is been a challenge but I have had success in using Java in very limited ways, and decoupling it from serving web (jsp) pages and so on. |