viernes, 30 de julio de 2010

¿Llegó el relevo de Java?

Java marcó un hito en la historia de la programación, al conseguir que la programación de aplicaciones funcionaran en cualquier plataforma, gracias al uso de un lenguaje semicompilado, independiente de la máquina. Añadió el paradigma de la programación orientada a objetos, con una sintaxis casi idéntica a la de C++ (del cual se inspiró), pero mejorando los aspectos más críticos de aquel (gestión de la memoria, garbage collector, punteros, herencia, etc). Asimismo, aunque naciera para dar servicio a electrodomésticos, fue en los albores de internet donde floreció, gracias al uso de los applets en las vetustas páginas estáticas HTML. Otra característica que favoreció su expansión fue la accesibilidad al lenguaje, principalmente económica. Hasta ese momento, programar en otros lenguajes requerían de IDE's costosos y licencias. Con Java, cualquiera podía bajarse el JDK y compilar código escrito con un procesador de textos. Después, los IDE's gratuitos NetBeans y Eclipse contribuyeron aún más a su proliferación.

Hoy día es el lenguaje de programación que más se utiliza en los proyectos tecnológicos, pero a lo largo de sus casi 20 años de historia, esa pequeña semilla se convirtió en un gigantesco árbol que ensombrece al más pintado, pero que conlleva también algunos problemas.

Por un lado, los SDK's son inmensos, con una inmensidad de librerías y de clases, que uno se pierde fácilmente. Por otro lado, han surgido multitud de tecnologías y frameworks, que convierten un desarrollo en una pesada cebolla, por la cantidad de capas a utilizar (Maven, Spring, hibernate, etc.) para cualquier cosa, incluso para lo más sencillo. Existen tantas dependencias en los proyectos Java, que es necesario una buena dosis de paciencia en instalar, configurar e integrar todos sus componentes base. Asimismo, en muchos sistemas críticos, el más pequeño cambio en una sola clase puede conllevar la parada del sistema para su implantación, con el consiguiente coste. También hay que tener en mente que el rendimiento es de lo más bajo, y aunque el hardware haya progresado y evolucionado mucho, las necesidades y el uso de los sistemas también. Seguramente, algún lector, podrá añadir más problemas o pegas a esta pequeña exposición.

Lo último a sumar al detrimento de este lenguaje de programación, es que nunca se liberó completamente, y que su adquisición por parte de Oracle (quien compró Sun Microsystems) hace dudar de sus intenciones, de la imparcialidad y de la libertad de Java. Recientemente, la liberación de la versión 1.6.0_21, incluye ya en todo el membrete de Oracle en sustitución de Sun Microsystems (inventor y mecenas del lenguaje), y han empezado a haber problemas técnicos muy graves, como que Eclipse se rompe y que está ocasionando muchos errores de tipo OutOfMemoryError.

¿Es posible que haya un relevo en el número uno del ranking de los lenguajes de programación más utilizados? Parece que hay candidatos muy competentes a arrebatarle ese honor y esa supremacía que ha mantenido durante los últimos años.

El lenguaje C++ sigue siendo uno de los lenguajes más utilizados, y a pesar de ser muy estricto en cuanto la gestión de memoria y de punteros se refiere, el rendimiento es su baza principal, ya que trabaja a muy bajo nivel. Sin embargo, esto conlleva el compilar en un ejecutable, y no en un bytecode. Ello significa que el ejecutable de C++ es dependiente de la plataforma. El lenguaje puede ser ANSI, pero para que el código funcione en una plataforma ha de compilarse con dicha plataforma.

C# también es otra alternativa a Java. Microsoft acertó al liberar este lenguaje y su framework .NET. Sus características como lenguaje son similares y en algunos puntos superiores a la de Java. Su rendimiento es mayor que el de Java, lo que lo hace atractivo en entornos de alto estrés. Aunque nació para sistemas Windows, existe una versión del framework y del lenguaje para otros sistemas, llamado Mono. Las comunidades son muy extensas, y aparecen todo tipo de proyectos opensource en torno a esta tecnología.

Pero no sólo hay que observar al lenguaje, si no también al escenario en el que se desarrollan los proyectos. También ha habido una evolución en cómo gestionar y desarrollar proyectos. Hemos pasado de equiparar los proyectos tecnológicos a los proyectos de obras de construcción, a lo que la realidad demanda: proyectos dinámicos en constante evolución. Los proyectos tecnológicos no deben cerrarse a una planificación predictiva, pues la realidad es que para ser competitivos y productivos, hay que cambiar constantemente, añadir funcionalidades, priorizar partes, evolucionar... Y desde hace unos pocos años están implantándose metodologías ágiles, donde su mayor referente es SCRUM.

Debido a esta agilidad y dinamismo en los proyectos, se piensa también en lenguajes y tecnologías que faciliten esa agilidad y permitan ser productivos. Por ello, lenguajes como Ruby, Python o Perl están siendo cada vez más demandados. Estos lenguajes, a diferencia de los citados anteriormente, son también multiparadigma, agregando además del paradigma orientado a objetos, otros como el imperativo, el reflexivo o el funcional. También se están creando frameworks muy potentes para ser más productivos aún, donde la mayor referencia es Rails. De hecho, Java está asimilando conceptos de este tipo, como JRuby o Groovy. Si bien se gana en agilidad y productividad, estos lenguajes y los frameworks asociados pecan de un rendimiento bastante bajo.

El escenario de las aplicaciones también ha cambiado de 20 años a esta parte. Hoy las aplicaciones de escritorio son una minoría, y las aplicaciones web y la computación en nube, están dominando el parque del software. Es relativamente sencillo, eficaz y rápido desarrollar aplicaciones con PHP, un servidor de aplicaciones y un servidor de base de datos. Los navegadores procesan HTML y JavaScript (y por ende AJAX). Estos recursos son sencillos y baratos.

En cuanto a interfaces de usuario, las RIA's (Rich Internet Application) están acaparando un protagonismo en el desarrollo de aplicaciones basadas en la Web, siendo relativamente sencillo desarrollar interfaces espectaculares, intuitivas y con inteligencia para cualquier navegador y en cualquier plataforma, invocando a procesos de negocio a través de servicios Web o HTTPService. En este panorama, AJAX, Flex y Silverlight son los mayores exponentes, frente a JavaFX u otras RIA's basadas en Java (como Apache Pivot), donde la diferencia de velocidad y el rendimiento es muy evidente. Por último, Adobe AIR permite llevar las aplicaciones Web realizadas en Flex al escritorio, pudiendo además complementar funcionalidades propias del escritorio (como, por ejemplo, el acceso a ficheros o a bases de datos locales, como SQLite).

Java ha sido (y es) un lenguaje muy influyente en el panorama tecnológico. Actualmente hay un punto crítico en el que Oracle amenaza su supremacía, debido a sus prácticas completamente propietarias que empañan la imagen de tan respetado lenguaje de programación. James Gosling, padre de Java, abandonó pesarosamente a su hijo merced del padrino forrado de dinero y sin escrúpulos. Multitud de cerebros y directivos de Sun Microsystems también lo hicieron, como los creadores de MySQL, OpenSolaris o el creador del XML. Las desavenencias entre el espíritu innovador y compartido de estos visionarios, a la mente depredadora de negocio que tiene Oracle, hay más que chispas. A Java no le espera un buen futuro con la mentalidad usurera de Oracle, quien haría un favor a todo el mundo liberando completamente el lenguaje Java y su máquina virtual. Pero como ésto parece muy improbable, y como el CORE de la mayor parte de las aplicaciones de Oracle está basado en Java, está cantado que todo esté ligado a productos y tecnologías Oracle, que obliguen a los proyectos, adquirir dichos productos e incrementar los costes de los proyectos de forma innecesaria, sin posibilidad de elegir con comodidad y libertad otros productos alternativos de otros fabricantes o de comunidades opensource. Esta visión de libertad será decisiva para que Java siga siendo atractivo para los proyectos.