Articulo de referencia

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 a entradas erróneas. [ 2 ] La robustez pued...

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 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 las redes de seguridad robustas . Las técnicas formales, como las pruebas de fuzzing , son esenciales para demostrar la robustez, ya que este tipo de pruebas implican entradas inválidas o inesperadas. Alternativamente, se puede utilizar la inyección deliberada de fallos para probar la robustez. [ 3 ] Varios productos comerciales realizan pruebas de robustez del análisis de software. [ 4 ]

Introducción

En general, construir sistemas robustos que abarquen todos los puntos de posible fallo es difícil debido a la gran cantidad de posibles entradas y combinaciones de entradas. [ 5 ] Dado que probar todas las entradas y combinaciones de entradas requeriría demasiado tiempo, los desarrolladores no pueden revisar todos los casos exhaustivamente. En cambio, el desarrollador intentará generalizar dichos casos. [ 6 ] Por ejemplo, imaginemos introducir algunos valores enteros . Algunas entradas seleccionadas podrían 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 números reales en tres números. Este es un método más eficiente y manejable, pero más propenso a fallos. La generalización de casos de prueba es un ejemplo de una técnica para abordar fallos, específicamente, fallos debidos a entradas de usuario no válidas. Los sistemas generalmente también pueden fallar por otras razones, como la desconexión de una red.

No obstante, los sistemas complejos deben gestionar adecuadamente cualquier error que se produzca. Existen numerosos ejemplos de sistemas exitosos. Algunos de los sistemas más robustos son evolutivos y pueden adaptarse fácilmente a nuevas situaciones. [ 5 ]

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. [ 5 ] 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 . [ 5 ] 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 permite margen de error. Este mismo principio puede aplicarse al software, pero existen algunos desafíos. Al aplicar el principio de redundancia a la informática, no se recomienda agregar código a ciegas. Agregar código a ciegas introduce más errores, hace que el sistema sea más complejo y dificulta su comprensión. [ 7 ] El código que no proporciona ningún refuerzo al código ya existente es indeseable. 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 automatizada . Para ello, el nuevo código debe saber cómo y cuándo adaptarse al punto de falla. [ 5 ] Esto significa que se necesita 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, este también se vuelve más complejo y los desarrolladores deben considerar cómo equilibrar la redundancia con la complejidad.

Actualmente, las prácticas de la informática no se centran en la construcción de sistemas robustos. [ 5 ] 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 resulta difícil implementarla de forma generalizada. [ 5 ]

Á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. [ 8 ] Requiere que el código gestione estas terminaciones y acciones de forma adecuada, 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 intentarán romper su código. [ 8 ] El programador también asume que su propio código escrito puede fallar o funcionar incorrectamente. [ 8 ]
Estupidez
El programador asume que los usuarios intentarán introducir datos incorrectos, erróneos o con formato incorrecto. [ 8 ] En consecuencia, el programador devuelve al usuario un mensaje de error claro e intuitivo que no requiere consultar códigos de error. El mensaje de error debe ser lo más preciso posible sin inducir a error al usuario, de modo que el problema pueda solucionarse fácilmente.
Herramientas peligrosas
Los usuarios no deben tener acceso a bibliotecas , estructuras de datos ni punteros a estructuras de datos. [ 8 ] Esta información debe permanecer oculta para que el usuario no la modifique accidentalmente e introduzca errores en el código. Cuando estas interfaces están correctamente construidas, los usuarios las utilizan sin encontrar vulnerabilidades para modificarlas. La interfaz ya debería estar correctamente implementada, por lo que el usuario no necesita realizar modificaciones. De esta manera, el usuario se centra exclusivamente en su propio código.
No puede suceder
Con frecuencia, el código se modifica y puede introducir la posibilidad de que ocurra un caso "imposible". Por lo tanto, se asume que los casos imposibles son altamente improbables. [ 8 ] El desarrollador piensa en cómo manejar el caso altamente improbable e implementa el manejo en consecuencia.

Aprendizaje automático robusto

El aprendizaje automático robusto generalmente se refiere a la robustez de los algoritmos de aprendizaje automático. Para que un algoritmo de aprendizaje automático se considere robusto, el error de prueba debe ser consistente con el error de entrenamiento, o el rendimiento debe ser estable después de agregar algo de ruido al conjunto de datos. [ 9 ] Recientemente, en consonancia con su creciente popularidad, ha habido un interés cada vez mayor en la robustez de las redes neuronales. Esto se debe particularmente a su vulnerabilidad a los ataques adversarios. [ 10 ]

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. [ 11 ] 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. [ 12 ]

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. 1 2 1990. El glosario estándar de terminología de ingeniería de software de la 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. Hsueh, Mei-Chen; Tsai, TK; Iyer, RK (1997). "Técnicas y herramientas de inyección de fallos". Computer . 30 (4): 75– 82. doi : 10.1109/2.585157 . hdl : 2060/19970022435 .
  4. 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 . Recuperado el 13 de noviembre de 2016 .
  5. 1 2 3 4 5 6 7 Gerald Jay Sussman (13 de enero de 2007). "Construyendo sistemas robustos: un ensayo" (PDF) . Groups.csail.mit.edu . Archivado del original (PDF) el 12 de agosto de 2017. Recuperado el 13 de noviembre de 2016 .
  6. Joseph, Joby (21 de septiembre de 2009). "Importancia de crear casos de prueba generalizados - Software Testing Club - Una comunidad en línea de pruebas de software" . Software Testing Club. Archivado del original el 24 de junio de 2016. Consultado el 13 de noviembre de 2016 .
  7. Agentes en la web : Software robusto. "Construyendo sistemas robustos: un ensayo" (PDF) . Cse.sc.edu . Consultado el 13 de noviembre de 2016 . 
  8. 1 2 3 4 5 6 "Programación robusta" . Nob.cs.ucdavis.edu . Consultado el 13 de noviembre de 2016 .
  9. 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 .
  10. Li, Linyi; Xie, Tao; Li, Bo (9 de septiembre de 2022). "SoK: Robustez certificada para redes neuronales profundas". arXiv : 2009.04131 [ cs.LG ].
  11. "Diseño de redes robustas" (PDF) . Math.mit.edu . Archivado del original (PDF) el 9 de septiembre de 2016. Consultado el 13 de noviembre de 2016 .
  12. 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. S2CID 1147058 .