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.
sumber
Jawaban:
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.
sumber
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.
sumber
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.
sumber
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.
sumber