Kita semua telah melakukannya, kami telah memberi label beberapa kode (sering kali barang yang kami warisi) sebagai "warisan"? Tetapi masih digunakan dalam sistem produksi - jadi apakah ini benar-benar warisan? Dan apa yang membuatnya menjadi warisan? Haruskah kita menghindar dari pelabelan kode berfungsi sempurna yang tidak beralasan ini; di mana pelabelan adalah kenyamanan murni yang memungkinkan kita untuk mendorong hal-hal baru dan menjaga manajemen tingkat atas baik dan bahagia?
Ringkasan jawaban
Melihat melalui jawaban saya melihat empat tema umum. Inilah yang saya lihat rinciannya:
- Kode apa pun yang telah dikirimkan: 6
- Sistem mati: 2.5
- Tidak ada tes unit: 2
- Pengembang tidak ada: 1.5
source-code
legacy
Nim
sumber
sumber
Jawaban:
Saya sendiri agak menyukai ringkasan Wikipedia :
Banyak hal yang dijelaskan orang lain dalam jawaban mereka adalah alasan mengapa kode menjadi "warisan". Tetapi pertanyaan penting itu sendiri adalah ini:
Fakta bahwa ia masih digunakan dalam produksi justru itulah yang membuatnya menjadi warisan . Jika kode tidak berfungsi dengan benar, atau tidak lagi digunakan dalam produksi, maka kode itu "rusak" atau "pensiun", masing-masing. Legacy berarti masih digunakan dan berfungsi dengan baik, tetapi menggabungkan desain atau teknik yang tidak lagi umum digunakan.
Setiap kode atau sistem yang Anda (a) ingin tingkatkan / perbarui, tetapi tidak bisa, atau (b) masih di tengah-tengah peningkatan, adalah sistem warisan. Ini tidak berarti refactoring atau pembersihan kode umum, itu berarti perubahan signifikan pada desain, mungkin menggunakan kerangka kerja baru atau bahkan platform baru.
Ada sejumlah alasan mengapa sistem atau kode mungkin menjadi warisan:
Kurangnya perawatan rutin atau pembusukan perangkat lunak . Jelas jika aplikasi tidak dikelola secara teratur, itu tidak akan mengimbangi perubahan besar di dunia perangkat lunak. Ini mungkin karena kelalaian sederhana atau mungkin pilihan yang disengaja berdasarkan prioritas bisnis atau kendala anggaran.
Kurangnya pengujian. Jawaban lain merujuk pada klaim hiperbolik penulis populer atas kode apa pun yang tidak dicakup oleh tes sebagai kode warisan. Ini benar-benar bukan definisi yang akurat tetapi adalah akar penyebab yang mungkin; tanpa tes yang baik (otomatis atau manual), pengembang menjadi takut-takut dan takut untuk membuat perubahan besar karena mereka khawatir akan merusak sesuatu, sehingga memimpin "pembusukan perangkat lunak" di atas.
Rev-locking, sebuah faktor yang sering diabaikan yang secara khusus berbahaya dalam proyek-proyek yang menggunakan pustaka atau kerangka kerja open-source yang besar (walaupun saya juga pernah melihatnya dengan alat-alat komersial). Seringkali akan ada penyesuaian besar yang dilakukan pada kerangka / pustaka, membuat upgrade menjadi sulit atau mahal. Dengan demikian sistem menjadi warisan karena berjalan pada platform yang lebih lama (dan mungkin tidak lagi didukung).
Kode sumber tidak lagi tersedia, artinya sistem hanya dapat ditambahkan, tidak pernah diubah. Karena sistem ini harus ditulis ulang untuk meningkatkan - sebagai lawan revisi bertahap / iteratif - banyak perusahaan tidak akan repot.
Apa pun yang memperlambat atau menghentikan pembaruan pada basis kode dapat menyebabkan basis kode itu menjadi warisan.
Sekarang pertanyaan terpisah, tetapi tidak dinyatakan tetapi tersirat adalah, apa yang salah dengan kode warisan? Ini sering digunakan sebagai istilah merendahkan, maka pertanyaannya:
Dan jawabannya tidak, kita seharusnya tidak; label yang dibenarkan dan istilah itu sendiri jelas menyiratkan kode fungsi. Intinya bukan yang itu fungsi, tapi bagaimana itu berfungsi.
Dalam beberapa kasus tidak ada yang salah dengan kode warisan. Itu bukan kata yang buruk. Kode / sistem lama bukanlah Jahat. Mereka baru saja mengumpulkan debu - kadang-kadang sedikit, kadang-kadang banyak.
Legacy menjadi usang ketika sistem tidak dapat lagi melayani (semua) kebutuhan klien. Itu label adalah salah satu yang kita perlu berhati-hati dari. Kalau tidak, itu hanya persamaan biaya / manfaat; jika biaya peningkatan akan lebih rendah daripada biaya manfaatnya (termasuk biaya pemeliharaan yang lebih rendah di masa depan) maka tingkatkan, jika tidak, biarkan saja. Tidak perlu memuntahkan kata "lawas" dengan nada yang sama seperti yang biasanya Anda pesan untuk "pemeriksaan pajak". Ini situasi yang sangat OK untuk dilakukan.
sumber
Biasanya itu berarti itu ditulis dalam bahasa, atau berdasarkan pada sistem yang biasanya tidak Anda lakukan pengembangan baru.
Misalnya, sebagian besar tempat tidak menulis program baru di Cobol. Namun, sebagian besar bisnis mereka dapat berjalan di aplikasi yang ditulis dalam Cobol. Karenanya, aplikasi tersebut diberi label "Legacy".
sumber
Legacy berarti kode apapun Anda akan lebih mengganti dari pekerjaan dengan. Mengingat sikap sebagian besar programmer terhadap sebagian besar kode yang ada, itu biasanya mencakup hampir semua kecuali apa yang sedang Anda tulis secara aktif saat ini (dan pada proyek besar di mana Anda harus membuat kode ke desain yang beku, bahkan apa yang Anda tulis di momen dapat dimasukkan juga).
Poin terakhir memang mengarah pada dua poin lain yang saya pikir sering benar.
Pertama, kode sering dipertahankan sebagai warisan, meskipun sebenarnya tidak seharusnya demikian. Manajer tingkat yang lebih tinggi umumnya menganggap menerapkan kembali sistem akan menelan biaya sebanyak atau lebih dari implementasi awal, yang jarang benar.
Kedua, unit test adalah pedang bermata dua. Mereka membuatnya terlalu mudah untuk berpikir bahwa perubahan-perubahan yang terlokalisasi dalam implementasi adalah yang sebenarnya penting. Untuk membuat perbaikan signifikan dalam sistem yang lebih besar, Anda sering (biasanya?) Harus mengubah cukup keseluruhan desain sehingga banyak (jika tidak sebagian besar) tes unit menjadi tidak relevan. Sayangnya, kehadiran unit test dan sikap yang mereka hasilkan dapat membuat semuanya terlalu mudah untuk mengabaikan perubahan yang benar-benar diperlukan.
Mungkin contoh yang akan membantu: mari kita asumsikan sebuah program memiliki perpustakaan UI dengan pengujian unit yang hebat, dan beberapa program yang menggunakan perpustakaan itu. Seseorang di manajemen atas menjadi yakin bahwa "web diaktifkan" adalah penting (dan, hanya untuk argumen, mari kita asumsikan bahwa dalam kasus ini dia benar tentang itu). Setelah ditinjau dengan cermat, manajer menengah menemukan bahwa pengujian unit mereka saat ini cukup sehingga mereka dapat berubah dari antarmuka pengguna yang ditampilkan melalui kemampuan windowing sistem operasi lokal untuk ditampilkan dari jarak jauh melalui HTML / CSS / AJAX, sambil mempertahankan semua validasi input asli.
Itu bagus bukan? Ini menunjukkan betapa bermanfaatnya pengujian unit. Kami telah menukar seluruh implementasi dari keseluruhan UI, tetapi memastikan bahwa tampilan, rasa, dan fungsionalitas tetap konsisten, dan semua input pengguna divalidasi untuk memastikan integritas data. Pengujian unit telah menghemat hari!
Atau tidak! Pustaka UI yang hebat, sangat fleksibel, dan telah diuji dengan cermat ini telah membantu semua orang yang buta terlibat dengan fakta bahwa untuk program ini di pasaran dengan penggunanya, UI berbasis web sepenuhnya merupakan hal yang salah untuk dikerjakan. Yang benar-benar dibutuhkan adalah layanan web dengan antarmuka yang tenang , dan sama sekali tidak ada UI sendiri.
Sekarang, memang benar bahwa pengujian unit tidak, dengan sendirinya menghilangkan kemampuan orang untuk memahami pasar mereka atau menyadari bahwa itu benar-benar diperlukan. Pada saat yang sama, kalimat lama tentang palu dan kuku hampir terlintas dalam pikiran. Ini bisa menjadi lebih buruk ketika Anda tidak hanya memiliki palu, tetapi memiliki banyak pengalaman dengan palu ini, dan tahu itu adalah palu yang benar-benar berkualitas tinggi yang bekerja sangat baik dalam banyak situasi yang berbeda. Fakta bahwa ia sangat pandai dalam banyak hal dalam begitu banyak situasi membuatnya lebih sulit untuk dikenali ketika itu sepenuhnya alat yang salah untuk pekerjaan yang sedang dihadapi.
sumber
Kode lama biasanya yatim piatu dalam beberapa cara. Pengembang utama, satu-satunya orang yang memahaminya, tertabrak bus, dan catatannya ditulis dalam dialek asli Ukraina, yang sekarang menjadi bahasa mati. Atau, secara bergantian, apa pun yang ditulis dalam Visual Basic 6.0 .
Saya bekerja pada kode warisan sepanjang waktu. Saya akan mengatakan karakteristiknya adalah:
Jika tidak memiliki karakteristik tersebut, maka itu mungkin bukan warisan. Jika Anda tidak menyukai skrip Perl pendahulu Anda , saya bersimpati, tapi saya pikir itu bukan warisan. Saya baru-baru ini memodernisasi beberapa skrip Perl yang berusia 15 tahun yang dihubungkan dengan database Sybase yang sudah usang . Itu kue dibandingkan dengan membuat bahkan perubahan terkecil untuk sistem akuntansi COBOL kami yang mengerikan .
sumber
Dalam bukunya, Bekerja Efektif dengan Legacy Code , Michael Feathers mendefinisikan kode legacy sebagai kode yang tidak tercakup dalam unit test. Itu satu definisi, yang saya setujui. Saya juga melihat kode lawas sudah tua, namun masih dapat digunakan.
sumber
Secara teknis, legacy adalah kode apa saja yang siap ditulis. Jadi segera setelah diproduksi, itu adalah warisan. Karena sudah ada nilai di sana, Anda tidak bisa begitu saja membuangnya ... Anda harus menghadapinya.
Ini "sebelum waktu Anda" tetapi "masih sakit kepala Anda" .
sumber
Kode lama adalah kode yang hanya tersisa di basis kode karena banyak hal akan berhenti berfungsi sebaliknya. Dengan kata lain: itu satu-satunya alasan untuk menjadi kompatibilitas mundur.
Anda lebih suka mengubahnya atau bahkan membuangnya, tetapi Anda tidak bisa karena Anda akan memecah semua kode yang bergantung padanya (yang mungkin merupakan kode yang tidak dapat Anda adaptasi). Oleh karena itu Anda harus menyimpannya (dan kadang-kadang bahkan mempertahankannya), tetapi Anda ingin semua kode baru tidak ditulis menentangnya.
Contohnya adalah metode API API yang sudah tidak digunakan lagi. Mereka masih di sana, sehingga jika siapa pun yang memperbarui perpustakaan masih dapat membangun proyeknya, tetapi mereka ditandai sebagai usang dan Anda kompiler harus memberi Anda peringatan.
Contoh lain adalah semua trik aneh yang dilakukan Microsoft untuk membuat program berjalan yang ditulis untuk versi OS mereka, mereka telah sepenuhnya ditinggalkan. Puncak dari makhluk ini adalah:
sumber
Warisan memerlukan warisan. Kode lama hanyalah kode yang Anda warisi dari masa lalu. Ini kode warisan bahkan jika Anda menulisnya sendiri sebelumnya!
Semua pertimbangan lain pada dasarnya berasal dari fakta bahwa Anda tidak menulisnya secara khusus untuk proyek Anda saat ini. Itu tidak selalu merupakan hal buruk per se.
sumber
Pendapat saya adalah apa yang dianggap sebagai kode warisan bergantung pada banyak hal, dan tag 'warisan' mungkin khusus untuk organisasi.
Jika perangkat keras / OS yang digunakannya sudah tua dan telah dihentikan oleh vendor - strike 1.
Jika lebih sulit untuk memperbaikinya, daripada menulis ulang, karena alasan apa pun
untuk melakukannya
Strike 2.
Penggabungan beberapa organisasi menjadi satu - Strike 3 - satu sisi mungkin akan ditandai sebagai warisan.
Apakah ada alternatif yang lebih baik, lebih murah yang dijual sebagai aplikasi dan / atau layanan pihak ketiga - mogok 4.
Apakah organisasi itu seperti rumah sakit atau distrik sekolah di mana konsistensi dinilai di atas teknologi baru dalam hal operasi sehari-hari? Diperlukan waktu lebih lama untuk aplikasi untuk dianggap sebagai warisan dibandingkan dengan aplikasi yang sama dalam organisasi komersial / kompetitif.
Jika perusahaan adalah perusahaan pengembangan kecil yang terus meningkatkan / mendukung aplikasi untuk melakukan apa yang pelanggan butuhkan, apakah itu dianggap kode warisan, atau hanya kode 'lama'. Saya tahu sebuah perusahaan bernama Mc2Ok - mereka mengembangkan perangkat lunak pada apa yang tampaknya Windows 3.1, dan terus membawanya ke depan. Masih sangat banyak memiliki tampilan dan nuansa Windows 3.1, tetapi mereka menambahkan antarmuka web juga. Itu adalah perusahaan pengembang dua orang (tebakan saya), dan saya katakan ketika mereka berhenti mengerjakannya, maka itu akan dianggap sebagai warisan, dan waktu untuk bermigrasi satu atau dua tahun setelahnya jika menggunakannya. Tapi itu bisa 10 tahun atau lebih.
Kadang-kadang ketika manajemen berubah, itu dapat berubah dalam gelombang yang memiliki banyak efek menetes ... Tergantung pada pengaruh manajemen baru, itu dapat membuat banyak aplikasi warisan yang mungkin baik-baik saja.
Setiap organisasi, saya percaya, harus mendefinisikan apa arti 'kode warisan' bagi mereka. Saya biasa melihat-lihat iklan The Sunday Times setiap minggu untuk melihat apa yang dicari organisasi. Dulu itu barometer saya untuk apa yang tidak lagi relevan (yaitu, warisan). Nah, The Sunday Times tidak lagi :-) relevan Dan kita bisa menggeneralisasi bahwa COBOL adalah warisan, ASP klasik adalah warisan, dll ... Tapi saya percaya setiap organisasi harus memutuskan kapan aplikasi dianggap warisan untuk itu.
sumber
Kode adalah warisan ketika seseorang takut untuk mengubahnya, karena dia mungkin melanggarnya. Bahkan lebih menyakitkan ketika seluruh sistem mungkin tertekan oleh perubahan kode itu.
Inilah sebabnya saya juga setuju dengan definisi Michael Feathers. Kode yang memiliki unit test yang baik dapat diubah tanpa rasa takut.
Saya juga berpikir bahwa kode warisan tidak ada hubungannya dengan berapa umurnya. Seseorang dapat menulis kode warisan dari awal.
sumber