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 programación robusta , aprendizaje automático robusto y red de seguridad robusta . Las técnicas formales, como las pruebas difusas , son esenciales para mostrar solidez, ya que este tipo de pruebas implica 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 todos los puntos de posible falla es difícil debido a la gran cantidad de entradas y combinaciones de entradas posibles. [4] Dado que todas las entradas y combinaciones de entradas requerirían demasiado tiempo para probarlas, los desarrolladores no pueden analizar todos los casos de manera exhaustiva. En cambio, el desarrollador intentará generalizar estos 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. Cuando se utilizan estos números para probar software de esta manera, el desarrollador generaliza el conjunto de todos los reales en tres números. Este es un método más eficiente y manejable, pero más propenso a fallar. La generalización de casos de prueba es un ejemplo de una sola técnica para lidiar con fallas, específicamente, fallas debidas a entradas no válidas del usuario. En general, los sistemas también pueden fallar por otras razones, como desconectarse de una red.
Independientemente, los sistemas complejos aún deberían manejar cualquier error encontrado con gracia. Hay muchos ejemplos de sistemas exitosos. Algunos de los sistemas más sólidos son evolucionables y pueden adaptarse fácilmente a nuevas situaciones. [4]
Los programas y el software son herramientas centradas en una tarea muy específica y, por tanto, no son generalizados ni flexibles. [4] Sin embargo, las observaciones en sistemas como Internet o sistemas biológicos demuestran 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 redundancia . [4] Muchos órganos son redundantes en los humanos. El riñón es un ejemplo de ello. Los seres humanos generalmente solo necesitan un riñón, pero tener un segundo riñón deja espacio para el fracaso. 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. En cambio, el nuevo código debe poseer una funcionalidad equivalente , de modo que si una función falla, otra que proporcione la misma función pueda reemplazarla, utilizando diversidad de software manual o automatizado . Para hacerlo, el nuevo código debe saber cómo y cuándo acomodar el punto de falla. [4] Esto significa que es necesario agregar más lógica al sistema. Pero a medida que un sistema agrega más lógica, 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.
Actualmente, las prácticas informáticas no se centran en la construcción de sistemas robustos. [4] Más bien, 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 manejar terminaciones inesperadas y acciones inesperadas. [7] Requiere código para manejar estas terminaciones y acciones con elegancia mostrando mensajes de error precisos e inequívocos . Estos mensajes de error permiten al usuario depurar el programa más fácilmente.
El aprendizaje automático robusto generalmente se refiere 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 interés creciente 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 redes 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]