¿Por que el software tiene errores? ¿Aceptamos errores como un subproducto natural del diseño de vanguardia?

Comencé a trabajar como Especialista Regional de Soporte de Software para una (entonces) gran empresa de computadoras en 1968. Durante gran parte de mi carrera inicial, fui un “depurador” del software del sistema. La mayoría de los errores se introdujeron en las nuevas versiones de los compiladores de lenguaje y sistemas operativos, mis especialidades. Cada vez que salía un nuevo lanzamiento, teníamos que obligar a nuestros clientes a usarlo con la amenaza de que dejaríamos de admitir los lanzamientos anteriores (era solo una amenaza porque nuestra base de clientes, principalmente las principales compañías automotrices, tenía bastante influencia para obtener lo que querían en la forma de soporte de software).
Los errores son simplemente una función de la falibilidad humana y la imperfección. Algunos desarrolladores, especialmente los más nuevos, cometen errores al agregar nuevas características a un producto existente y en su mayoría funciona correctamente. Por lo que he visto de las cosas y aplicaciones de Microsoft como Quora, las cosas no han mejorado con los años, sino que han empeorado considerablemente.
Un ejemplo sería el primer error del compilador de Cobol que solucioné poco después de que me mudé al trabajo: uno de nuestros clientes de Ford se quejó de que con la última versión, la función de cinta de salida de registro de longitud variable dejó de funcionar correctamente (el segundo o más tarde carretes de la cinta no tenía registros más largos que el último registro de la cinta anterior). Para resumir (5 días), un desarrollador, que implementó la nueva función de máquina de escribir de la consola, decidió “reutilizar” un campo de dirección existente (aparentemente para ahorrar memoria (?)). Su uso de ese campo durante la generación de mensajes de la máquina de escribir de intercambio de carrete de salida había estropeado el punto final del búfer para los siguientes registros (puntuación).
Después de informar la causa y la corrección del error, el desarrollador anterior, a pedido de Ford, recibió un disparo al amanecer de la mañana siguiente.

Hay muchos tipos de errores. Algunos de ellos son prevenibles, con un esfuerzo razonable y algunos de ellos son realmente difíciles de prevenir. La primera clase de errores que se pueden evitar son aquellos en los que faltaba el diseño o la atención del desarrollador. La segunda clase de errores, que son un poco más difíciles de detectar, es cuando los componentes desarrollados por diferentes desarrolladores necesitan trabajar juntos. La falta de sincronización entre los desarrolladores causa errores. La siguiente clase es el hardware o las dependencias del sistema operativo. Algunos de esos errores no se pueden evitar, ya que no se probaron o no pudieron probarse de manera realista (en el caso de que se publique un nuevo HW y el proveedor de software no tuvo la influencia adecuada con el proveedor de Hardware para poder probar / certificar su solución antes del lanzamiento).

Entonces diría que siempre se esperan errores, pero hay demasiados o demasiado obvios, realmente molesta a los usuarios (más en algunos países que en otros).

La razón principal por la que tenemos errores en el código es porque los desarrolladores a menudo son presionados para cumplir con plazos artificiales y necesitan ir rápido. Los principios SÓLIDOS rara vez se siguen.

Además de lo que dijo Ryan …

Los errores ocurren debido a las matemáticas descuidadas.

Tomar atajos que parecen correctos no es necesariamente correcto. También es posible dejar accidentalmente algo fuera.