Robustez (informática) - Robustness (computer science)

En informática , la robustez es la capacidad de un sistema informático para hacer frente a errores durante la ejecución y hacer frente a entradas erróneas. La robustez puede abarcar muchas áreas de la informática, como una programación robusta , un aprendizaje automático robusto y una red de seguridad robusta . Las técnicas formales, como las pruebas de fuzz , son esenciales para mostrar solidez, ya que este tipo de pruebas implica entradas no válidas o inesperadas. Alternativamente, la inyección de fallas se puede utilizar para probar la robustez. Varios productos comerciales realizan pruebas de robustez del análisis de software.

Introducción

En general, la construcción de 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. 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 tales casos. 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 el 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 debido a una entrada de usuario no válida. Los sistemas generalmente también pueden fallar debido a otras razones, como desconectarse de una red.

Independientemente, los sistemas complejos aún deben manejar correctamente cualquier error que se encuentre. Hay muchos ejemplos de sistemas tan exitosos. Algunos de los sistemas más robustos pueden evolucionar y adaptarse fácilmente a nuevas situaciones.

Desafíos

Los programas y el software son herramientas enfocadas en una tarea muy específica y, por lo tanto, no son generalizadas ni flexibles. Sin embargo, las observaciones en sistemas como Internet o 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 redundancia. Muchos órganos son redundantes en los humanos. El riñón es uno de esos ejemplos. Los seres 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 hace que sea más difícil de entender. 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 se rompe, otra que proporcione la misma función pueda reemplazarla, utilizando diversidad de software manual o automatizada . Para hacerlo, el nuevo código debe saber cómo y cuándo adaptarse al punto de falla. 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 hacer 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. Por el contrario, tienden a centrarse en la escalabilidad y la eficiencia . Una de las principales razones por las que hoy en día no se hace hincapié en la robustez es porque es difícil de hacer de manera general.

Áreas

Programación robusta

La programación robusta es un estilo de programación que se enfoca en manejar terminaciones inesperadas y acciones inesperadas. 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.

Principios

Paranoia
Al crear software, el programador asume que los usuarios están dispuestos a descifrar su código. El programador también asume que su propio código escrito puede fallar o funcionar incorrectamente.
Estupidez
El programador asume que los usuarios intentarán entradas incorrectas, falsas y mal formadas. Como consecuencia, el programador devuelve al usuario un mensaje de error intuitivo e inequívoco que no requiere buscar códigos de error. El mensaje de error debe intentar ser lo más preciso posible sin inducir a error al usuario, de modo que el problema se pueda solucionar con facilidad.
Implementos peligrosos
Los usuarios no deben tener acceso a bibliotecas , estructuras de datos o punteros a estructuras de datos. Esta información debe ocultarse al usuario para que el usuario no la modifique accidentalmente e introduzca un error en el código. Cuando tales interfaces se construyen correctamente, los usuarios las usan sin encontrar lagunas para modificar la interfaz. La interfaz ya debería estar correctamente implementada, por lo que el usuario no necesita realizar modificaciones. Por tanto, el usuario se centra únicamente en su propio código.
No puede suceder
Muy a menudo, el código se modifica y puede introducir la posibilidad de que ocurra un caso "imposible". En cambio, se supone que los casos imposibles son muy poco probables. El desarrollador piensa en cómo manejar el caso que es altamente improbable e implementa el manejo en consecuencia.

Aprendizaje automático robusto

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 sólido, el error de prueba debe ser coherente con el error de entrenamiento o el rendimiento es estable después de agregar algo de ruido al conjunto de datos.

Diseño de red robusto

El diseño de redes robustas es el estudio del diseño de redes frente a demandas variables o inciertas. En cierto sentido, la robustez en el diseño de redes es tan amplia como la robustez en el diseño de software debido a las amplias posibilidades de cambios o entradas.

Algoritmos robustos

Existen algoritmos que toleran errores en la entrada o durante el cálculo. En ese caso, el cálculo finalmente converge a la salida correcta. Este fenómeno se ha denominado "atracción por la corrección".

Ver también

Referencias