Apakah ada studi kasus aktual tentang penulisan ulang tingkat keberhasilan / kegagalan perangkat lunak?

36

Saya telah melihat banyak posting tentang penulisan ulang aplikasi yang buruk, pengalaman orang-orang tentang hal itu di sini di Programmer, dan sebuah artikel yang saya siapkan oleh Joel Spolsky tentang masalah ini, tetapi tidak ada bukti keras atau studi kasus. Selain dua contoh yang diberikan Joel dan beberapa posting lainnya di sini, apa yang Anda lakukan dengan basis kode yang buruk dan bagaimana Anda memutuskan apa yang harus dilakukan dengan didasarkan pada studi nyata?

Untuk kasus yang dimaksud, ada dua klien yang saya tahu bahwa keduanya memiliki kode lama. Mereka terus berjalan pincang karena itu karena salah satu dari mereka tahu, menulis ulang adalah bencana, itu mahal dan tidak benar-benar bekerja untuk meningkatkan kode banyak. Pelanggan itu memiliki beberapa logika bisnis yang sangat rumit karena para penulis cepatnya tahu.

Dalam kedua kasus, ini adalah aplikasi misi kritis yang membawa banyak pendapatan bagi perusahaan. Salah satu yang mencoba menulis ulang merasa bahwa mereka akan menabrak dinding bata jika perangkat lunak warisan tidak ditingkatkan di beberapa titik di masa depan. Bagi saya, risiko semacam itu memerlukan penelitian dan analisis untuk memastikan jalan yang sukses.

Pernahkah ada studi kasus aktual yang telah menyelidiki ini? Saya tidak ingin mencoba menulis ulang utama tanpa mengetahui beberapa praktik terbaik, jebakan, dan keberhasilan berdasarkan studi yang sebenarnya.

Buntutnya: oke, setelah pencarian lebih lanjut, saya menemukan tiga artikel menarik tentang studi kasus:

  1. Menulis ulang atau Menggunakan Kembali . Mereka melakukan penelitian pada aplikasi Cobol yang dikonversi ke Jawa.
  2. Yang lainnya adalah tentang Penggunaan Kembali Perangkat Lunak: Pengalaman dan Persepsi Pengembang .
  3. Penggunaan Kembali atau Tulis Ulang Studi lain tentang biaya perawatan versus penulisan ulang.

Baru-baru ini saya menemukan artikel lain tentang masalah ini: The Great Rewrite . Di sana penulis tampaknya menemukan beberapa masalah utama. Bersamaan dengan ini adalah ide prototyping dengan menggunakan tumpukan teknologi baru yang diusulkan dan mengukur seberapa cepat devs mengambilnya. Ini semua sebagai awal penulisan ulang, yang saya pikir merupakan ide bagus!


sumber
10
Saya tidak tahu tentang studi kasus, tetapi saya pikir jawaban standar untuk suatu pendekatan mungkin adalah "menambahkan unit test dan refactor."
Jerry Coffin
2
Bagi saya, ini sangat mungkin sebagai pendekatan risiko terendah yang tersedia. Tentu saja, saya tidak tahu cukup detail untuk memastikan bahwa ini adalah pendekatan yang tepat, tetapi berdasarkan apa yang saya ketahui sejauh ini, saya tidak tahu banyak yang sangat mungkin jauh lebih baik.
Jerry Coffin
2
Jika mereka melakukan tes unit (benar - benar menangkap semua persyaratan) sulit untuk menemukan cara untuk refactoring untuk menghasilkan bencana yang sebenarnya. Tentang hal terburuk yang dapat terjadi adalah Anda tidak membuat kemajuan secepat yang Anda inginkan. Pada saat yang sama, jika basis kode mereka dalam kondisi buruk seperti yang disiratkan oleh pertanyaan, kemungkinan cukup bagus bahwa upaya serius akan diperlukan untuk memungkinkan kemajuan, terlepas dari rute yang diambil.
Jerry Coffin
2
Begitu banyak proyek yang bersifat pribadi sehingga akan sulit untuk studi memiliki set sampel yang sangat baik. Anda mungkin terbatas pada bukti anekdotal.
mike30
1
Masalahnya bukan menulis ulang seluruh basis kode. Masalahnya adalah ingin menulis ulang semuanya sekaligus dan kemudian tekan tombol dan pastikan semua sakit kepala Anda sudah hilang. Dalam kebanyakan kasus, Anda tidak mampu membayar waktu yang hilang untuk pesaing Anda menambahkan fitur baru, bug dibiarkan membusuk, dan pelanggan dibiarkan membatalkan. Betapapun banyak bencana total yang terjadi pada basis kode, harus mungkin untuk mengidentifikasi titik-titik nyeri dan memodulasi potongan-potongan spageti yang tepat saat Anda pergi.
Erik Reppen

Jawaban:

6

Saya tidak dapat menerima pujian atas komentar-komentar hebat ini, tetapi tidak pernah dimasukkan ke dalam jawaban oleh penulis asli, jadi saya menandainya sebagai wiki komunitas.

Saya tidak tahu tentang studi kasus, tetapi saya pikir jawaban standar untuk suatu pendekatan mungkin adalah "menambahkan unit test dan refactor."

Bagi saya, ini sangat mungkin sebagai pendekatan risiko terendah yang tersedia. Tentu saja, saya tidak tahu cukup detail untuk memastikan itu adalah pendekatan yang tepat, tetapi berdasarkan apa yang saya ketahui sejauh ini, saya tidak tahu banyak yang sangat mungkin jauh lebih baik.

Jika mereka melakukan tes unit (benar - benar menangkap semua persyaratan) sulit untuk menemukan cara untuk refactoring untuk menghasilkan bencana yang sebenarnya. Tentang hal terburuk yang dapat terjadi adalah Anda tidak membuat kemajuan secepat yang Anda inginkan. Pada saat yang sama, jika basis kode mereka dalam kondisi buruk seperti yang disiratkan oleh pertanyaan, kemungkinan cukup bagus bahwa upaya serius akan diperlukan untuk memungkinkan kemajuan, terlepas dari rute yang diambil.

Saya akan berasumsi bahwa menulis ulang proyek tidak jauh berbeda dalam tingkat kegagalan daripada proyek pada umumnya, dan akan merujuk pada laporan CHAOS terbaru untuk info terbaik.

pengguna39741
sumber
8
kode yang perlu ditulis ulang biasanya ditulis dengan cara yang tidak dapat diuji (kopling ketat, kelas yang melakukan terlalu banyak, dll.) yang menempatkan Anda pada posisi aneh yang membutuhkan refactor sebelum Anda dapat menguji unit.
Kevin
Ya, itulah sebabnya komentar tentang buku: "Bekerja Secara Efektif dengan Kode Warisan" sangat tepat. Saya harus melakukan sesuatu seperti ini tahun lalu dan mengambil pendekatan yang lebih metodis seperti apa yang dijelaskan dalam buku itu akan menghemat banyak waktu dan meninggalkan jejak dokumentasi / pengujian yang akan berguna. Saya merasa bekerja saja itu bagus, tetapi tidak cukup. Objek memiliki banyak dependensi sehingga saya merasa pengujian saya dapat memiliki cakupan yang lebih baik.
6

Saya membaca Skim Secara Efektif dengan Legacy Code oleh Michael Feathers beberapa waktu lalu dan menemukan itu menawarkan beberapa wawasan yang baik ke dalam praktik dunia nyata mempertahankan kode warisan, termasuk tes menulis (bahkan ketika Anda tidak tahu untuk apa kode itu) dan tentang kursus refactoring / penulisan ulang. Agak ketinggalan jaman tapi berperingkat tinggi di Amazon.

Akan
sumber
3

Berbicara dari pengalaman dan tinggal di sebuah perusahaan yang memiliki arsitektur perusahaan yang buruk sejak awal, saya dapat dengan jujur ​​mengatakan masalah terbesar adalah mengembangkan pemahaman yang komprehensif.

Gagasan bahwa suatu sistem dapat dipecah menjadi beberapa bagian dan dipahami secara individual adalah cacat. Pada satu titik waktu satu individu, atau beberapa individu harus mampu memahami seluruh masalah secara keseluruhan. Jika masalah itu adalah serangkaian masalah bisnis dan teknologi yang mendorongnya; mungkin diperlukan seseorang di perusahaan beberapa tahun untuk memahami semua sistem ke tingkat di mana menggantinya tanpa bencana atau persyaratan yang terlewatkan adalah mungkin. Ini tentu terjadi di perusahaan saya ketika saya mengambil alih sebagai Direktur Teknologi. Jika bukan karena fakta bahwa saya sendiri adalah seorang pembuat kode, saya tidak akan bisa perlahan memahami semua detail dari arsitektur yang tidak tertata rapi, berpasangan ketat, terikat erat dan integrasi teknologi. Jika kecil, detail yang tidak didokumentasikan suka"We put the eBay order number in the "SYSOENT.PO_NUMBER" field in the ERP system because that's what Wendell the VB coder from Florida decided to do" diabaikan hasilnya bisa menjadi bencana, dan satu-satunya cara untuk mengetahui ini adalah perlahan-lahan menemukan semuanya.

Jika seseorang diminta untuk mengganti mesin di pesawat terbang saat dalam penerbangan, atau menghadapi kematian tertentu - mengingat jumlah alat dan sumber daya yang tepat yang perlu diketahui oleh individu yang harus mengetahui cara mengganti sensor, sistem hidrolik, cara mengubah rute aliran bahan bakar , memanipulasi sistem yang tidak pernah dirancang untuk diubah atau dimanipulasi secara eksternal atau dari kokpit. Inilah yang sering menjadi prospek penulisan ulang aplikasi bisnis. Aplikasi ini biasanya ditumbuk dalam bisnis di antara berbagai teknologi lainnya.

Saya kira poin utama saya adalah, sistem harus dipahami dalam kompleksitas yang hampir penuh, dan harus pada suatu titik waktu dipahami dalam kelengkapannya agar sistem baru untuk "direkayasa" dengan benar dan tidak hanya "dibuat".

Cookie dibuat, perangkat lunak (harus) direkayasa.

Ben DeMott
sumber
2
+1 untuk kebutuhan untuk memahami banyak hal tentang sistem bisnis di muka. Namun, seperti yang Anda tahu, tantangan di sini adalah waktu dan sumber daya (dari bisnis) serta faktor perubahan. Untuk sistem menengah dan besar, memahami kompleksitas penuh di muka terkadang tidak selalu mungkin.
NoChance
2

Ada banyak contoh perusahaan yang meninggal karena menulis ulang, seperti Netscape . Ada juga perusahaan yang selamat menulis ulang tanpa masalah besar seperti twitter .

Tidak ada studi kasus terukur, karena tidak layak untuk memiliki eksperimen kontrol di mana Anda melihat keberhasilan bisnis dari tidak menulis ulang versus keberhasilan bisnis menulis ulang. Setiap aplikasi berbeda.

Ada beberapa kasus yang jelas di mana penulisan ulang masuk akal dan banyak kasus di mana itu tidak. Saya sudah memasak sedikit resep untuk mencari tahu apakah penulisan ulang akan masuk akal dalam kasus Anda.

Saya pikir penulisan ulang lebih masuk akal saat ini karena kita mengkode dengan cepat di pundak yang terus meningkatkan kerangka kerja invasif seperti Rails, Grails, AngularJS. Jika Anda ingin pindah dari js sederhana ke Angular, menulis ulang adalah semua yang dapat Anda lakukan. Mungkin masih masuk akal. Jika Anda mengganti satu implementasi diy dengan yang lain (seperti semua contoh dalam artikel Joel Spolsky ) Anda mungkin gila.

iwein
sumber
1

Anda tidak akan menemukan banyak studi kasus non-bias yang tidak lain dari setelah laporan tindakan - kebanyakan orang tidak akan membayar untuk melakukan pekerjaan yang sama dilakukan setidaknya dua kali (sekali sebagai penulisan ulang, sekali sebagai upgrade, terbaik case akan berupa beberapa penulisan ulang / peningkatan oleh tim yang berbeda).

Studi kasus yang Anda temukan tampaknya telah diproduksi oleh Fujitsu, dan tidak mengejutkan hasilnya adalah lebih baik menggunakan alat Fujitsu.

Dari sudut pandang organisasi, penulisan ulang hanya jelas merupakan kegagalan ketika aplikasi yang ditulis ulang tidak berfungsi, atau proyek dibatalkan sebelum selesai - jika tidak, tidak mungkin untuk mengetahui apakah keterlambatan dalam merilis versi yang ditulis ulang itu adalah penyebab kerugian apa pun yang Anda derita atau hanya kebetulan. Jika dibatalkan sebelum selesai, umumnya dianggap membuang-buang waktu dan sumber daya. Upgrade mungkin berpotensi memiliki masalah yang sama, tetapi menjadi inkremental tidak mungkin pada skala yang sama (Anda mendapatkan sesuatu untuk uang Anda).

Kasus terbaik dari perspektif pemrograman adalah melakukan keduanya - peningkatan bertahap saat menulis ulang, keduanya mendukung dan menginspirasi satu sama lain. Kecuali Anda memiliki tim yang berbeda, ini tentu saja akan memakan waktu lebih lama.

Perhatikan bahwa ini memberikan pedoman kasar untuk kapan Anda harus mempertimbangkan penulisan ulang total - proyek ini cukup kecil sehingga Anda dapat melakukannya dengan mudah, atau orgainisasi cukup besar sehingga mampu melakukan keduanya, menghitung upaya atau biaya pembelajaran bermanfaat. Juga perhatikan bahwa jika penulisan ulang tidak pernah berhasil, itu dapat berarti beberapa hal, tetapi semua yang lain sama, mungkin berarti menulis ulang itu tidak perlu.

jmoreno
sumber
1
Menulis ulang bisa menjadi kegagalan ketika berjalan secara besar-besaran melebihi anggaran dan dibatalkan sebelum mencapai penyelesaian. Uang sia-sia. Kemungkinan kejadian ini adalah mengapa penulisan ulang dianggap lebih berisiko daripada refactoring.
MarkJ
@ MarkJ: Saya pikir itu tercakup dalam "tidak bekerja", tapi saya akan mengedit untuk membuatnya lebih jelas.
jmoreno