Ich sehe nur Antworten darüber, dass wir menschlich und anfällig für Irrtümer sind, was sehr richtig ist ... aber ich sehe Ihre Frage aus einem anderen Blickwinkel.
Ich denke, Sie können fehlerfreie Programme schreiben, aber das sind normalerweise Programme, die Sie bereits 10 oder 12 Mal geschrieben haben. Wenn Sie das gleiche Programm zum 13. Mal von Grund auf neu schreiben, wissen Sie bereits, wie es geht: Sie kennen das Problem, Sie kennen die Techniken, Sie kennen die Bibliotheken, die Sprache ... Sie sehen es in Ihrem Kopf. Alle Muster sind auf allen Ebenen vorhanden.
Das passiert mir mit sehr einfachen Programmen, weil ich Programmierung unterrichte. Sie sind einfach für mich, aber schwer für die Schüler. Und ich spreche nicht von Lösungen für Probleme, die ich schon oft an der Tafel gemacht habe. Natürlich kenne ich die. Ich meine ~ 300-Zeilen-Programme, die etwas mit Begriffen lösen, die ich wirklich gut kenne (die Konzepte, die ich unterrichte). Ich schreibe diese Programme ohne Planung und sie funktionieren einfach und ich habe das Gefühl, dass ich alle Details kenne und TDD überhaupt nicht brauche. Ich bekomme ein paar oder drei Kompilierungsfehler (meist Tippfehler und ähnliches) und das wars. Ich kann das für kleine Programme tun, und ich glaube auch, dass manche Leute das für kompliziertere Programme tun können. Ich denke, Leute wie Linus Torvalds oder Daniel J. Bernstein sind so klar im Kopf, dass sie einem fehlerfreien Programmierer am nächsten kommen. Wenn duVerstehe die Dinge tief, ich denke du schaffst es. Ich kann das nur für einfache Programme machen, wie ich schon sagte.
Ich glaube, wenn Sie immer versuchen, Programme zu erstellen, die weit über Ihrem Niveau liegen (ich habe Jahre damit verbracht, genau das zu tun), werden Sie verwirrt und machen Fehler. Große Fehler wie die, bei denen Sie plötzlich feststellen, dass Ihre Lösung nicht funktionieren kann, wenn Sie das Problem endlich verstehen und Änderungen vornehmen müssen, die Sie möglicherweise daran hindern, Ihr Problem zu lösen oder den Code schrecklich zu machen. TDD ist für diese Fälle, glaube ich. Sie wissen, dass Sie das Problem, mit dem Sie sich befassen, nicht in den Griff bekommen, und führen daher überall Tests durch, um sicherzustellen, dass Sie eine starke Basis haben. TDD löst jedoch nicht die 10.000-Fuß-Vision. Sie können die ganze Zeit in Kreisen mit perfekt sauberem Code laufen.
Wenn Sie jedoch versuchen, etwas Neues zu tun, das sich jedoch knapp über Ihrem Niveau befindet, erhalten Sie möglicherweise ein perfektes oder fast perfektes Programm. Ich denke, es ist wirklich schwierig zu wissen, welche Programme sich in Ihrer "Wissensgrenze" befinden, aber theoretisch ist dies der beste Weg, um zu lernen. Eigentlich schreibe ich viele Programme von Grund auf neu. Einige Leute tun es, aber Sie brauchen viel Zeit und Geduld, denn wenn Sie ein nicht triviales Programm zum dritten Mal wiederholen, werden Sie nicht so aufgeregt wie beim ersten Mal.
Mein Rat ist also: Denken Sie nicht, dass Sie etwas verstehen, bis Sie ein fehlerfreies Programm nur für diese Sache schreiben können. Versuchen Sie dann, zwei dieser Konzepte, die Sie genau kennen, in einem Programm zu kombinieren. Ich bin mir fast sicher, dass Sie es beim ersten Mal richtig machen werden. Eine der besten Möglichkeiten besteht darin, nicht-triviale Software neu zu schreiben, was beim ersten Mal viel Mühe gekostet hat (das mache ich gerade mit Android-Apps). Jedes Mal, wenn ich wieder anfange, ändere ich etwas oder füge Dinge hinzu, um ein bisschen Spaß zu haben, und ich kann Ihnen sagen, dass ich immer besser und besser werde ... vielleicht nicht fehlerfrei, aber wirklich stolz.