Bug yang merayap ke dalam kode dapat diminimalkan, tetapi tidak sepenuhnya dihilangkan seperti yang tertulis - programmer, meskipun banyak yang tidak setuju , hanya manusia.
Ketika kita mendeteksi kesalahan dalam kode kita, apa yang bisa kita lakukan untuk menghilangkannya? Bagaimana kita harus mendekatinya untuk memanfaatkan waktu berharga kita secara paling efektif dan memungkinkan kita menghabiskan lebih sedikit waktu untuk menemukannya dan lebih banyak pengkodean waktu? Juga, apa yang harus kita hindari saat debugging?
Perhatikan di sini bahwa kita tidak berbicara tentang mencegah bug; kita sedang berbicara tentang apa yang harus dilakukan ketika bug yang muncul. Ini adalah bidang yang luas, saya tahu, dan mungkin sangat tergantung pada bahasa, platform, dan alat. Jika demikian, tetap mencakup jawaban seperti pola pikir dan metode umum.
Jawaban:
Pola pikir dan sikap terhadap debugging mungkin adalah bagian yang paling penting, karena menentukan seberapa efektif Anda akan memperbaiki kesalahan, dan apa yang akan Anda pelajari darinya - jika ada.
Klasik tentang pengembangan perangkat lunak seperti The Pragmatic Programmer dan Code Complete pada dasarnya mendukung pendekatan yang sama: setiap kesalahan adalah kesempatan untuk belajar, hampir selalu tentang diri Anda (karena hanya pemula yang menyalahkan kompiler / komputer terlebih dahulu).
Jadi perlakukan itu sebagai misteri yang akan menarik untuk dipecahkan. Dan memecahkan misteri itu harus dilakukan secara sistematis, dengan mengekspresikan asumsi kita (kepada diri kita sendiri, atau kepada orang lain) dan kemudian menguji asumsi kita, satu-per-satu jika perlu - menggunakan setiap alat yang kita miliki, terutama debugger dan kerangka kerja pengujian otomatis. Kemudian setelah misteri terpecahkan, Anda dapat melakukan yang lebih baik dengan melihat semua kode Anda untuk kesalahan serupa yang mungkin Anda buat; dan menulis tes otomatis untuk memastikan kesalahan tidak akan terjadi tanpa disadari lagi.
Satu catatan terakhir - Saya lebih suka menyebut kesalahan sebagai "kesalahan" dan bukan "bug" - Dijkstra memarahi rekan-rekannya karena menggunakan istilah yang terakhir karena tidak jujur, mendukung gagasan bahwa peri-bug yang merusak dan berubah-ubah menanam bug di program kami sementara kami tidak t mencari, daripada berada di sana karena pemikiran (ceroboh) kita sendiri: http://www.cs.utexas.edu/users/EWD/transcription/EWD10xx/EWD1036.html
sumber
Tulis tes. Pengujian tidak hanya hebat dalam mencegah bug (dalam pengalaman saya, TDD dilakukan dengan benar menghilangkan hampir semua bug yang sepele, bodoh), tetapi juga banyak membantu dalam debugging. Pengujian memaksa desain Anda menjadi agak modular, yang membuatnya lebih mudah mengisolasi dan mereplikasi masalah. Juga, Anda mengendalikan lingkungan, jadi akan ada lebih sedikit kejutan. Selain itu, setelah Anda mendapatkan test case yang gagal, Anda dapat yakin bahwa Anda telah memakukannya alasan sebenarnya dari perilaku yang mengganggu Anda.
Pelajari cara menggunakan debugger.
print
pernyataan mungkin bekerja dengan cukup baik pada tingkat tertentu, tetapi sebagian besar waktu debugger sangat membantu (dan begitu Anda tahu cara menggunakannya, itu jauh lebih nyaman daripadaprint
pernyataan).Bicara tentang seseorang tentang masalah Anda, walaupun itu hanya sebuah bebek karet . Memaksa diri sendiri untuk mengungkapkan masalah yang sedang Anda kerjakan dengan kata-kata benar-benar membuat keajaiban.
Beri diri Anda batas waktu. Jika misalnya setelah 45 menit Anda merasa tidak ke mana-mana, cukup beralih ke tugas lain untuk beberapa waktu. Saat Anda kembali ke bug Anda, semoga Anda dapat melihat solusi lain yang mungkin tidak pernah Anda pertimbangkan sebelumnya.
sumber
Saya pikir reproduksi bug juga penting. Semua kasus yang mereproduksi bug dapat didaftar dan kemudian Anda dapat memastikan bahwa perbaikan bug Anda mencakup semua kasus tersebut.
sumber
Ada buku bagus yang saya baca tentang topik ini yang disebut Why Programs Fail , yang menguraikan berbagai strategi untuk menemukan bug mulai dari menerapkan metode ilmiah untuk mengisolasi dan menyelesaikan bug, hingga delta debugging. Bagian menarik lainnya dari buku ini adalah bahwa ia menghilangkan istilah 'bug'. Pendekatan Zeller adalah:
(1) Seorang programmer membuat cacat pada kode. (2) Cacat menyebabkan infeksi (3) Infeksi menjalar (4) Infeksi menyebabkan kegagalan.
Jika Anda ingin meningkatkan keterampilan debug Anda, saya sangat merekomendasikan buku ini.
Dalam pengalaman pribadi saya, saya telah menemukan banyak bug dalam aplikasi kami, tetapi manajemen cukup menekan kami untuk mengeluarkan fitur baru. Saya sering mendengar "Kami menemukan bug ini sendiri dan klien belum menyadarinya, jadi biarkan saja sampai mereka menemukannya". Saya pikir menjadi reaktif menentang proaktif dalam memperbaiki bug adalah ide yang sangat buruk karena ketika tiba saatnya untuk benar-benar memperbaiki, Anda memiliki masalah lain yang perlu diselesaikan dan lebih banyak fitur manajemen ingin keluar secepatnya, sehingga Anda ketahuan. dalam lingkaran setan yang dapat menyebabkan banyak stres dan terbakar dan akhirnya, sistem cacat ditunggangi.
Komunikasi juga merupakan faktor lain ketika bug ditemukan. Mengirimkan email atau mendokumentasikannya di pelacak bug semuanya baik-baik saja, tetapi menurut pengalaman saya sendiri, pengembang lain menemukan bug yang sama dan alih-alih menggunakan kembali solusi yang Anda buat untuk memperbaiki kode (karena mereka sudah lupa semua tentangnya ), mereka menambahkan versi mereka sendiri, jadi Anda punya 5 solusi berbeda dalam kode Anda dan hasilnya terlihat lebih membengkak dan membingungkan. Jadi, ketika Anda memperbaiki bug, pastikan beberapa orang meninjau perbaikan dan memberi Anda umpan balik seandainya mereka telah memperbaiki sesuatu yang serupa dan menemukan strategi yang baik untuk mengatasinya.
Limist menyebut buku itu, The Pragmatic Programmer yang memiliki beberapa materi menarik tentang cara memperbaiki bug. Dengan menggunakan contoh yang saya berikan pada paragraf sebelumnya, saya akan melihat ini: Entropi Perangkat Lunak , di mana analogi janda rusak digunakan. Jika dua jendela yang pecah muncul, tim Anda mungkin menjadi apatis untuk memperbaikinya, kecuali jika Anda bersikap proaktif.
sumber
Bug, kesalahan, masalah, cacat - apa pun yang Anda inginkan, tidak ada bedanya. Saya akan tetap pada masalah karena itulah yang biasa saya lakukan.
Jika Anda sangat terbiasa dengan kode, atau jika masalah atau perbaikannya jelas, Anda dapat melewati beberapa langkah itu.
Saya mengambil masalah dengan itu, karena itu menyiratkan bahwa menulis kode baru lebih berharga daripada memiliki program kerja yang berkualitas tinggi. Tidak ada yang salah dengan menjadi seefektif mungkin dalam memperbaiki masalah, tetapi suatu program tidak selalu menjadi lebih baik dengan hanya menambahkan lebih banyak kode ke dalamnya.
sumber
Saya suka sebagian besar jawaban lain, tetapi di sini ada beberapa tips tentang apa yang harus dilakukan SEBELUM Anda melakukan semua itu. Akan menghemat waktu Anda beaucoup.
Tentukan apakah memang ada bug. Bug adalah SELALU perbedaan antara perilaku sistem dan persyaratan; penguji harus mampu mengartikulasikan perilaku yang diharapkan dan aktual. Jika dia tidak dapat memberikan dukungan untuk perilaku yang diharapkan, tidak ada persyaratan dan tidak ada bug - hanya pendapat seseorang. Kirim kembali.
Pertimbangkan kemungkinan bahwa perilaku yang diharapkan salah. Ini bisa jadi karena salah tafsir dari persyaratan. Bisa juga karena cacat pada persyaratan itu sendiri (delta antara persyaratan rinci dan persyaratan bisnis). Anda dapat mengirim ini kembali juga.
Isolasikan masalahnya. Hanya pengalaman yang akan mengajarkan Anda cara tercepat untuk melakukan ini - beberapa orang hampir dapat melakukannya dengan keberanian mereka. Satu pendekatan dasar adalah memvariasikan satu hal sambil menjaga semua hal lainnya tetap konstan (apakah masalah terjadi pada lingkungan lain? Dengan peramban lain? Di wilayah pengujian yang berbeda? Pada waktu yang berbeda dalam sehari?) Pendekatan lain adalah dengan melihat tumpukan tumpukan atau pesan kesalahan - kadang-kadang Anda dapat mengetahui hanya dengan cara diformat komponen sistem mana yang melempar kesalahan asli (misalnya jika itu dalam bahasa Jerman Anda dapat menyalahkan pihak ketiga yang bekerja dengan Anda di Berlin).
Jika Anda mempersempitnya menjadi dua sistem yang berkolaborasi, periksa pesan di antara kedua sistem melalui monitor lalu lintas atau file log, dan tentukan sistem mana yang berperilaku spesifik dan mana yang tidak. Jika ada lebih dari dua sistem dalam skenario, Anda dapat melakukan pemeriksaan berpasangan dan bekerja dengan cara "menurunkan" tumpukan aplikasi.
Alasan mengapa mengisolasi masalah sangat penting adalah bahwa masalahnya mungkin bukan karena cacat dalam kode yang Anda kontrol (misalnya sistem pihak ketiga atau lingkungan) dan Anda ingin agar pihak tersebut mengambil alih secepat mungkin . Ini baik untuk menyelamatkan Anda bekerja dan untuk mendapatkan mereka pada titik segera sehingga resolusi dapat dicapai dalam waktu sesingkat mungkin. Anda tidak ingin mengerjakan masalah selama sepuluh hari hanya untuk menemukan itu benar-benar masalah dengan layanan web orang lain.
Jika Anda telah menentukan bahwa memang ada cacat dan itu benar-benar ada dalam kode yang Anda kontrol, Anda dapat mengisolasi masalah lebih lanjut dengan mencari build "dikenal baik" terakhir dan memeriksa log kontrol sumber untuk perubahan yang mungkin menyebabkan masalah. Ini bisa menghemat banyak waktu.
Jika Anda tidak dapat mengetahuinya dari kontrol sumber, sekarang saatnya untuk melampirkan debugger Anda dan melangkah melalui kode untuk mengetahuinya. Kemungkinannya sekarang Anda sudah memiliki ide yang cukup bagus tentang masalah itu.
Setelah Anda tahu di mana bug itu dan bisa memikirkan perbaikan, berikut ini adalah prosedur yang baik untuk memperbaikinya:
Tulis tes unit yang mereproduksi masalah dan gagal.
Tanpa memodifikasi tes unit, buat lulus (dengan memodifikasi kode aplikasi).
Simpan unit test di dalam test suite Anda untuk mencegah / mendeteksi regresi.
sumber
Begini cara saya melakukannya:
sumber
Dengan asumsi bahwa Anda berada dalam lingkungan produksi, inilah yang perlu Anda lakukan:
Jelaskan "kesalahan" dengan benar, dan identifikasi peristiwa yang menyebabkannya terjadi.
Menentukan apakah "kesalahan" adalah kesalahan kode atau kesalahan spesifikasi. Misalnya, memasukkan nama 1 huruf dapat dianggap sebagai kesalahan pada beberapa sistem tetapi perilaku yang dapat diterima untuk sistem lain. Kadang-kadang pengguna akan melaporkan kesalahan yang menurutnya merupakan masalah tetapi harapan pengguna untuk perilaku sistem bukan bagian dari persyaratan.
Jika Anda telah membuktikan bahwa ada kesalahan dan kesalahan disebabkan oleh kode, maka Anda dapat menentukan potongan kode mana yang perlu diperbaiki untuk mencegah kesalahan. Juga memeriksa pengaruh perilaku pada data saat ini dan operasi sistem masa depan (analisis dampak pada kode dan data).
Pada titik ini Anda mungkin akan memiliki perkiraan berapa banyak sumber daya yang akan dikonsumsi untuk memperbaiki bug. Anda dapat memperbaikinya segera atau menjadwalkan perbaikan dalam rilis perangkat lunak yang akan datang. Ini juga tergantung pada apakah pengguna akhir bersedia membayar untuk perbaikannya. Anda juga harus mengevaluasi berbagai opsi yang tersedia untuk memperbaiki kesalahan. Mungkin ada lebih dari satu cara. Anda harus memilih pendekatan yang paling sesuai dengan situasi.
Analisis alasan yang menyebabkan bug ini muncul (persyaratan, pengkodean, pengujian, dll.). Menegakkan proses yang akan mencegah kondisi terjadi lagi.
Dokumentasikan episode dengan memadai.
Lepaskan perbaikan (atau versi baru)
sumber