Widzę tylko odpowiedzi na to, że jesteśmy ludźmi i skłonni do błędów, co jest bardzo prawdziwe ... ale widzę twoje pytanie z innego punktu widzenia.
Myślę, że możesz pisać programy wolne od błędów, ale zazwyczaj są to programy, które napisałeś już 10 lub 12 razy. Kiedy piszesz ten sam program od zera, już wiesz, jak to zrobić: znasz problem, znasz techniki, znasz biblioteki, język ... widzisz to w swoim umyśle. Wszystkie wzory są na wszystkich poziomach.
Zdarza mi się to z bardzo prostymi programami, ponieważ uczę programowania. Są dla mnie proste, ale trudne dla studentów. I nie mówię o rozwiązaniach problemów, które robiłem wiele, wiele razy na tablicy. Oczywiście, że je znam. Mam na myśli ~ 300-liniowe programy, które rozwiązują coś za pomocą pojęć, które znam naprawdę dobrze (pojęć, których uczę). Piszę te programy bez planowania, a one po prostu działają i czuję, że znam wszystkie szczegóły, w ogóle nie potrzebuję TDD. Dostaję kilka lub trzy błędy kompilacji (głównie literówki i inne podobne rzeczy) i to wszystko. Mogę to zrobić dla małych programów, a także wierzę, że niektórzy ludzie mogą to zrobić dla bardziej skomplikowanych programów. Myślę, że ludzie tacy jak Linus Torvalds lub Daniel J. Bernstein mają taką jasność umysłu, że są najbliżej bezbłędnego kodera. Jeśli tyrozumiem rzeczy głęboko. Myślę, że możesz to zrobić. Mogę to zrobić tylko dla prostych programów, tak jak powiedziałem.
Wierzę, że jeśli zawsze spróbujesz robić programy, które są znacznie powyżej twojego poziomu (spędziłem lata, robiąc to tylko), będziesz zdezorientowany i popełnisz błędy. Wielkie błędy, takie jak te, w których nagle zdajesz sobie sprawę, że twoje rozwiązanie nie może działać, kiedy w końcu zrozumiesz problem i musisz wprowadzić zmiany tak skomplikowane, że mogą powstrzymać cię od rozwiązania problemu lub uczynić kod okropnym. Uważam, że TDD dotyczy tych przypadków. Wiesz, że nie mylisz się z problemem, z którym się zmierzysz, dlatego też wszędzie stawiaj testy, aby upewnić się, że masz silną bazę. TDD nie rozwiązuje jednak widzenia na 10 000 stóp. Możesz chodzić w kółko z idealnie czystym kodem przez cały czas.
Jeśli jednak spróbujesz zrobić coś nowego, ale nieco powyżej poziomu, możesz uzyskać doskonały lub prawie idealny program. Myślę, że naprawdę trudno jest wiedzieć, jakie programy znajdują się na „granicy wiedzy”, ale teoretycznie jest to najlepszy sposób na naukę. Właściwie często przepisuję programy od zera. Niektórzy tak robią, ale potrzebujesz dużo czasu i cierpliwości, ponieważ za trzecim razem, gdy powtórzysz nietrywialny program, nie ekscytujesz się tak jak za pierwszym razem.
Moja rada jest następująca: nie myśl, że coś rozumiesz, dopóki nie możesz napisać programu bezbłędnego tylko do tego. A następnie spróbuj połączyć dwie z tych koncepcji, które znasz głęboko w ten sam program. Jestem prawie pewien, że uda ci się to zrobić za pierwszym razem. Jednym z najlepszych sposobów jest przepisanie nietrywialnego oprogramowania, co za pierwszym razem wymagało wiele wysiłku (teraz robię to z aplikacjami na Androida). Za każdym razem, gdy zaczynam od nowa, zmieniam coś lub dodaję coś, tylko po to, aby dodać trochę zabawy, i mogę ci powiedzieć, że jestem coraz lepszy i lepszy ... może nie jest wolny od błędów, ale naprawdę dumny.