Berdampak rendah refactoring dan pembersihan kode kode ceroboh sambil menunggu persyaratan

17

Saya mewarisi basis kode yang ada untuk produk yang ceroboh. Desain dasar sangat tidak memadai yang sayangnya saya dapat melakukan sedikit tentang tanpa refactor lengkap (kopling TINGGI, kohesi RENDAH, duplikasi kode merajalela, tidak ada dokumentasi desain teknis, tes integrasi bukan tes unit). Produk ini memiliki sejarah, paparan tinggi terhadap klien "cash-cow" yang kritis dengan toleransi minimal terhadap risiko, utang teknis yang akan membuat orang-orang Yunani memerah, basis kode dan kompleksitas SANGAT besar, dan pendekatan pemukul yang lelah terhadap bug oleh tim sebelum saya.

Tim lama melompat kapal ke divisi lain sehingga mereka memiliki kesempatan untuk merusak proyek lain. Sangat jarang saya mengalami Kegagalan Proyek Ketidakmampuan Teknis sebagai lawan Kegagalan Manajemen Proyek tetapi ini memang salah satu dari kasus tersebut.

Untuk saat ini saya sendirian tetapi saya punya banyak waktu, kebebasan untuk mengambil keputusan dan arahan di masa depan dan kemampuan untuk membangun tim dari awal untuk membantu saya.

Pertanyaan saya adalah untuk mengumpulkan pendapat tentang refactoring berdampak rendah pada proyek seperti ini ketika Anda memiliki waktu luang selama fase pengumpulan persyaratan fungsional. Ada ribuan peringatan kompiler, hampir semuanya impor yang tidak digunakan, variabel lokal yang belum dibaca, tidak adanya pengecekan tipe dan gips yang tidak aman. Pemformatan kode sangat tidak dapat dibaca dan ceroboh sehingga sepertinya pembuat kode menderita penyakit Parkinson dan tidak dapat mengontrol berapa kali bilah spasi ditekan pada garis tertentu. Sumber data dan file lebih lanjut biasanya dibuka dan tidak pernah ditutup dengan aman. Argumen metode tidak berguna, duplikat metode yang melakukan hal yang sama, dll.

Sementara saya menunggu persyaratan untuk fitur berikutnya, saya telah membersihkan hal-hal berisiko rendah berdampak rendah saat saya pergi dan bertanya-tanya apakah saya membuang-buang waktu atau melakukan hal yang benar. Bagaimana jika fitur baru berarti merobek kode yang saya habiskan sebelumnya? Saya akan memulai pendekatan Agile dan saya mengerti ini dapat diterima dan normal untuk terus-menerus memperbaiki selama pengembangan Agile.

Dapatkah Anda memikirkan dampak positif atau negatif dari saya melakukan ini yang ingin Anda tambahkan?

maple_shaft
sumber
1
Menyelamatkan apa yang layak diselamatkan, menulis ulang sisanya ...
SF.
"Sangat jarang saya mengalami Kegagalan Proyek Ketidakmampuan Teknis sebagai lawan Kegagalan Manajemen Proyek [...]" Betapa benarnya ini, +1.
Gregory Higley

Jawaban:

22

Pertama saya ingin menunjukkan bahwa tes unit bukan pengganti untuk tes integrasi. Keduanya harus ada berdampingan. Bersyukurlah bahwa Anda memiliki tes integrasi, jika tidak salah satu refactoring kecil Anda bisa membuat salah satu dari sapi perahan yang toleran rendah menjadi balistik pada Anda.

Saya akan mulai bekerja pada peringatan kompiler dan variabel serta impor yang tidak digunakan. Dapatkan bangunan bersih terlebih dahulu. Kemudian mulailah menulis unit test untuk mendokumentasikan perilaku saat ini, kemudian mulailah refactoring yang sebenarnya.

Saya tidak bisa melihat dampak negatifnya. Anda akan mendapatkan banyak pemahaman mendalam tentang basis kode, yang akan membantu dengan refactoring yang lebih besar. Itu hampir selalu lebih disukai daripada refactor daripada menulis ulang, karena selama refactoring Anda masih memiliki produk yang berfungsi, sedangkan selama penulisan ulang Anda tidak. Dan pada akhirnya penjualan produk harus membayar gaji Anda.

Setelah persyaratan mulai masuk, saya akan menggunakan apa yang saya sebut pendekatan sorotan. Lakukan hal lincah yang biasa (memprioritaskan, kemudian memotong lempengan kecil untuk iterasi, dan bekerja melalui itu) dan menyisakan sedikit waktu untuk perbaikan kode. Kemudian tetap refactor di mana Anda bekerja. Seiring waktu, ini akan mencakup area yang luas dari basis kode tanpa Anda harus menjelajah ke area di mana Anda akan mengalami kesulitan membenarkan manajemen mengapa Anda bekerja pada bagian kode tersebut.

wolfgangsz
sumber
Saya sangat suka jawaban ini. Saya membutuhkan pemahaman yang lebih dalam tentang basis kode dan sapi perah DO membayar gaji saya dan juga memungkinkan kami untuk bekerja pada proyek baru yang lebih baik untuk pelanggan lain di mana saya mendapatkan kesempatan untuk memulai dari awal dan melakukannya dengan benar dari awal.
maple_shaft
10

Tes unit penulisan mungkin lebih berharga dari penggunaan waktu Anda: ini akan memberi Anda wawasan tentang cara kerja basis kode saat ini, dan jika Anda memutuskan untuk memulai dari apa yang Anda miliki daripada menulis ulang semuanya dari awal, Anda akan memiliki dasar yang kuat untuk melakukan perubahan tanpa mengambil risiko terlalu banyak. Kemungkinannya adalah bahwa dalam penulisan unit test, Anda juga akan membuat perubahan pada basis kode hanya untuk membuatnya menjadi bentuk yang dapat diuji; itu bagus, karena unit-testable biasanya juga berarti modular, dienkapsulasi dan sebagian besar independen dari keadaan eksternal. Dan, yang paling penting, unit test yang ditulis dengan baik adalah dokumentasi teknis yang sangat berharga. Dengan unit test di tempat, Anda akan dapat menilai apa yang bisa dan tidak bisa dilakukan oleh basis kode saat ini, daripada membuat tebakan liar atau menulis ulang hal-hal untuk berjaga-jaga.

tammmer
sumber
2
Mulailah dengan yang mudah lalu naik ke atas?
Pelaku
2
Ini selalu menjadi masalah dalam pengalaman saya - kode seperti ini tidak pernah ditulis untuk memungkinkan pengujian dan Anda akhirnya harus membuat refactoring besar jika tidak langsung menulis ulang kode untuk bahkan memungkinkan untuk tes unit di tempat pertama.
Wayne Molina
2
Jika kode tersebut tidak dirancang untuk pengujian, itu semua menjadi alasan untuk melakukan tes di sekitarnya - tapi aman. Baca buku Michael Feathers "Bekerja Efektif dengan Legacy Code"; ini memiliki resep untuk membuat kode yang tidak dapat diuji dapat diuji.
Joe White
1
Saya setuju; hanya menyatakan dalam pengalaman saya ketika tidak ada tes, Anda harus memulai refactoring besar untuk membuatnya siap untuk tes di tempat pertama, yang mengarah pada lebih banyak waktu "buang-buang" refactoring, yang membuatnya lebih sulit untuk menulis tes, yang kemudian membuatnya jauh lebih sulit untuk benar-benar memperbaiki apa pun.
Wayne Molina
1
Dibutuhkan beberapa pengalaman dan penilaian yang baik. Tidak semuanya dapat (atau seharusnya) dijadikan unit yang dapat diuji.
Pelaku
1

Memadukan jawaban - pemikiran saya adalah untuk memadukan pengujian dan pembersihan - mungkin 50/50? Jika Anda mengerjakan area yang melakukan semacam pendekatan TDD - atur tes yang perlu Anda ketahui bahwa unit dan pengujian integrasi seperti yang diinginkan dan kemudian mulai memperbaikinya. Pindah jika waktu memungkinkan.

Ini mungkin berarti Anda tidak akan membuat banyak kemajuan, tetapi itu berarti bahwa Anda akan memiliki basis kode yang stabil di beberapa area, setidaknya, dan Anda akan memiliki basis awal yang baik.

Reaksi usus saya awalnya adalah "dapatkah benar-benar sakit untuk membersihkan kode yang rusak?" (alias, kesalahan kompiler), tapi kemudian saya teringat saat-saat di mana memperbaiki masalah benar-benar merusak fungsionalitas dalam beberapa kasus yang sangat aneh karena alih-alih sebuah thread sekarat, ia meninggalkan memori di tempat-tempat yang buruk - pada dasarnya istirahat yang buruk menutupi kesalahan yang bahkan lebih buruk. Ini benar-benar bisa menjadi Kotak Pandora kejutan yang tidak menyenangkan.

Mengingat Anda melakukan ini sambil menunggu lebih banyak persyaratan, saya pikir apa pun yang Anda bisa untuk mendiagnosis kekacauan akan sangat menambah kewarasan jangka panjang Anda.

bethlakshmi
sumber