¿Programar o no programar?
Para resolver un problema con un producto de software, después de tener una comprensión de los requisitos, puede SEA escribir un programa utilizando lenguajes de programación O especificar el programa utilizando un lenguaje formal y herramientas de generación de código de uso. Este último solo agrega un nivel de abstracción.
¿Hacer las cosas bien o hacer las cosas bien?
El enfoque formal le brinda una prueba de que su software funciona de acuerdo con las especificaciones. Entonces su producto hace las cosas bien. ¿Pero hace lo correcto?
Los requisitos en los que está trabajando pueden ser incompletos o ambiguos. Incluso podrían tener errores. En el peor de los casos, las necesidades reales ni siquiera se expresan. Pero una imagen vale más que mil palabras, solo imágenes de Google para "Lo que quiere el cliente", por ejemplo de este artículo :
El costo de la formalidad.
En un mundo perfecto, tendría requisitos completamente detallados y perfectos desde el principio. Entonces podría especificar completamente su software. Si opta por formal, su código se generará automáticamente para que sea más productivo. Las ganancias de productividad compensarían el costo de las herramientas formales. Y ahora todos usarían métodos formales. Entonces, ¿por qué no lo es?
¡En la práctica, esto rara vez es la realidad! Es por eso que tantos proyectos en cascada fallaron, y por qué los métodos de desarrollo iterativos (ágil, RAD, etc.) tomaron la delantera: pueden manejar requisitos, diseños e implementaciones incompletos e imperfectos y refinarlos hasta que estén bien.
Y aquí viene el punto. Con métodos formales, cada iteración requiere tener una especificación formal completamente consistente. Esto requiere un pensamiento cuidadoso y trabajo adicional, porque la lógica formal no es indulgente y no le gustan los pensamientos incompletos. Los simples experimentos desechables se vuelven caros bajo esta restricción. Y también cada iteración que llevaría a retroceder (por ejemplo, una idea que no funcionó, o un requisito que no se entendió).
En la práctica
Cuando no está obligado a usar métodos formales por razones legales o contractuales, también puede lograr una calidad muy alta sin sistemas formales, por ejemplo, mediante el uso de programación basada en contratos y otras buenas prácticas (por ejemplo, revisión de código, TDD , etc.). No podrá probar que su software funciona, pero sus usuarios disfrutarán de un software de trabajo antes.
Actualización: esfuerzo medido
En la edición de octubre de 2018 de Communications of the ACM hay un artículo interesante sobre el software verificado formalmente en el mundo real con algunas estimaciones del esfuerzo.
Curiosamente (basado en el desarrollo del sistema operativo para equipos militares), parece que producir software probado formalmente requiere 3,3 veces más esfuerzo que con las técnicas de ingeniería tradicionales. Entonces es realmente costoso.
Por otro lado, requiere 2.3 veces menos esfuerzo obtener software de alta seguridad de esta manera que con el software de ingeniería tradicional si agrega el esfuerzo para certificar dicho software a un alto nivel de seguridad (EAL 7). Entonces, si tiene requisitos de alta confiabilidad o seguridad, definitivamente hay un caso de negocios para ir formal.
El diseño de seL4 y el desarrollo del código tomaron dos años-persona. La suma de todas las pruebas seroespecíficas a lo largo de los años llega a un total de 18 años-persona para 8,700 líneas de código C. En comparación, L4Ka :: Pistachio, otro microkernel de la familia L4, comparable en tamaño a seL4, tardó seis años-persona en desarrollarse y no proporciona un nivel significativo de seguridad. Esto significa que solo hay un factor 3.3 entre el software verificado y el software de ingeniería tradicional. Según el método de estimación de Colbert y Boehm, 8 una certificación tradicional de Criterios Comunes EAL7 para 8,700 líneas de código C tomaría más de 45.9 años-persona. Eso significa que la verificación formal de implementación a nivel binario ya es más que un factor de 2.3 menos costoso que el nivel de certificación más alto de Criterios comunes, pero proporciona una garantía significativamente más sólida.