Esencialmente, no, pero deberías hacer tu mejor esfuerzo de todos modos. Explicaré por qué (o simplemente salte a la conclusión si no tiene suficiente paciencia)
Considere un problema tan trivial como la implementación de la búsqueda binaria. Una implementación muy popular tenía un error que no se detectó durante aproximadamente dos décadas. Si veinte líneas tardan veinte años en liberarse de errores y se usan ampliamente e incluso se supone que son correctas, ¿podemos esperar que un gran programa esté libre de errores?
¿Cuántos errores podemos esperar que tenga un gran programa de todos modos? Un número que encontré fue "10 defectos por 1000 líneas" (Code Complete 2nd edition, página 517 - simplemente usé un ejemplo, sin citar ningún dato) Eso nos da alrededor de 200 000 a 300 000 errores en su software. Afortunadamente, tenemos formas de mejorar la calidad del programa. Se sabe que las pruebas unitarias, las revisiones de códigos y las pruebas manuales comunes reducen la cantidad de errores. Aún así, el número seguirá siendo alto.
Si pudiéramos resolver el 95% de todos los errores, sería increíble. Y, sin embargo, todavía tendríamos entre 10 000 y 15 000 errores en el software.
Afortunadamente, dado que el software es ampliamente utilizado (y, por lo tanto, ampliamente probado), se encontrarán errores. Entonces, gradualmente obtendremos menos errores. Sin embargo, menos errores también significan que los restantes son más difíciles de encontrar, así que no esperes una curva lineal en la corrección de errores. Los últimos errores va a ser muy difícil de encontrar y podrían no ser detectados por varios años (suponiendo que están cada vez encontrados).
También parece estar asumiendo erróneamente que si el software no cambia, no aparecerán nuevos errores. Si el software depende de bibliotecas de terceros, las nuevas versiones pueden romper algunas características, introduciendo nuevos errores a pesar de que el código de la aplicación sigue siendo el mismo. Los nuevos sistemas operativos también pueden romper una aplicación que anteriormente funcionaba perfectamente (consulte Windows Vista para ver un ejemplo popular). Considere también los errores del compilador, etc.
No está claro si las herramientas de prueba de código realmente pueden resolver el problema del software con errores. Ciertamente no es posible resolver el problema de detención de ningún programa, pero podría ser posible demostrar que un programa se comporta como se especifica ... ¿Pero entonces qué? Tal vez el programa de prueba tiene un error. Tal vez la especificación en sí tiene un error.
Claramente, podemos reducir en gran medida la cantidad de errores, pero es muy poco probable que lleguemos a cero.
Debido a que existe la noción de que cada corrección que haces crea más errores, pero no creo que sea cierto.
(énfasis añadido)
Estás en lo correcto. Esta afirmación está mal. Aquí hay un ejemplo:
int main() {
int x[10];
x[10] = 8; //Buffer overflow here
return 0;
}
Ahora, arreglemos este error:
int main() {
int x[11];
x[10] = 8; //No buffer overflow here
return 0;
}
¿Ver? Arreglamos un error y no introdujimos nuevos.
Sin embargo, es cierto que cada vez que arregla un error corre el riesgo de crear uno nuevo, aunque este riesgo puede mitigarse (por ejemplo, con pruebas unitarias).
Digamos que por cada 100 errores que soluciono, accidentalmente introduzco uno nuevo. Entonces, si corrijo 10 000 errores, presento 100 nuevos errores. Y si corrijo esos nuevos errores, presento un error. ¿Y qué? El programa ahora tiene 9 999 errores menos, por lo que probablemente sea mejor de lo que era (suponiendo que el nuevo error no sea 10 000 veces peor que los anteriores).
Además, arreglar un error puede exponer otros nuevos. Pero esos errores también pueden repararse. Si haces las cosas bien, eventualmente el software estará en un mejor estado del que comenzó.
Algunos programadores principales me dijeron que es mejor no corregir muchos errores debido a la noción que mencioné en el OP.
Este comportamiento es negligente. Si hay un error y puedes arreglarlo. Hazlo. Por supuesto, debe hacer todo lo posible para evitar agregar nuevos, pero si introduzco un pequeño error por cada 10 errores graves que soluciono, esa no es una razón válida para dejar de corregirlos. De hecho, es una buena razón para seguir arreglando errores .
Así que menos errores que arregles, menos errores volverán a ti en el futuro
Cuantos menos errores solucione, más errores permanecerán en su software, lo que molestará a sus usuarios. De hecho, no "volverán a ti en el futuro". No volverán porque nunca se fueron en primer lugar. La noción de "volver" está relacionada con las regresiones. Nuevamente, es posible reducir el riesgo de regresiones.
Algunos errores no se pueden corregir porque se usaron tanto que la gente comenzó a depender de ellos y corregir el error rompería el programa para esos usuarios. Sucede. Sin embargo, ¿pueden realmente considerarse errores en ese caso?
La mentalidad de "arreglar un error, hacer un error" podría estar relacionada con ese monstruo horrible , un código que es tan ilegible e imposible de mantener que simplemente tocarlo crea errores. Si tiene un monstruo en su base de código, es posible que primero necesite des-monstruificarlo antes de hacer algo.
Finalmente, si eres un programador terrible, existe el riesgo de que cualquier cosa que toques cree nuevos errores. Obviamente, esto pondría nerviosos a los programadores senior. Sin embargo, decir "No hagas nada. No toques nada. Ni siquiera respires". Probablemente no sea la forma correcta de crear un ambiente de trabajo saludable. La educación es mejor.
Conclusión:
- El software que sigue obteniendo toneladas de nuevas características, pero sin correcciones de errores, inevitablemente apestará.
- El software que obtiene un número moderado de nuevas características pero soluciona sus errores tiene más posibilidades de ser utilizable.
- Los que intentan tener pocos errores tienen (en promedio) menos errores que los que no les importan.
- No es razonable esperar que un programa finalmente se vuelva libre de errores.
- Los programadores senior no son necesariamente competentes.
- Arregla tus errores.
- Adopte metodologías que mejoren la calidad de su software.