it-swarm-id.com

Bagaimana cara mengurangi jumlah bug saat coding?

Tidak ada yang sempurna, dan apa pun yang kita lakukan, kita akan menghasilkan kode yang memiliki bug di dalamnya dari waktu ke waktu. Apa beberapa metode/teknik untuk mengurangi jumlah bug yang Anda hasilkan, baik saat menulis perangkat lunak baru dan mengubah/memelihara kode yang ada?

30
GSto

Hindari pengkodean yang mewah. Semakin rumit kode, semakin besar kemungkinan ada bug. Biasanya pada sistem modern, kode yang ditulis dengan jelas akan cepat dan cukup kecil.

Gunakan perpustakaan yang tersedia. Cara termudah untuk tidak memiliki bug yang menulis rutin utilitas adalah dengan tidak menulisnya.

Pelajari beberapa teknik formal untuk hal-hal yang lebih rumit. Jika ada kondisi yang rumit, kalahkan mereka dengan pena dan kertas. Idealnya, ketahui beberapa teknik pembuktian. Jika saya bisa membuktikan kode yang benar, itu hampir selalu baik kecuali untuk bug besar, bodoh, jelas yang mudah diperbaiki. Jelas, ini hanya berjalan sejauh ini, tetapi kadang-kadang Anda dapat secara formal beralasan tentang hal-hal kecil tapi rumit.

Untuk kode yang ada, pelajari cara refactor: cara membuat perubahan kecil dalam kode, sering menggunakan alat otomatis, yang membuat kode lebih mudah dibaca tanpa mengubah perilaku.

Jangan lakukan sesuatu terlalu cepat. Mengambil sedikit waktu di depan untuk melakukan hal-hal yang benar, untuk memeriksa apa yang telah Anda lakukan, dan untuk memikirkan apa yang Anda lakukan dapat membayar banyak waktu nanti.

Setelah Anda menulis kode, gunakan apa yang Anda miliki untuk membuatnya menjadi baik. Tes unit sangat bagus. Anda dapat sering menulis tes sebelumnya, yang bisa menjadi umpan balik yang bagus (jika dilakukan secara konsisten, ini adalah pengembangan yang didorong oleh tes). Kompilasi dengan opsi peringatan, dan perhatikan peringatan.

Dapatkan orang lain untuk melihat kode. Ulasan kode formal bagus, tetapi mungkin tidak pada waktu yang tepat. Tarik permintaan, atau yang serupa jika SCM Anda tidak mendukungnya, memungkinkan untuk ulasan yang tidak sinkron. Pengecekan teman bisa menjadi tinjauan yang kurang formal. Pemrograman pasangan memastikan dua pasang mata melihat segalanya.

58
David Thornley

Tes Unit memungkinkan Anda mengurangi jumlah bug yang muncul untuk kedua kalinya. Jika Anda menemukan bug dalam kode Anda, menulis unit test akan memastikan itu tidak muncul lagi nanti. (Plus, memikirkan semua kasus dan menulis ribuan tes unit di depan terkadang sulit dilakukan)

30
Ryan Hayes

Saya telah mengembangkan gaya pemrograman yang cukup fungsional, meskipun bahasa utama saya adalah C++ dan Python. Saya menemukan bahwa jika saya meneruskan semua konteks ke fungsi (atau metode) yang fungsi itu perlu melakukan tugasnya, dan mengembalikan data bermakna yang saya cari, bahwa kode saya telah menjadi jauh lebih kuat.

Status tersirat adalah musuh dan dalam pengalaman saya adalah sumber # 1 bug. Status ini bisa berupa variabel global atau variabel anggota, tetapi jika hasilnya bergantung pada sesuatu yang tidak diteruskan ke fungsi yang Anda minta masalah. Jelas itu tidak layak untuk menghilangkan negara, tetapi meminimalkan itu memiliki efek positif besar pada keandalan program.

Saya juga ingin memberi tahu rekan kerja saya bahwa setiap cabang (jika, untuk, sementara,? :) kemungkinan adalah bug. Saya tidak bisa mengatakan apa manifestasi dari bug tersebut, tetapi semakin sedikit perilaku kondisional yang dimiliki kode Anda, semakin besar kemungkinan bug tersebut bebas hanya karena fakta bahwa cakupan kode selama eksekusi akan lebih konsisten.

Go figure, semua hal ini juga memiliki efek positif pada kinerja juga. Menang!

9
dash-tom-bang

+1 pada kedua komentar unit test.

Selain itu, setel tingkat peringatan tertinggi yang ditawarkan kompiler Anda, dan pastikan peringatan diperlakukan sebagai kesalahan. Bug sering bersembunyi di kesalahan "keliru" itu.

Demikian pula, berinvestasi dalam alat analisis statis yang berjalan pada waktu kompilasi (saya melihat ini sebagai tingkat tambahan peringatan kompiler).

9
Alan

Selain apa yang telah disebutkan:

  • Jangan abaikan kode kesalahan - mis. jangan berasumsi bahwa Anda mendapat hasil yang valid, bahwa file telah berhasil dibuat, dll ... Karena suatu hari, sesuatu akan terjadi.
  • Jangan berasumsi bahwa kode Anda tidak akan pernah memasuki kondisi tertentu dan karena itu "aman untuk mengabaikan kondisi itu".
  • Uji kode Anda, lalu uji oleh orang lain. Saya menemukan saya orang terburuk yang menguji kode saya sendiri.
  • Beristirahatlah, lalu baca kembali kode Anda dan lihat apakah Anda "melewatkan yang sudah jelas". Sering terjadi pada saya.

Banyak hal lain yang saya lupa saat ini, tetapi yang lain pasti akan memikirkan mereka. :)

9
MetalMikester
  • Tulis lebih sedikit kode yang menghasilkan lebih banyak.
  • Pikirkan tentang implikasi tingkat rendah dan konsekuensi tingkat tinggi
  • Renungkan abstraksi yang Anda buat dalam kode Anda.
  • Tuliskan hanya kompleksitas esensial jika memungkinkan.
8
Paul Nathan

Jawaban yang sedikit kurang teknis: jangan memprogram ketika Anda lelah (9 jam/hari sudah cukup), mabuk atau 'dipanggang'. Ketika saya lelah saya tidak memiliki kesabaran untuk menulis kode yang bersih.

8
Alexandru

Tulis tes unit dan tes integrasi.

7
ysolik

Beberapa jawaban bagus di sini mengenai pengujian unit dan alat. Satu-satunya hal yang dapat saya tambahkan kepada mereka adalah ini:

Libatkan penguji Anda sedini mungkin

Jika Anda memiliki tim uji coba, jangan jatuh ke dalam perangkap memperlakukan mereka sebagai penjaga gerbang untuk kualitas kode Anda dan menangkap cacat Anda untuk Anda. Alih-alih, bekerjalah dengan mereka dan libatkan mereka sedini mungkin (pada proyek yang gesit ini akan dimulai dari awal proyek, tetapi kita selalu dapat menemukan cara untuk melibatkan mereka lebih awal jika kita benar-benar mencoba).

  • Cari tahu apa rencana pengujian mereka. Tinjau kasus pengujian mereka dengan mereka - apakah Anda menutupi semuanya dengan kode Anda?
  • Mintalah mereka untuk memahami persyaratan. Apakah sama dengan milikmu?
  • Berikan mereka bangunan kerja awal untuk melakukan pengujian eksplorasi - Anda akan kagum dengan perbaikan yang mereka sarankan.

Memiliki hubungan kerja yang baik dengan penguji Anda berarti Anda dapat menangkap asumsi dan cacat yang buruk sejak awal, sebelum mereka dapat melakukan kerusakan. Ini juga berarti bahwa penguji merasa diberdayakan untuk membantu dengan desain produk dan menangkap masalah kegunaan ketika ada waktu untuk memperbaikinya.

5
Paddyslacker

Alat Analisis Statis

Plugin dan aplikasi seperti FindBugs merayapi kode Anda dan menemukan tempat di mana ada potensial bug. Tempat di mana variabel tidak diinisialisasi dan digunakan atau hanya hal-hal gila yang 9 kali dari 10, membuatnya lebih mudah untuk bug muncul. Alat seperti ini membantu saya mencegah tulang kepala saya bergerak di jalan meskipun itu belum bug.

P.S .: Ingatlah untuk selalu meneliti mengapa alat memberi tahu Anda ada sesuatu yang buruk. Tidak ada salahnya untuk belajar (dan tidak semuanya benar dalam semua situasi).

4
Ryan Hayes

Inspeksi kode atau bentuk lain dari peer review seperti pemrograman pasangan.

Ulasan kode terstruktur seperti inspeksi Fagan setidaknya bisa seefektif dan efisien sebagai unit testing dan bahkan terbukti lebih baik daripada unit testing dalam beberapa kasus. Inspeksi juga dapat digunakan lebih awal dalam siklus hidup perangkat lunak dan dengan artefak selain kode.

Peer Reviews in Software oleh Karl Wiegers adalah buku yang bagus tentang hal ini.

3
Michael

Selain semua saran lain di sini, nyalakan semua peringatan yang mungkin sampai tingkat sensitivitas tertinggi dan perlakukan sebagai kesalahan. Gunakan juga alat bantu linting yang dimiliki bahasa.

Anda akan kagum pada berapa banyak kesalahan sederhana dapat ditangkap oleh peringatan dan berapa banyak dari hal-hal sederhana yang diterjemahkan menjadi bug nyata dalam kode Anda.

2
greyfade

Banyak jawaban bagus di sini, tetapi beberapa hal yang ingin saya tambahkan. Pastikan Anda benar-benar memahami persyaratannya. Saya telah melihat banyak bug ketika pengguna berpikir persyaratan berarti X dan programmer berpikir itu berarti Y. Dorong kembali untuk klarifikasi tentang persyaratan yang buruk atau ambigu. Saya tahu kita semua suka melompat dan kode tetapi semakin banyak waktu yang dihabiskan di depan memastikan pemahaman, semakin sedikit pengerjaan ulang dan perbaikan bug akan ada.

Mengenal bisnis yang Anda dukung, Anda akan sering melihat hal-hal dalam persyaratan yang hilang atau butuh penjelasan lebih lanjut. Ketahuilah bahwa jika Anda melakukan tugas Y sebagaimana dinyatakan, itu akan merusak fitur Z.

Pahami struktur basis data Anda. Banyak banyak bug sebagai hasil dari kueri yang secara sintaksis benar, tetapi mengembalikan hasil yang salah. Pelajari cara mengenali kapan hasil Anda terlihat lucu. Jika saya menulis kueri pelaporan yang kompleks, saya selalu meminta spesialis teknis untuk meninjau hasil sebelum saya menandainya siap, mereka pasti akan melihat sesuatu dalam data yang saya lewatkan. Kemudian buat catatan untuk diri sendiri apa yang mereka tangkap yang tidak Anda ketahui dan ingat bahwa lain kali Anda melakukan sesuatu yang serupa.

2
HLGEM

Saya mengikuti praktek Test-Code-Test alih-alih Code-test-code-test. Ini membantu saya untuk memikirkan use case dan membingkai logika dengan tepat

1
viv

Yang mengejutkan, tiga poin penting berikut ini belum disebutkan:

  • Gunakan pernyataan secara bebas. Pertanyaan yang harus selalu Anda tanyakan pada diri sendiri bukanlah "haruskah saya menyatakan ini?" tetapi "adakah yang saya lupa nyatakan?"

  • Memilih kekekalan. (Gunakan akhir/hanya baca secara bebas.) Semakin sedikit keadaan yang Anda miliki, semakin sedikit hal yang bisa salah.

  • Jangan mengoptimalkan secara prematur. Banyak programmer mendapatkan sisi dilacak dengan masalah kinerja, menyebabkan mereka tidak perlu melilit kode mereka dan membombardir desain mereka tanpa mengetahui sebelumnya apakah kinerja akan menjadi masalah. Pertama, buat produk perangkat lunak Anda dengan cara akademis, dengan mengabaikan kinerja; kemudian, lihat apakah kinerjanya buruk; (Mungkin tidak akan.) Jika ada masalah kinerja, cari satu atau dua tempat di mana Anda dapat memberikan optimasi algoritme Nice dan formal yang akan membuat produk Anda memenuhi persyaratan kinerjanya alih-alih mengubah dan meretas seluruh basis kode Anda untuk memeras siklus jam di sana-sini.

1
Mike Nakis

Gunakan alat inspeksi kode seperti ReSharper atau IDE seperti IntelliJ IDEA yang memperingatkan tentang banyak penyalinan dan -paste bug dan lainnya oleh eg menunjukkan variabel yang "ditulis untuk, tetapi tidak pernah dibaca". Telah menghemat banyak waktu.

1
DonJoe

Saya pikir teknik yang paling penting adalah luangkan waktu Anda. Jika Anda merasa perlu dua hari untuk membuat kode modul baru, tetapi bos Anda memaksa Anda untuk membuat kode hanya dalam satu hari ... kode Anda kemungkinan besar akan bermasalah.

Salah satu buku yang saya baca beberapa waktu lalu, mengatakan bahwa Anda tidak boleh hidup dengan jendela rusak, karena orang tidak akan peduli jika orang lain rusak ... Pengodeannya sama, semua orang akan peduli menjadi yang pertama dalam melakukan sesuatu buruk tapi cepat, tetapi tidak ada yang peduli tentang satu kode neraka, dengan banyak bug, dan desain dan gaya yang sangat buruk.

1
greuze