Essencialmente, não, mas você deve fazer o seu melhor de qualquer maneira. Vou explicar o porquê (ou pule para a conclusão, se você não tiver paciência suficiente)
Considere um problema tão trivial quanto a implementação da pesquisa binária. Uma implementação muito popular teve um bug que não foi detectado por cerca de duas décadas. Se vinte linhas levam vinte anos para que o uso livre de bugs seja amplamente utilizado e até supostamente correto, podemos realmente esperar que um programa enorme seja livre de bugs?
Quantos erros podemos esperar que um programa enorme tenha? Um número que encontrei foi "10 defeitos por 1000 linhas" (Code Complete 2nd edition, página 517 - apenas usou um exemplo, sem citar dados). Isso nos dá de 200.000 a 300.000 erros no seu software. Felizmente, temos maneiras de melhorar a qualidade do programa. Testes de unidade, revisões de código e testes manuais comuns são conhecidos por reduzir o número de bugs. Ainda assim, o número ainda será alto.
Se pudéssemos resolver 95% de todos os erros, isso seria incrível. E ainda teríamos de 10.000 a 15.000 bugs no software.
Felizmente, como o software é amplamente utilizado (e, portanto, amplamente testado), serão encontrados erros. Então, gradualmente teremos menos bugs. No entanto, menos erros também significam que os restantes são mais difíceis de encontrar - portanto, não espere uma curva linear na correção de erros. Os últimos erros vai ser muito complicado encontrar e poderia escapar à detecção por vários anos (assumindo que eles estão sempre encontrado).
Você também parece estar assumindo erroneamente que, se o software não mudar, nenhum novo erro será exibido. Se o software depender de bibliotecas de terceiros, novas versões poderão quebrar alguns recursos - introduzindo novos erros, mesmo que o código do aplicativo ainda seja o mesmo. Novos sistemas operacionais também podem interromper um aplicativo que funcionava perfeitamente perfeitamente (consulte o Windows Vista para obter um exemplo popular). Considere também erros do compilador, etc.
Não está claro se as ferramentas à prova de código podem realmente resolver o problema do software de buggy. Certamente não é possível resolver o problema de interrupção de nenhum programa, mas pode ser possível provar que um programa se comporta conforme especificado ... Mas e daí? Talvez o programa de provas tenha um bug. Talvez a especificação em si tenha um erro.
Claramente, podemos reduzir bastante o número de bugs, mas é muito improvável que cheguemos a zero.
Porque existe alguma noção de que toda correção que você cria cria mais bugs, mas não acho que isso seja verdade.
(enfase adicionada)
Você está certo. Esta afirmação está errada. Aqui está um exemplo:
int main() {
int x[10];
x[10] = 8; //Buffer overflow here
return 0;
}
Agora, vamos corrigir este bug:
int main() {
int x[11];
x[10] = 8; //No buffer overflow here
return 0;
}
Vejo? Corrigimos um erro e não introduzimos novos.
No entanto, é certamente correto que toda vez que você conserte um erro, arrisque criar um novo, embora esse risco possa ser mitigado (por exemplo, com testes de unidade).
Digamos que, para cada 100 bugs corrigidos, introduzo acidentalmente um novo. Portanto, se eu corrigir 10.000 erros, apresento 100 novos erros. E se eu corrigir esses novos erros, apresento um erro. Mas e daí? O programa agora possui 9.999 bugs a menos, então provavelmente é melhor do que era (assumindo que o novo bug não seja 10.000 vezes pior que os anteriores).
Além disso, a correção de um bug pode expor novos. Mas esses erros também podem ser corrigidos. Se você fizer as coisas corretamente, eventualmente o software estará em um estado melhor do que o iniciado.
Eu era velho por alguns programadores de destaque que é melhor não corrigir muitos bugs por causa da noção que mencionei no OP.
Esse comportamento é negligente. Se houver um erro e você pode corrigi-lo. Faça. É claro que você deve fazer o possível para evitar a adição de novos, mas se eu apresentar um pequeno bug para cada 10 erros graves que eu corrigir, esse não é um motivo válido para parar de corrigir erros. De fato, é uma boa razão para continuar corrigindo bugs .
Portanto, menos bugs corrigidos, menos bugs voltarão para você no futuro
Quanto menos erros você consertar, mais erros permanecerão no seu software, incomodando os usuários. De fato, eles não "voltarão para você no futuro". Eles não vão voltar porque nunca foram embora. A noção de "voltar" está relacionada a regressões. Novamente, é possível reduzir o risco de regressões.
Alguns bugs não podem ser corrigidos porque se tornaram tão amplamente utilizados que as pessoas começaram a depender deles e a correção do bug interromperia o programa para esses usuários. Acontece. No entanto, eles podem realmente ser considerados erros nesse caso?
A mentalidade "conserte um bug, faça um bug" pode estar relacionada ao monstro horrível - código que é tão ilegível e impossível de manter que apenas tocá-lo cria bugs. Se você tem um monstro em sua base de código, pode ser necessário desmonstrificá-lo antes de fazer qualquer coisa.
Finalmente, se você é um péssimo programador, existe o risco de que qualquer coisa que você toque crie novos bugs. Obviamente, isso deixaria programadores seniores nervosos. No entanto, dizendo "Não faça nada. Não toque em nada. Nem respire". provavelmente não é o caminho certo para criar um ambiente de trabalho saudável. A educação é melhor.
Conclusão:
- Software que continua recebendo toneladas de novos recursos, mas nenhuma correção de bug inevitavelmente será péssima.
- O software que obtém um número moderado de novos recursos, mas corrige seus erros, tem mais chances de ser utilizável.
- Aqueles que tentam ter poucos erros têm (em média) menos erros do que aqueles que não se importam.
- Não é razoável esperar que um programa acabe ficando livre de erros.
- Programadores seniores não são necessariamente competentes.
- Corrija seus erros.
- Adote metodologias que melhorem a qualidade do seu software.