Saya hanya melihat jawaban tentang kami sebagai manusia dan cenderung salah, yang sangat benar ... tetapi saya melihat pertanyaan Anda dari sudut pandang lain.
Saya pikir Anda dapat menulis program bebas bug, tetapi biasanya itu adalah program yang sudah Anda tulis 10 atau 12 kali. Kali ke-13 Anda menulis program yang sama dari awal, Anda sudah tahu bagaimana melakukannya: Anda tahu masalahnya, Anda tahu tekniknya, Anda tahu perpustakaan, bahasa ... Anda melihatnya dalam pikiran Anda. Semua pola ada di sana, di semua tingkatan.
Ini terjadi pada saya dengan program yang sangat sederhana karena saya mengajar pemrograman. Mereka sederhana bagi saya, tetapi sulit bagi para siswa. Dan saya tidak berbicara tentang solusi untuk masalah yang telah saya lakukan berkali-kali di papan tulis. Tentu saja saya tahu itu. Maksud saya ~ 300-line program yang memecahkan sesuatu menggunakan konsep yang saya kenal dengan baik (konsep yang saya ajarkan). Saya menulis program ini tanpa perencanaan dan hanya berfungsi, dan saya merasa saya tahu semua detailnya, saya tidak perlu TDD sama sekali. Saya mendapatkan beberapa atau tiga kesalahan kompilasi (kebanyakan kesalahan ketik dan hal-hal lain seperti itu) dan hanya itu. Saya dapat melakukan ini untuk program kecil, dan saya juga percaya bahwa beberapa orang dapat melakukannya untuk program yang lebih rumit. Saya pikir orang-orang seperti Linus Torvalds atau Daniel J. Bernstein memiliki kejernihan pikiran, mereka adalah yang paling dekat dengan pembuat kode bebas bug. Jika kamuMemahami hal-hal secara mendalam, saya pikir Anda bisa melakukannya. Saya hanya bisa melakukan ini untuk program sederhana, seperti yang saya katakan.
Keyakinan saya adalah bahwa jika Anda selalu mencoba melakukan program yang jauh di atas level Anda (saya telah menghabiskan waktu bertahun-tahun melakukan hal itu), Anda akan bingung dan membuat kesalahan. Kesalahan besar seperti ketika Anda tiba-tiba menyadari bahwa solusi Anda tidak dapat bekerja, ketika Anda akhirnya memahami masalahnya, dan harus membuat perubahan yang begitu rumit sehingga mereka mungkin menghentikan Anda dari menyelesaikan masalah Anda atau membuat kode menjadi buruk. TDD untuk kasus ini, saya percaya. Anda tahu bahwa Anda tidak mengalami masalah yang sedang Anda hadapi dan karenanya melakukan tes di mana-mana untuk memastikan bahwa Anda memiliki basis yang kuat. TDD tidak menyelesaikan visi 10.000 kaki. Anda mungkin berjalan berputar-putar dengan kode bersih sempurna sepanjang waktu.
Namun, jika Anda mencoba melakukan sesuatu yang baru tetapi itu hanya di atas level Anda, Anda mungkin mendapatkan program Anda sempurna atau hampir sempurna. Saya pikir sangat sulit untuk mengetahui program apa yang ada di "batas pengetahuan" Anda, tetapi secara teori itu adalah cara terbaik untuk belajar. Saya menulis ulang banyak program dari awal, sebenarnya. Beberapa orang melakukannya, tetapi Anda membutuhkan banyak waktu dan kesabaran karena ketiga kalinya Anda mengulangi program yang tidak sepele, Anda tidak menjadi bersemangat seperti yang pertama kali.
Jadi saran saya adalah: jangan berpikir Anda mengerti sesuatu sampai Anda dapat menulis program bebas bug hanya untuk hal itu. Dan kemudian cobalah untuk menggabungkan dua konsep yang Anda ketahui secara mendalam ke dalam program yang sama. Saya hampir yakin Anda akan melakukannya dengan benar pertama kali. Salah satu cara terbaik adalah menulis ulang perangkat lunak non-sepele, sesuatu yang membutuhkan banyak upaya pertama kali (saya melakukan ini dengan aplikasi Android sekarang). Setiap kali saya mulai lagi saya mengubah sesuatu atau menambahkan barang, hanya untuk menambahkan sedikit kesenangan, dan saya dapat memberitahu Anda bahwa saya menjadi lebih baik dan lebih baik dan lebih baik ... mungkin tidak bebas bug tetapi sangat bangga.