miércoles, 9 de julio de 2008

Tranquilo, no he abandonado Java...todavía

En una respuesta a mi ultima entrada, Jorge me pregunto porque no aprendí Ruby o Python en lugar de Scala. Es una buena pregunta y voy a tratar de responderla.

Primero voy a pedir permiso para contar mi ultimo gran aprendizaje tecnológico, o sea, cuando aprendí Java. Eso fue en mis tiempos "heroicos" cuando use Java en su versión 0.93a para hacer un sitió web. En la misma época:
  • no existía Microsoft Internet Explorer,
  • Netscape no soportaba las applet todavía: solamente Hotjava de Sun lo hacia.
  • No existían las API's Java empresariales (Servlet, EJB, JNDI, JDBC, etc).
  • No existía JVM para Windows y mucho menos para Linux, AIX, etc.
Entonces, era una aplicación CGI que llamaba a la JVM desde una shell en Sun Solaris. La aplicación Java realizaba cálculos que migre desde una biblioteca C++.

Estoy contando mi historia de viejo combatiente de la programación porque creo que refleja los ingredientes que se requieren para que un lenguaje sea exitoso:
  • un grupo de programadores entusiastas dispuestos a arriesgarse,
  • una tecnología que mejora significativamente lo que había antes. Es ultra sabido que Java mejora el uso de la memoria de C/C++ y simplifica la sintaxis de C++.
Pero, faltan otros ingredientes. Mi cliente era bastante conservador para sus decisiones tecnológicas, su infra-estructura era de tipo COBOL-CICS mainframe con algunas aplicaciones no criticas en MS-DOS y nada de cliente-servidor ¿Que hizo que este cliente me aguantará una innovación tan drástica? Super simple, la web: tenían que tener el sitio ¡ahora ya! y todo era nuevo para ellos de todas formas. La web fue la "killer application" que hizo posible el gran éxito de Java..

El último ingrediente, es la comunidad de empresas que Sun logro juntar: hasta Microsoft participo en el éxito inicial.

Basado en argumentos equivalentes, este blogger cree que Java va a morir de viejo antes de ser destronado por otro(s) lenguaje(s). Creo que tiene en gran parte razón y es por eso que no renuncio a Java.

¿Entonces, porqué hago el esfuerzo con Scala? Porque, a diferencia del blogger, creo que estamos a punto de ver otra "killer application" para la cual Java tiene defectos como lenguaje. En una entrada anterior, aposte que las bases de datos van a sufrir los efectos de un escalamiento en el volumen de transacciones y este mismo impacto va a llegar a los servidores de aplicación y sus lenguajes. Por otra parte, ya no se puede aumentar la frecuencia del reloj de la CPU, pero la ley de Moore sigue vigente y ahora aumenta el número de core: vamos a necesitar multi-threading en los desktop también. Por estas razones, se va a requerir lenguajes que facilitan la programación concurrente. Y eso es un punto debil para Java:
  • el lenguaje usa "monitores" basados en lock. Es un modelo que tiene limitaciones conocidas
  • Las framework y API's vienen al rescate del lenguaje y alivian el problema en el servidor: por ejemplo EJB provee escalabilidad "a bajo costo" (el programador no tiene que preocuparse de sincronizar el acceso a metodos). Todo eso funciona, mientras no se requiera paralelizar el procesamiento interno de cada requerimiento HTTP.
El lenguaje Erlang. ataca el problema de raíz: se basa en objetos que se comunican vía mensajes y sus threads no pueden compartir estado (un objeto mutable). STM es otra técnica muy de moda también. Cuando fui a mirar ejemplos para entender los conceptos, ¡no entendí nada de nada! Erlang y Haskell (donde encontré ejemplos de STM) son lenguajes funcionales que nunca había visto antes: completamente marciano para mi. Entonces, tenia que aprender a usar programación funcional y lo mejor que encontré fue Scala. Eso porque no tenia que renunciar:
  • a la orientación al objeto,
  • a la programación genérica,
  • al estilo imperativo (aunque entendi que tenia que dejarlo poco a poco para obtener los beneficios del lenguaje),
  • ¡al static typing! Eso es la razón principal de eligir Scala sobre Ruby, Python o cualquier lenguaje dinámico.
  • a las biblotecas Java que ya conozco (como JPA),
  • a la JVM y los servidores de aplicación que mis clientes saben administrar
Finalmente, Scala provee mecanismos equivalentes a Erlang a través de su biblioteca de Actores y Terracota esta dando el soporte de cluster.

En resumen:
  • no veo ventaja significativa usar otro lenguaje para aplicaciones web. Java, JEE, sus IDE's y sus servidores de aplicación estan ok. Excepto si los clientes piden otra solución (como .Net, PHP, Ruby, Python), me quedo con Java.
  • la interoperabilidad de Scala con Java permite fasear el aprendizaje,
  • La programación concurrente es el talón de aquiles actual de Java (como el manejo de la memoria lo era para C y C++),
  • la tormenta de transacciones es la "killer application" para algunos lenguajes y Scala también esta posicionado sobre este terreno.

1 comentario:

Jorge.Rodriguez.Suarez dijo...

Francois:

Valida la respuesta, bien elaborada, pero de todo solo me quedo con:

1 - No hay ventaja COMERCIAL en usar otra plataforma empresarial que no sea J2EE, y por ende Java. Digo COMERCIAL porque otras ventajas si tiene usar Rails o Django para construir aplicaciones web.
2 - Reuso de los fw y librerias Java que conoces. VALIDO.
3 - Curva de aprendisaje "SUAVE" si conoces MUCHO Java y BIEN los paradigmas de programación que implementa.

Yo no he rebuscado en temas mas sofisticados de los lenguajes, porque para mi un lenguaje es funcional y efectivo cuando de manera sencilla te permite abstraerte de cualquier tema complejo, como por ejemplo el paralelismo.

Me enamore de Ruby cuando vi el codigo para abrir y procesar un archivo, tarea que aun no aprendo de golpe en Java. Siempre termino releyendo de nuevo las amadas javadoc.

Me enamore de Python cuando tuve que hacer un proyecto para abstraer un cliente del uso del Subversion y automatizar tareas de generación de instalables (ear, war, jar) e instalarlos en ambientes WAS. La primera opcion fue hacerlo con Java, y "jamas" lo hubiera terminado en una semana.

Entonces estos lenguajes convierten las tareas dificiles en sencillas cuando exponen interfaces que te abstraen de la complejidad.

Voy a elaborar más este comentario en un post en mi blog. Usaré tu blog como referencia. Está muy bien elaborado.

Saludos !