10 razones para seguir usando Java

Publicado por pico.dev el , actualizado el .
blog-stack java opinion planeta-codigo planeta-linux programacion
Comentarios

Con ya dos décadas de vida y a lo largo de este tiempo Java se ha convertido en uno de los lenguajes más empleados para programar a día de hoy. En este periodo han surgido otros lenguajes en la propia plataforma de la JVM como Groovy, Scala o Clojure y fuera de ella como C#, Python, Ruby, PHP, Go o Dart ofreciendo algunas cosas adicionales o supliendo algunas carencias de Java. Aún con toda esta competencia esta es mi lista de 10 razones por las que creo que Java sigue siendo una de las mejores opciones.

Java

El sábado 23 de mayo de 2015 el lenguaje Java cumple 20 años de historia y aún hoy Java sigue siendo uno de los lenguajes de programación preferidos para desarrollar en un mundo tecnológico en el que unos pocos años pueden darse grandes cambios y en dos décadas ver surgir nuevas tecnologías y verlas languidecer. Algunas personas se jactan y hablan con un tono de desprecio y mofa nada agradable hacia Java mostrando su desconocimiento o prejuicios siguiendo algunos tópicos bastante difundidos la mayoría incorrectos. A otras personas quizá no les gusta Java no tanto por el lenguaje como por los proyectos que ha desarrollado en él, en consultoras cárnicas, para clientes con condiciones laborales paupérrimas, con tecnologías, librerías y frameworks obsoletos o códigos heredados programados por programadores aparentemente con poca experiencia que es un infierno mantener debido a una cantidad importante de errores, uso de tecnologías no adaptadas a la solución, malos funcionamientos y falta de documentación. Pero estas situaciones externas no tiene nada que ver con el lenguaje. Algunas otras personas quizá no les gusta porque no les ofrece el último azúcar sintáctico que han visto y usado en otros lenguajes o porque para propósitos específicos hay alternativas que permiten obtener una solución de una forma más sencilla.

Java 20 años (1995-2015)

En JavaWorld ha publicado varios artículos para celebrar el aniversario comentando su futuro, su pasado y presente o que notables características reunió en su momento para ser hoy uno de los lenguajes más usados.

Algún otros artículos interesantes son:

Aunque algunos parecen considerar ya hoy a Java el nuevo COBOL (y este último aún tiene futuro) y no sea lo habitual, en este artículo trataré de exponer algunos argumentos que posee Java para su defensa y por los que en mi caso aún no he tenido necesidad de buscar mayor felicidad programando en otra opción.

Java no es lento

Quizá en las primeras versiones de los 90 fuera así pero la realidad hoy con las mejoras introducidas en cada versión a la Java Virtual Machine (JVM) un programa Java es comparativamente igual de rápido que uno en C o C++, salvo para tareas muy específicas de cálculos intensivos no hay diferencia. Eligiendo las estructuras de datos adecuadas no tendría por qué haber una diferencia de rendimiento considerable y además para la mayoría de las tareas más importante que la rapidez es la legibilidad del código, su fácil desarrollo, mantenimiento o coste.

Javadoc

Java tiene una gran herramienta de documentación que permite embeber la misma en el código fuente de los archivos y generar una serie de documentos html para su posterior consulta. La documentación proporcionada en la API es extensa, completa y buena, siendo simple html puede ser alojada en cualquier servidor web y consultada en internet. Sin documentación la tarea de los programadores sería considerablemente más complicada, aún en el caso de falta de documentación javadoc el IDE con la asistencia de código puede ayudarnos gracias a la introspección incorporada en la plataforma.

Compilado, tipado estático

Las metodologías ágiles están siendo ampliamente adoptadas y algunos de sus defensores apuestan por lenguajes que consideran encajan con su metodología agilista confundiéndola con lenguajes dinámicos y menos verbosos, que puede ser acertado en ocasiones o circunstancias pero con Java también se puede ser ágil como el que más. Una de las buenas prácticas de las metodologías ágiles es tener teses unitarios del código al ser posible que lo cubra al 100%, sin embargo, la realidad es que nos será complicado tener el 100% del código cubierto con teses.

Con los lenguajes dinámicos hay que tener especial cuidado ya que por su propia naturaleza hace que algunos errores solo los encontraremos en la ejecución, por experiencia propia no será la primera vez (ni la centésima) que un error tan básico como de compilación por nombre de variable o método mal escrito es descubierto en producción. El IDE es la herramienta que en Java junto con el tipado estático y la ayuda al compilador permite detectar errores de compilación instantáneamente, por otra parte proporciona asistencia de código y a los programadores nos sirve como documentación de los tipos esperados en los argumentos de los métodos o propiedades de las clases. Los compiladores además de para traducir el código fuente a lenguaje máquina (o bytecode) están para capturar errores sintácticos y léxicos ante los cambios de una nueva característica, una refactorización o un merge con conflictos. Se puede pensar en el compilador como un test automatizado que cubre el 100% del código, con un IDE se obtienen los errores al instante después de escribir cada caracter ¿que hay mejor? ¡no lo desprecies!.

Escribir código menos verboso no hace que escribirlo sea más rápido ni necesariamente más legible, Java posee buenos IDEs con asistentes de código que con unas pocas pulsaciones permiten escribir el código igual o más rápido. Java es un lenguaje verboso y explícito en parte propiciado por su poco azúcar sintáctico pero las construcciones sintácticas pueden ser contraproducentes, un alto número de ellas y el código será muy críptico sin un conocimiento amplio del lenguaje. Uno de los éxitos de Java es su relativa simplicidad.

IDE

Con un IDE el código Java se ve de distinta forma, no como simple texto sino donde los métodos, clases y propiedades tienen entidad propia. La asistencia de código permite obtener métodos disponibles, ver los tipos y nombres de argumentos y retornos, las excepciones lanzadas, si el método es estático o de instancia y la visibilidad de acceso según escribimos. Con la ayuda de un IDE podemos encontrar todos los usos de un método o clase de forma totalmente exacta o cambiar un nombre por otro. Hay IDEs para lenguajes dinámicos como Groovy con IntelliJ IDEA o Python con PyCharm que proporcionan asistencia de código pero usando las características dinámicas de estos lenguajes el encontrar todos los usos de un método o variable no está garantizado.

Un IDE puede suponer la diferencia entre dedicar un tiempo considerable a tareas de bajo valor a ser mucho más productivo, o mejor aún, ayudando a evitar errores.

Refactorizaciones

Con la ayuda del compilador y de un IDE las refactorizaciones como renombrar una variable, propiedad, método o clase son más sencillas y con más garantías de no romper nada, además de poder realizarlo en unos pocos segundos y sin tener que buscar y sustituir las referencias como texto plano en todo el código del proyecto. En proyectos grandes en los que trabajan más de una persona y tienen un tiempo de vida y de mantenimiento de más de unos pocos meses hace que evitemos muchos problemas y programemos con más seguridad de que las modificaciones que hacemos no introducen errores por cosas tan básicas como la compilación.

Si el uso de un proyecto es prolongado en el tiempo este posiblemente tenga que adaptarse a necesidades inicialmente totalmente desconocidas, en estos casos será tarde o temprano necesario refactorizar. En un negocio en el que el tiempo es importante y en una tecnología en constante evolución realizar refactorizaciones pequeñas o grandes es una necesidad. La mayor certeza es el cambio y se dará en herramientas, frameworks, lenguajes, ideas de negocio, ….

Productividad y legibilidad

El compilador e IDE nos indican todos los errores léxicos y sintácticos después de escribir cada caracter sin tener que ejecutar el código o los teses unitarios para descubrirlos evitando que lleguen a producción en cuyo caso nos requerirá dedicar tiempo para corregirlos o con peores consecuencias para los usuarios de nuestro código y para el negocio. Que el IDE nos muestre sugerencias con la asistencia de código según escribimos o mediante refactorizaciones son un gran diferencia de productividad aunque algunos piensen que por ser el código más verboso o por escribir menos líneas de código se tarde en programar más la misma tarea, el compilador y el IDE son factores que permiten aumentar la productividad a pesar de la verbosidad.

Con la llegada de Java 8 y sus novedades se ha incorporado al lenguaje la programación funcional que permite expresar de una forma más natural para los humanos la tarea que se desea realizar, esto hace que el código sea más legible. Lo que en un lenguaje imperativo son varias líneas de código con una combinación de sentencias condicionales, bucles, asignaciones y llamadas a métodos con un objetivo poco claro sin un examen detallado del código ahora se puede expresar de forma funcional haciendo uso de los streams y expresiones lambda, también en menor número de líneas de código.

Software disponible

Java posee gran cantidad de software disponible, de gran calidad y en muchos casos con una licencia de código abierto o de software libre para cualquier tipo de necesidad en una aplicación de cualquier ámbito. A menudo hay no solo una opción sino varias disponibles y con la libertad de elegir la que más se adecue al proyecto o se prefiera. Ahí está la fundación Apache, Spring o JBoss con una buena colección de proyectos ampliamente utilizados.

Los cambios se producirán, por ello no te encadenes a una determinada tecnología que en un futuro te impida adaptarte a nuevas necesidades. En Java hay opciones para cada diferente aspecto de la aplicación (seguridad, persistencia, logging, framework web, …), por si en un futuro surge una nueva «cojoherramienta», y esto pasará tarde o temprano, diseña tu aplicación de tal forma que sea posible reemplazar una pieza por otra sin tener que reescribir la aplicación entera.

Ofertas de trabajo, desarrolladores

Dado que Java unos de los lenguajes más utilizados y es usado ampliamente en muchos ámbitos es más fácil encontrar a personas con conocimientos y expertos en Java. Por ello hay numerosas ofertas de trabajo para diversos ámbitos (web, escritorio, servidor, dispositivos móviles, …) algunas a considerar, aunque bastantes menos que ofertas.

Conservador, no anticuado

Java tarda en incorporar en el lenguaje algunas de las últimas técnicas de programación que un determinado momento tienen gran relevancia. No porque no pueda sino porque tienen una actitud conservadora, y esto no es malo ya que uno de sus principios hasta el momento es mantener la compatibilidad hacia atrás ¿qué lenguaje que ha ido incorporando nuevas características ha mantenido la compatibilidad de compilación en gran medida durante 20 años? Java pone gran énfasis en este aspecto en cada nueva versión. Esperando cierto tiempo asegura incorporar en el lenguaje aquellas nuevas posibilidades que realmente han demostrado ser útiles y no son simples modas pasajeras que más tarde dificultan la compatibilidad en futuras versiones. Esto no quiere decir que no evolucione, ya en Java 5 incorporó numerosas novedades como generics, … y en Java 8 programación funcional como streams para mejorar la legibilidad del código y aprovechar el procesamiento paralelo de los procesadores multinúcleo. Los métodos por defecto (default methods) en interfaces son una muestra del interés que hay en Java de mantener la compatibilidad hacia atrás. En este enlace está la evolución histórica durante estos años.

Como dijo James Gosling en una conferencia de JavaOne:

We don’t want to do things until we know we can do them right—in Java and on the JVM.

Propósito general

Java es un lenguaje de propósito general y multiplataforma ejecutable en cualquier dispositivo en el que haya una JVM disponible. No está restringido a un determinado ámbito o tipo de aplicación, el mismo conocimiento del lenguaje sirve para múltiples tipos de aplicaciones desde de escritorio, de servidor, procesamiento de datos, dispositivos móviles, ¿Java para scripting? También, por las ventajas de un lenguaje compilado con la facilidad de ejecución de un entorno interpretado … incluso juegos, sí juegos. Hay muestras de algunos impresionantes con buen rendimiento, aunque alguno diría incorrectamente que no. Con jMonkeyEngine podemos hacer un juego que tiene poco que envidiar usando otro lenguaje ya que proporciona los mimbres comunes: bucle del juego, colisiones, física, 3D con OpenGL, sonido, entrada, …. Minecraft es una muestra, otras buenas muestras usando jMonkeyEngine son PirateHell, Hostile Sector, Imperii, Grappling Hook o 4089: Ghost Within y en la página de ejemplos hay alguno más.

Quizá en un futuro cambie pero hoy Java es el lenguaje en el que se programan las aplicaciones Android nativas y una de las plataformas móviles con mayor cuota de mercado. El lema “write once, run everywhere” sigue siendo aplicable hoy más que nunca haciéndole ideal para la nueva generación de dispositivos de la internet de las cosas (IoT, Internet of things).

Mi escala de preferencias para un lenguaje es de la siguiente forma de mayor a menor (aunque puede variar según la necesidad):

  • Ofertas de trabajo, alguna de Groovy, alguna de Python pero mucho menores que en Java, C# o PHP.
  • Propósito general, esto permite que el tiempo dedicado a aprender y convertirte en un experto en un lenguaje (que pueden ser de varios años) pueda ser aprovechado en el momento que el avance de la tecnología cambie las reglas de juego como la aparición de los dispositivos móviles. PHP es un lenguaje que fuera del ámbito de desarrollo web tiene poca presencia, dispone de buenas herramientas como Wordpress, Drupal o Symfony y hay ofertas de trabajo. En la plataforma Android Java es el lenguaje empleado.
  • Productividad, refactorizaciones y documentación disponible. Poder refactorizar el código de forma segura es un gran punto para la productividad y más importante aún evitar errores, por este motivo y a base de experiencia soy reticente a los lenguajes dinámicos. El tipado estático ayuda a evitar errores y servir como documentación, un buen IDE permite aumentar la productividad. Java es un lenguaje que está bien documentado con su Javadoc.
  • Software disponible, hay cantidad de lenguajes algunos de los más nombrados son Go o Dart pero en estos es probable que debiésemos desarrollar nosotros el software para una determinada necesidad que en otros lenguajes ya está implementado y más que probado pudiendo haber incluso varias opciones.
  • Legibilidad, cualquier añadido al lenguaje que haga más claro el propósito del código o en menos líneas es bienvenido pero como ves esto está abajo en esta lista según importancia.

Aunque no lo he puesto el divertirse y programar a gusto con un lenguaje también debería estar en esta lista pero esto en parte se consigue una vez que dominamos el lenguaje y su ecosistema sintiéndonos capaces de realizar cualquier tarea produciendo buen código, ya sea Java o cualquier otro.

Estas son otras listas de 10 razones por las que Java mola más que nunca y otras 10 razones para querer a Java y la JVM.

Para aprender Java en profundidad son varios libros de los que he leído que me han gustado empezando por Thinking in Java, Effective Java y Java 8 in Action además de otros buenos libros para mejorar como programadores que son interesantes de leer.

En Junio de 1997 James Gosling formando parte de Sun Microsystems Inc. escribía el artículo de título The Feel of Java detallando varias propiedades del lenguaje que hacen del él lo que es y que aún siguen estando vigentes. Y en 1996 junto con Henry McGilton The Java Language Environment: A White Paper donde describen los objetivos del lenguaje. Finalmente escrito más recientemente Java The Legend analiza Java, su pasado, aciertos y fallos, comunidad, ecosistema y futuro. Estos tres documentos son piezas valiosas de información.

¡Larga vida a Java!