Memperbaiki bug saat mengerjakan bagian basis kode yang berbeda

19

Ini terjadi setidaknya sekali pada saya. Saya sedang mengerjakan beberapa bagian dari basis kode dan menemukan bug kecil di bagian yang berbeda, dan bug tersebut menghentikan saya untuk menyelesaikan apa yang sedang saya coba lakukan. Memperbaiki bug bisa sesederhana mengubah satu pernyataan.

Apa yang Anda lakukan dalam situasi itu?

  1. Perbaiki bug dan lakukan bersama dengan pekerjaan Anda saat ini
  2. Simpan pekerjaan Anda saat ini di tempat lain, perbaiki bug dalam komit terpisah, kemudian lanjutkan pekerjaan Anda [1]
  3. Lanjutkan apa yang seharusnya Anda lakukan, komit kode (bahkan jika itu istirahat membangun gagal beberapa tes), lalu perbaiki bug (dan membangun membuat tes lulus) dalam komit terpisah

[1] Dalam praktiknya, ini berarti: mengkloning repositori asli di tempat lain, memperbaiki bug, mengkomit / mendorong perubahan, menarik komit ke repositori yang sedang Anda kerjakan, menggabungkan perubahan, dan melanjutkan pekerjaan Anda.

Sunting: Saya mengubah nomor tiga untuk mencerminkan apa yang sebenarnya saya maksudkan.

imgx64
sumber
2
Mengapa tidak melakukan perbaikan bug dan perubahan Anda dalam satu transaksi? Ini cukup umum, dan bersih. Anda harus memberikan komentar yang tepat dalam komitmen Anda, tentu saja.
@Ierre, itu nomor 1. Saya pikir saya bisa memilih kata yang lebih baik daripada silently.
imgx64
Saya biasanya menempatkan beberapa perbaikan di komit yang sama. Saya mereferensikan mereka menggunakan ID tugas, dan saya bahkan Trac untuk melampirkan komit saya ke tugas secara otomatis dengan pengait khusus yang saya pasang
2
@Ierre 303 Oh man, latihan yang buruk! Bagi komit Anda menjadi granular.
alternatif
@mathepic: ketika perubahan hanya mempengaruhi satu tugas ya, tetapi ketika itu mempengaruhi banyak tugas, itu tidak mungkin tanpa merusak build

Jawaban:

15

Saya telah melakukan 1 dan 2 dan pada akhirnya, saya pikir saya lebih suka # 2. Ini memungkinkan visibilitas lebih untuk perbaikan bug, yang mungkin penting untuk QA / catatan rilis / pengembang lainnya.

Saya juga menemukan situasi di mana apa yang saya pikir bug sebenarnya tidak (tidak mengatakan bahwa ini adalah kasus di sini), dan "memperbaikinya" dalam komit terpisah memungkinkan pengembang lain untuk menghubungi saya dan menjelaskan apa itu apa alih-alih "memperbaiki" hanya tersesat di check-in normal saya.

Adam Lear
sumber
11

Saya biasanya memilih # 2. Itu membuat repositori bersih, dan membuat log lebih mudah dimengerti. Aku benci ketika pengembang lain saya bekerja dengan melakukan 15 perbaikan bug yang berbeda, fitur, dan refactor semua dalam komit yang sama.

Juga, tergantung pada bagaimana tim Anda melakukan pelacakan cacat, Anda mungkin perlu mencari repo cacat untuk memastikan bahwa jika cacat yang Anda perbaiki ada di sana, Anda menandai item tersebut lengkap. Atau, Anda mungkin perlu membuat item baru dan menandainya selesai sehingga sistem cacat dan repo kode cocok.

RasionalGeek
sumber
7

Saya melakukan # 2. Menggunakan alat seperti git membuatnya mudah untuk membaginya menjadi beberapa komit. Jika Anda tidak dapat meyakinkan tim Anda untuk beralih ke alat yang lebih modern, git-svn akan memberi Anda porsi yang layak dari apa yang Anda gunakan untuk menyelesaikan masalah ini. Posting blog ini memberikan ikhtisar yang baik tentang alur kerja yang Anda coba selesaikan: Hal Tentang Git

Daenyth
sumber
Terima kasih, posting blog itu sangat berguna, dan dapat diterapkan dalam kasus saya (saya menggunakan Mercurial, yang kurang lebih memiliki fitur yang sama dengan git). Saya pikir saya harus membaca The Book suatu hari nanti.
imgx64
@ imgx64: Tapi saya tidak tahu apakah itu setara dengan indeks. Ini fitur pembunuh git, IMO
Daenyth
Membaca komentar di posting blog itu, Mercurial memiliki ekstensi yang setara. The shelveekstensi melakukan apa yang saya butuhkan.
imgx64
@ imgx64 Shelve bisa bermanfaat, ya. Tapi kurasa ekstensi Record lebih tepat. Saya menggunakannya hanya melalui GUI TortoiseHg (Anda dapat mengklik dua kali pada diff untuk menghapus / menambahkannya ke komit).
barjak
3

Saya memilih opsi tidak tertulis (4): Bagi proyek Anda menjadi kumpulan / pustaka yang sangat terspesialisasi, sehingga bug yang tidak terkait akan selalu berada di lokasi yang berbeda di pohon kontrol versi.

Saya minta maaf jika hal di atas terdengar aneh, tapi maksud saya dengan tulus. Saya merasa ngeri setiap kali saya melihat proyek monolitik dengan seratus bentuk dan ruang nama yang tidak ada hubungannya sama sekali. Saya sering menghadapi dilema yang sama ini, bertanya-tanya apakah dan bagaimana saya harus memecah komit yang berurusan dengan area fungsional yang berbeda; Tidak lama kemudian saya menyadari bahwa memiliki semua area fungsional yang berbeda ini dalam satu proyek yang dapat diterima, dengan sendirinya, merupakan cacat desain utama.

Saya masih sering menemukan bug yang sama sekali tidak terkait saat saya sedang mengerjakan fitur tertentu. Saya mungkin bekerja pada UI dan menemukan bug dalam beberapa logika bisnis, dan harus memperbaikinya sebelum saya bisa melanjutkan. Perbedaannya adalah bahwa logika bisnis selalu dalam perakitan / proyek yang berbeda dari UI, jadi yang harus saya lakukan adalah membuat satu perubahan kecil ke BL dan melanjutkan dengan satu komit yang sangat kecil, kemudian terus bekerja.

Memiliki organisasi proyek yang benar-benar bagus menjadikannya tidak hanya mungkin, tetapi cukup mudah untuk menangani masalah ini tanpa mengubur perubahan, merusak build, atau terperosok dalam cabang / penggabungan yang menjengkelkan (bahkan jika Anda menggunakan DVCS, itu tidak sepenuhnya menyakitkan. ).

Jika Anda tidak memiliki opsi ini - yaitu Anda seorang junior pengembang yang tidak memiliki suara dalam organisasi proyek - maka saya hanya akan pergi dengan # 1 dan membuat catatan yang sesuai dalam log sehingga orang lain tahu mengapa Anda melakukan apa yang Anda lakukan. Jika Anda telah membuat perubahan besar, maka juga ajukan laporan bug dalam sistem pelacakan masalah Anda untuk memberikan visibilitas ke apa yang telah Anda perbaiki dan mengapa.

Aaronaught
sumber
2
Meskipun saya setuju, itu tidak berhasil dalam semua situasi. 'Bug di bagian kode yang berbeda' mungkin berada di kelas induk atau bahkan dalam metode yang berbeda di kelas yang sama. Anda tidak dapat memisahkan mereka di perpustakaan yang berbeda.
imgx64
@ img: Tentu, tetapi jika "bagian berbeda" dari basis kode berada sangat dekat dengan apa yang sedang Anda kerjakan, maka itu mungkin bahkan tidak membenarkan perhatian sebanyak ini - perbaiki saja! : P
Aaronaught
1

Saya mencoba melakukan # 2. Jika ini benar-benar merupakan masalah yang terpisah, kemungkinan besar itu ada di file yang berbeda dari yang sedang Anda kerjakan. Anda harus dapat memeriksa file sebagai komit terpisah, bahkan jika itu dibuat di repositori yang sama yang sedang Anda kerjakan. Untuk semua alasan yang telah dinyatakan, masuk akal untuk memiliki komitmen sel independen mungkin, untuk melacak dan juga mengembalikan perubahan jika itu salah.

KeithB
sumber
3
Dengan Git, Anda dapat membagi beberapa perubahan dalam file yang sama di beberapa komit - Saya sering kehilangan ini ketika bekerja pada proyek berbasis SVN.
Peter Boughton
1

Saya biasanya hanya memperbaiki bug, dan kemudian melanjutkan apa yang saya kerjakan. Ketika saatnya untuk melakukan, dengan asumsi perbaikan bug dalam file yang terpisah, saya melakukan dua komitmen simultan - yang pertama adalah komitmen parsial yang hanya berisi perbaikan bug, dan yang kedua adalah segalanya.

Catatan untuk memikirkan nama
sumber
1

Jawaban singkat: # 2. Anda benar-benar ingin perbaikan bug itu (dengan catatan di pelacak Anda!) Ditandai dalam riwayat versi Anda sebagai entitas yang terpisah.

Jawaban yang lebih panjang:

  • Tersandung bug
  • Tulis tes atau lebih yang menunjukkan bug
  • Buat lulus ujian
  • Lakukan perubahan itu saja dan pengujiannya ( git add --interactiveataudarcs record -i atau Namun VCS Anda melakukannya) (*)
  • Kembali ke apa yang saya lakukan.

(*) Di CVS (tidak, sungguh) saya kadang-kadang memeriksa pohon yang bersih dan juga salinan tempat saya bekerja. Lalu saya menggunakan gabungan - winmerge, dalam kasus saya - untuk menarik hanya perbaikan bug ke pohon bersih sehingga saya dapat melakukan itu secara terpisah. (Opsi lain untuk mengganti nama file Anda yang diubah,cvs update dan menggabungkan. Saat Anda melakukan perubahan, hapus file dan ganti nama file yang Anda pindahkan kembali ke nama aslinya.)

Namun yang perlu dicatat adalah bahwa saya biasanya hanya menemukan bug yang terkait dengan apa yang sedang saya kerjakan, atau berada dalam jarak yang dekat. Saya akan terkejut jika itu normal bagi orang untuk menemukan bug di bagian basis kode yang tidak terkait - mengapa Anda membaca kode yang tidak terkait ketika memperbaiki bug? (Ya, ini adalah kebalikan dari apa yang dikatakan Aaronnaught!)

Frank Shearar
sumber
1

Saya memperbaiki bug dan saya melakukan komitmen terpisah , satu untuk setiap perbaikan / fitur.

Sebagian besar waktu, perubahan tidak di file yang sama, jadi mudah untuk memisahkan komit. Jika perubahan dalam file yang sama, saya menggunakan TortoiseHg (front-end GUI mecurial) untuk memilih secara tepat diff yang ingin saya komit (saya pikir mungkin untuk melakukan ini pada baris perintah dengan ekstensi Record , tetapi kurang nyaman ).

Beberapa orang menggunakan Antrian Mercurial untuk mengisolasi perbaikan kecil saat mengerjakan fitur. Perbaikan kecil ditumpuk dalam MQ, dan ketika fitur selesai dan dikomit, konten antrian juga dilakukan (satu perubahan untuk setiap entri dalam antrian).

barjak
sumber
0

Saya biasanya melakukan # 2. Menyimpan pekerjaan saya saat ini di tempat lain: ini biasanya bekerja dengan baik dengan membuat tambalan. Juga beberapa IDE (IntelliJ) memungkinkan untuk perubahan rak yang persis seperti itu: menyimpan pekerjaan saat ini di tempat lain.

michid
sumber
0

Apa yang saya lakukan tergantung pada apakah bug benar-benar ada di bagian yang berbeda. Jika ya, maka memeriksanya tidak tergantung pada perubahan yang saya lakukan setengah. Saya membuat perubahan, membangun bagian yang berbeda itu untuk memastikan saya tidak melakukan kesalahan sepele, mengujinya (mungkin dengan melakukan apa pun yang membuat saya tidak melakukan) dan memeriksanya dalam menjelaskan apa yang terjadi. Seringkali saya akan membuat item kerja untuk itu, dan setelah checkin / tekad, menetapkan WI ke tester. Kemudian saya kembali ke apa yang saya lakukan.

Jika semuanya sudah dibuahi dengan file yang sudah saya ubah setengahnya, saya tidak bisa membuat dan menguji bagian itu secara mandiri. Dalam hal ini, saya membuat WI lain untuk itu dan ketika saya memeriksa perubahan saya, saya menyelesaikan kedua WI dengan checkin yang sama, yang biasanya bertentangan dengan prinsip saya, tetapi berlaku baik dalam kasus ini.

Dalam kedua keadaan tersebut, perbaikan bug akhirnya diuji oleh saya, diperiksa dengan semacam jejak sehingga orang-orang mengerti mengapa saya mengubah kode itu secara acak hari itu, dan WI ditugaskan kepada orang lain untuk mengonfirmasi bahwa itu benar sekarang.

Kate Gregory
sumber
0

Kami melakukan # 1. # 2 kedengarannya bagus, tetapi saya tidak bisa mengatakan kami memiliki masalah dengan # 1 yang akan diperbaiki # 2.

Faktor tambahan di perusahaan saya adalah kami membuat aplikasi web, dan pengujian kami hampir seluruhnya melalui antarmuka web - kira-kira, apa yang orang sebut pengujian fungsional daripada pengujian unit. Kami memiliki semua tes yang lulus sebelum check-in. Membagi komit menjadi bit yang lebih kecil berarti menjalankan tes satu kali untuk setiap bit, dan itu akan memakan waktu lebih lama. Saya ingin memiliki test suite yang jauh lebih cepat, yang memungkinkan kami melakukan lebih kecil, tetapi kami tidak memilikinya.

Tom Anderson
sumber