Kode lama mengacu pada kode perangkat lunak yang masih melayani tujuannya tetapi dikembangkan menggunakan teknologi lama yang sekarang sudah ketinggalan zaman. Ini mencakup kode yang diwarisi dari tim lain atau versi perangkat lunak yang lebih lama dan kode sumber yang tidak lagi didukung atau dipelihara secara aktif. Ini juga mencakup kode yang ditulis menggunakan perangkat keras atau sistem operasi yang sudah usang, kompiler atau antarmuka pemrograman aplikasi (API) yang sudah tidak digunakan lagi, atau bahasa pemrograman atau lingkungan pengembangan perangkat lunak yang sudah ketinggalan zaman . Akibatnya, kode lama tidak lagi sesuai dengan standar pengodean baru, prinsip-prinsip desain perangkat lunak saat ini atau arsitektur komputasi terbaru.
Dalam bukunya tahun 2004, Working Effectively with Legacy Code, Michael Feathers menawarkan deskripsi lain-"kode tanpa tes."1 Definisi kode lama ini berarti bahwa programmer tidak memiliki cara untuk memverifikasi bahwa kode tersebut berfungsi dan bekerja seperti yang diharapkan. Banyak sistem lama juga tidak memiliki dokumentasi yang memadai yang penting untuk memahami perilaku mereka, yang membuat memperluas atau meningkatkannya menjadi tugas berat bagi pengembang.
Kode lama berkontribusi pada hutang teknis, yang perlu “dilunasi” dari waktu ke waktu melalui pemeliharaan kode yang berkelanjutan. Berikut adalah beberapa tantangan umum yang mungkin dihadapi organisasi saat mempertahankan kode lama:
● Kemampuan beradaptasi
● Biaya
● Kinerja
● Skalabilitas
● Keamanan dan kepatuhan
Karena sifatnya yang ketinggalan zaman, kode lama bisa tidak kompatibel atau sulit diintegrasikan dengan sistem yang lebih modern. Kurangnya kemampuan beradaptasi ini dapat menghambat inovasi dan memperlambat pertumbuhan bisnis, sehingga perusahaan berpotensi kehilangan keunggulan kompetitif.
Sistem lama bisa mahal untuk dipelihara. Biaya operasional dan pemeliharaan ini dapat bertambah, dengan biaya dukungan pihak ketiga yang meningkat untuk versi perangkat lunak dan perangkat keras yang lebih lama. Selain itu, menemukan pengembang yang terampil dalam praktik komputasi atau bahasa pemrograman yang sudah ketinggalan zaman bisa jadi merupakan tantangan tersendiri dan ada harganya.
Arsitektur monolitik yang kikuk menyebabkan latensi tinggi, waktu respons yang lambat, dan waktu henti yang sering terjadi. Kinerja yang lamban ini dapat berdampak negatif pada pengalaman pengguna, menurunkan kepuasan pelanggan. Hal ini juga dapat menghambat produktivitas dan efisiensi bagi anggota tim yang bekerja dengan dan memelihara sistem ini.
Sistem yang sudah ketinggalan zaman dapat mengalami peningkatan beban pengguna. Mereka berjuang untuk memenuhi lonjakan permintaan dan meningkatkan atau menurunkan skala sesuai kebutuhan. Komponen mereka yang digabungkan erat juga menyulitkan untuk meningkatkan fungsionalitas yang ada atau menambahkan fitur baru.
Kode lama mungkin tidak diperbarui secara aktif dengan patch keamanan dan mengikuti standar keamanan terbaru, sehingga menjadi rentan terhadap serangan siber dan pelanggaran. Sistem lama mungkin juga tidak mematuhi peraturan saat ini.
Memodernisasi aplikasi lama memerlukan perencanaan yang cermat. Berikut adalah metodologi 5 langkah untuk membantu menyederhanakan proses:
● Memahami basis kode
● Membagi dan menaklukkan
● Tes karakterisasi perakitan
● Memfaktorkan ulang, memigrasikan, atau menulis ulang
● Menguji dan mendokumentasikan
Langkah pertama adalah memahami basis kode, dan biasanya menjadi bagian yang paling sulit. Mulailah dengan melakukan ulasan terhadap dokumentasi yang tersedia, baik itu dokumen persyaratan, komentar kode sebaris atau riwayat kontrol versi seperti log komit atau log perubahan.
Jika dokumentasi tidak mencukupi, cobalah menggunakan alat analisis kode statis yang secara otomatis memeriksa kode tanpa menjalankannya. Selain itu, alat visualisasi kode dapat membuat representasi grafis dari struktur kode sumber, membantu memetakan ketergantungan dan interaksi antar elemen.
Setelah tim pengembangan perangkat lunak memiliki pemahaman yang cukup tentang sistem lama, mereka dapat mulai mengatasinya. Basis kode yang luas ini bisa sangat sulit untuk ditangani, jadi bagilah menjadi modul-modul yang lebih kecil dan lebih mudah dikelola dan kerjakan 1 modul pada satu waktu.
Pengujian biasanya ditulis untuk memvalidasi kebenaran kode dan perilaku yang dimaksudkan. Namun, tes karakterisasi dibuat untuk memahami apa yang dilakukan kode dan bagaimana fungsinya. Ini berguna untuk memahami kode lama.2
Perusahaan umumnya memiliki 3 opsi dalam hal memodernisasi kode lama: memfaktorkan ulang, bermigrasi, atau menulis ulang. Mereka juga dapat menggabungkan salah satu pendekatan ini. Memutuskan jalur mana yang akan ditempuh membutuhkan keterlibatan tim rekayasa perangkat lunak dan tim kepemimpinan bisnis.
Refaktorisasi kode mengubah struktur internal kode sumber tanpa mengubah perilaku eksternalnya atau memengaruhi fungsionalitasnya. Perubahan kecil ini cenderung tidak menimbulkan bug dan dapat menghasilkan kode yang jelas dan bersih yang lebih mudah dipelihara.
Untuk kode lama, tim dapat memulai dengan modifikasi kecil untuk setiap modul, termasuk mengganti nama variabel, menghapus metode yang duplikat atau tidak terpakai, dan menstandarkan format. Mereka kemudian dapat melanjutkan dengan restrukturisasi yang lebih berbasis logika seperti memecah metode besar menjadi metode yang lebih kecil, menyederhanakan kondisionalitas yang kompleks dan memindahkan fitur di antara fungsi-fungsi untuk mengurangi ketergantungan dan meningkatkan keterpaduan.
Migrasi merupakan cara lain menuju modernisasi kode lama. Hal ini memerlukan migrasi semua atau sebagian kode ke platform atau tumpukan teknologi yang lebih baru, seperti transisi dari arsitektur monolitik ke layanan mikro atau beralih dari lokal ke cloud. Penting untuk memeriksa kompatibilitas dengan platform atau tumpukan teknologi dan mengonfirmasi apakah penyedia menawarkan dukungan apa pun selama migrasi.
Menulis ulang kode lama sering kali menjadi pilihan terakhir karena melibatkan pembuatan kode baru sepenuhnya untuk menggantikan kode lama. Ini merupakan proyek baru tersendiri—sebuah usaha besar yang mungkin memerlukan tim pengembangan terpisah untuk menanganinya.
Baik migrasi maupun penulisan ulang bisa menjadi tugas yang menakutkan bagi basis kode lama yang besar, sehingga tim dapat mempertimbangkan strategi “strangler fig”.3 Ara pencekik tumbuh tinggi di permukaan pohon, akarnya turun ke tanah, perlahan-lahan membungkus pohon inangnya dengan kisi-kisi yang menyempit yang pada akhirnya menyebabkan pohon itu layu.
Dalam hal sistem lama, tim dapat secara bertahap memigrasi atau menulis ulang fragmen kode kecil sampai seluruh basis kode telah dialihkan ke kerangka kerja modern atau dikembangkan dalam bahasa pemrograman saat ini. Namun, tim harus membangun arsitektur transisi untuk kode yang ada dan kode baru untuk hidup berdampingan. Arsitektur transisi ini kemudian akan dinonaktifkan setelah migrasi atau penulisan ulang selesai.3
Sangat penting untuk menguji kode yang direfaktor, dimigrasikan, atau ditulis ulang secara menyeluruh untuk memastikan tidak ada bug yang muncul. Pengembang dapat menulis integrasi dan pengujian unit mereka sendiri, tetapi penting juga untuk melibatkan tim QA yang dapat menjalankan pengujian fungsional, regresi, dan menyeluruh untuk memeriksa apakah fitur dan perilaku tetap utuh.
Dokumentasi adalah bagian penting lain dari alur kerja modernisasi. Dokumen perubahan kode sumber, baik dengan membuat anotasi kode melalui komentar sebaris, membuat log perubahan terperinci atau menulis dokumen arsitektur dan desain yang komprehensif dan dokumentasi teknis lainnya.
Beberapa alat dapat membantu mempercepat dan mengotomatiskan proses modernisasi kode lama. Berikut beberapa hal yang umum:
● Penganalisis kode statis
● Aplikasi visualisasi kode
● Menguji kerangka kerja otomatisasi
● Platform dan toolkit migrasi
● Generator dokumen
Alat analisa statis dapat membantu men- debug kode lama untuk kelemahan pemrograman, masalah kualitas, dan bahkan kerentanan keamanan. Banyak alat analisis kode statis mendukung bahasa pemrograman lama seperti C, COBOL, PL/I, dan RPG. Contoh penganalisis kode statis termasuk CodeSonar, Klocwork, sumber terbuka PMD, dan SonarQube.
Visualisator kode merepresentasikan kode sumber secara grafis untuk memberikan gambaran yang lebih baik tentang cara kerjanya, terutama untuk basis kode yang besar atau kompleks. Representasi grafis ini datang dalam format yang berbeda seperti peta kode, diagram alur, dan diagram bahasa pemodelan terpadu (UML). Contoh aplikasi visualisasi kode adalah CodeScene, CodeSee dan Understand, antara lain.
Kerangka kerja ini membuat dan menjalankan pengujian otomatis dan menghasilkan laporan tentang pengujian tersebut. Kerangka kerja otomatisasi pengujian populer termasuk Cypress dan Selenium untuk aplikasi web dan Appium untuk aplikasi mobile.
Platform dan toolkit ini membantu menyederhanakan dan mengotomatiskan alur kerja migrasi untuk sistem lama. Beberapa platform migrasi utama adalah AWS Application Migration Service, Azure Migrate, toolkit migrasi Google Cloud, IBM Cloud Transformation Advisor, dan Red Hat Migration Toolkit for Applications.
Alat-alat ini secara otomatis menghasilkan dokumentasi dari kode sumber dan file input lainnya. Contoh alat pembuatan dokumen adalah Doxygen, Sphinx dan Swimm, di antara lainnya.
Kecerdasan buatan (AI) dapat membantu dalam modernisasi kode lama. Aplikasi AI generatif didukung oleh model bahasa besar (LLM) yang dapat menganalisis basis kode lama yang kompleks atau besar.
AI generatif dapat digunakan untuk membantu tugas modernisasi kode lama ini:
● Penjelasan kode
● Pemfaktoran ulang kode
● Transformasi kode
● Pembuatan dan dokumentasi pengujian
AI generatif dapat memahami konteks dan semantik yang mendasari basis kode lama. Hal ini membuat mereka mampu menguraikan logika dan fungsi di baliknya, menjelaskan kode dengan cara yang dapat dimengerti oleh para programmer.
Alat yang didukung AI dapat menawarkan rekomendasi refactoring real-time. Sebagai contoh, IBM watsonx Code Assistant memanfaatkan model IBM Granite untuk mengidentifikasi bug dan pengoptimalan. Kemudian menyarankan perbaikan yang ditargetkan yang selaras dengan konvensi pengodean yang telah ditetapkan oleh tim, membantu menyederhanakan dan mempercepat refactoring kode.
Sistem AI dapat menyarankan cara untuk mengimplementasikan kode sumber dari bahasa pemrograman lama ke yang lebih modern. Misalnya, IBM watsonx Code Assistant for Z memadukan otomatisasi dan AI generatif untuk membantu pengembang memodernisasi aplikasi mainframe. Kemampuan AI generatif ini termasuk penjelasan kode untuk COBOL, JCL dan PL/I dan mengonversi COBOL ke kode Java.
Seperti kerangka kerja otomatisasi pengujian, asisten pengodean AI juga dapat membuat pengujian secara otomatis. Selain itu, mereka dapat membuat komentar sebaris untuk mendokumentasikan fungsi fragmen atau potongan kode tertentu.
Seperti halnya aplikasi yang didukung AI, programmer harus tetap berhati-hati saat menggunakan AI untuk memodernisasi kode lama. Mereka harus meninjau output untuk akurasi dan menguji perubahan atau perbaikan yang disarankan.
Instana menyederhanakan perjalanan migrasi cloud Anda dengan menawarkan pemantauan yang komprehensif dan insight yang dapat ditindaklanjuti.
Manfaatkan AI generatif untuk mempercepat dan menyederhanakan modernisasi aplikasi mainframe.
Optimalkan aplikasi lama dengan hybrid cloud dan layanan dan strategi modernisasi yang didorong oleh AI.
1 #195 - Working Effectively with Legacy Code and AI Coding Assistant - Michael Feathers, Tech Lead Journal, 14 Oktober 2024
2 Characterization Testing, Michael Feathers, 8 Agustus 2016
3 Strangler Fig, Martin Fowler, 22 Agustus 2024