En informática , la robustez es la capacidad de un sistema informático para hacer frente a errores durante la ejecución [1] [2] y hacer frente a entradas erróneas. [2] La robustez puede abarcar muchas áreas de la informática, como la programación robusta , el aprendizaje automático robusto y la red de seguridad robusta . Las técnicas formales, como las pruebas fuzz , son esenciales para demostrar la robustez, ya que este tipo de pruebas implican entradas no válidas o inesperadas. Alternativamente, se puede utilizar la inyección de fallas para probar la robustez. Varios productos comerciales realizan pruebas de robustez del análisis de software. [3]
En general, construir sistemas robustos que abarquen cada punto de posible falla es difícil debido a la gran cantidad de posibles entradas y combinaciones de entradas. [4] Dado que todas las entradas y combinaciones de entradas requerirían demasiado tiempo para probarse, los desarrolladores no pueden ejecutar todos los casos exhaustivamente. En cambio, el desarrollador intentará generalizar dichos casos. [5] Por ejemplo, imagine ingresar algunos valores enteros . Algunas entradas seleccionadas pueden consistir en un número negativo, cero y un número positivo. Al usar estos números para probar software de esta manera, el desarrollador generaliza el conjunto de todos los números reales en tres números. Este es un método más eficiente y manejable, pero más propenso a fallar. Generalizar los casos de prueba es un ejemplo de solo una técnica para lidiar con el fracaso, específicamente, el fracaso debido a una entrada de usuario no válida. Los sistemas generalmente también pueden fallar debido a otras razones, como la desconexión de una red.
De todas formas, los sistemas complejos deberían manejar con elegancia los errores que se presenten. Hay muchos ejemplos de sistemas que han tenido éxito. Algunos de los sistemas más robustos son evolucionables y pueden adaptarse fácilmente a nuevas situaciones. [4]
Los programas y el software son herramientas enfocadas en una tarea muy específica y, por lo tanto, no son generalizables ni flexibles. [4] Sin embargo, las observaciones en sistemas como Internet o los sistemas biológicos demuestran la adaptación a sus entornos. Una de las formas en que los sistemas biológicos se adaptan a los entornos es mediante el uso de la redundancia . [4] Muchos órganos son redundantes en los humanos. El riñón es un ejemplo de ello. Los humanos generalmente solo necesitan un riñón, pero tener un segundo riñón deja espacio para fallas. Este mismo principio puede aplicarse al software, pero existen algunos desafíos. Al aplicar el principio de redundancia a la informática, no se sugiere agregar código a ciegas. Agregar código a ciegas introduce más errores, hace que el sistema sea más complejo y lo hace más difícil de entender. [6] El código que no proporciona ningún refuerzo al código ya existente no es deseado. El nuevo código debe poseer, en cambio, una funcionalidad equivalente , de modo que si una función se rompe, otra que proporcione la misma función pueda reemplazarla, utilizando la diversidad de software manual o automatizada . Para hacerlo, el nuevo código debe saber cómo y cuándo adaptarse al punto de falla. [4] Esto significa que se debe agregar más lógica al sistema. Pero a medida que un sistema agrega más lógica, más componentes y aumenta de tamaño, se vuelve más complejo. Por lo tanto, al crear un sistema más redundante, el sistema también se vuelve más complejo y los desarrolladores deben considerar equilibrar la redundancia con la complejidad.
En la actualidad, las prácticas informáticas no se centran en la construcción de sistemas robustos. [4] En cambio, tienden a centrarse en la escalabilidad y la eficiencia . Una de las principales razones por las que hoy en día no se presta atención a la robustez es porque es difícil hacerlo de manera general. [4]
La programación robusta es un estilo de programación que se centra en el manejo de terminaciones y acciones inesperadas. [7] Requiere que el código maneje estas terminaciones y acciones de manera elegante mostrando mensajes de error precisos e inequívocos . Estos mensajes de error permiten al usuario depurar el programa con mayor facilidad.
El aprendizaje automático robusto se refiere generalmente a la solidez de los algoritmos de aprendizaje automático. Para que un algoritmo de aprendizaje automático se considere robusto, el error de prueba debe ser coherente con el error de entrenamiento o el rendimiento debe ser estable después de agregar algo de ruido al conjunto de datos. [8] Recientemente, en consonancia con su aumento de popularidad, ha habido un creciente interés en la solidez de las redes neuronales. Esto se debe particularmente a su vulnerabilidad a los ataques adversos. [9]
El diseño de red robusta es el estudio del diseño de red frente a demandas variables o inciertas. [10] En cierto sentido, la robustez en el diseño de red es amplia, al igual que la robustez en el diseño de software, debido a las vastas posibilidades de cambios o entradas.
Existen algoritmos que toleran errores en la entrada. [11]