I've been programming for over 30 years, and I've used C and assembler and worked on embedded systems and Windows and UNIX machines at different times. I'm using Delphi currently for a long-running legacy project, but I'm also involved with a newer project that uses
Java. I'll be honest - my focus is mainly on Windows machines for multimedia playback currently, and that's part of my bias. Java's certainly not my strongest language - I'm dangerous, and sometimes don't know my limits.
I find lots of interesting things in Java - built in types and functions that make some things easier, plus lots of free tools and toolkits to address different problems.
However, whenever I start to get to something "specific" - play a video file, or start with some database work, or dealing with more Windows-centric functionality (services, registry, messaging, etc.) - suddenly things seem to be "hard" or "awkward" to do.
Playing a video file is one example. Java Media Framework seems dead. There doesn't seem to be a lot of effort in the Java world to support multimedia, particularly in the "write once, run everywhere" mentality that surrounded the language initially. If I could write one app that ran on Windows and Mac and Linux, it would be worth the hassle to some extent. But I can't. I realize my Windows app won't work on a Mac or Linux, but it was a LOT easier to write.
UI stuff seems similarly "stilted", at least to me. The Swing UI for the project at work is clunky. Controls seem strange - not quite Windows, not quite Mac. They can be figured out, but they feel "off". It's maybe got something to do with the programmers - we're winging some of it based on Google searches and looking at our Java reference books and tutorials. But it's just "weird". Coding for the interactions seems awkward (at least in Eclipse, without using an sort of visual editor). We get oddness in behavior between Java versions (1.5 vs. 1.6, etc.).
Am I alone in thinking that Java suffers from having to be sort of a "lowest common denominator" runtime environment in order to try and run across so many possible target environments and platforms?
Not trying to start a war ... I'm working on learning more about Java and filling in the holes that may be getting in my own way. But it sometimes seems that understanding the underlying
philosophy and design decisions for a language explain the implementation that you see.