Eu só vejo respostas sobre nós sermos humanos e propensos a errar, o que é muito verdadeiro ... mas eu vejo sua pergunta de outro ponto de vista.
Eu acho que você pode escrever programas sem erros, mas esses normalmente são programas que você escreveu já 10 ou 12 vezes. A 13ª vez que você escreve o mesmo programa do zero, você já sabe como fazê-lo: você conhece o problema, conhece as técnicas, conhece as bibliotecas, a linguagem ... você vê sua mente. Todos os padrões estão lá, em todos os níveis.
Isso acontece comigo com programas muito simples porque eu ensino programação. Eles são simples para mim, mas difíceis para os alunos. E não estou falando de soluções para problemas que tenho feito muitas e muitas vezes no quadro negro. Claro que eu sei disso. Quero dizer programas de ~ 300 linhas que resolvem algo usando conceitos que conheço muito bem (os conceitos que eu ensino). Eu escrevo estes programas sem planejamento e eles simplesmente funcionam, e eu sinto que conheço todos os detalhes, eu não preciso de TDD. Eu recebo um par ou três erros de compilação (principalmente erros de digitação e outras coisas assim) e é isso. Eu posso fazer isso para pequenos programas, e também acredito que algumas pessoas podem fazer isso para programas mais complicados. Eu acho que pessoas como Linus Torvalds ou Daniel J. Bernstein têm essa clareza de espírito, elas são as mais próximas que você pode chegar de um codificador sem erros. Se você entender as coisas profundamente, eu acho que você pode fazer isso. Eu só posso fazer isso por programas simples, como eu disse.
Acredito que, se você sempre tentar fazer programas que estão muito acima do seu nível (passei anos fazendo exatamente isso), você ficará confuso e cometerá erros. Grandes erros como aqueles em que você de repente percebe que sua solução não pode funcionar, quando você finalmente entende o problema e tem que fazer alterações tão complicadas que podem impedi-lo de resolver seu problema ou tornar o código horrível. O TDD é para esses casos, acredito. Você sabe que não resolve o problema que está enfrentando e, portanto, faz testes em todos os lugares para garantir que tenha uma base strong. O TDD não resolve a visão de 10.000 pés, no entanto. Você pode andar em círculos com código perfeitamente limpo o tempo todo.
No entanto, se você tentar fazer algo novo, mas apenas acima do seu nível, poderá obter um programa perfeito ou quase perfeito. Eu acho que é realmente difícil saber quais programas estão em sua "fronteira do conhecimento", mas em teoria essa é a melhor maneira de aprender. Eu reescrevo programas do zero muito, na verdade. Algumas pessoas fazem, mas você precisa de muito tempo e paciência, porque a terceira vez que você repete um programa não-trivial, você não fica excitado como da primeira vez.
Então meu conselho é: não pense que você entende alguma coisa até que você possa escrever um programa livre de bugs apenas para essa coisa. E tente combinar dois desses conceitos que você conhece profundamente no mesmo programa. Tenho quase certeza que você vai acertar da primeira vez. Uma das melhores maneiras é reescrever o software não-trivial, algo que exigiu muito esforço na primeira vez (estou fazendo isso com aplicativos Android agora). Toda vez que eu começo de novo eu mudo alguma coisa ou adiciono coisas, só para adicionar um pouco de diversão, e posso dizer que fico cada vez melhor e melhor ... talvez não seja livre de bugs, mas realmente orgulhoso.