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] .
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] .
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] .
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.
PrincipiosParanoia: 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.
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] .
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.
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] .
Calidad del software | |||||
---|---|---|---|---|---|
Características |
| ||||
Normas y recomendaciones |
| ||||
Procesos y Organizaciones |
|