Sunday, October 29, 2006

Programando Cerca del Dominio

El siguiente texto es un resumen completo de la entrevista que llevo Bill Venners de artima a los SrS. Andy Hunt y Dave Thomas

Andy Hunt y Dave Thomas son los Programadores Pragmáticos, reconocidos internacionalmente como expertos en el desarrollo de software de alta calidad. Su libro mas vendido “The Pragmatic Programmer: From Journeyman to Master” está lleno con consejos prácticos en un rango amplio del desarrollo de software. También son autores de “Programming Ruby: A Pragmatic Programmer's Guide”, además han ayudado a escribir el Manifiesto Ágil del desarrollo de Software.

¿Cuando vale la pena construir una herramienta?

Muchas personas han malinterpretado el termino “Lenguaje de dominio” como si se tratara de rescribir java de la nada. Un lenguaje de dominio puede ser tan simple como una docena de macros en lenguaje C que dejaran crear valores iniciales y estructuras de datos. Si se estuviera usando un lenguaje que soporte reflexión, un Lenguaje de Dominio puede ser algo que permita configurar el sistema mediante la construcción de clases al vuelo, en tiempo de ejecución.

Una razón de por que la programación es difícil en general es que usted tiene que acercarse y alejarse a través de los diferentes niveles de detalle. Usted puede bajarse hasta los bits en bajo nivel y aritmética de punteros y entonces hacer un alejamiento hacia una abstracción que esta cerca del Dominio del Negocio. Usted estará de aquí para allá y de allá para acá, lo que resulta muy difícil. Es mucho más fácil si el usuario le da las Reglas del Negocio en su propio Lenguaje de Dominio. Es mucho más fácil si usted no tiene que mapear las Reglas de Negocio hacia el nivel mas bajo como un compilador lo haría. Para eso se usa la automatización, para eso están los computadores mismos, dejándolo quedar en el alto nivel de abstracción es la gran ventaja de los Lenguajes de Dominio.

Hablando del Lenguaje de Dominio

Un ejemplo real que refleja la aplicación de este concepto es una compañía que hace un software para probar lo interruptores de la línea telefónica. El software es cientos de miles de líneas de C++. Usted configura el software para el interruptor a ser probado. Se entran las señales y se chequea la salida correcta. Anteriormente cada ves que un nuevo interruptor entraba, ellos tenían que alterar el programa principal y recompilar 800.000 líneas de C++ para soportar un nuevo interruptor. Ahora ellos usan el lenguaje Ruby el cual tiene una interfaz muy simple a C++ que hace que los objetos de C++ parezcan como los del mismo de Ruby. Ellos envolvieron la plataforma de pruebas completa en Ruby, de esta forman pueden accederla por medio de programas en Ruby. Ahora para soportar un nuevo interruptor solo tienen que escribir un programa en Ruby de 50 líneas para manejarlo. Ellos ahora escriben código al nivel de Dominio de la aplicación. Y son infinitamente más productivos.

Un lenguaje de dominio es solo otro nivel de influencia. Así como C es otra capa de influencia encima del lenguaje ensamblador, Java es otra encima de C++, un Lenguaje de Dominio es por encima de Java. Un lenguaje de dominio es solo una capa más en una pila que abstrae más y más desde el nivel de ensamblador hasta el nivel de dominio.

¿Como se hizo Ruby su lenguaje de dominio?

Debido a que en Ruby, se puede escribir código de la forma, “para cada línea en el conjunto de entradas, ponga la línea de estado en Alto”. Esto hace que el código en Ruby sea muy específico al dominio.

Usted desearía codificar de tal forma que le puede mostrar a una persona del negocio y es mas posible que le entienda. Usted debe hablar en su lenguaje, no en el lenguaje del computador

¿Pueden diferenciar entre lenguajes declarativos e imperativos. Cuales son las ventajas y desventajas de ambos?

Es preferible codificar en forma declarativa, debido a que al nivel del negocio no se están ejecutando una serie de instrucciones. Se esta tratando con datos. Entre mas se pueda mantener el código a nivel de los datos, mas cercano se esta codificando en el dominio de la aplicación. Si usted puede expresar el programa en términos de los datos y de las relaciones entre los datos, se mantendrá en un nivel más alto siendo declarativo. Alternativamente si necesita controlar, o si necesita ser muy específico acerca del orden en el cual hacer las cosas, entonces necesita bajar al nivel imperativo. Lo que no debe hacer es ir y venir entre los dos modelos en la misma porción de código. Debido a que obtendrá un efecto traumático. Debe mantener las cosas separadas enfocándose en cada modelo según sea necesario.

La programación declarativa es otro ejemplo de programación cercana al dominio del usuario. Tal como el lenguaje SQL. SQL es principalmente declarativo con una instrucción SELECT usted dice “tráigame estos campos de esta tabla” usted no dice el como. En SQL no dice “Siga el puntero, traiga este archivo del disco. Recórralo con este índice BTREE. Optimícelo.” Usted no dice nada de eso. Eso es lo que necesita, eso es lo que se busca.

Referencias

Andy Hunt y Dave Thomas son los autores de El Programador Pragmático, http://www.pragmaticprogrammer.com/

El Manifiesto Ágil: http://agilemanifesto.org/

XProgramming.com: Recursos de Programación Extrema: http://www.xprogramming.com/

Como usar de un modo práctico estas técnicas para el desarrollo Agil de aplicaciones ver mas en: Open Systems Development (OSD) - http://www.osdglobal.com