Notas sobre el uso de Métodos formales en los procesos de desarrollo de software. Hugo A. López A. Abstract Formal methods have emerged as analytical approaches where software programs can be verified by means of powerful mathematical theories. This approach presents several advantages comparing to informal methodologies, in terms of the quality of software, size of the proofs, reduced validation cost and reduced time-to-market. However, these methods have not been successfully received by the software development industry, and there exists several inconveniences that delay the acceptance in the near future. This paper discuss some of the advantages of the use of formal methods as software methodologies, as well as present current challenges that formal methods face in order to settle as one recognized software methodology Resumen Los métodos formales han emergido como enfoques analı́ticos en donde el desarrollo de software puede ser verificado por medio de poderosas teorı́as matemáticas, presentando ventajas en la calidad del software, tiempo de desarrollo, tamaño y complejidad de las pruebas. Sin embargo, aún existen muchos inconvenientes para la correcta implantación de los métodos formales como una métodologia de desarrollo de software comúnmente aceptada en ingenierı́a de software. Este articulo discute algunas de las ventajas del uso de métodos formales como metodologı́as de desarrollo, ası́ como plantea los retos a vencer para una masificación de este enfoque. 1. Introducción La calidad del software es una de las problemáticas más importantes en los procesos de desarrollo de software. Garantizar el correcto funcionamiento bajo situaciones no determinadas es una tarea que tiene que ser realizada con cuidado extremo. En algunos casos, este tipo de pruebas son de mayor importancia, ya que involucran ambientes sensibles e información crı́tica en donde es necesario garantizar que cada uno de los componentes involucrados (hardware, software y componentes humanos) actúe de manera correcta ante situaciones especı́ficas, con una variedad de ejemplos que cubren áreas tan diversas como planeación de tráfico [2], aplicaciones militares [12] y sistemas médicos [15], entre muchas otras [4]. Uno de los principales problemas que aqueja la ingenierı́a de software se sitúa en la definición de requerimientos. Ambigüedad, vaguedad o incompompletitud en los requerimientos son siquiera algunos de los retos que los desarrolladores tienen que enfrentar al hacer un análisis detallado del sistema [23]. Los modelos formales presentan una alternativa práctica para solucionar estos problemas. Constituyen un enfoque analı́tico para la especificación, diseño y verificación de sistemas de hardware y software. Su caracterı́stica principal es la rigurosidad en la que sus modelos se encuentran basados, con fundamentos en sólidos principios matemáticos que permiten definir con precisión y sin temor a ambigüedades las necesidades de un sistema. Gracias a estos fundamentos, el software generado mediante métodos formales puede ser verificado mediante el cumplimiento de propiedades derivadas de la especificación. Este enfoque ha resultado ser exitoso frente a otras tendencias, encontrando errores en diseño que difı́cilmente habrı́an podido ser considerados usando otras técnicas. Este artı́culo pretende introducir al lector en el uso de métodos formales para el desarrollo de software, presentando una serie de consideraciones necesarias al tomar la decisión de incluir dichas metodologı́as en el proceso de desarrollo de una organización. El artı́culo plantea la siguiente estructura: en el capitulo 2 se introducirán los métodos formales para el desarrollo de software, en el capı́tulo 3 se presentará un comparativo entre las caracterı́sticas de los modelos formales en relación al proceso de desarrollo de software. En el capitulo 4 se presentarán una serie de preguntas que ayudarán a identificar al lector si las metodologı́as formales se ajustan a sus necesidades especificas. Finalmente, en el capitulo 5 se presenta una discusión final. 2. Qué son los métodos formales? Los métodos formales (FM, por sus siglas en inglés) representan un conjunto de tendencias de desarrollo de software y hardware en donde la especificación, verificación y diseño de componentes se realiza mediante notaciones, lenguajes, herramientas y técnicas basadas en teorı́as con sólida fundamentación matemática. El uso de notaciones y lenguajes formales permite plantear de manera clara los requerimientos de un sistema, generando especificaciones que definen el comportamiento en términos del ”qué debe hacer” y no del ”cómo lo hace”. Gracias al correcto proceso de especificación, propiedades derivadas de cada modulo pueden ser verificadas mediante técnicas de razonamiento asociadas a los modelos formales, como probadores de teoremas y verificadores de modelos. A partir de las especificaciones, la implementación de un sistema puede ser generada de manera casi automática. Es necesario bajar en el grado de abstracción de las especificaciones mediante técnicas como refinamiento o concretización (reification). En este proceso, denominado diseño formal, es necesario garantizar que cada nivel de abstracción generado cumple con las propiedades verificadas en los grados en las abstracciones de más alto nivel. En los niveles más bajos es posible encontrar notaciones y estructuras muy cercanas a los lenguajes de programación, generando del último nivel una implementación que puede ser verificada e instanciada en un lenguaje de programación. Teniendo en cuenta los niveles de abstracción y las caracterı́sticas propias de cada sistema, una variedad significativa de modelos han sido propuestos. En los procesos de especificación, tres grandes corrientes pueden ser identificadas: Lenguajes basados en modelos y estados (e.g., VDM [16], Z [26] o sus posteriores extensiones en el método B [27]), Lenguajes de especificación para sistemas concurrentes (el caso de CSP [13] o el cálculo π [21] ) o especificaciones para sistemas temporales (e.g., TLZ[19], LOTOS [9] y los cálculos basados en tcc [25, 22]). Para los procesos de verificación, dos grandes enfoques son reconocidos: los verificadores de modelos, que realizan una busqueda exhaustiva sobre los estados posibles de una especificación para encontrar posibles fallas no consideradas, y los probadores de teoremas, en donde la especificación y sus propiedades deseables se formalizan como formulas lógicas, y se prueban mediante una serie de axiomas y reglas de inferencia presentes en cada probador. Los métodos formales difieren en la manera y tiempos de cada una de las fases del ciclo de vida del software. Su utilización requiere mayor tiempo en el desarrollo de especificación y la construcción de diseños correctos, lo que aumenta el tiempo de las fases de análisis y diseño; sin embargo, los 2 métodos usados, ”correctos por construcción”, disminuyen el tiempo de verificación del software, al requerir una cantidad de casos de prueba mucho más reducida que cubre todo el panorama de prueba, a diferencia de validaciones en base a simulaciones que son incompletas e ineficientes. 3. Ventajas e Inconvenientes Si bien los métodos formales constituyen un acercamiento alternativo a las metodologı́as de desarrollo de software, existen un número de diferencias significativas que deben de ser consideradas al pensar en instaurar los métodos formales en un equipo de desarrollo de software: 3.1. Entrenamiento Los métodos formales requieren de un nivel avanzado en matemáticas. Más que seguir una notación especı́fica, el mayor problema se presenta en los modelos mentales del equipo desarrollador. Tı́picamente, los modelos de elicitación de requerimientos plantean sus metas en lenguaje natural, en busca de un correcto entendimiento entre el cliente y el equipo de desarrollo. Sin embargo, la traducción de los pliegos de requerimientos a especificaciones formales tienden a resultar fallidas, generando sólo especificaciones ambigüas e incompletas. Es necesario un entrenamiento a nivel de todo el equipo de desarrollo, de manera que cualquiera se encuentre en capacidad de definir y entender especificaciones por si mismo. 3.2. Pluralidad de Modelos Una de las dificultades en usar modelos formales es la ausencia de una metodologı́a única para el desarrollo de software. Diversos modelos han sido propuestos desde las matemáticas, cada uno especialmente diseñado para las necesidades de un entorno especı́fico: Refinamiento y maquinas de estados finitos para modelos secuenciales, redes de Petri y álgebras de procesos para computación distribuida, lógicas temporales lineales y ramificadas para computación dinámica y modelos de eventos para computación en tiempo real son sólo algunas de las múltiples ramas existentes. Esta multiplicidad de enfoques tiene ventajas y desventajas: Es posible aprovechar cada uno de los formalismos para expresar con mayor nivel de claridad una especificación de un sistema; sin embargo, la misma pluralidad de modelos exige un conocimiento experto en cada uno de los modelos existentes para lograr el mayor aprovechamiento de los metodos formales en la especificación de dichos sistemas. 3.3. El lado obscuro de las matemáticas. Una de las mayores dificultades que han tenido que enfrentar los métodos formales para la instauración dentro de los procesos productivos de la ingenierı́a de software tiene que ver con las herramientas mismas. Las notaciones son difı́ciles de entender para la mayorı́a de los ingenieros involucrados y hasta el momento son pocas las herramientas con la madurez suficiente para modelar sistemas realmente complejos. Actualmente existen esfuerzos para sobrellevar estos inconvenientes: la integración de cálculos de procesos y UML parece una tendencia prometedora para que herramientas de tipo CASE puedan brindar entornos de verificación mucho más cercanos al común de los ingenieros de software [18, 17, 7]. Sobre las herramientas para verificación, el proceso continuo de desarrollo de frameworks como LOTOS, the Concurrency Workbench [5] o FDR[20] ha permitido que los errores presentes en versiones anteriores sean solucionados; sin embargo, es necesaria 3 un mayor uso por parte de la comunidad, de manera que la experiencia adquirida entre los usuarios finales y los desarrolladores permitan solucionar errores y plantear nuevas caracterı́sticas que permitan cerrar el abismo existente entre ellos. 4. Dos enfoques, una sola ingenierı́a Ciertamente la inclusión de los modelos formales como metodologı́a de desarrollo de software es hasta ahora, uno de los tópicos más discutidos en las ciencias de la computación. Dos grandes corrientes pueden ser reconocidas actualmente. Los grupos a favor, plantean dentro de sus razones más importantes la generación de sistemas correctos en ambientes en donde un fallo puede resultar crı́tico para la estabilidad de un sistema, los beneficios de un costo ostensiblemente menor, el aumento en la documentación, y la reducción de errores en los procesos de desarrollo de software. Sus detractores plantean el aumento en el tiempo de producción, falta de experticia por parte del personal, falta de usabilidad en las herramientas formales, y dificultad en aplicaciones con cambios constantes en sus diseños. Si bien ambos grupos tienen razones de peso para plantear una posición, y muchas de las virtudes encontradas en el uso de modelos formales pueden conseguirse bajo otros modelos de desarrollo riguroso (the Capability Maturity Model Integration – CMMI [3] es un ejemplo de ello), el uso de modelos formales en muchos casos puede o no ser conveniente. Para esto es importante definir una serie de caracterı́sticas importantes en la escogencia del enfoque de desarrollo para un sistema de software: Modelo Fenomenológico: Identifica los fundamentos cientı́ficos de la aplicación a desarrollar de acuerdo al fenómeno estudiado, de manera que el modelo formal pueda considerar sus aspectos más relevantes en los procesos de abstracción. Por ejemplo: al desarrollar una aplicación para balı́stica, el modelo fenomenológico esta guiado por la mecánica clásica. Mientras que una aplicación de redes estará fundamentada en teorı́as de tráfico y Conmutación. Modelo Computacional de la aplicación: Define la estructura en alto nivel en donde los procesos de cómputo se llevarán a cabo. Pueden identificarse modelos secuenciales, distribuidos, concurrentes o de tiempo real. Los cuales identificarán el modelo formal más apropiado para expresar la aplicación. Caracterı́sticas del ambiente de ejecución: Identifica las caracterı́sticas fı́sicas y sociales en las cuales el sistema debe estar en capacidad de operar, definiendo el nivel de detalle requerido en la verificación del sistema. Por ejemplo, una aplicación relacionada con la seguridad debe garantizar gran confianza respecto a los posibles ataques en su ambiente de ejecución, mientras que una aplicación de realidad virtual debe permitir al usuario un amplio grado de interacción con el sistema. Aplicación Objetivo: Es necesario identificar cuál es la necesidad principal del sistema, como criterio decisorio en la selección de los métodos formales: Aparentemente, el correcto funcionamiento, y el alto desempeño pueden verse beneficiados usando estas técnicas; sin embargo, la facilidad de uso, o las aplicaciones con alta tendencia al cambio en sus requerimientos se ven beneficiadas con otros modelos, como los modelos orientados a objetos. 5. Discusión Si bien el uso de los métodos formales presupone una rigurosidad en los procesos, es importante aclarar que su uso no es el único que define un proceso maduro en el desarrollo de software; ası́ mismo, el simple hecho de usar modelos formales no garantiza que las implementaciones generadas 4 tengan la total confianza esperada, para esto es necesario seguir la rigurosidad de todo proceso de desarrollo, verificando que los modelos cumplan con las propiedades especificadas. Actualmente, los metodos formales han sido principalmente utilizados en las etapas de análisis y diseño. Existen algunos casos documentados en donde el proceso completo de desarrollo ha sido guiado desde una perspectiva formal: el sistema para tráfico aéreo CDIS [11], el sistema aeronáutico para Lookheed [8] y la verificación de procesadores [1]. Sin embargo, podrı́a decirse que falta mucho para lograr una aceptación general de estos métodos dentro del proceso de desarrollo. son necesarios métodos integradores en donde el ingeniero de software pueda realizar especificaciones de manera intuitiva, de manera que estos modelos puedan traducirse a formalismos matemáticos verificables. Adicionalmente, métodos formales en donde solo las partes más crı́ticas del sistema se vean beneficiadas por las pruebas formales, sin afectar la consistencia del resto del sistema son deseables para facilitar los procesos de desarrollo. Finalmente, una educación con mayor profundidad en habilidades matemáticas es necesaria para poder implantar los métodos formales como estándares de desarrollo de software. Referencias [1] P. Black, K. Hall, M. Jones, T. Larson, and P. Windley. A brief introduction to formal methods. In IEEE 1996 Custom Integrated Circuits Conference (CICC ’96), pages 377–380, May 1996. [2] J. P. Bowen and M. G. Hinchey. The use of industrial-strength formal methods. pages 332–337, 13–15 August 1997. [3] Mary Beth Chrissis, Mike Konrad, and Sandy Shrum. CMMI Guidlines for Process Integration and Product Improvement. Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 2003. [4] E. M. Clarke and J.M. Wing. Formal methods: state of the art and future directions. ACM Computing Surveys, 28(4):626–643, 1996. [5] Rance Cleaveland, Joachim Parrow, and Bernhard Steffen. The concurrency workbench: a semantics-based tool for the verification of concurrent systems. ACM Trans. Program. Lang. Syst., 15(1):36–72, 1993. [6] E. F. Codd. A relational model of data for large shared data banks. Commun. ACM, 26(1):64– 69, 1983. [7] David Crocker. Perfect developer: A tool for object-oriented formal specification and refinement. In Tools Exhibition Notes at Formal Methods Europe, 2003. [8] Martin Croxford and James Sutton. Breaking through the v and v bottleneck. In Ada-Europe, pages 344–354, 1995. [9] P. Van Eijk and Michel Diaz, editors. Formal Description Technique Lotos: Results of the Esprit Sedos Project. Elsevier Science Inc., New York, NY, USA, 1989. [10] Formal Methods Europe. Choosing a formal http://www.fmeurope.org/fme/choosing.htm, 2006. method. Available at [11] Anthony Hall. Using formal methods to develop an atc information system. IEEE Softw., 13(2):66–76, 1996. 5 [12] Constance Heitmeyer, Dino Mandrioli, and Politecnico Milano. Formal Methods for Real-Time Computing. John Wiley & Sons, Inc., New York, NY, USA, 1996. [13] C. A. R. Hoare. Communicating Sequential Processes. Commun. ACM, 26(1):100–106, 1983. [14] M. Jackson. Formal methods and traditional engineering. J. Syst. Softw., 40(3):191–194, 1998. [15] Jonathan Jacky, Jonathan Unger, Michael Patrick, David Reid, and Ruedi Risler. Experience with z developing a control program for a radiation therapy machine. In Jonathan P. Bowen, Michael G. Hinchey, and David Till, editors, ZUM, volume 1212 of Lecture Notes in Computer Science, pages 317–328. Springer, 1997. [16] Cliff B. Jones. Systematic Software Development using VDM. Prentice-Hall, Upper Saddle River, NJ 07458, USA, 1990. [17] Katerina Korenblat and Corrado Priami. Extraction of pi-calculus specifications from uml sequence and state diagrams. Technical report, University of Trento, 2003. [18] Vitus S. W. Lam and Julian A. Padget. On execution semantics of uml statechart diagrams using the pi-calculus. In Ban Al-Ani, Hamid R. Arabnia, and Youngsong Mun, editors, Software Engineering Research and Practice, pages 877–882. CSREA Press, 2003. [19] Leslie Lamport. Tlz. In Z User Workshop, pages 267–268, 1994. [20] Gavin Lowe. Breaking and fixing the needham-schroeder public-key protocol using fdr. Software - Concepts and Tools, 17(3):93–102, 1996. [21] Robin Milner. Communicating and Mobile systems. The Pi Calculus. Cambridge University Press, 1999. [22] Catuscia Palamidessi and Frank Valencia. A temporal concurrent constraint programming calculus. In Toby Walsh, editor, Proc. of the 7th International Conference on Principles and Practice of Constraint Programming, volume 2239, pages 302–316. LNCS, Springer-Verlag, 2001. [23] Roger S. Pressman. Software Engineering: A Practitioner’s Approach. McGraw-Hill Higher Education, 2000. [24] Hossein Saiedian. An invitation to formal methods. Computer, 29(4):16–17, 1996. [25] Vijay A. Saraswat, Radha Jagadeesan, and Vineet Gupta. Timed default concurrent constraint programming. Journal of Symbolic Computation, 22(5/6):475–520, 1996. [26] J. M. Spivey. The Z notation: a reference manual. Prentice-Hall, Inc., Upper Saddle River, NJ, USA, 1989. [27] J. B. Wordsworth. Software engineering with B. Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA, 1996. 6