sábado, 11 de febrero de 2012

Un concepto que puede volarnos la cabeza

Estoy leyendo un libro realmente muy interesante, aunque se que no les va a gustar a todos. Se trata de una metodología de desarrollo de software basada en iteraciones rápidas, conocido como agile programming. En particular se titula Engineering Long-Lasting Software: An Agile Approach Using Saas & Cloud Computing, escrito por Armando Fox y David Patterson, docentes de la universidad de Berkeley.

Dentro del libro encontré un concepto realmente interesante acerca del tiempo necesario para realizar pruebas de software realmente exhaustivas que contemplen todas las posibilidades. El caso presentado es un caso improbable, pero que realmente demuestra la imposibilidad de realizar pruebas realmente completas.

Supongamos que tenemos un programa que se ejecuta en un milisegundo, y que podemos automatizar para que se ejecute nuevamente una vez que finalizó la prueba anterior. Este programa tiene una sola entrada: un simple valor de 64 bits. Como cada bit puede tener dos estados, 0 y 1, y la posición de cada bit en el valor de entrada es importante, la evaluación de cada posición implica evaluar 2 elevado a la 64 potencia.

Con una calculadora podemos realizar algunos simples cálculos. La cantidad total de variaciones a probar es igual a 1.8446744073709551616e19, o sea una bestialidad de milisegundos, porque recordemos que cada ejecución del programa dura 1 milisegundo. Aclaremos que esto equivale a decir 1.8446744073709551616 multiplicado por 10 elevado a la 19 potencia.

Eso quiere decir que para obtener segundos deberemos dividir el número por mil, siendo el resultado 1.8446744073709551616e16, una bestialidad de segundos. Cada minuto está formado por 60 segundos, por lo que dividimos por 60 y obtenemos minutos. 3.07445734561825860267e14 minutos.

Para pasar a horas tenemos 60 minutos por hora, 5.12409557603043100444e12 horas, y 24 de ellas forman un día, 2.13503982334601291852e11. Finalmente, 365 días forman un año (no es exacto, pero es una buena aproximación). Esto nos da 5.84942417355072032471e8 años, o sea más de 500.000.000 años. La verdad es que es una cifra que impresiona.

Esta es la razón por la que la inmensa mayoría de los programas solo son probados con un conjunto de casos limitado, porque la verdad es que una prueba total es realmente imposible. Obviamente, programas con entradas más triviales llevan menos tiempo, porque cada prueba lleva más tiempo (1 milisegundo es solo para programas MUY simples), pero son menos combinaciones.

El problema es que a medida que aumenta la complejidad del software comenzamos a incorporar controles que pueden ocasionar problemas si se los activa en distintas combinaciones, y si tenemos 64 controles que pueden estar prendidos o apagados, tenemos esta bonita situación para probarlos todos.


4 comentarios:

  1. Y ahora el comentario es el siguiente: la próxima vez que me digan que la inteligencia artificial es segura, no les creo.

    ResponderEliminar
    Respuestas
    1. Así es, yo también tengo mis dudas sobre la inteligencia artificial, sobre todo porque están investigando como imitar la humana, y todos sabemos que la humana es falible.

      Eliminar
  2. Vaya comentario capullo!!!!!!!

    ResponderEliminar
    Respuestas
    1. Jajajaja, me encantaría que la gente que opina de esta forma diga quien es, así podemos entablar un diálogo para saber a que se quiso referir con este simpático exabrupto.

      Eliminar