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 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]

Introducción

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]

Desafíos

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]

Áreas

Programación robusta

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.

Principios

Paranoia
Al crear software, el programador asume que los usuarios quieren descifrar 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 realizar entradas incorrectas, falsas y con formato incorrecto. [7] Como consecuencia, el programador devuelve al usuario un mensaje de error inequívoco e intuitivo 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, para que el problema pueda solucionarse con facilidad.
Implementos peligrosos
Los usuarios no deben obtener acceso a bibliotecas , estructuras de datos o punteros a estructuras de datos. [7] Esta información debe estar oculta al usuario para que no la modifique accidentalmente e introduzca un error en el código. Cuando dichas interfaces se construyen correctamente, los usuarios las utilizan sin encontrar lagunas para modificar la interfaz. La interfaz ya debería estar implementada correctamente, 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". Por lo tanto, se supone que los casos imposibles son muy 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 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]

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 redes 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]

Ver 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. ^ ab 1990. Glosario estándar de terminología de ingeniería de software del IEEE, IEEE Std 610.12-1990 define la robustez como "El grado en que un sistema o componente puede funcionar correctamente en presencia de entradas no válidas o condiciones ambientales estresantes".
  3. ^ Panadero, Jack W.; Schubert, Matías; 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). "Un ensayo sobre construcción de sistemas robustos" (PDF) . Grupos.csail.mit.edu . Consultado el 13 de noviembre de 2016 .
  5. ^ José, Joby (21 de septiembre de 2009). "Importancia de realizar 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 web: software robusto. "Un ensayo sobre construcción de sistemas robustos" (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 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, Martín C. (12 de julio de 2010). "Identificar automáticamente regiones de entrada y código críticos 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. S2CID  1147058.