Esto suena bien, pero, ¿es una especificación de requerimientos? ¡NO, no, no! Más bien se trata de la solución a los posibles requerimientos personales del comprador, que podrían ser expresados de esta otra forma (y perdone el lector lo ridículo de esta situación, pero los ejemplos suelen ser como los consejos: de mala catadura):
Naturalmente aquí cabría añadir condicionantes temporales de todo tipo: "Para cumplir estos requerimientos dispongo de un presupuesto de 200.000,-pta. y además quiero que la marca del televisor empiece por SA, y quiero que las instrucciones vengan en sánscrito, y quiero...", pero que en absoluto cambian la naturaleza de los requerimientos expresados. Se aprecia también, en este estúpido ejemplo, que requerimiento no equivale a necesidad, pues ésta es anterior a aquél. O sea, se aplica el siguiente y elemental esquema secuencial (a veces no tan secuencial):
Oh, bueno, esto parece esencialmente correcto, pero ¿no se están obviando importantes circunstancias de entorno? Esto es, siguiendo el ejemplo, ¿no habría que inquirir sobre el contexto en que se insertará el aparato y las condiciones de interacción de éste en el mismo?
Parece que de esta manera, al describir los “roles” del sistema (en este caso una simple interacción hombre-máquina), los condicionantes se muestran claros, formando un todo con los requerimientos. De hecho suele ser así como deberían abordarse las compras de electrodomésticos. Pero, vaya, esto plantea nuevas y difusas fronteras, incluso para los grandes almacenes. INCOMPLETITUD DE LAS ESPECIFICACIONES Hay que notar que, en principio, no importa si los requerimientos constituyen una realidad objetiva exterior al cliente o si más bien forman parte, por la propia capacidad de éste relacionada con el problema a analizar, de su propia estructura mental, pues lo que en definitiva transmite el cliente al analista es una imagen, frecuentemente deformada por condicionamientos propios, de tal realidad, siendo lo que percibe efectivamente el analista otra imagen, matizada y quizás afortunadamente distinta, de tales requerimientos. Bien, esta larguísima frase viene a querer expresar, en definitiva, lo que Nietzsche en su aforismo "El filósofo preso de las redes del lenguaje". Por naturaleza, la comunicación viene determinada por la intersección semántica de sistemas simbólicos formales entre los comunicantes, así que ... bueno, quizás me esté apartando de ese enfoque pragmático con que se pretendía dotar al presente texto. Bien: bajemos al planeta Tierra. La cuestión es que cuando una entidad multiconceptual se comunica a otros, ésta se convierte en una entidad distinta (y recuerden aquello de "traduttore tradittore", luego denostado por Jacobson). Todo esto, aplicado a la comunicación entre cliente y analista, nos lleva a la siguiente trivial conclusión: ¡Este asunto no es nada fácil, diantre! De alguna manera tenemos que extraer del cliente la mayor cantidad posible de información relevante al problema a resolver. Y fíjese bien el lector que, según lo declarado, las sesiones de análisis tendrán dos cometidos básicos: extraer mucha información y que ésta sea esencial al problema. El abuso, por separado, de esta funcionalidad puede llevar bien al inútil sobreexceso de descriptores, bien a una interpretación conceptual demasiado alejada de la realidad del problema. Pero aun suponiendo la exacta aplicación de las técnicas apropiadas a lo que en Tecnología de Objetos se ha dado en llamar OORA (Object-Oriented Requirements Analysis), el resultado a documentar por el analista -esto es, las especificaciones- será matizadamente distinto del conjunto de requerimientos previsto por el cliente, de manera que las especificaciones observarán, en todos los casos, una característica básica de incompletitud, que nos llevará, como veremos, a un ciclo de refinamiento involutivo posterior similar al representado por los conocidos modelos de fuente, espiral o piscina en las fases de Análisis y Diseño Orientados-a-Objetos. Lo más fascinante de todo es que el cliente en absoluto busca la comunalidad, la abstracción o la reutilización: simplemente la satisfacción de una necesidad inserta en un contexto concreto, y que observará, por tanto, un comportamiento mayormente arbitrario. Es propio de la condición humana, por otro lado, el cambio inopinado y la carencia de previsión, por lo que es prácticamente imposible satisfacer a la vez todos los posibles roles que la solución provista pueda adoptar. He aquí la llaga. El dedo correspondiente señala que la circunstancia de rol es precisamente la que define la incompletitud generalista del requerimiento y satisface, a la vez, su adecuación para con la necesidad que lo genera. ¿DÓNDE COMIENZA EL CÍRCULO? ¿Cuál es la tarea primera del analista? Secuencialmente hablando, debiera ser, como base de su posterior trabajo, el establecimiento tangible de las especificaciones que conforman los requerimientos del cliente. Esto es, el analista, mediante una interrogación adecuada al cliente, deberá establecer el material conceptual sobre el que operar después. El resultado final de este proceso marcará, de forma ineludible, el desarrollo ulterior de software. Naturalmente aquí, como ya habrá supuesto el inteligente lector, la orientación-a-objetos tiene mucho que decir. Pero antes examinemos la típica orientación estructurada, con un enfoque que podríamos denominar de "descomposición en tablas", o de "análisis tabular", y que normalmente se basa, de una forma tendenciosa, en reconocer y definir las estructuras de datos (?!) que se esconden tras los requerimientos del cliente. Vayamos, pues, por partes. TABULA RASA Resultaría interesante -y aconsejable, si no estuviera perseguido policialmente- diseccionar la mente de un analista estructurado. Pero, bueno, actualmente nos habremos de conformar con observar a uno de ellos en una típica sesión de análisis de requerimientos. Se trata de someter las consideraciones del cliente a un especial filtrado que las tamiza segmentándolas, básicamente, en cuatro áreas bien definidas: pantallas de acceso y modificación de datos, listados de impresora, procesos secuenciales y estructura de las tablas para bases de datos relacionales sobre las que habría de bascular el sistema entero. De esta manera, y con cierta lógica perversa, tal tipo de analista no intenta comprender la esencia del problema que se le plantea sino, más bien, resulta en actuar como una especie de curioso traductor mecánico: cada requerimiento del cliente se transforma, así, bien en una indicación directa de la composición de una o más tablas susceptibles de ser manejadas por un gestor de bases de datos relacionales, bien en una o más funciones de aplicación secuencial que habrán de manejar los datos encerrados en las tablas anteriores. De lo que se trata en estas reuniones, que podríamos nominar como "relacionales", es de ajustar las especificaciones del problema a la especial estructuración -y a veces deformación profesional- del analista. Claro que esto normalmente funciona, pero imagino que si uno se entrenara durante años para encender cerillas con los dedos de los pies la cosa funcionaría igualmente. Esto es, que la persona es un animal acomodaticio y se acostumbra a todo. Lo cierto es que el desarrollo y estabilización del modelo relacional ha influido de forma esencial en la construcción de sistemas software durante los últimos quince años, pero ¿estamos en el buen camino? Bien, examinemos una típica reunión de este tipo de análisis (un poco deformada -y así me anticipo a la razonable queja del lector-, pero es que es así como mejor se aprecian sus peculiaridades). Les pongo en antecedentes: se trata de una primera reunión para la especificación de requerimientos de una aplicación de gestión de muestras para un laboratorio de aguas:
.....................
.....................
.....................
Como se ve, el diálogo no tiene desperdicio. ¿Qué ha ocurrido aquí? El lector por fuerza habrá de reconocer cierta similitud entre esta situación y la que se generaría con un vendedor de coches usados. El analista (que aquí podría muy bien ser nominado "analistra", y que me perdone Alfred Jarry) maneja perfectamente la situación, de forma que las explicaciones del cliente sólo son asumidas cuando reflejan algún retazo del pequeño universo de éste. Naturalmente que el diálogo anterior no expresa literalmente la realidad, pero puedo asegurar que la refleja fielmente. COMPRENSIÓN DE LA NATURALEZA DEL PROBLEMA Pudiera parecer, desde un enfoque alarmantemente simplista, que cliente y analista pertenecen a dos mundos distintos, posiblemente en colisión, y que el entendimiento entre ambos depende de la elección de un adecuado y seguro territorio común, potenciando así un ánimo parecido al que originó en su día el esperanto. Semblaría, entonces, que los comunicantes habrían de perder parte de su acervo personal para que la comunicación alcanzara mayor densidad formal. Bien, esto resulta verdaderamente interesante, pero ... ¡vaya!, es exactamente contrario a nuestro enfoque expositivo, que establece un área común para los comunicantes: el dominio del problema. De esta manera, cliente y analista han de trabajar conjuntamente en las descripciones de los requerimientos que compondrán la especificación buscada, y es por esto que ambos hablarán el mismo lenguaje. Atención: ¡el mismo lenguaje!. Esto quiere decir que en las reuniones de OORA no deben normalmente aparecer vocablos como bases de datos relacionales, campos, registros, índices, etc., aun suponiendo que el mismo cliente sea un experto en ingeniería de software. Lo que se pretende, al fin, básicamente, es traspasar al analista una porción del conocimiento del cliente referido a un ámbito concreto, y fíjense que se trataría así de un flujo de información direccional con un único sentido: del cliente al analista. No nos interesa, pues, el bagaje informático que el analista pudiera aportar al cliente. Si necesitáramos expresar sincréticamente (¡Maldición! ¡Un neologismo!) lo anterior, podríamos decir que el objeto cliente, en respuesta a mensajes excitadores o catalizadores del analista, le envía a éste mensajes volcando su contenido. Pero, ¿quiere esto decir que en ningún momento se va a hablar de componentes informáticos concretos? -podría preguntar el ya inquieto lector. No, no, no: la informática ha de hacerse notar, pero cuanto más tarde mejor [1]. ¿TIENE ALGUNA VEZ EL CLIENTE LA RAZÓN? Como en el diálogo de ejemplo, es frecuente encontrarnos en la vida real con situaciones en que el analista, arrastrado por una cierta mecanización profesional, interprete directamente y corrija de forma automática requerimientos del cliente, ajustándolos a sus propios esquemas. Pero es que así lo que se consigue es cambiar el sentido de flujo de la información, y esto es esencialmente erróneo, según vimos en el parágrafo anterior. De esta manera, por ejemplo, en el análisis de requerimientos de una estación de servicio de carburante, el cliente podría decir que ellos utilizan vales de servicio de carburante, y entonces el analist(r)a le corregiría diciendo: "Ya, ya. Vales. O sea, albaranes de servicio", presuntuosamente suponiendo que el conocimiento desarrollado en el análisis de innumerables aplicaciones le coloca en un plano más general que el cliente. Pero, ¿no es esto una verdad práctica? No tan deprisa. Veámoslo desarrollando un poco el sencillo ejemplo expuesto. Si asimilamos directamente que un "Vale" es conceptualmente igual a un albarán, según nuestra propia experiencia de análisis, es posible que tengamos que ampliar de una forma no natural el comportamiento habitual de los albaranes tal y como los entendíamos. Así, verbigracia, a un "Vale" podría seguirle o no una factura, mientras que los albaranes necesitarían, acaso, ser siempre facturados. Esta situación nos llevaría a modificar la estructura de los albaranes (¿añadiendo quizás un nuevo campo del tipo "Facturar s/n"?), creando al final una macro-composición de difícil cualificación. Pero, bueno -exclamará el lector-, ¿no es este tipo de reutilización el que se pretende imbuir con la Orientación-a-Objetos? No exactamente, pues un OOSS sostiene según Meyer [2], entre otros, el principio abierto-cerrado, que establece, prácticamente, que la modificación de los módulos (objetos) será realizada en otros nuevos provenientes de aquellos mediante herencia. ¡Ya está, pues! -repetirá el inteligente lector-: derivamos nuestra clase "Vale" de la anterior clase "Albarán" y ... ¡todo arreglado! Bravo, amigo lector: esta podría ser la solución, pero la cuestión es que nuestro analist(r)a la ha tomado a destiempo. Me explico: es posible, efectivamente, que "Vale" derive de "Albarán" mediante herencia (significando que un "Vale" es-un "Albarán"), o también que, sin que se dé tal relación de herencia, pueda ser aprovechado el módulo "Albarán" para la construcción del "Vale" usando, por ejemplo, de layering, pero esto no lo podemos determinar hasta que las especificaciones de requerimientos para tal módulo "Vale" estén completas. O sea, primero hay que determinar cuáles son las necesidades y luego, en las etapas de OOA y OOD buscar si disponemos de módulos (objetos) que puedan reutilizarse para satisfacer éstas. De acuerdo con lo expuesto, un analista procurará no reutilizar módulos ni conceptos en la fase de OORA. Incluso si "Vale", según la descripción del cliente, es exactamente idéntico a un módulo ya disponible pero con otro nombre, pues tal temprana asunción constreñiría de forma no despreciable las posteriores etapas de OOA y OOD, y aun la implementación final. Bueno, esto puede parecer trivial, pero el corolario es que el analista de OORA debe "simplemente" analizar el problema, y no procurar al cliente una suerte de servicio de consultoría de organización de empresas. Al menos, no debiera proporcionar ambos servicios de forma indivisible: es posible asesorar al cliente, como analistas del dominio del problema en que éste se ve inmerso, en la generalización de aspectos concretos del mismo, pero la asunción de estas indicaciones por parte del cliente conllevará, ineludiblemente, el cambio de las especificaciones de requerimientos, por lo que tendríamos entonces que volver a empezar. LA FALACIA DE LA SECUENCIA MAESTRA A fuerza de reparar siempre en el mismo error, uno puede llegar a convencerse que está en lo cierto. Es práctica común, así, inquirir al cliente, como en nuestro ejemplo, por una cierta secuencia de procesos y, de aqui, intentar reconocer o inferir una línea maestra, con una secuencia principal y varias bifurcaciones, sobre la que apoyar el análisis completo. Pero lo cierto es que la situación real suele ser más grave: al analist(r)a no le suele importar el carácter dinámico del sistema a estudiar, sino que desaforadamente intenta establecer una estructura secuencial rígida sobre la que "colgar" pantallas, listados y cambios estructurales. Por supuesto que, una vez establecida tal secuencia maestra, nuestro analist(r)a se agarra a ella como a una viuda rica, y cada vez que el cliente lo llama para introducir alguna modificación es como si le clavaran un puñal en el occipital. El invariable desarrollo de estas pequeñas historias de cambio en la secuencia maestra pasa por las siguientes fases, directamente relacionadas con el estado mental del analist(r)a:
En el mejor de los casos, se produce la siguiente última fase, de fuerte componente negocial:
Y vuelta a empezar. ¿O es que creían que el analist(r)a es un animal autoevolutivo? ¿O acaso pensaban que las quejas del cliente influyen "realmente" sobre las técnicas de este tipo de análisis? Por supuesto que la pregunta del millón de dólares del cliente es: ¿por qué diablos no plantearon al principio esta generalización y unificación conceptual? Bien, vayamos al principio. El analist(r)a intenta secuenciar con exactitud porque es su única forma de abordar un problema. Así, con el práctico lema "Divide y vencerás", se aplica al problema un enfoque top-down, más o menos matizado, y ... bueno, ya saben ustedes: se busca el cometido principal o función top del sistema y, en sucesivos pasos, se descompone en subobjetivos, hasta llegar a subproblemas indescomponibles o perfectamente identificables como componentes básicos en ciertos repositorios. El verdadero problema es que, como señala Meyer, la mayoría de los sistemas complejos de información no poseen función top, de manera que el analist(r)a debe normalmente moldear uno "a medida", pero que, por su misma extrema concreción, malamente admite modificaciones. CICLO DE VIDA DE LAS ESPECIFICACIONES La observación -por no decir análisis- de multitud de proyectos software basados, informal o formalmente, en el "enfoque estructurado" puede llevar al lector a la errónea conclusión de que el análisis de requerimientos es una suerte de composición estática, gráfica o textual, que sostendrá el proyecto como un todo, del mismo modo que lo harían los requerimientos del cliente de un arquitecto con respecto a la construcción de una cierta edificación. Bien, esto es parcialmente cierto, pero, a la vez, lamentablemente difuso. O sea, es en efecto acertado suponer que un proyecto dado no podrá llevarse a cabo sin saber de qué demonios de proyecto se trata, pero también lo es que pensar que el desarrollo del proyecto puede, de alguna manera, imponer restricciones o facilitar ampliaciones de los requerimientos iniciales del mismo. Así que volvemos a lo de siempre -pensará el inquieto y avisado lector-: "Arriba y abajo, siempre atrás y adelante. Pero, ¿es que no hay nada fijo, estable, en que apoyarse firmemente?". Bueno, amable lector, quizás la muerte, o aun la tontería, pero no las frágiles estructuras que se desprenden de la interpretación del conocimiento humano. ASPECTOS CONTRACTUALES Una queja que se deja oír muchas veces en las empresas serias de desarrollo de software suena de forma parecida a: "resulta turbadoramente difícil establecer un documento con carácter contractual sobre el que se pueda dirimir, en caso de conflicto, el ajuste, o no, del trabajo realizado a los requerimientos del cliente". Recapacitemos ligeramente: de todas las posibles fases (en cascada o no) del proceso de desarrollo de software, la única que posibilita tal entroncamiento contractual, por ser la única susceptible de ser expresada en un lenguaje común a ambos, cliente y analista, es la de OORA. En el resto de las fases se produce una transcripción de tales especificaciones a lenguajes y simbologías que no tienen directamente que ver con el dominio del problema a estudiar, y que, por ende, requerirían, para ser dotadas de fuerza legal, de una interpretación léxica objetiva y exacta. Por supuesto que no existe tal esfera objetiva exterior, y dudo que ningún cliente se aviniera a basar sus cuitas judiciales en la previa aceptación de un diagrama no proveniente de su propia casa, por mucho Yourdon, de Marco, Jackson, Rumbaugh, etc. que en tal se detallara. Aparentemente se imponen, así, las especificaciones textuales: necesarias, pero no exclusivas. ¿ESPECIFICACIONES GRÁFICAS O TEXTUALES? Regresemos al principio: ¿por qué las especificaciones en OOA/OOD son mayoritariamente textuales? Esto es, ¿qué pasa con aquéllos habituales -y prácticos- diagramas estructurados de flujo de datos? ¿o con las conocidas burbujas? Y sobre todo, ¿por qué no usar los tan extendidos modelos gráficos Entidad-Relación de Chen? Bien: Lo cierto es que la mayoría de las técnicas actuales -calificadas ya como "tradicionales" por Firesmith [3] hace uso intensivo de las directrices de Abbott [4], desarrolladas sobre una plataforma textual conseguida de alguna innominada manera, pues normalmente se obvia el proceso por el que se obtienen tales especificaciones textuales, así como su tratamiento, si acaso existe. TÉCNICAS DE OORA Tras lo expuesto en anteriores parágrafos, el lector puede pensar que la tarea de arrancar al cliente las especificaciones no es nada fácil. De hecho, como ya ha sido dicho, la práctica totalidad de los métodos actuales de OOA/OOD no establecen ningun método formal de procurar las especificaciones de requerimientos que proporcionen la base sobre la que edificar el posterior análisis y diseño del sistema. Precisamente por eso podría sorprenderse al constatar que Graham [5] sostiene precisamente lo contrario. Oh, pero no hay nada sustantivo tras estas cuitas, que vienen a sostener que el bagaje técnico del analista finalmente inclinará la balanza. La verdad es que, mención aparte del texto de Jackson [6](que comenté en el artículo “Objetos: Hitos, Mitos y Ritos”, RPP, enero, 1996), pocas técnicas de especificaciones encontrará editadas el ávido lector (cosa que no puede decirse de los lenguajes de especificación que, sin abrumar, abundan). UNA SOLUCIÓN INTEGRAL Tras todo lo anterior, ¿qué hacer? ¿Realmente no existe una solución integral que cubra el proceso entero de desarrollo de software? Oh, sí. Se denomina OOram, y será protagonista del próximo artículo. [1] No cuento aquí, claro, con los supuestos de estimación cuantitativa, solidez, efectividad y eficacia de los sistemas software. [2] Meyer, Bertrand, Object-Oriented Sofware Construction, 1988, Prentice Hall. [3] Firesmith, Donald G., Object-Oriented Requirements Analysis and Logical Design, 1993. [4] Abbott, R.J. (1983), Program Design by Informal English Descriptions, Communications of the ACM, 26(11), 882-94 [5] Graham, Ian M., Object-Oriented Methods, 1991, Addison-Wesley. [6] Jackson, Michael, Software Requirements & Specifications, 1995, Addison-Wesley, 0-201-87712-0. |
||
| Pº. Castellana 188, 14º e · 28046 - Madrid · info@a4devis.com |
||