Llevo unos días que parezco un taxista de película policíaca clásica, cuando el protagonista para un taxi y dice: “Siga a ese coche” mientras saca un par de billetes de dólar y se los da al conductor.
Salvo que en mi caso voy siguiendo a una variable por dentro de las intrincadas relaciones de frameworks, plataformas, sistemas, redes y servicios que forman (o deforman) el sistema digital de una gran empresa.
Hace un tiempo nos piden añadir una prestación nueva en el software de mi empresa de por las mañanas. Aparentemente es algo sencillo. El Departamento de Marketing nos proporcionará una marca para que podamos ofrecer servicios especiales a algunos clientes escogidos por ellos. Para lo cual, Marketing nos enviará diariamente un fichero con la relación de clientes que formarán parte de la promoción. Las aplicaciones que de verdad se relacionan con el cliente, si éste tiene en una variable de su ficha comercial un uno, le ofrecerán el nuevo producto y si tiene un cero no se lo ofrecerán. Hasta aquí algo sencillo.
Pero lo que parece un agradable paseo, se va convirtiendo en una persecución por la maraña de la diversidad de los servicios. El listado de marketing, llega en una hoja de cálculo. Lo convertimos a un formato que el Host sea capaz de entender. La ficha de clientes reside en el Host (el gran ordenador central con Cobol) así que allí se queda la variable. Empezamos las pruebas y no van bien. La variable de marketing, la captura un módulo de preventa general, que también corre en Cobol, a través de una transacción contra el módulo de personas. El módulo de preventa informa a su vez a una aplicación que también reside en el host, pero que está en otra aplicación, y según el valor de la variable, le indica al módulo de Terminal Financiero (que corre en Java) que pinte una cosa u otra en la pantalla que ven los empleados cuando hacen la venta. Pero hay otro módulo que tiene que hacer otras comprobaciones antes de la venta. Tiene otro módulo de evaluación de clientes, escrito en Java y C++. Recibe el valor del módulo de preventa anterior, lo pasa por una serie de algoritmos, y al final informa por un lado a otra aplicación en un programa en Cobol en el host, y a una aplicación Web (para los clientes que operan directamente) mediante un servicio Web que luego enlaza con una página escrita en asp de Microsoft. Además otra aplicación en Cobol, recoge el valor de la variable y la usa para enviar correos personalizados a los clientes finales, ofreciéndoles los nuevos servicios. Esta aplicación es heredada y corre todavía en Visual Basic y tiene un sistema de comunicación mediante ficheros planos que el host le deja en un directorio por ftp y los procesa en diferido.
Pues aquí estoy yo, buscando en qué lugar del laberinto, la variable que en origen valía 1, ahora vale 0. Y una tarea que parece trivial, se convierte en una lucha contra los elementos. Tenemos que habilitar la generación de logs en los diferentes módulos del host en Cobol, por donde pasa la variable. Pero como cada módulo tiene una arquitectura, no son iguales. Algunos no admiten unos o ceros, así que la varibale se convierte en true o false. Otros solo admiten letras, así que la variable se convierte en S o N…
Además administración de sistemas, no nos deja activar los logs cuando lo necesitamos y todos a la vez, porque degradamos el rendimiento del sistema. Así que solo podemos poner los logs un ratito y cuando haya poca carga en el sistema. Los módulos de Java… cada uno lleva un sistema de logs diferente y más complicado. Y sucede lo mismo, hay que pedir permiso antes de activarlos, porque frenan mucho a su servidor. El servicio Web que recoge el valor de la variable, hace el log de otra forma… Al final el módulo que envía los avisos a los clientes en diferido es el más sencillo de revisar, nos vamos a los ficheros del ftp y vemos que se graba allí.
Así que nos pasamos varios días siguiendo a una variable que solo tiene un uno o un cero. Vamos que solo es un bit. Si llega a tener valores más complejos…
Yo entiendo que la especialización lleva a ir usando herramientas diferentes para cada cosa, pero en ocasiones esto provoca algunos problemas. Y por supuesto, me falta comentar, que cada módulo es mantenido por una empresa externa diferente, que tiene distinta cultura, horarios e incluso están en otros países con husos horarios modificados.
Y lo peor es explicarle al usuario que para saber cómo enviar un cero y un uno, nos pasamos una semana.
Bueno os dejo, que tengo que volver a ponerme la gabardina y el sombrero y buscar otro taxi, que tengo que volver a perseguir a la variable escurridiza.
11 Comentarios
Comentarios Cerrados
Veo tendero que tienes la típica reunión multinacional sin traductores, desde el “programa dinosurio” en Visual Basic (que seguro funciona mejor que algunos modernos pero eso es otra historia) hasta el de última generación, y cómo pasa siempre que se juntan varias generaciones y revisiones, pues aunque hablen el mismo idioma ,Cobol, tienen modismos diferentes y os toca hacer de mediadores para que se pongan todos de acuerdo.
Como las reuniones familiares, vaya, espero que lo soluciones “pronto” y ahora… “¡¡¡No pierda de vista a ese coche!!!”
El programa dinosaurio es el de Cobol, Visual Basic es un lenguaje orientado a objetos, aunque no os guste…
Lo sé, me di cuenta después, recordando el primer lenguaje de programación que aprendí. Y tienes razón, a mi particularmente el VB no me ha gustado nunca, quizás por eso me salté el Cobol.
Cobol arghhhhhhhhh, pensaba que solo habia sido una pesadilla y no existia….
Te veo programando “modulos traductores” para que todos se entiendan.
“…si éste tiene en una variable de su ficha comercial un uno, le ofrecerán el nuevo producto y si tiene un cero no se lo ofrecerán”
Un antiguo compi llamaba a eso “programación orientada al flag”.
“El Departamento de Marketing nos proporcionará una marca para que podamos ofrecer servicios especiales a algunos clientes escogidos por ellos.”
Y a eso “programación orientada al sujeto”. Creo que todos tenemos experiencia con los dos conceptos. Pero es útil tener nombres para ellos 🙂
El error lo acabamos de encontrar… estaba en un buffer de intercambio que otra aplicación nos borraba…
Cuando empecé a leer la respuesta pensé que ibas a decir que el problema estaba en el condensador de fluxo 😛
Yo flipaba mientras el programador me enseñaba la traza y me lo explicaba
Hola Tendero!!!acabo de leer tu post y me he dado cuenta de que te falta algo…todo lo que has contado es tal cual en mi trabajo, muchas veces hago lo mismo pero te falta la parte humana del tema, los reinos de taifas que has de atravesar en tu persecución de la variable..frases antológicas:
– ¿Y por qué preguntas eso?
– ¿Y tú quién eres?
– Tenemos un formulario para registrar tu pregunta, rellénalo y ya te contestaremos
– ¿Y para qué quieres saberlo?
– Nosotros somos X y no lo llevamos, lo lleva Y.
– Nosotros somos Y y no lo llevamos, lo lleva X.
Tengo que reconocer que a mi esta parte me desespera….muchas veces les encuentras errores en ‘sus’ sistemas o aplicaciones y lo más que obtienes es un gruñido…en fin, siempre queda el placer de haber dado capturado esa variable!!!!
Es que daría para muchas más entradas como tu bien dices. Iré tomando notas y contaré alguna más. La del formulario es buenísima. Yo tengo la versión de: “Sabemos que falla, está mal, pero o me abres la incidencia (con una carga burocrática enorme) o no te lo arreglamos”. Y el pasarse el muerto de X a Y…