stringtranslate.com

Robustez (informática)

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]

Introducción

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]

Desafíos

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]

Áreas

Programación robusta

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.

Principios

Paranoia
Al crear software, el programador asume que los usuarios están dispuestos a romper su código. [7] El programador también asume que su propio código escrito puede fallar o funcionar incorrectamente. [7]
Estupidez
El programador asume que los usuarios intentarán introducir datos de forma incorrecta, falsa o mal formada. [7] Como consecuencia, el programador devuelve al usuario un mensaje de error intuitivo y claro 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 pueda solucionarse con facilidad.
Herramientas peligrosas
Los usuarios no deberían tener acceso a bibliotecas , estructuras de datos o punteros a estructuras de datos. [7] Esta información debería estar oculta al usuario para que no la modifique accidentalmente e introduzca un error en el código. Cuando dichas interfaces están correctamente construidas, los usuarios las utilizan 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 lo tanto, el usuario se centra únicamente en su propio código.
No puede pasar
Muy a menudo, se modifica el código y puede introducir la posibilidad de que se produzca un caso "imposible". Por lo tanto, se supone que los casos imposibles son altamente improbables. [7] 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 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]

Diseño de red robusto

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.

Algoritmos robustos

Existen algoritmos que toleran errores en la entrada. [11]

Véase también

Referencias

  1. ^ "Un enfoque basado en modelos para pruebas de robustez" (PDF) . Dl.ifip.org . Consultado el 13 de noviembre de 2016 .
  2. ^ desde 1990. El Glosario estándar IEEE de terminología de ingeniería de software, IEEE Std 610.12-1990 define la robustez como "el grado en el que un sistema o componente puede funcionar correctamente en presencia de entradas no válidas o condiciones ambientales estresantes".
  3. ^ Baker, Jack W.; Schubert, Matthias; Faber, Michael H. (2008). "Sobre la evaluación de la robustez" (PDF) . Seguridad estructural . 30 (3): 253–267. doi :10.1016/j.strusafe.2006.11.004 . Consultado el 13 de noviembre de 2016 .
  4. ^ abcdefg Gerald Jay Sussman (13 de enero de 2007). "Building Robust Systems an essay" (PDF) . Groups.csail.mit.edu . Consultado el 13 de noviembre de 2016 .
  5. ^ Joseph, Joby (21 de septiembre de 2009). "Importancia de crear casos de prueba generalizados - Club de pruebas de software - Una comunidad de pruebas de software en línea". Club de pruebas de software . Consultado el 13 de noviembre de 2016 .
  6. ^ Agentes en la red: software robusto. "Building Robust Systems an essay" (PDF) . Cse.sc.edu . Consultado el 13 de noviembre de 2016 .
  7. ^ abcdef "Programación robusta". Nob.cs.ucdavis.edu . Consultado el 13 de noviembre de 2016 .
  8. ^ El Sayed Mahmoud. "¿Cuál es la definición de la robustez de un algoritmo de aprendizaje automático?" . Consultado el 13 de noviembre de 2016 .
  9. ^ Li, Linyi; Xie, Tao; Li, Bo (9 de septiembre de 2022). "SoK: Robustez certificada para redes neuronales profundas". arXiv : 2009.04131 [cs.LG].
  10. ^ "Diseño de red robusta" (PDF) . Math.mit.edu . Consultado el 13 de noviembre de 2016 .
  11. ^ Carbin, Michael; Rinard, Martin C. (12 de julio de 2010). "Identificación automática de regiones de entrada críticas y código en aplicaciones" (PDF) . Actas del 19.º simposio internacional sobre pruebas y análisis de software - ISSTA '10 . ACM. págs. 37–48. doi :10.1145/1831708.1831713. ISBN . 9781605588230.S2CID1147058  .​