UN JAVA MÁS SENCILLO VERSION PARA IMPRIMIR (Versión original en español en http://espanol.aurumsol.com/articulos/art8/art8-1.html Enlace a la versión original en inglés) Bruce Tate Presidente de J2Life. Traducido con permiso de TheServerSide.com por Dr. Vicent-Ramon Palasí Lallana. Gerente General de Aurum Solutions. http://www.aurumsol.com Enero 2004 1. INTRODUCCIÓN Muchos vendedores y proyectos de código abierto en Java ofrecen herramientas complejas, construidas para resolver problemas complejos, frecuentemente bajo el paraguas de desarrollo “empresarial” en Java. Por ello, en la actualidad asistimos a una explosión de complejidad en J2EE, EJB y XML. Aunque es cierto que la sencillez y la potencia de una herramienta suelen ser opuestas, algunos arquitectos importantes de la comunidad Java trabajan para cambiar la tendencia desde los frameworks monolíticos hacia otros más sencillos y limpios. Así, varios proyectos se oponen a la tendencia a una mayor complejidad, optando por construir frameworks específicos más ligeros que ayuden a simplificar las aplicaciones. En este artículo, examinaremos unos pocos de estos frameworks y nos ocuparemos de los principios básicos con los que consiguen ser más sencillos. Concretamente, estudiaremos un contenedor ligero y un framework de persistencia. Luego veremos cómo los vendedores J2EE más importantes enfrentan este cambio de paradigma. 2. VOLVER A EMPEZAR Hay unos pocos proyectos notables que se basan muy poco en J2EE. Básicamente intentan crear una noción simplificada de lo que significa ser un objeto persistente o un contenedor. Los contenedores ligeros como Pico o Spring proporcionan menos servicios que EJB, pero tienen una arquitectura mucho menos invasora. Por otra parte, Hibernate, un framework de persistencia, ofrece una alternativa a la persistencia gestionada por el contenedor (Container Managed Persistence o CMP) de EJB, como veremos a continuación. 2.1. Persistencia transparente La solicitud 12 de especificación de Java (Java Specification Request 12) fue una de las primeras solicitudes que se realizaron dentro del Proceso Comunitario Java (Java Community Process o JCP). Solicitaba persistencia transparente en forma de JDO ya que argumentaba que ésta no podía conseguirse con los beans de entidad EJB. JDO falló por un tiempo pero ha experimentado un resurgimiento en el último par de meses gracias al respaldo de los equipos de desarrollo de los servidores de aplicaciones SunOne y JBoss. Con dos fuertes productos JDO como Kodo y Lido, se puede decir que la persistencia transparente se ha hecho realidad. Siguiendo la misma línea, Hibernate es un proyecto de código abierto, iniciado por Gavin King, que proporciona persistencia transparente para aplicaciones Java. Debo confesar que, aunque imparto una sesión introductoria sobre Hibernate en varias conferencias, no creo que Hibernate experimente un éxito rápido, sino que pienso que será, en el mejor de los casos, un actor secundario en el mercado. Al fin y al cabo, es propietario, goza de recursos de desarrollo modestos comparados con muchos de los motores de persistencia comerciales y es un proyecto de código abierto, lo que puede perjudicarlo en los departamentos informáticos más grandes. Aún así, Hibernate ha irrumpido en la escena con un impulso tremendo, proporcionando un framework sorprendentemente rico y rápido. Al contrario que JDO o EJB, Hibernate no esta basado en la “mejora” de bytecodes o en la generación de código, sino que utiliza reflexión. Deja una huella pequeña y, a parte de la base de datos, necesita muy pocos recursos para ejecutarse. Creo que el éxito de Hibernate se debe a tres razones principales: es específico, sencillo y rápido. Veamos a continuación algunos de los principios que han hecho exitoso al proyecto Hibernate. Haga sólo una cosa y hágala bien. Hibernate es un motor de persistencia que funciona exclusivamente con aplicaciones Java que usan bases de datos relacionales mediante JDBC. Esto constituye la mayor proporción de los casos de persistencia en Java. Además, es un problema específico. Así, limitando el dominio del problema a bases de datos relacionales, Hibernate puede tomar algunas decisiones pragmáticas que tienen un impacto dramático sobre la eficiencia. Por ejemplo, como los diseñadores sabían que usarían SQL a través de JDBC, pudieron aprovechar algoritmos específicos para estos casos y extensiones de alto rendimiento para “outer joins”. Esto no es posible en muchos otros frameworks de persistencia, ya que no se limitan a bases de datos relacionales. Así, Hibernate consigue una mayor eficiencia al precio de un mayor acoplamiento a un problema específico. Procure alcanzar la sencillez. El equipo de Hibernate ha trabajado duro para conseguir documentación efectiva y buenos ejemplos de uso. Además, ha diseñado una API sencilla. Así, conseguí que mi primera aplicación con Hibernate se ejecutara en menos de quince minutos. Observo la sencillez de Hibernate en muchos puntos. Sus métodos tienen nombres adecuados y las capas de abstracción están claras. Puedo trabajar simplemente con Javabeans, en vez de tener que construir componentes complejos. Hibernate incluye integración con Ant y soporte a Xdoclet. En general, un framework debería proporcionar a sus usuarios el soporte más sencillo posible. Elija sus batallas. Si usted decide construir aplicaciones o frameworks más sencillos, deberá decidir donde centrar su atención. No puede adoptar cada patrón de diseño existente o hacer todas las mejoras de eficiencia posibles. Admito que algunas de mis primeras reservas sobre Hibernate se debían a su uso de la reflexión. Sin embargo, Gavin King y su equipo supusieron de forma correcta que la sobrecarga debida a la reflexión sería mínima comparada con la debida a las consultas SQL que Hibernate generaría. En vez de optimizar la reflexión, el equipo se concentró en el número y eficiencia de las consultas retrasando actualizaciones, combinando muchas sentencias SQL en una, detectando “no operaciones” (como una inserción seguida inmediatamente de una actualización y un borrado) y haciendo optimizaciones similares. El resultado es un framework sorprendentemente rápido, que además goza de la transparencia que permite la reflexión. Debido a la sencillez y a su concentración en los puntos importantes, el equipo de Hibernate ha conseguido lanzar versiones bien acabadas a un ritmo rápido. Su comunidad de usuarios crece a pesar de que se ha completado sólo la segunda versión principal. Pero la persistencia no es el único dominio en el que la tendencia a la sencillez está echando raíces. 2.2. Contenedores ligeros Los contenedores ligeros intentan proveer servicios para componentes que sean lo más sencillos posibles. Spring y Pico son los contenedores ligeros más populares. Si todavía no los conoce, quizás esté tentado de saltarse este apartado, pensando que lo último que necesita es otro contenedor más. No lo haga. Los contenedores ligeros como Spring se están difundiendo rápidamente, porque pueden resolver problemas que otros contenedores no pueden. Aunque estos frameworks no son tan conocidos como Hibernate, al menos uno de ellos puede serlo pronto. El equipo de Spring comienza a generar el ruido familiar de las primeras etapas de un proyecto exitoso de código abierto. Desde mi punto de vista, los aspectos más interesantes de Spring son la transparencia de los objetos, la existencia de servicios limpios y desconectables y su huella pequeña. Todos estos aspectos producen un framework sencillo y efectivo, con las siguientes características: Transparencia. Cuando se construye una solución para programadores, lo más sencillo suele ser lo mejor. Spring no es invasor. De hecho, los objetos que se colocan en el contenedor son simples POJOs (“Plain Old Java Objects”), objetos tradicionales de Java (o JavaBeans, para ser más precisos). Los objetos no dependen del contenedor. Pueden ejecutarse fuera del mismo para facilitar las pruebas o llamar a otros objetos como POJOs. Posibilidades de extensión. Spring soporta algunos servicios sencillos de forma integrada, incluyendo, por ejemplo, capas JTA y JDBC para proporcionar soporte a bases de datos y a transacciones. Además, Spring ofrece una API bien distribuida en capas y que puede ser extendida fácilmente por terceras partes. Por ejemplo, ya se pueden usar objetos Hibernate y JDO dentro de un contenedor Spring. Una huella más pequeña. La sencillez de Sprint le permite una huella más pequeña. Así, puede usarse de maneras que no podría usarse un contenedor J2EE tradicional. Puede utilizarse fácilmente en la etapa de pruebas, incluso si planifica ejecutar muchas de ellas en una sola construcción. Se puede usar Spring en un cliente Web o en un dispositivo móvil. Como los contenedores ligeros trabajan con objetos tradicionales de Java (POJOs), separan claramente las funciones de los diversos servicios. Por ello, son adecuados para la próxima generación de paradigmas de programación, como la programación orientada a aspectos. Hemos visto que Hibernate y Spring reducen la complejidad del desarrollo de software, para lo cual se basan en abstracciones simplificadas. Ahora bien, hemos visto también que la sencillez y la potencia de una herramienta suelen oponerse. ¿Cómo sabemos que estas abstracciones son suficientemente potentes para un desarrollo empresarial? 2.3. Abstracciones con fugas Está claro que hay una tendencia a retornar a abstracciones más sencillas y limpias, pero la sencillez no es suficiente. Todas las abstracciones tienen fugas, es decir, hay situaciones en que no pueden o no deberían abstraer la infraestructura subyacente. Por ejemplo, nunca será posible capturar toda la complejidad de la API nativa de una base de datos en un framework simplificado y un contenedor ligero nunca será capaz de hacer todo lo que hace un contenedor pesado. Por esta razón, es importante exponer la capa inmediatamente inferior a la nueva abstracción. Por ejemplo, en Hibernate no existe el concepto de procedimientos almacenados. En vez de esto, se permite el acceso completo a la conexión JDBC subyacente, para que se pueda llamar a los procedimientos almacenados desde fuera de Hibernate. Además, una arquitectura adaptable y conectable, con bajo acoplamiento en las áreas apropiadas, permite desconectar los servicios que son inadecuados y conectar otros más robustos. Por ejemplo, Spring permite conectar y desconectar la persistencia y las transacciones. Hasta ahora, hemos mencionado un par de proyectos de código abierto que simplifican el desarrollo de aplicaciones Java. A continuación, veremos lo que los principales vendedores J2EE están haciendo para soportar un paradigma Java más sencillo. 3. ENFOQUES ALTERNATIVOS Por supuesto, construir frameworks más sencillos desde cero es sólo una forma de ganar sencillez. La comunidad Java está explorando también otros enfoques alternativos. Algunos equipos de desarrollo están evaluando paradigmas de programación completamente nuevos, como arquitectura dirigida por el modelo (Model Driven Architecture o MDA) o programación orientada a aspectos (Aspect-Oriented Programming o AOP). Otros están probando un enfoque más incremental, como usar herramientas para protegerse de la complejidad. 3.1. Herramientas que simplifican Algunos vendedores, especialmente los que tienen una inversión significativa en J2EE, pueden pensar que los contenedores ligeros, Hibernate y frameworks similares son una desviación demasiado radical del status quo. Estos vendedores pueden no prescindir completamente de J2EE para volver a empezar, sino que pueden preferir usar herramientas más inteligentes que consigan aislar a los usuarios de la complejidad. Rave de Sun o Workshop de BEA adoptan este enfoque. Inspirándose en Visual Studio, BEA y Sun han construido herramientas para proteger a los programadores sin experiencia de las complejidades de J2EE. Se espera así que herramientas más inteligentes con alto nivel de generación de código puedan aislar a los programadores en J2EE más comunes de un excesivo nivel de detalle. La habilidad de construir aplicaciones con bajo acoplamiento, especialmente usando servicios Web, es una característica fundamental de Workshop de BEA, que intenta proveer un conjunto de abstracciones simplificadas que permitan a sus usuarios ser mucho más productivos. Para tener éxito con Workshop, BEA tiene un reto doble. Debe abstraer a sus usuarios la mayor parte de la complejidad de J2EE, y aún así permitir el acceso a algunas de las capas subyacentes para que los clientes puedan usar Workshop en formas que vayan más allá de las intenciones del equipo original de diseño. 4. ¿QUÉ ENFOQUE ES EL MEJOR? ¿Se adelantará alguno de estos enfoques y matará al dragón de la complejidad? La verdad es que, hasta donde puede preverse, es probable que veamos muchos más intentos de reducir la complejidad, ya que, en lo que respecta a la misma, se está llegando al límite superior de lo que la mayoría de equipos modernos de desarrollo de aplicaciones puede manejar. Pero la industria no se limitará a un único enfoque. Los vendedores con grandes inversiones en frameworks existentes para J2EE tenderán a preferir mejores herramientas que liberen a sus clientes de los detalles tediosos. Otros esfuerzos, como Hibernate y Spring, intentarán adoptar un enfoque más radical y fundamental. Incluso otros intentarán argumentar que Java nos ha traído tan lejos como es posible y que debemos pasar al siguiente lenguaje o paradigma como C# o AOP. El terreno está preparado. Que comience el juego. SOBRE EL AUTOR Bruce Tate es un consultor en Austin, Texas. Es el autor de libros muy vendidos como Bitter Java y Bitter EJB. Es un conferenciante común en conferencias de la industria, como TheServerSideSymposium y No Fluff, Just Stuff Java Symposium. Tiene 15 años de experiencia en desarrollo y es el fundador y presidente de J2Life, que ofrece consultoría y servicios en el área de persistencia en Java, mercadotecnia en programación y en el proceso de desarrollo de aplicaciones. Compruebe la calidad de nuestro desarrollo offshore. Aurum Solutions tiene experiencia en desarrollo offshore en J2EE y .NET de alta calidad y reducidos costos para empresas europeas y norteamericanas. Conozca nuestro desarrollo offshore haciendo clic aquí o en la página Web http://espanol.aurumsol.com/offshore.html. Cursos de Aurum Solutions relacionados con el tema de este artículo: “Frameworks y bibliotecas para el desarrollo en Java” “Persistencia para Java” “Buenas prácticas en programación en Java” “Buenas prácticas en arquitecturas J2EE” |