Como ingeniero de software, escribo mucho código para productos industriales. Cosas relativamente complicadas con clases, hilos, algunos esfuerzos de diseño, pero también algunos compromisos para el rendimiento. Realizo muchas pruebas, y estoy cansado de probar, así que me interesé en las herramientas de prueba formales, como Coq, Isabelle ... ¿Podría usar una de estas para probar formalmente que mi código está libre de errores y listo? ¿con eso? - pero cada vez que reviso una de estas herramientas, me alejo convencido de que son utilizables para la ingeniería de software cotidiana. Ahora, eso solo podría ser yo, y estoy buscando consejos / opiniones / ideas sobre eso :-)
Específicamente, tengo la impresión de que hacer que una de estas herramientas funcione para mí requeriría una gran inversión para definir adecuadamente al probador los objetos, métodos ... del programa en consideración. Entonces me pregunto si el probador no se quedaría sin energía dado el tamaño de todo con lo que tendría que lidiar. O tal vez tendría que deshacerme de los efectos secundarios (esas herramientas de prueba parecen funcionar realmente bien con lenguajes declarativos), y me pregunto si eso daría como resultado un "código probado" que no podría usarse porque no sería rápido o suficientemente pequeño. Además, no tengo el lujo de cambiar el idioma con el que trabajo, tiene que ser Java o C ++: no puedo decirle a mi jefe que voy a codificar en OXXXml de ahora en adelante, porque es el único idioma en que puedo probar la exactitud del código ...
¿Podría alguien con más experiencia en herramientas de prueba formal comentar? Nuevamente, me ENCANTARÍA usar una herramienta de prueba formal, creo que son geniales, pero tengo la impresión de que están en una torre de marfil que no puedo alcanzar desde la zanja de Java / C ++ ... (PS: I también LOVE Haskell, OCaml ... no me hagas una idea equivocada: soy un fanático de los lenguajes declarativos y las pruebas formales, solo estoy tratando de ver cómo podría hacer que esto sea realmente útil para la ingeniería de software)
Actualización: Dado que esto es bastante amplio, intentemos las siguientes preguntas más específicas: 1) ¿hay ejemplos de uso de probadores para probar la corrección de los programas industriales Java / C ++? 2) ¿Coq sería adecuado para esa tarea? 3) Si Coq es adecuado, ¿debería escribir el programa en Coq primero y luego generar C ++ / Java desde Coq? 4) ¿Podría este enfoque manejar optimizaciones de subprocesos y rendimiento?