miércoles, 18 de mayo de 2011

Cuestiones a tener en cuenta en integración de sistemas

Cuando hablamos de integración de sistemas, o de la definición de los mecanismos mediante los cuales diferentes soluciones SW se integran para poder cubrir en conjunto los requerimientos de negocio, es necesario tener en cuenta atributos de calidad que guíen dichas integraciones, junto a los requerimientos funcionales que fomentan el desarrollo.

Estos atributos de calidad, a modo ilustrativo, pueden dividirse de la siguiente manera:

Calidades asociadas al diseño
Estas calidades están relacionadas a las tareas de definiciones de interfaces o conexiones entre sistemas, sumado al diseño de los protocolos, mecanismos y formatos de interacción. Si bien no impactan en forma directa en el funcionamiento de las interfaces, es muy importante tener en cuenta estos aspectos para hacer más feliz la vida de aquellas personas involucradas en el desarrollo.

Coherencia semántica
La coherencia semántica es mi atributo de calidad preferido. Cuando hablamos de integración, la coherencia semántica se refiere a la separación de incumbencias entre los diferentes sistemas. Se debe tener en cuenta que la información expuesta sea de importancia para los consumidores de la misma, pero sin dar a conocer información técnica de implementación. Así, por ejemplo, dar a conocer un id interno de una base de datos, si este no tiene ningún significado de negocio, es una mala práctica.

Unificación de mensajes
Hay que buscar que los protocolos definidos para las integraciones sigan una regla coherente para definir sus protocolos de integración. Si bien parece mas un atributo que aumenta la reusabilidad, es bueno tenerlo en cuenta por separado, para que lo tengamos siempre presente. Es muy incómodo ver, en un sistema, dos integraciones distintas que hacen referencia a un nombre de dos maneras diferentes, uno como "customer_name", y otro como "nombre_cliente". Definir estándares hace más feliz la vida de los involucrados en la integración.

Reusabilidad
Hay que pensar las integraciones de forma tal que puedan utilizarse para cubrir diferentes problemáticas, y que no sean aplicables a un solo caso en particular. Para lograr esto, es imprescindible pensar a las integraciones en pos de que las mismas tengan un sentido de negocio, y que una interfaz no dependa funcionalmente de otra. Por ejemplo, si tenemos dos integraciones, una denominada "cálculo de importe" que tenga como parámetro el importe básico y los impuestos, y otro "calculo de impuestos", que también tenga como parámetro el importe básico, pero además le sumamos la categoría impositiva del cliente, es una mala práctica hacer que el consumidor de la funcionalidad deba orquestar ambas integraciones (obteniendo el impuesto de "calculo de impuestos", para luego pasarlo a "calculo de importe". Sería mejor definir una única integración, llamada "calculo de importe", con parámetros importe básico y categoría impositiva, que internamente obtenga el importe y calcule el total.

Calidades asociadas al tiempo de ejecución
Diferentes cuestiones o decisiones que tomemos van a impactar en forma perjudicial o beneficiosa en el tiempo de ejecución de los servicios. A continuación voy a describir cada una de las calidades relacionadas con las integraciones.

Disponibilidad
La disponibilidad se define como la proporción de tiempo que un elemento SW se encuentra funcionando y trabajando. Es necesario conocer los requerimientos de disponibilidad de cada uno de las integraciones, y no aplicar una única estrategia a todo el sistema en su conjunto. Me gustaría que quede claro, en este punto, que no es necesaria siempre una disponibilidad del 100%, y que no todos los consumidores de las integraciones requieren la misma disponibilidad. Recordemos que a mayor disponibilidad, mayor costo y complejidad. No sumemos complejidad sin una necesidad real.

Interoperabilidad
Es vital tener en cuenta la necesidad de interoperabilidad que tendrá el sistema en cuestión para poder pensar en las cuestiones correctas. Se llama interoperabilidad a la capacidad que tiene uno o mas sistemas para intercomunicarse entre si, de forma tal que sea simple reemplazar un componente por otro, o modificar un sistema internamente sin impactar en el resto de los participantes de la integración. Además, está relacionado con la independencia tecnológica entre diferentes sistemas. Por ejemplo, si tengo aplicaciones desarrolladas en .NET, otras en J2EE y otras en Ruby, utilizaré mecanismos de integración agnóstico a las tecnologías, mientras que si todos mis sistemas se desarrollan en una única tecnología, podrá utilizar mecanismos propietarios (convengamos que este caso es poco probable).

Facilidad de administración
Este es un aspecto pocas veces tenido en cuenta a la hora de desarrollar una aplicación en general, y también aplica muy bien cuando pensamos en integraciones entre sistemas. Debemos tener en cuenta los requerimientos de administración, gestión de incidentes, trazabilidad y seguimiento de las ejecuciones. Es vital en entornos distribuidos, donde los logs de las aplicaciones serán muy diferentes entre si, y muy pocas veces nos permitirá seguir con detalle la ejecución de un flujo de integración.

Performance
La performance, rendimiento, o la medida que nos permite conocer el nivel de respuesta ante una petición a una integración es algo que siempre será visto como "de vital importancia", siendo el requerimiento que la respuesta "sea presentada lo más rápido posible". Lo que tenemos que saber es ¿como mido "lo mas rápido posible"? ¿como impactará el rendimiento solicitado en el resto del sistema? ¿Cual es realmente el requerimiento de performance?. Debemos tener en cuenta todo el conjunto (consumidor, proveedor, medio, entorno) a la hora de hablar de performance en integraciones, y actuar en base a las mismas.

Robustez
La robustez es la capacidad de mantenerse un sistema (o componente SW) en funcionamiento ante determinadas condiciones de falla o inesperadas. En el caso de las integraciones, está intimamente relacionado con la capacidad de mantener los mensajes o pedidos hasta que sean tratados, manejar transaccionabilidad de las interacciones, o devolver alguna respuesta al sistema consumidor aunque no sea mas que un mensaje de error (ejemplo, twitter y su famosa ballena).

Escalabilidad
La escalabilidad es la habilidad que tiene un sistema para aumentar su capacidad de procesamiento para soportar aumentos en la carga del mismo, sin perjudicar el rendimiento de las integraciones implementadas. Para lograrlo, hay que tener en cuenta, entre otras cosas, la capacidad de aumento de HW para lograr soportar mayor carga, el soporte a multi threading y multi core, y el aprovechamiento al máximo de los recursos utilizados.

Seguridad
La seguridad es la capacidad de prevenir acciones que perjudiquen al sistema, ya sean estas realizadas en forma maliciosa o accidental. Un sistema seguro es aquel que previene de accesos indebidos, al mismo tiempo que evita la modificación de los activos del sistema. Este es un atributo de calidad que no se lleva del todo bien con las integraciones, ya que puede penalizar el rendimiento, complicar la mensajería, y requerir cuestiones administrativas que son un tanto tediosas. Pero es necesario y muy importante tener en cuenta estas cuestiones, mas cuando las integraciones que exponga nuestro sistema serán la puerta de acceso a la modificación de datos y valores.

Calidades del sistema
Estos son atributos de calidad que deben tenerse en cuenta para poder dar una visión completa al sistema, no solo desde el punto de vista de mejoras en el diseño, desarrollo o tiempo de ejecución, sino también en el resto del ciclo de vida de un desarrollo.

Simplicidad de test
Las integraciones, al involucrar diferentes sistemas, grupos de desarrollo y equipo de personas, además de diferentes tecnologías y desarrollos diversos, presentan mucha dificultad para ser testeadas. Es necesario tener en cuenta los requerimientos de creación de escenarios de prueba y criterios de aceptación, y facilitar la ejecución de los mismos para comprobar la calidad del desarrollo.

Calidades de comunicación
Estamos hablando de integración entre sistemas, OK. La experiencia me dice que cuando pensamos en este tipo de integraciones, nos olvidamos que las mismas son desarrolladas por personas, y si las personas no pueden comunicarse, integrarse y trabajar en conjunto, estos desarrollos no llegan a ninguna parte. Es vital la capacidad de comunicación en estos equipos de trabajo, que por otro lado son multidisciplinarios, y con diferentes intereses. Estas calidades no impactan directamente en el desarrollo, ni en la ejecución, pero tenerlas en cuenta realmente nos hace la vida mas feliz.

Utilidad para comunicación al usuario final
Al hablar de integraciones, entendemos muchas veces que no es necesario tener en cuenta al usuario final, ya que todo lo relacionado con integrar sistemas pasa "entre bambalinas", y el no debería enterarse, en el mejor de los casos. En la práctica, este escenario feliz no pasa, y muchas veces debemos dar explicaciones sobre porque el sistema de venta vende pero el CRM no se entera de las nuevas altas, o simplemente mostrar la complejidad del cambio que nos están pidiendo, al impactar en muchos sistemas de nuestra arquitectura. En estos casos, debemos pensar las integraciones (o solo los nombres) de manera tal que sea simple comunicarlas a usuarios no técnicos. Tal vez solo baste con tener una planilla donde se listen todas las interfaces y sus nombres funcionales, aunque otras veces es algo mas complejo.

Utilidad para documentación
Que mejor que tener un desarrollo que se auto-documente. Eso nos ahorra mucho trabajo, y encima es mejor cuando este trabajo es algo que no es muy feliz hacer. Si la metodología de desarrollo que estamos utilizando no requiere muchísima documentación innecesaria, es muy útil pensar en que los diseños o desarrollos de las integraciones se auto-documenten (por ejemplo, utilizando WSDL o REST para definir los protocolos).

Notas finales
En esta entrada intente explayarme sobre aquellos atributos de calidad con los que me topé en mi experiencia al desarrollar integraciones. No quiere decir que todos existan en todos los casos, ni que debamos aplicar todos a todos los desarrollos, ni siquiera que sean los únicos. Pero creo que sirve como guía para comenzar, o ayuda-memoria para no olvidarnos de cosas que creo importantes.

0 comentarios:

Publicar un comentario