Vedo solo risposte su di noi che sono umani e inclini a sbagliare, il che è molto vero ... ma vedo la tua domanda da un altro punto di vista.
Penso che puoi scrivere programmi senza bug, ma quelli in genere sono programmi che hai scritto già 10 o 12 volte. La tredicesima volta che scrivi lo stesso programma da zero, sai già come farlo: conosci il problema, conosci le tecniche, conosci le librerie, il linguaggio ... lo vedi in la tua mente. Tutti i modelli sono lì, a tutti i livelli.
Questo mi succede con programmi molto semplici perché insegno alla programmazione. Sono semplici per me, ma difficili per gli studenti. E non sto parlando di soluzioni ai problemi che ho fatto molte, molte volte nella lavagna. Certo che li conosco. Voglio dire ~ programmi di 300 righe che risolvono qualcosa usando concetti che conosco molto bene (i concetti che insegno). Scrivo questi programmi senza pianificazione e funzionano, e sento di conoscere tutti i dettagli, non ho assolutamente bisogno di TDD. Ottengo un paio o tre errori di compilazione (principalmente errori di battitura e altre cose del genere) e basta. Posso farlo per piccoli programmi, e credo anche che alcune persone possano farlo per programmi più complicati. Penso che persone come Linus Torvalds o Daniel J. Bernstein hanno una tale chiarezza mentale, sono le più vicine a un programmatore privo di bug. Se tu capisci le cose profondamente, penso che tu possa farcela. Posso farlo solo per programmi semplici, come ho detto.
La mia convinzione è che se cerchi sempre di fare programmi che sono molto al di sopra del tuo livello (ho passato anni facendo proprio questo), ti confonderai e commetterai degli errori. Grandi errori come quelli in cui improvvisamente ti rendi conto che la tua soluzione non può funzionare, quando finalmente capisci il problema, e devi apportare modifiche così complicate che potrebbero impedirti di risolvere il tuo problema o rendere il codice orribile. TDD è per questi casi, credo. Sapete che non si tratta del problema che si sta affrontando e quindi si mettono i test dappertutto per assicurarsi di avere una base strong. Tuttavia, TDD non risolve la visione di 10.000 piedi. Puoi camminare in cerchio con codice perfettamente pulito tutto il tempo.
Tuttavia, se provi a fare qualcosa di nuovo ma questo è solo sopra il tuo livello, potresti ottenere il tuo programma perfetto o quasi perfetto. Penso che sia davvero difficile sapere quali programmi sono nella tua "frontiera della conoscenza", ma in teoria è il modo migliore per imparare. Riscrivo molto spesso i programmi da zero. Alcuni lo fanno, ma hai bisogno di molto tempo e pazienza perché la terza volta che ripeti un programma non banale non ti emozioni come la prima volta.
Quindi il mio consiglio è: non pensare di aver capito qualcosa finché non puoi scrivere un programma privo di bug solo per quella cosa. E poi prova a combinare due di quei concetti che conosci profondamente nello stesso programma. Sono quasi sicuro che lo farai bene la prima volta. Uno dei modi migliori è riscrivere il software non banale, cosa che ha richiesto molto impegno la prima volta (lo sto facendo con le app Android in questo momento). Ogni volta che ricomincio cambio qualcosa o aggiungo cose, solo per aggiungere un po 'di divertimento, e posso dirti che sto migliorando sempre di più ... forse non sono privo di bug ma sono davvero orgoglioso.