Só vejo respostas sobre ser humano e propenso a errar, o que é muito verdadeiro ... mas vejo sua pergunta de outro ponto de vista.
Eu acho que você pode escrever programas sem erros, mas esses geralmente são programas que você já escreveu 10 ou 12 vezes. Na 13ª vez que você escreve o mesmo programa do zero, você já sabe como fazê-lo: conhece o problema, conhece as técnicas, conhece as bibliotecas, o idioma ... o vê em 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 já fiz muitas e muitas vezes no quadro-negro. Claro que eu conheço isso. Quero dizer ~ programas de 300 linhas que resolvem algo usando conceitos que eu conheço muito bem (os conceitos que ensino). Escrevo esses programas sem planejamento e eles simplesmente funcionam, e sinto que conheço todos os detalhes, não preciso de TDD. Eu recebo alguns 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. Acho que pessoas como Linus Torvalds ou Daniel J. Bernstein têm tanta clareza de mente que são as mais próximas que você pode chegar de um codificador sem erros. Se vocêsentender as coisas profundamente, acho que você pode fazê-lo. Só posso fazer isso em programas simples, como eu disse.
Minha crença é que, se você sempre tenta fazer programas que estão muito acima do seu nível (passei anos fazendo exatamente isso), ficará confuso e cometerá erros. Grandes erros como aqueles em que você repentinamente percebe que sua solução não funciona, quando finalmente entende o problema e precisa fazer alterações tão complicadas que podem impedir que você resolva o problema ou torne o código horrível. TDD é para esses casos, acredito. Você sabe que não entende o problema que está enfrentando e, portanto, faz testes em todos os lugares para garantir uma base sólida. O TDD não resolve a visão de 10.000 pés. Você pode andar em círculos com um código perfeitamente limpo o tempo todo.
No entanto, se você tentar fazer algo novo, mas que esteja um pouco acima do seu nível, poderá obter um programa perfeito ou quase perfeito. Eu acho que é realmente difícil saber quais programas estão na sua "fronteira do conhecimento", mas na teoria essa é a melhor maneira de aprender. Na verdade, eu reescrevo muitos programas do zero. Algumas pessoas precisam, mas você precisa de muito tempo e paciência, porque na terceira vez que repete um programa não trivial, não fica animado como na primeira vez.
Portanto, meu conselho é: não pense que você entende alguma coisa até poder escrever um programa sem erros apenas para isso. E tente combinar dois desses conceitos que você conhece profundamente no mesmo programa. Tenho quase certeza de que você acertará na primeira vez. Uma das melhores maneiras é reescrever software não trivial, algo que exigiu muito esforço da primeira vez (estou fazendo isso com aplicativos Android no momento). Toda vez que recomeço, troco algo ou adiciono coisas, apenas para adicionar um pouco de diversão, e posso dizer que fico melhor e melhor e melhor ... talvez não seja livre de bugs, mas realmente orgulhoso.