Resulta extraño que un partidario de Java como yo, se disponga a criticar la tecnología que ama. Creo que las críticas constructivas son algo muy útil; es un ejercicio que debería hacerse más a menudo.
Lo que intento encontrar en este texto son las razones de lo que considero un fracaso a medias: el éxito a medias que tiene. Para este ejercicio intelectual, consideraré el vaso como medio vacío.
Java fue creada como una tecnología de programación multiplataforma. Los programas en Java deberían correr en cualquier sistema operativo. Pero no lo hacen. Si Java existe desde hace 10 años ¿Por qué no usamos programas hechos en Java? Esa es la cuestión. Sin sonar extremista, el 80% de los programas que usamos diariamente se pueden hacer en Java y correr en entornos multiplataforma. Con programas de uso diario me refiero a navegadores, clientes de correo, clientes de chat, procesadores de texto, reproductores multimedia, etc.
Cuando me quiero bajar un programa, usualmente busco una opción hecha en Java. Y pocas veces la encuentro. Se nota que los programadores no usan a Java en forma masiva. Entiendo que no usen Pascal, por ejemplo. Claro, Pascal apesta. Pero Java es el lenguaje más avanzado del mundo. ¿Por qué usan lenguajes realmente inferiores como Visual Basic? Los programas más usados hoy en día son las interfaces gráficas, programas que en muchos casos son pura GUI con poco y nada atrás. La capacidad gráfica de Java es sinceramente deficiente (ver más abajo), pero sin embargo se pueden desarrollar esas interfaces sin grandes problemas. Creo que los programadores prefieren los entornos de desarrollo de Microsoft como Visual Basic y Visual C por lo fácil que es crear una GUI, tan sólo arrastrando ventanas y haciendo un par de clicks, se crean estas "cascaritas de programas". Lo mismo se puede realizar con Delphi, a un precio mucho menor y portándolo a Linux (Kylix).
Quienes programan en Java hoy en día sólo tienen 2 cosas en mente:
Hasta que no hagamos programas de uso masivo y popular, y los distribuyamos gratuitamente, Java va a seguir siendo una extrañeza de los informáticos más sectarios.
Todos los lenguajes tienen sus pros y sus contras. Si quisiera hacer un programa muy simple, usaría C o C++, sobre todo si ese programa será la base de otra cosa. Si tan sólo quiero hacer una interfaz gráfica que haga algo muy simple, usaría Delphi o algún Visual. Si quisiera hacer un programa muy específico que haga algo técnico, usaría Perl. Parecería que Java es un lenguaje de descarte, pero en realidad sirve para todo el resto. También se puede hacer lo mencionado anteriormente, pero ya no sería práctico.
Primero fue AWT, ahora es Swing. Ninguna solución WO/RE permite el uso de gráficos grossos. Eso es porque cualquier solución del tipo Direct Media que permita el uso extensivo de los componentes gráficos del sistema operativo no sería una solución WO/RE.
Esto puede cambiar, ya que hoy en día esas capacidades gráficas en modos no seguros están disponibles en muchas de las nuevas versiones de Linux, por lo que supongo se trasladará a otros entornos UNIX, como Solaris y FreeBSD. Sin embargo, hasta el día de hoy no se puede hacer ese uso de video, el cual es indispensable para los videojuegos.
A mí los videojuegos no me gustan, pero todos debemos admitir que son importantes. Ya superamos holgadamente el GHz en los micros, y esa victoria se debe exclusivamente a la necesidad de jugar jueguitos, que son lo único que necesita más de 800 MHz de micro y 128 Mb de RAM. Es lógico pensar que si los juegos mueven al mercado de hardware, juegos en Java podrían reavivar el interés en el lenguaje.
Los programas en Java se ejecutan muy lento. Eso es un hecho del cual no se puede escapar. Se debe a que se ejecutan en la máquina virtual (JVM). Cada vez que se ejecuta el programa de Java, se tiene que levantar toda la máquina de Java, y recién ahí se ejecuta el programa en sí. Ojo, pasa lo mismo con Perl, Python, etc. Esto no hace a Java apto para aplicaciones que deben ser muy rápidas, como los videojuegos.
Java debería funcionar en cualquier sistema operativo, pero todos los sistemas operativos usan formas distintas para ubicar archivos en un disco. Por ejemplo, mientras que todo el mundo usa la barra común / para separar paths, Windows usa la barra invertida \. Para acceder archivos locales hay que usar JNDI, que es un bardo.
Los programas en Java se compilan con la extensión .class, y se deben ejecutar con la ayuda de un programa launcher como java.exe. Para algunos, esto es un problema. Usualmente vienen empaquetados en un archivo comprimido .jar, y adentro hay un montón de archivos .class. Sólo uno es el ejecutable, el resto son librerías. Si no se tienen las instrucciones del programa, hay que andar adivinando cuál es la clase principal.
Por estas características, no se puede hacer una asociación para ejecutar en forma simple y automática los programas en Java.
Atrás de todo lo malo siempre está el gran Satán, Bill Gates. Microsoft es sin duda quienes más han perjudicado a la carrera de Java para convertirse en El Lenguaje.
Ellos tienen una razón simple para ello: su propio interés comercial. Para ganarse el vil metal, Microsoft ha boicoteado a Java sistemáticamente durante los últimos 10 años.
Mientras que, por ejemplo, Apple crea una JVM de muy buena calidad para el Mac OS <sería imposible que Apple haga algo de mala calidad>, Microsoft nos da una JVM de mierda (sinceramente) con Windows. No se puede ejecutar prácticamente nada. Se nota que es tan sólo una solución de compromiso para hacer que los applets funcionen en Internet Explorer. La JVM de Windows carece de muchas de las librerías que hoy por hoy son imprescindibles (basta con tipear clspack -dump lista.txt en una línea de comandos para comprobarlo).
En toda la ayuda de Windows, no menciona nada de programas en Java. Hay que adivinar como usar el jview.exe y el wjview.exe para correr un mísero programa.
Como broma de mal gusto, crearon librerías propietarias para su JVM, como WFC, que por supuesto no forman parte del estándar WO/RE de Sun e IBM.
Para seguir metiendo el dedo en la llaga, Windows XP venía sin JVM. Y luego de perder otro juicio contra Sun, Microsoft tuvo que incluir otra de sus deficientes JVMs para seguir disimulando.
El insulto final es que, después de haber defenestrado a la idea de WO/RE y las máquinas virtuales, Microsoft copia a Java y sus conceptos, en la cagada de .NET, que es una copia alevosa y descarada de Java, del mismo modo que Windows es una copia de Mac OS.
En el sitio http://www.microsoft.com/java no hay nada. Sacaron todo el soporte de Java y recomiendan a los programadores "actualizarse" a .NET.
Acá no se salva nadie, ni siquiera los inventores de Java. Sun se mandaron su parte que perjudicó tanto al lenguaje como al WO/RE en sí.
Siendo los genios de Sun tan inteligentes... ¿Para qué sacan la especificación de JDK 1.1 con AWT si después la cambian por Swing? Para cuando hicieron el cambio, todos los sistemas operativos traían AWT. Por lo tanto, AWT vió la luz en su obsolescencia. En todo caso, es un detalle menor.
Sun no hace computadoras para usuarios finales. Hacen servidores re-zarpados, en racks para clustering. Sun no hace software para la gente común, Solaris es un muy buen sistema operativo para redes y desarrolladores, pero no se puede hacer nada "normal" en él. Cuando les toca hacer un lenguaje, como de costumbre, no pensaron en la gente normal sino en las grandes empresas que consumen sus bizarros productos. No se los puede culpar por ello, es su target. Pero esto llevó a que Java sea hoy en día un lenguaje ampliamente usado dentro de corporaciones y grandes empresas; mientras que es injustamente despreciado a la hora de desarrollar productos para la gente común.