De programador a habil declarante.
Dentro del desarrollo de aplicaciones, las herramientas utilizadas están en permanente evolución. Todos tratan de crear herramientas que hagan mas fácil crear programas mas rápido y mejor, de forma de hacer mas productivos a quienes desarrollamos aplicaciones.
En dicha tendencia, se destacan las que permiten trabajar con modelos donde la realidad se modela (valga la redundancia) declarando parte de la misma con un lenguaje especifico para dicha realidad.
Tomando por ejemplo GeneXus que es la herramienta que utilizo, en la misma se esta viendo clara esta evolucion. Lo que sigue son algunos ejemplos de dichos modelos a traves de las diferentes versiones.
Al principio, se tenían Transacciones. En las mismas se modela varias cosas, pues tiene por un lado estructuras (que definen a traves de un proceso de normalizacion, la estructura de la base las tablas de la base de datos), pantallas (donde se dice como se va a mostrar estos datos al usuario), reglas (donde se declaran que validaciones hay que realizar cuando el usuario ingresa datos) y propiedades (donde se declara modela comportamientos diferentes que se quieren dar a dicho ingreso de datos).
Pasaron los años y se inventaron los GeneXus Patterns (el nombre es malo, pero es una herramienta que genera programas GeneXus, a partir de modelos, que implementan un patrón de diseño y/o comportamiento).
El mas conocido de los patrones implementados era el WorkWith, que permite generar un programa de alta/baja/modificación/listado de datos, basados en transacciones.
La forma de desarrollar cambio radicalmente, pues se generan en forma facil una parte importante de los sistemas. En este momento, los desarrolladores pasamos de programar (cambiando código) a editar archivos XML (instancias de los patterns) con editores específicos y a partir de ellos se generan los programas.
El nivel de abstracción se eleva, pero también la productividad, perdiéndose parte de la flexibilidad.
Aparecieron en el mercado nuevos patrones mas sofisticados o que resuelven otros problemas mas especificos.
Pasa el tiempo, y aumentan las necesidades de mantener cada vez aplicaciones mas grandes. También aparecen nuevos dispositivos en el mercado y con ellos la necesidad de generar para dichos dispositivos.
Con esta necesidad, aparecen patrones especificos para la generacion de dispositivos moviles, que hacen posible que a partir de un mismo modelo, se pueda generar para plataformas bien diversas.
Esto hace que el nivel de abstraccion vuelva a elevarse, y tambien se pierde otro poco de flexibilidad, pero se gana en productividad para varias plataformas.
Otro aspecto en lo que hemos ido avanzando en la tendencia de declarar en vez de programar es en el diseño de las pantallas. En vez de dibujar una pantalla en un editor wysiwyg, se declara cuales son los campos que se quieren en la pantalla, en que orden, como se pueden separar en columnas, que descripciones se quieren y la pantalla se genera a partir de dichas declaraciones. Este enfoque tiene la ventaja que permite regenerar todas las pantallas en forma facil cuando se produce algun cambio en las especificaciones de diseño o tambien cuando se quiere generar para otra plataforma. Ya hay varios patrones que implementan esto y parece una tendencia que va a seguir.
En vez de diseñar, declaramos.
Lo mismo pasa con los procedures que usábamos para recuperar determinados datos, ahora se hacen a través de un lenguaje declarativo de los Data Providers. Los mismos tienen propiedades que permiten que el mismo data provider tenga salida en diferentes formatos (soap, json, xml, etc).
Un tema importante de esta forma de trabajar es que hay que conocer muy bien las posibilidades de las herramientas, pues el cambio de una propiedad puede hacer que se generen programas bien distintos.
Todo esto, hace que cada vez "programemos" menos y "declaremos" mas, con un aumento de productividad y un aumento en el nivel de abstracción y algo de perdida de flexibilidad.
Vos usais patterns en aplicaciones reales?
ResponderBorrarHay una frase que no se a quien pertenece (yo se la escuche a Pablo Garcia de MS) que dice que en software nos dedicamos a hacer "abstracciones arriba de abstracciones".
ResponderBorrarLo que comentás en el post creo que refleja eso. Cada vez se agregan más capas que hacen las cosas más sencillas.
Igual esto no quiere decir que no tengamos que conocer todas las capas en varias ocasiones :P
Muy bueno el post, me gustan estos post reflexivos sobre la forma de construir software.
Anónimo:
ResponderBorraren nuestras aplicaciones usamos patronres de desarrollo y diseño. También usamos los Genexus Patterns para generar una parte de nuestra aplicación, la mas repetitiva. El pattern Workwith soluciona una parte básica y aburrida de las aplicaciones. Cuando se necesita algo mas, podemos desarrollar un pattern propio para adaptar el pattern a nuestras necesidades.
Lamentablemente el pattern ww, a sido tan exitoso que muchas veces se confunde un pattern especifico con la herramienta de generación de código a partir de modelos.
Entonces si no entiendo mal, los patterns los usas para cosas sencillas y la parte compleja del aplicativo la "programas" y no la "declaras", ¿no?
ResponderBorrarEl anonimo de antes.
Matías:
ResponderBorrarEl nivel de abstracción es critico en el desarrollo de software. Si lo elevamos demasiado, pocas personas puede entenderlo y será difícil desarrollar. Si es muy bajo, se terminan haciendo tareas aburridas y repetitivas de bajo nivel.
A este post le falta dos partes mas , sobre uso de modelos en testing y modelos en deployment.
Tambien estaría bueno poder escribir sobre los diferentes lenguajes específicos (dsl) que usamos en genexus, pero no se si voy a tener tiempo/ganas.
Gracias por el comentario.
Anónimo:
ResponderBorrarSi hablamos del pattern Workwith , se puede usar en partes sencillas (por ejemplo para mantenimiento de datos básicos) y también en lugares mucho mas sofisticados. Aun hay partes de nuestras aplicaciones que no pueden modelarse correctamente con un Workwith. Para esos casos puedes desarrollar un pattern, usar un pattern existente (generalmente hay que comprarlos) o desarrollarlos a mano de forma tradicional.
Lo que quiero comunicar con el post es que usar herramientas donde se declara en vez de programar es cada día mas frecuente y es importante tenerlo presente pues es un cambio significativo.
Conviene usarlos, entendernos y aprovecharlos al máximo, pues tienen muchas ventajas y algunas desventajas que pueden manejarse para poder rendir mas.
Gracias por leer el blog y preguntar.
Hola Enrique, estos post de reflexion sobre las herramientas/metodologias y demás, me resultan de lo mas interesantes, gracias por compartirlos con nosotros. Un abrazo.
ResponderBorrarAluziner, me alegra mucho que te gusten este tipo de publicaciones. Me parece que cada tanto debemos reflexionar un poco sobre lo que hacemos y analizar como lo hacemos para buscar mejores formas de trabajar.
ResponderBorrarEjemplo de cómo podría ser un Form declarado en un dsl propietario, el ejemplo estaba en xml pero la herramienta de comentarios filtra html/xml.
ResponderBorrarobject-definition(designer="GXWebUI"){
web-ui(title="Trabajar con Lenguaje Declarativo"){
form(){
category(title="Lenguajes"){
grid(name="gridLenguajes"){
columns() {
field-column(title="Lenguaje",data="langname");
field-column(title="Descripción",data="langdesc");
}
operations() {
operation (caption="Ver detalle",name="BtnDetalle",selection="single");
}
}
}
}
}
}
Anonimo:
ResponderBorrarme gusta tu ejemplo de DSL para generar formularios. Tiene muchas ventajas, el generar las pantallas de esa forma, pues se puede automatizar muchas operaciones y ademas al hacer algun cambio que afecta a todos los programas, es facil regenerar todas las pantallas.
Ya existen varios patterns para la X evolution * que permiten generar las pantallas de esta forma y tiene muchas ventajas.