Confiabilidad (ciencias de la computación)

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 19 de mayo de 2021; las comprobaciones requieren 4 ediciones .

En ciencias de la computación (informática), la confiabilidad  es la capacidad de un sistema informático para hacer frente a datos erróneos y errores durante la ejecución de tareas [1] [2] . La confiabilidad puede cubrir muchas áreas de la informática , como programación confiable , aprendizaje automático confiable y seguridad de red confiable. Los métodos formales, como las pruebas difusas, son importantes para demostrar la confiabilidad porque este tipo de prueba implica entradas incorrectas o inesperadas. Alternativamente, se puede usar una falla del sistema en ejecución para probar la estabilidad. Varios productos comerciales realizan pruebas de confiabilidad a través del análisis de software [3] .

Introducción

En general, la creación de sistemas confiables que cubran cada punto de posible falla es difícil debido a la gran cantidad de entradas posibles y sus combinaciones [4] . Dado que llevaría demasiado tiempo probar todas las entradas y sus combinaciones, los desarrolladores no pueden investigar exhaustivamente todos los casos. En su lugar, el desarrollador intentará generalizar tales casos [5] . Por ejemplo, imagine que está ingresando 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 casos a 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 un solo método para tratar un problema de falla, es decir, un error debido a una entrada de usuario no válida. Por lo general, los sistemas también pueden fallar por otras razones, como desconectarse de la red.

Aun así, los sistemas complejos deben manejar cualquier error. Hay muchos ejemplos de tales sistemas exitosos. Algunos de los sistemas más robustos están evolucionando y se pueden adaptar fácilmente a nuevas situaciones [4] .

Problemas

Los programas y el software son herramientas enfocadas a una tarea muy específica, y por lo tanto no son generalizadas y flexibles [4] . Sin embargo, las observaciones de sistemas como Internet o los sistemas biológicos muestran una característica tan importante como la adaptación al medio . Una forma de adaptar los sistemas biológicos al medio ambiente es utilizar la redundancia [4] . Muchos órganos son funcionalmente redundantes en un organismo biológico. Por ejemplo, el riñón es uno de esos ejemplos. Por lo general, las personas solo necesitan un riñón, pero tener un segundo riñón preserva las capacidades del cuerpo cuando falla el primero. El mismo principio se puede aplicar al software, pero hay algunos problemas. Cuando se aplica el principio de redundancia a la informática, se desaconseja la adición de código ciego. Agregar código a ciegas conduce a más errores, complica el sistema y lo hace más difícil de entender [6] . El código que no proporciona refuerzo para el código ya existente no es deseable. En su lugar, el nuevo código debe tener una funcionalidad equivalente, de modo que si una función falla, el código que proporciona la misma función puede reemplazarla mediante el espaciado de software manual o automático. Para ello, el nuevo código debe saber cómo y cuándo considerar el punto de fallo [4] . Esto significa que se necesita agregar más lógica al sistema. Pero a medida que el sistema agrega más lógica, componentes y crece en tamaño, se vuelve más y más complejo. Por lo tanto, al construir un sistema más redundante, también se vuelve más complejo y los diseñadores deben considerar equilibrar la redundancia con la complejidad.

Actualmente, las tecnologías informáticas no están dirigidas a crear sistemas fiables [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 se descuida la fiabilidad es que es difícil hacerlo de forma general [4] .

Áreas

Programación confiable

la programación confiable es un estilo de programación que se enfoca en manejar terminaciones inesperadas y acciones inesperadas [7] . Se utiliza un código especial para manejar correctamente estas finalizaciones y acciones al mostrar mensajes de error precisos e inequívocos. Estos mensajes de error facilitan al usuario la personalización del programa.

Principios

Paranoia: al crear software, el programador asume que los usuarios quieren descifrar su código. El programador también asume que su propio código escrito puede no funcionar o funcionar incorrectamente.

Estupidez: el programador asume que los usuarios intentarán ingresar datos incorrectos, falsos e incorrectos. Como consecuencia, el programador devuelve un mensaje de error inequívoco e intuitivo al usuario que no requiere buscar códigos de error. El mensaje de error debe ser lo más preciso posible sin confundir al usuario para que el problema se pueda solucionar fácilmente.

Herramientas peligrosas: los usuarios no deben acceder a bibliotecas, estructuras de datos o punteros a estructuras de datos. Esta información debe ocultarse al usuario para que no pueda cambiarla accidentalmente e introducir un error en el código. Cuando dichas interfaces se construyen correctamente, los usuarios las usan sin encontrar lagunas para cambiar la interfaz. La interfaz ya debería estar implementada correctamente, por lo que el usuario no necesita realizar cambios. Por lo tanto, el usuario se enfoca únicamente en su código.

No puede suceder  : muy a menudo, el código se modifica y puede llevar al caso "imposible". Por lo tanto, se supone que los casos imposibles son extremadamente improbables. El desarrollador entiende cómo manejar los casos que son extremadamente improbables e implementa el diseño 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 confiable, el error de prueba debe coincidir con el error de entrenamiento o el rendimiento debe permanecer estable después de agregar algo de ruido al conjunto de datos [8] .

Diseño de red robusta

El diseño robusto de redes es el estudio del diseño de redes bajo requisitos variables o inciertos [9] . En cierto sentido, la confiabilidad en el diseño de redes es tan amplia como en el diseño de software, debido a las amplias posibilidades de cambio o entrada.

Algoritmos confiables

Hay algoritmos que cometen errores en los datos de entrada [10] o durante los cálculos [11] . En este caso, los cálculos eventualmente convergen a la conclusión correcta. Este fenómeno ha sido llamado "correctnesstraction" (atracción de la corrección en inglés) [11] .

Notas

  1. Un enfoque basado en modelos para pruebas de robustez  // Dl.ifip.org. Consultado el 13 de noviembre de 2016. Archivado el 24 de noviembre de 2020.
  2. 1990. El glosario estándar de terminología de ingeniería de software de IEEE, estándar IEEE 610.12-1990, define la confiabilidad como "el grado en que un sistema o componente puede funcionar correctamente en presencia de entradas incorrectas o condiciones ambientales estresantes".
  3. Jack W. Baker, Matthias Schubert, Michael H. Faber. Sobre la evaluación de la robustez  // Seguridad Estructural 30. - 2008. - Nº 30 . — S. 253–267 . -doi : 10.1016/ j.strusafe.2006.11.004 . Archivado el 25 de noviembre de 2020.
  4. ↑ 1 2 3 4 5 6 7 Gerald Jay Sussman. Creación de sistemas robustos un ensayo  // Groups.csail.mit.edu. Consultado el 13 de noviembre de 2016. - 13 de enero de 2007. Archivado desde el original el 12 de agosto de 2017.
  5. José, Joby. Importancia de hacer 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-11-2016. - 21-09-2009. Archivado desde el original el 24 de junio de 2016.
  6. Creación de sistemas robustos un ensayo  // Agentes en la web: Software robusto: Cse.sc.edu. Consultado el 13 de noviembre de 2016. Archivado desde el original el 25 de enero de 2020.
  7. Programación robusta . Nob.cs.ucdavis.edu. (Consultado el 13 de noviembre de 2016). Consultado el 18 de febrero de 2020. Archivado desde el original el 17 de febrero de 2020.
  8. El Sayed Mahmud. ¿Cuál es la definición de la robustez de un algoritmo de aprendizaje automático? . puerta de la investigación. Consultado el 13 de noviembre de 2016. Consultado el 23 de febrero de 2020. Archivado desde el original el 14 de noviembre de 2020.
  9. Diseño de red robusto (enlace descendente) . Matemáticas.mit.edu. Consultado el 13 de noviembre de 2016. Consultado el 24 de febrero de 2020. Archivado desde el original el 9 de septiembre de 2016. 
  10. Carbin, Michael; Rinard, Martin C. Identificación automática de regiones de entrada críticas y código en aplicaciones  // Actas del 19º simposio internacional sobre pruebas y análisis de software - ISSTA '10. — págs. 37–48 . — ISBN 9781605588230 . -doi : 10.1145/ 1831708.1831713 . Archivado desde el original el 13 de noviembre de 2019.
  11. ↑ 1 2 Danglot, Benjamín; Preux, Philippe; Baudry, Benoit; Monperrus, Martín. Atracción de corrección: un estudio de la estabilidad del comportamiento del software bajo perturbaciones en tiempo de ejecución  // Ingeniería de software empírica. 23(4). - 21 de diciembre de 2017. - S. 2086-2119 . -doi : 10.1007/ s10664-017-9571-8 . -arXiv : 1611.09187 . _ Archivado desde el original el 24 de febrero de 2020.