Bagaimana saya bisa memperbarui basis kode warisan besar untuk memenuhi standar kualitas tertentu?

10

Ada banyak informasi tentang alat dan teknik untuk meningkatkan basis kode warisan, tapi saya belum menemukan studi kasus dunia nyata yang sukses. Sebagian besar saran ada di tingkat mikro, dan meskipun bermanfaat, tidak meyakinkan banyak orang karena kurangnya bukti yang dapat membantu di tingkat makro.

Saya mencari secara khusus untuk peningkatan tambahan yang telah terbukti sukses di dunia nyata ketika memperbarui basis kode warisan besar untuk memenuhi standar kualitas saat ini, dan bukan penulisan ulang yang lengkap.

Sebelum:

  • Besar: lebih besar dari 1MLOC
  • Warisan: tidak ada tes otomatis
  • Kualitas buruk: kompleksitas tinggi, kopling tinggi, cacat lolos tinggi

Setelah

  • Tes otomatis
  • Pembaruan / pemeliharaan yang lebih mudah
  • Kualitas tinggi: kompleksitas rendah, kode dipisahkan, beberapa cacat lolos

Apa langkah tambahan yang telah terbukti di dunia nyata untuk memperbarui basis kode warisan besar yang berhasil memenuhi standar kualitas di atas, tanpa melalui penulisan ulang total?

Jika memungkinkan, sertakan contoh perusahaan atau studi kasus dari proyek warisan besar yang telah melalui proses peningkatan kualitas "sukses" dalam jawaban Anda untuk mendukungnya.

mikelong
sumber
2
Netscape
Karthik T
7
Seluruh industri keuangan? Sebagian besar berjalan pada kode FORTRAN berusia 40 tahun. Tidak seperti Netscape, mereka tidak bisa membuangnya dan menulis ulang dari awal, jadi ini secara bertahap membaik sepanjang waktu ini.
MattDavey
2
di POV saya, Netscape hampir tidak dapat digunakan sebagai contoh yang sukses - proyek tersebut mengakhiri perusahaan ..... yang pada saat itu adalah komersial untuk organisasi laba. Tidak dapat membayangkan pemegang saham membuka rak paling atas pada hari itu ...... sebenarnya ada kertas putih yang sudah diketahui sepanjang baris "Apa yang tidak boleh dilakukan" menggunakan Netscape sebagai studi kasus yang sempurna ....
mattnz
2
Hai @mikelong Saya telah mengedit pertanyaan Anda untuk mencoba dan membukanya kembali. Pertanyaan awal Anda menanyakan daftar contoh, yang dianggap "tidak konstruktif" oleh standar StackExchange. Jangan ragu untuk mengeditnya lebih lanjut untuk menambahkan rincian lebih lanjut tentang apa yang Anda maksud dengan "kualitas tinggi", atau untuk memperbarui kata-kata jika saya membuat kesalahan. :)
Rachel

Jawaban:

8

Buku-buku seperti http://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052 harus cukup menjadi saksi seberapa besar, basis kode kualitas warisan yang lama yang umum dalam industri.

Dugaan saya mengapa Anda belum pernah mendengar atau melihat, dan, yang lebih penting, Anda tidak akan pernah mungkin mendengar tentang mereka sampai Anda mengerjakan salah satu dari mereka sendiri, adalah, sepertinya tidak ada yang mampu karena berbagai alasan, untuk berterus terang dan mengatakan bahwa kode mereka dasar semua di atas tanpa menghadapi dampak non-sepele.

Ini bisa menjelaskan kelangkaan studi yang Anda bicarakan. Jika Anda membaca cukup banyak buku, misalnya, Rahasia C Dalam Peter van der Linden, Anda akan membaca sekitar jutaan dolar bug di mana bagian tentang proyek mana yang memiliki mereka akan hilang.

CATATAN: Saya ingin berkomentar, tapi terlalu panjang. Saya mengerti ini tidak menjawab pertanyaan sepenuhnya.

EDIT: C ++ 11 & Kelayakan jangka panjang GCC dipertanyakan - jika pengembang refactor GCC dan membuatnya lebih toolable sebagai LLVM / dentang, itu mungkin memberikan contoh yang baik. Diskusi mencatat bahwa dokumentasinya buruk di beberapa tempat yang mendorong hambatan masuk untuk pengembang baru yang lebih tinggi.

vpit3833
sumber
4

Pada 3 Februari 2013, Michael Meeks, salah satu pengembang LibreOffice, memberikan ceramah dalam beberapa hari berjudul, "LibreOffice: membersihkan dan memfaktorkan ulang basis kode raksasa, atau mengapa menulis ulang akan lebih buruk lagi . " Kedengarannya persis seperti apa yang Anda minta: diskusi tentang apa yang telah mereka lakukan untuk mengambil "basis kode raksasa yang kurang dipahami secara luas berkomentar di Jerman, tanpa tes unit, infrastruktur membangun kusut, dan dua puluh lima tahun utang teknis yang belum dibayar "dan memodernisasi itu.

Presentasi dapat disiarkan secara online , dan (saya pikir) rekaman akan tersedia di masa mendatang.

Josh Kelley
sumber
1
Saya menyadari ini dijadwalkan beberapa hari dari sekarang, namun begitu disiarkan apakah Anda dapat menambahkan ringkasan dari proses yang mereka ambil untuk memodernisasi basis kode mereka ke jawaban Anda, kalau-kalau tautan itu pernah mati?
Rachel
@Rachel - Jika saya bisa menangkap siaran, saya pasti akan melakukannya. Terima kasih.
Josh Kelley
4

Saya sebenarnya telah melalui refactoring yang cukup signifikan tiga kali dalam karir saya. Kode cenderung membusuk, jadi jika basis kode Anda cukup panjang, refactor besar tidak bisa dihindarkan. Semua contoh saya berada di pangkalan kode pribadi, yang mungkin menjelaskan mengapa contoh publik sulit ditemukan.

Pertama kali adalah aplikasi yang, percaya atau tidak, memiliki arsitektur dasar yang membuatnya hanya berfungsi dengan printer dot matrix. Ketika perusahaan saya tidak lagi dapat menemukan vendor untuk memasok pita, mereka menugaskan saya untuk membuatnya bekerja dengan printer laser.

Yang kedua adalah migrasi beberapa ratus skrip pengujian otomatis dari C ke Jawa, sebagian karena kami membutuhkan kemampuan lintas platform yang lebih baik, dan sebagian karena semakin sulit untuk mempekerjakan pengembang C baru.

Ketiga kalinya saya masih di tengah, yang memodulasi aplikasi monolitik besar untuk memungkinkan pengujian unit dengan mengurangi kopling, dan untuk tujuan lintas platform.

Saya membandingkan upaya untuk mendaki gunung. Anda memiliki tujuan besar di depan Anda, tetapi Anda tidak mengatasinya di tingkat makro. Anda mengambilnya satu pegangan pada satu waktu, selalu memiliki posisi mundur yang dekat, tidak pernah memutuskan keselamatan sebelumnya sampai yang berikutnya ada di tempat. Anda mulai hanya membuat sedikit peningkatan tambahan, dan setelah beberapa saat Anda berbalik dan tiba-tiba ada pemandangan yang indah ini.

Katakanlah Anda memiliki 60.000 file kode yang sangat berpasangan, misalnya. Anda ingin mulai meletakkannya di bawah unit test, tetapi dependensi membuatnya tidak mungkin. Bagaimana Anda memperbaikinya? Anda memisahkan satu file. Anda menambahkan tes otomatis. Anda kembali ke tanah stabil sebelum melanjutkan. Ulangi 59.999 kali.

Jika itu suara sederhana, bahwa karena itu adalah sederhana. Itu tidak mudah, tetapi sederhana. Sulit untuk melihat adanya kemajuan pada awalnya. Kami adalah dua tahun ke dalam apa yang tampaknya menjadi refactor mustahil, dan kemungkinan memiliki tahun di depan kami sampai kami selesai, tetapi melihat ke belakang kami tiba-tiba menyadari betapa jauh lebih baik kode sudah didapat, dan kami telah dapat terus memberikan fungsionalitas baru untuk pelanggan kami dalam waktu yang berarti.

Dua kali lainnya bekerja dengan cara yang sama. Anda menemukan langkah aman terkecil yang dapat Anda ambil, dan Anda mengambilnya, selalu menjaga aplikasi dalam kondisi kerja. Anda hanya mengkhawatirkan gambaran besar untuk memastikan Anda menuju ke arah yang benar. Semua tindakan Anda kecil, mantap, dan bertahap.

Karl Bielefeldt
sumber
1

Dari pengalaman pribadi bekerja pada basis kode baris multi-juta saya telah menemukan beberapa strategi yang tampaknya berhasil.

Lihatlah semua bug (bahkan yang tertutup) dan cobalah untuk memecahnya menjadi beberapa kategori. Khususnya untuk mencoba memecahnya oleh komponen milik mereka. Jika mereka milik lebih dari satu komponen, perhatikan bahwa mereka memilikinya. Setelah Anda selesai melihat ini, ember mana yang terbesar dan gunakan untuk menentukan di mana untuk memulai. Selain itu Anda dapat melihat riwayat revisi file untuk menentukan apa yang paling berubah dan menggunakannya sebagai panduan untuk memulai. Pada dasarnya apa yang Anda coba lakukan adalah menemukan apa yang paling rusak memperbaikinya dan mengulanginya. Selain itu saya telah menemukan bahwa mencoba untuk memperbaiki semuanya pada saat yang sama tidak pernah berhasil hanya menyebabkan lebih banyak masalah.

Jika Anda menemukan bahwa ada banyak hal yang dimiliki oleh beberapa komponen yang merupakan indikasi masalah "sistem" dan mungkin menunjuk ke kode yang terlalu erat digabungkan atau API yang perlu disegarkan.

Area lain tempat saya menghabiskan banyak waktu adalah menguji basis kode yang ada. Ada beberapa strategi di sini dan semua memiliki kelebihan tetapi tidak ada yang merupakan solusi lengkap untuk masalah ini.

  • Pengujian unit dapat bekerja tetapi sering kali Anda terbatas pada apa yang dapat diuji unit karena kode yang digabungkan secara ketat. Namun lakukan di mana Anda bisa.
  • Pengujian eksternal adalah jalan lain. Saya berasumsi bahwa Anda mungkin sudah memiliki ini dan jika tidak, saya akan meluangkan waktu untuk membuatnya. Selain itu, sesuatu yang berhasil bagi saya adalah menambahkan kemampuan untuk menyuntikkan kesalahan / kejadian secara acak ke dalam sistem. Selain itu cobalah untuk menyuntikkan banyak hal sekaligus untuk membuatnya gagal dengan cara baru.
barrem23
sumber