¿Por qué los programas tienen errores?
Probablemente deberíamos definir un error como cualquier cosa que haga que el software funcione de manera no intencionada.
Michael O. Church dio una gran respuesta. Voy a responder desde un punto de vista ligeramente diferente.
- ¿Cuál es el mejor software de edición de fotos para Linux?
- ¿Cuál es el mejor software para proyectar versículos bíblicos rápidamente mientras el pastor predica?
- ¿Puede ganar $ 1 millón USD vendiendo software de código abierto como propietario único? ¿Cuál es el valor de mercado del software de código abierto?
- ¿La revista International Journal of Advanced Research in Computer Science and Software Engineering (IJARCSSE) es falsa?
- ¿Cuáles son las aplicaciones de IoT?
Algunos de estos errores van a ser causados por problemas de hardware.
Estos pueden incluir fallas en el hardware (memoria o discos duros), desbordamientos de la pila o falta de memoria (que podría ser causada por el hardware en sí o por malas prácticas de programación si el programa asigna la memoria), o especialmente con Internet y el software distribuido , puede encontrarse con problemas derivados de la falta de comunicación debido a congestión u otro problema de red. Algunos programas pueden funcionar bien en una pieza de hardware pero fallar en otra, o incluso fallar si hay cierto otro software ejecutándose al mismo tiempo.
Los problemas de hardware pueden incluso involucrar algo tan simple como una batería con bajo voltaje que impide que el procesador funcione correctamente.
Algunos de estos errores serán causados por problemas de software.
Cuando el software está programado, a menudo espera que las entradas estén en un cierto rango, pero no está programado para manejar excepciones. Por ejemplo, si te pregunta tu edad y pones “A”, el software debe saber que esto no es válido. A veces faltan datos de entrada y se supone que son 0, lo que puede causar un error de división por cero. Esto puede deberse a la falta de previsión o la compensación entre la solidez y la finalización del software. Hay “esperar que la entrada sea correcta”, “detectar cuándo la entrada no es correcta” y “ser lo suficientemente robusto para manejar la entrada que no es correcta”.
El software a menudo se usa más allá de los parámetros de diseño previstos , lo que podría incluir situaciones como que todos intenten inscribirse en Obamacare de inmediato (sobrecarga) o el error Y2K. Esos programadores en la década de 1960 nunca esperaron que su software estuviera en uso 30 años después. O tal vez desborde el valor de la cantidad de milisegundos desde que se inicia el programa, lo que solo sucede si el programa está en funcionamiento continuo durante más de 38 días.
Algunos errores son causados por una simple programación descuidada o descuidada , que creará código que se ejecuta y no arroja un error, pero no funciona como se esperaba. Esto a menudo puede suceder si ejecuta un bucle incorrectamente o utiliza incorrectamente los índices de la matriz, por ejemplo. C ++ le permitirá intentar acceder a un valor de matriz que está fuera de los límites y devolver cualquier valor que esté en esa ubicación de memoria, mientras que otros lenguajes de programación arrojarán un error si intenta hacerlo.
El software a menudo depende de otro software. Cuando juegas a la última versión de Grand Theft Auto, los desarrolladores de juegos confían en los controladores para las tarjetas gráficas y el sistema operativo subyacente, por nombrar algunas cosas. Sin tener todo el código fuente, es imposible para ellos eliminar cada problema potencial. E incluso si tuvieran todo el código fuente, sería una tarea hercúlea. Su código tiene que ejecutarse en muchos sistemas operativos diferentes con muchas configuraciones de hardware diferentes y muchos controladores diferentes.
A menudo, los usuarios finales no saben lo que quieren. Esto significa que la especificación sigue cambiando, o peor, no hay especificación y el programa se convierte en la especificación. La mayoría de los proyectos tienen requisitos de diseño ligeramente fluidos, pero algunos son mucho peores que otros.
Errores interesantes que he visto
Un error interesante que vi fue causado por los diferentes formatos de fecha entre los EE. UU. (Mm-dd-aaaa) y Europa (dd-mm-aaaa). El programa funcionó bien en los EE. UU. Hasta el 13 del mes.
Otra buena que vi fue tratar de registrar un código de error en una tabla de base de datos. Desafortunadamente, el tipo de datos para el código de error no pudo manejar la gama completa de códigos de error, lo que en sí mismo causó su propio error (que no se pudo registrar).
También he visto incompatibilidades cuando se mezclan o combinan diferentes idiomas, como problemas con el escape de diferentes caracteres (especialmente los apóstrofes). El software funcionará bien hasta que alguien ponga un apellido como O’Hara.
El uso de variables con nombres similares también puede ser confuso. Es posible que tenga algo como un “x_val” y un “x_value”. O si sus variables tienen un alcance incorrecto, podría estar accediendo a una variable local cuando cree que está usando una global o viceversa.
Otra cosa que puede hacer que las cosas se rompan son las actualizaciones, ya sea de software o equipo. Puede configurar un nuevo servidor de base de datos pero no configurar las cuentas de usuario correctamente o actualizar la configuración en una pieza de software, lo que hará que ese software ya no funcione.
Con problemas en cualquier proyecto, se debe evaluar lo siguiente:
Gravedad
Probabilidad de ocurrencia
Probabilidad de detección
Lo que esto significa es que a través del ciclo de vida del software, los peores errores se corrigen primero, pero puede haber muchos más pequeños que permanecen en el código que tienen poco o ningún impacto y nunca se corrigen. A menudo, los errores requieren el conjunto perfecto de circunstancias antes de que ocurran, lo que los hace extremadamente difíciles de detectar.
Otros factores
Una cosa a tener en cuenta es que el código se usa a menudo en tantos lugares y tantas cosas dependen de él que cualquier cambio en una pieza crítica de código puede afectar literalmente a cientos de aplicaciones. A menudo es necesario asegurarse de que el código sea compatible con versiones anteriores antes de realizar cualquier cambio, o estar absolutamente seguro de que cierta funcionalidad puede ser desaprobada o eliminada.
Tenga en cuenta que incluso en un programa “simple” con 100 líneas de código, hay miles de decisiones que deben tomarse para que el programa funcione correctamente. Incluso con algunas malas decisiones, el programa puede funcionar correctamente la mayor parte del tiempo o el tiempo suficiente para ser útil, con la intención de solucionar cualquier problema que se encuentre a través del uso en la vida real.
También tenga en cuenta que cuando el software se desarrolla, no se desarrolla de forma lineal y, a menudo, lo desarrolla más de una persona. No es como leer una historia de principio a fin. Hay un objetivo general para lo que hace el software. Luego se crean esquemas para determinar qué módulos se necesitan. Se desarrollan algoritmos y estructuras de datos para cada módulo. Y una vez que se entiende, la codificación (y las pruebas) pueden comenzar. A menudo se hacen suposiciones durante todo el proceso para que el código pueda continuar desarrollándose y probado.