Solo veo respuestas acerca de que somos humanos y propensos a errar, lo cual es muy cierto ... pero veo tu pregunta desde otro punto de vista.
Creo que puedes escribir programas sin errores, pero esos son típicamente programas que ya escribiste 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 tu mente. Todos los patrones están ahí, en todos los niveles.
Esto me pasa 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. Tengo un par o tres errores de compilación (en su mayoría errores tipográficos y otras cosas así) y eso es todo. Puedo hacer esto para programas pequeños, y también creo que algunas personas pueden hacerlo 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 puedes estar de un programador libre de errores. Si comprende las cosas profundamente, creo que puede 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 (llevo años haciendo eso), te confundirás y cometerás errores. Grandes errores como aquellos en los que repentinamente se da cuenta de que su solución no funciona, cuando finalmente comprende el problema, y tiene que hacer cambios tan complicados que podrían impedirle resolver su problema o hacer que el código sea horrible. TDD es para estos casos, creo. Usted sabe que no trata el problema que está abordando y, por lo tanto, realiza pruebas en todas partes para asegurarse de que tenga una base sólida. Sin embargo, TDD no resuelve la visión de 10,000 pies. Puede caminar en círculos con código perfectamente limpio todo el tiempo.
Sin embargo, si intentas hacer algo que es nuevo pero que está solo por encima de tu nivel, puedes obtener tu programa perfecto o casi perfecto. Creo que es realmente difícil saber qué programas se encuentran en su "frontera del conocimiento", pero en teoría esa es la mejor manera de aprender. Reescribo programas desde cero mucho, en realidad. Algunas personas lo hacen, pero necesitas mucho tiempo y paciencia porque la tercera vez que repites un programa no trivial no te emociona como la primera vez.
Así que mi consejo es: no creas que entiendes algo hasta que puedas escribir un programa sin errores solo para eso. Y luego intente combinar dos de esos conceptos que conoce profundamente en el mismo programa. Estoy casi seguro de que lo harás bien la primera vez. Una de las mejores maneras es reescribir el software no trivial, algo que requirió mucho esfuerzo la primera vez (lo estoy haciendo con las aplicaciones de Android en este momento). Cada vez que vuelvo a empezar, cambio algo o agrego cosas, solo para agregar un poco de diversión, y puedo decirte que mejoro y mejor y mejor ... tal vez no esté libre de errores pero realmente orgulloso.