miércoles, 18 de marzo de 2009

RIA y framework web

Son dos temas que toque antes por separado.  En el tema RIA, aposte que Javascript iba a ser la tecnología dominante en el browser (sobre Adobe Flash/Flex, MS Silverlight y Java/JavaFX).  En el tema de los framework web, observe que la guerra no esta terminada y declare mi preferencia por Lift .

Ahora, estoy seguro que los temas RIA y framework web son indivisibles, porque:
  • no creo en una solución 100% browser.  Eso seria programar Javascript en el browser, llamando interfaces Web Service o RESt en el servidor que retornen XML o JSON.  Javascript es mucho más potente de lo que pensaba pero nunca tanto.
  • ya no creo en una solución 100% servidor, como por ejemplo:
    • un framework basado en componentes que se inicializan vía tags o programación Java y que generan mágicamente el HTML, CSS y Javascript cliente
    • un compilador de Java a Javascript como el GWT de Google o un compilador de XML a Javascript como el OpenLaszlo .
Entonces, creo que el framework web debe permitir programar en Javascript en el browser con la opción de interactuar con el Javascript generado por el, como por ejemplo ser notificado de algún evento y procesarlo localmente (sin necesidad de ir al servidor)  Además, tiene que darme la opción de llamar código de negocio en el servidor desde Javascript mio en el browser.

Para mi, es un cambio importante, porque si había escrito sobre este tema hace 1 año, habría dicho sin vacilar que confiaría todo la generación del javascript a un framework como JSF o Wicket argumentando que "menos javascript veo mejor me porto".  Fiel a este concepto, cuando empece a trabajar con Lift, implemente un wrapper de Flot para implementar el código Javascript una sola vez y re-utilizarlo como un widget. Ahora que termine mi último proyecto, me doy cuenta que mezcle sin asco javascript en el browser con javascript generado por las API's de Lift y lo encuentro perfectamente normal.  Hasta lo encuentro elegante.


Con la luz de esta revelación, voy a revisar los framework que conozco y ver como resisten.

Lift

Si llegue a esta conclusión, es porque Lift me permitió esta mezcla y me convencí que no era una abominación. 

Una vez que entendí como funciona jQuery y el soporte AJAX de Lift es muy fácil intercambiar código javascript en el browser versus código Scala/Lift que genera javascript.  Con un poquito más de esfuerzo se puede hacer comunicar estos códigos entre si.  Cabe notar que Lift soporta Yahoo UI también y debe ser relativamente fácil (pero tedioso) soportar otras bibliotecas javascript.

Creo que David Pollak tuvo una muy buena idea usar un framework conocido: 
  • ahora es fácil crear código que encapsula los widget de jQuery.  Lift puede aprovechar las mejoras en jQuery como jQuery UI.
  • como jQuery y Yahoo UI son populares, tienen buen soporte y documentación.  El grupo de Lift puede ahorrar este esfuerzo.
Lo único que puedo criticar a Lift es que es relativamente de bajo nivel: hay que entender como funcionan las cosas por debajo para ser eficiente.  Lift esta en su versión 1.0, tiene tiempo para desarrollar algo un poco más abstracto (lo cual es posible porque el "bajo nivel" esta bien hecho).


Wicket

En comparación Wicket usa su propia API javascript.  Hasta lo que se, no hay documentación y puntos de interfaz para conectar código Javascript propio  

Es relativamente normal, ya que Wicket tiene una filosofía orientado a programación Java: los componentes se crean y asemblan vía código Java en el servidor.  Es entonces cada componente que es responsable generar el código javascript que el requiere.

JSF

Pasa lo mismo con JSF, con los agravantes:
  • es bastante difícil crear componentes propios,
  • algunas bibliotecas JSF que soportan AJAX intervienen el ciclo de vida del procesamiento de la pagina para retornar el código AJAX.  Eso crea incompatibilidades entre las soluciones.
  • la configuración vía tags es generalmente inflexible.
Cabe notar que la idea de escribir este entrada de blog, me llego leyendo esta entrevista donde un fabricante de componentes JSF afirma que:

"A new feature in our latest edition is a JavaScript eventing model. In the past, the focus of our product was to keep the JavaScript engine under the covers, and to provide only limited access points to it. Our customers had been telling us to open that [event model] up so that they can plug in JavaScript and Ajax calls pretty much anywhere. In response to those requests, we enabled over 200 event attributes across our components."

Leyendo eso, me di cuenta que eso estaba haciendo con Lift y que era entonces un punto a su favor.  Tenia que documentarlo.


Struts

Supongo que el abuelo de los framework web hace completamente agua con AJAX.

Servlet/JSP

Podría ser una solución para código Javascript 100% cliente.  No es lo que busco.


Voy a tener que comparar Lift con RoR o Grails o Django porque parece que los framework web Java llegaron a su máxima capacidad  Nota: es un buen argumento para convencer que es tiempo de mirar otras soluciones que java. 

2 comentarios:

Jorge.Rodriguez.Suarez dijo...

>>> Ahora, estoy seguro que los temas RIA y framework web son indivisibles, porque...

Francois,

No comparto esto, en mi caso si he separado totalmente la interfaz web de los servicios, usando jQuery o extjs en el browser y servicios Java que retornan objetos JSON. Incluso hemos prototipeado la aplicacion usando RoR y luego re-escrito la logica server en Java :(

Ahora bien, si es lo más optimo o no, creo que es un tema a discutir en profundidad, para mi depende más del skill de los desarrolladores.

Un saludo.

Francois dijo...

@Jorge:

Seguro que se puede tener toda la lógica de presentación (HTML, CSS, JS) en el browser y acceder al servidor solamente para rescatar o inyectar data (con XML o jSon).

De mi punto de vista, es muy cómodo poder tener la lógica UI donde más me conviene según el proyecto o incluso según el estado del proyecto (prototipo versus versión final). La separación total demanda un mínimo de planificación (saber que data voy a transferir de un lado a otro) y lo que aporta es poco.

¡Cámbiate de RoR a Lift/Scala o Groovy/Grails! Tendrás más posibilidad de convencer a tus clientes, porque no les obligaras cambiar sus servidores de aplicación que tanto les costo comprar y hacer funcionar bien.

Como anécdota, converse la semana con un cliente que conoce y aprecia RoR y se frustra porque no puede usarlo en producción por normas de su empresa. Se intereso mucho cuando le explique que Scala/Lift tienen las mismas ventajas que Ruby/RoR y no requieren hacer cambio en su ambiente de producción (Tomcat 5.5 con JVM 1.5).

Es un argumento muy potente... No sufras más, Scala te espera :)