Solo veo respuestas sobre nosotros siendo humanos y propensos a errar, lo cual es muy cierto ... pero veo tu pregunta desde otro punto de vista.
Creo que puedes escribir programas libres de errores, pero por lo general son programas que ya has escrito 10 o 12 veces. La 13ª vez que escribe el mismo programa desde cero, ya sabe cómo hacerlo: conoce el problema, conoce las técnicas, conoce las bibliotecas, el idioma ... lo ve en su mente. Todos los patrones están ahí, en todos los niveles.
Esto me sucede con programas muy simples porque enseño programación. Son simples para mí, pero difíciles para los estudiantes. Y no estoy hablando de soluciones a problemas que he hecho muchas, muchas veces en la pizarra. Por supuesto que los conozco. Me refiero a ~ programas de 300 líneas que resuelven algo usando conceptos que conozco muy bien (los conceptos que enseño). Escribo estos programas sin planificación y simplemente funcionan, y siento que conozco todos los detalles, no necesito TDD en absoluto. Recibo un par o tres errores de compilación (principalmente errores tipográficos y otras cosas por el estilo) y eso es todo. Puedo hacer esto para programas pequeños, y también creo que algunas personas pueden hacer eso para programas más complicados. Creo que personas como Linus Torvalds o Daniel J. Bernstein tienen tanta claridad mental que son lo más cerca que se puede estar de un codificador libre de errores. Si tuentiendo las cosas profundamente, creo que puedes hacerlo. Solo puedo hacer esto para programas simples, como dije.
Creo que si siempre intentas hacer programas que están muy por encima de tu nivel (he pasado años haciendo eso), te confundirás y cometerás errores. Grandes errores como aquellos en los que de repente te das cuenta de que tu solución no puede funcionar, cuando finalmente entiendes el problema, y tienes que hacer cambios tan complicados que podrían impedirte resolverlo o hacer que el código sea horrible. TDD es para estos casos, creo. Usted sabe que no entiende el problema que está abordando y, por lo tanto, realiza pruebas en todas partes para asegurarse de tener una base sólida. Sin embargo, TDD no resuelve la visión de 10,000 pies. Puede caminar en círculos con un código perfectamente limpio todo el tiempo.
Sin embargo, si intenta hacer algo que es nuevo, sino que es simplemente por encima de su nivel, es posible obtener su programa perfecto o casi perfecto. Creo que es realmente difícil saber qué programas están en su "frontera del conocimiento", pero en teoría esa es la mejor manera de aprender. Reescribo mucho los programas desde cero. Algunas personas lo hacen, pero necesita mucho tiempo y paciencia porque la tercera vez que repite un programa no trivial no se emociona como la primera vez.
Así que mi consejo es: no creas que entiendes algo hasta que puedas escribir un programa libre de errores solo para esa cosa. Y luego intente combinar dos de esos conceptos que conoce profundamente en el mismo programa. Estoy casi seguro de que lo hará bien la primera vez. Una de las mejores formas es reescribir el software no trivial, algo que requirió mucho esfuerzo la primera vez (estoy haciendo esto con las aplicaciones de Android en este momento). Cada vez que empiezo de nuevo, cambio algo o agrego cosas, solo para agregar un poco de diversión, y puedo decirte que cada vez estoy mejor y mejor ... tal vez no esté libre de errores, pero estoy realmente orgulloso.