Hampir dua puluh tahun yang lalu, saya mendapatkan banyak wawasan tentang hal ini dari buku David Thielen yang sangat baik "No Bugs: Memberikan Kode Bebas Kesalahan dalam C dan C ++", yang sekarang tersedia dalam bentuk PDF gratis .
Dia mengajari saya dua ide hebat ...
Bug tidak datang entah dari mana. Kita semua programmer duduk dan menuliskannya ke dalam kode kita dengan jari kita sendiri.
"Bug" berkonotasi bahwa beberapa agensi luar memutuskan untuk menginfeksi program Anda dengan bug dan bahwa jika Anda menjalani kehidupan yang bersih, dan mengorbankan hewan berbulu kecil di kaki komputer Anda, mereka akan pergi ... Konsep ini penting karena warna pendekatan Anda untuk men-debug kode Anda. Jika Anda melihat kesalahan sebagai "bug," Anda berharap tidak ada yang ditemukan. (Kamu berharap peri yang baik datang, menaburkan debu peri, dan serangga pergi.)
Bug tidak boleh disebut bug, mereka harus disebut Massive Fuck-Ups [MFUs] ... MFU ada karena program ditulis oleh orang-orang, dan orang-orang membuat kesalahan ... Anda akan menulis MFU. Anda akan duduk dan dengan kebencian penuh dari pemikiran sebelumnya menempatkan MFU dalam kode Anda. Pikirkan tentang hal ini - Anda tahu bahwa Anda yang meletakkan bug di sana. Jadi, jika Anda duduk dengan kode, Anda akan memasukkan beberapa bug.
Karena takdir semua programmer tidak bisa dihindari untuk menulis bug, saya perlu kode defensif, termasuk hal-hal yang akan melompat, menjerit, dan mengibarkan bendera merah ketika mereka mendeteksi bug.
Setelah ditulis pada awal tahun 90-an, kekhususan dalam buku Thielen ini agak ketinggalan zaman. Misalnya, di Linux dan Mac OS X, Anda tidak perlu lagi menulis bungkus sendiri untuk operator baru C ++; Anda dapat menggunakan valgrind untuk itu.
Tetapi ada beberapa hal yang secara rutin saya lakukan untuk C / C ++ / ObjC:
- Ketika saya bisa, nyalakan opsi "Peringatan adalah kesalahan" dari kompiler, dan perbaiki semuanya. (Saya mengelola satu proyek lama di mana memperbaiki semuanya sekaligus akan memakan waktu berminggu-minggu, jadi saya hanya memperbaiki file setiap beberapa minggu - dan dalam beberapa tahun, saya dapat mengaktifkan opsi itu.)
- Gunakan alat analisis kode statis, seperti Gimpel's PC-Lint atau yang sangat bagus sekarang dibangun ke dalam Xcode Apple. Cakupan bahkan lebih baik, tetapi biayanya untuk perusahaan besar, bukan hanya manusia biasa.
- Gunakan alat analisis dinamis, seperti valgrind, untuk memeriksa masalah memori, kebocoran, dll.
- Seperti yang dikatakan Thielen (dan bab ini masih layak dibaca): Assert The World . Tentu saja, tidak ada orang selain idiot yang akan memanggil fungsi Anda dengan pointer nil - dan itu berarti seseorang, di suatu tempat, adalah idiot yang akan melakukan hal itu. Bahkan mungkin Anda dalam tiga tahun ketika apa yang Anda lakukan hari ini telah berkabut. Jadi tambahkan saja pernyataan di awal fungsi untuk memvalidasi argumen pointer - dibutuhkan tiga detik untuk mengetik, dan hilang dalam rilis executable.
- Di C ++, RTTI adalah teman Anda. Sekali lagi, tidak ada orang selain idiot yang akan memanggil fungsi Anda dengan penunjuk ke objek yang salah - yang berarti bahwa, pasti, beberapa orang idiot akan - dan biaya untuk bertahan terhadap hal itu dapat diabaikan. Dalam kode berbasis-C yang diturunkan dari GObject, Anda dapat melakukan hal yang sama dengan macro cast dinamis yang defensif.
- Unit dan tes regresi otomatis sekarang menjadi bagian penting dari repertoar saya. Pada satu proyek, mereka adalah bagian integral dari sistem build rilis, dan build tidak akan selesai kecuali mereka semua lulus.
- Bagian penting lainnya adalah mencatat kode di debug dan melepaskan executable yang dapat diaktifkan saat runtime oleh sesuatu seperti variabel lingkungan.
- Tulis tes defensif sehingga programmer yang menjalankan debug tidak dapat mengabaikannya jika gagal. Pesan runtime ke konsol dapat diabaikan. Program macet dengan tegas tidak dapat diabaikan.
- Saat merancang, menyediakan API publik, dan implementasi pribadi yang tidak bisa didapatkan oleh kode luar. Dengan begitu, jika Anda harus refactor, tidak ada yang bergantung pada beberapa variabel keadaan interior sihir atau sesuatu. Di kelas C ++, saya penggemar berat yang dilindungi dan pribadi untuk ini. Saya juga berpikir kelas proxy hebat, tapi jangan gunakan itu sendiri.
Tentu saja, apa yang akan Anda lakukan untuk bahasa atau teknologi baru akan bervariasi dalam detailnya. Tapi begitu Anda memasukkan ke dalam hati Anda anggapan bahwa serangga itu Besar-Besaran, Anda Menulis Dengan Jari Anda Sendiri, dan kode Anda terus-menerus diserang oleh pasukan idiot, dengan Anda sebagai kepala jenderal, dengan Anda sebagai kepala jenderal, saya yakin Anda Saya akan mencari teknik pertahanan yang cocok.