Debugging: memahami detail mengapa perbaikan tertentu berhasil? [Tutup]

12

Ketika debugging, saya kadang-kadang menemukan bahwa saya membuat beberapa perubahan dan saya tidak 100% yakin mengapa perubahan itu memperbaiki beberapa bug dalam program. Apakah penting untuk memahami setiap detail tentang mengapa beberapa bug terjadi dan mengapa perubahan tertentu menghilangkan bug tersebut? Atau apakah itu umum di antara pengembang untuk terkadang membuat program bekerja tanpa benar-benar mengetahui detail tentang mengapa perbaikannya bekerja?

gila
sumber
1
Bagaimana Anda meyakinkan siapa pun bahwa Anda telah selesai memperbaiki bug, jika tidak?
related: appproach memperbaiki bug "Biasanya, Anda mencoba mencari tahu penyebab sebenarnya untuk bug terjadi dan kemudian memperbaikinya. Tapi kadang-kadang apa yang saya lakukan ketika saya muak melakukan penelitian (dan tidak dapat menemukan informasi yang sesuai tentang internet) hanya mengubah logika, yang membutuhkan waktu jauh lebih sedikit dibandingkan dengan pilihan lain ... "
Agas

Jawaban:

32

Saya akan mengatakan bahwa sangat penting untuk memahami setiap detail tentang mengapa beberapa bug terjadi dan mengapa perubahan tertentu menghilangkan bug itu, dan itu juga umum di antara pengembang untuk terkadang membuat program bekerja tanpa benar-benar mengetahui detail tentang mengapa perbaikan bekerja!

Seni mengubah sesuatu sampai bug menghilang, tanpa memahami apa yang menyebabkannya atau mengapa perubahan itu diperbaiki, sering disebut "pemrograman voodoo," dan itu bukan pujian. Sama sekali tidak ada cara Anda bisa yakin bahwa Anda telah benar-benar memperbaiki bug, dan bukan memperbaikinya sebagian untuk kasus tertentu yang Anda selidiki, jika Anda tidak mengerti apa yang menyebabkannya.

Dalam kasus terburuk, Anda belum melakukan apa pun kecuali memindahkan bug: Saya ingat dari komputasi tahun pertama di uni, ketika banyak siswa belajar C dan pointer untuk pertama kalinya, bug pointer sering berhenti bermanifestasi ketika mereka mengubah hal-hal secara acak, karena perubahan akan mengatur ulang struktur data dalam memori yang cukup untuk membuat bug pointer menginjak sedikit memori yang berbeda. Jelas itu tidak membantu sama sekali .

Tetapi setelah mengatakan itu, realitas komersial pemrograman sering sedemikian rupa sehingga memuaskan klien bahwa bug diperbaiki lebih penting daripada memuaskan diri sendiri. Saya tidak akan merekomendasikan Anda mendeklarasikan sesuatu yang diperbaiki jika Anda tidak tahu apa penyebabnya, tetapi jika Anda dapat melihat bahwa beberapa kode bermasalah, dan Anda memperbaikinya, bahkan jika Anda "tidak 100% yakin" bagaimana hal itu menyebabkan spesifik bug untuk dimanifestasikan, kadang-kadang Anda hanya perlu pindah ke bug berikutnya sebelum klien berteriak terlalu keras tentang kemajuan lambat Anda.

Carson63000
sumber
15

Jika Anda merasa klien marah karena butuh waktu terlalu lama untuk memperbaiki bug, bayangkan betapa marahnya mereka tentang bug berulang yang Anda klaim telah diperbaiki, atau perbaikan untuk satu hal yang memperburuk sesuatu. Jika perbaikan Anda hanya solusi atau mitigasi, pelanggan biasanya masih akan menyambutnya, tetapi Anda harus jujur ​​tentang apa itu, dan Anda memasukkan sebanyak mungkin logging yang Anda butuhkan untuk memperbaikinya secara nyata.

Jika Anda cukup yakin telah memperbaikinya, tetapi tidak tahu mengapa perbaikannya berhasil, tanyakan kepada seseorang. Kebanyakan insinyur yang saya kenal suka mendapatkan pertanyaan seperti itu karena misteri di baliknya.

Karl Bielefeldt
sumber
Saya setuju Anda seharusnya tidak mengklaimnya sebagai "diperbaiki" jika Anda tidak yakin itu tidak hanya dipindahkan atau disembunyikan. Namun, tidak akan terlalu mengerikan untuk mengakui bahwa Anda "memperbaiki area masalah dalam kode terkait" dan sekarang "tidak dapat mereproduksi bug" - di masa lalu tim saya telah mencatat ini sebagai "CNR dalam v <nomor versi > "
PeterL
6

Mengubah hal-hal sampai bug tidak lagi secara umum ada praktik buruk, tetapi sayangnya kenyataan bagi sebagian orang.

Saya berpendapat kuat bahwa Anda seharusnya tidak pernah menulis kode bahwa Anda tidak mengerti apa yang dilakukannya atau mengapa melakukannya. Bagaimana Anda bisa yakin bahwa meskipun Anda telah memperbaiki bug yang Anda rencanakan untuk diperbaiki - Anda belum memecahkan apa pun?

Secara umum, sebelum Anda memperbaiki masalah / bug - Anda harus melakukan penilaian / analisis penyebab yang mendasarinya untuk menentukan mengapa masalah ini terjadi dan jika dapat direplikasi. Maka Anda harus membaca kode dan memahami mengapa kode menyebabkan bug terjadi. Setelah Anda memiliki pemahaman itu: maka Anda dapat mulai melihat bagaimana menyelesaikan masalah dan menentukan area lain yang akan berdampak pada perubahan Anda. Tes unit dapat sangat membantu di sini!

Saya telah melihat sejumlah perubahan kode yang dilakukan orang untuk memperbaiki masalah (yang hebat), tetapi sayangnya memperkenalkan masalah lain karena pengembang tidak menyadari dampak penuh dari apa yang mereka ubah. Banyak dari "perbaikan" ini hanya mengaburkan penyebab mendasar masalah asli serta memperkenalkan kompleksitas dan lebih banyak bug.

Karena itu, saya telah memperbaiki sejumlah masalah dalam kode murni berdasarkan asosiasi. Di mana saya telah mengubah / mengerjakan ulang / refactored sesuatu dan itu memperbaiki bug luar biasa lainnya. Jadi, meskipun saya tidak tahu apa yang menyebabkan mereka awalnya, saya menemukan kode cerdik dan "memperbaikinya" - yang terjadi untuk memperbaiki bug itu juga. Saya membahas perubahan seperti ini dengan pengujian unit dan integrasi untuk memastikan integritas bisnis dan persyaratan teknis fungsi.

Deco
sumber
4

Atau apakah itu umum di antara pengembang untuk terkadang membuat program bekerja tanpa benar-benar mengetahui detail tentang mengapa perbaikannya bekerja?

Setidaknya ada tiga masalah besar dengan itu:

  1. Ini mengarah ke pola pikir ilmu hitam di mana Anda menyerah pada gagasan bahwa Anda dapat memahami kode dan bukannya hanya mulai bergerak di sekitar berharap bahwa masalah akan hilang. Ini adalah program yang setara dengan mendorong makanan di piring Anda, berharap membuat makan malam Anda terlihat cukup dimakan sehingga orang tua Anda tidak akan membuat Anda makan lebih banyak sayuran.

  2. Anda tidak dapat mengetahui bahwa bug tersebut benar-benar diperbaiki atau hanya ditutupi oleh perubahan Anda kecuali jika Anda memahami a) apa masalahnya, dan b) bagaimana perubahan Anda menyelesaikan masalah.

  3. Bugnya mungkin tidak diperbaiki , dan itu akan menggigit Anda lagi dalam waktu dekat.

Caleb
sumber
2

Saya melihat dua skenario: Anda mengerjakan sesuatu yang lain dan bug berhenti terjadi, selama sesuatu yang lain tidak merusak yang lain, Anda harus membiarkannya masuk - Anda melakukan apa yang dibutuhkan / diinginkan dan itu telah efek samping positif yang tidak terduga dan tidak dapat dijelaskan.

Yang lain adalah bahwa Anda sedang mengerjakan bug ini dan perubahan acak membuat semuanya berfungsi, itu tidak bisa diterima. Jika Anda tidak tahu kesalahan kode lama, Anda mungkin tidak tahu kesalahan kode baru itu.

Saya benar-benar tidak bisa memikirkan alasan bagus untuk memilih kembali kasus kedua - jika itu adalah bug yang kritis, maka itu penting untuk memperbaikinya. Jika itu bug yang tidak penting, setidaknya Anda bisa yakin bahwa Anda tidak memperkenalkan bug yang kritis dengan "perbaikan" Anda.

jmoreno
sumber
0

Atau apakah itu umum di antara pengembang untuk terkadang membuat program bekerja tanpa benar-benar mengetahui detail tentang mengapa perbaikannya bekerja?

Saya pikir ini sangat umum akhir-akhir ini. Itu karena Google dan Stackoverflow. Anda memiliki masalah dengan kode Anda, cukup google saja, cari solusinya, perbaiki, lanjutkan ke masalah berikutnya.

Pieter B
sumber