Kamu membuka file yang terakhir disentuh 3 tahun lalu. Tidak ada komentar. Variable bernama data2, tempVar, dan flag. Function sepanjang 400 baris. Tidak ada test. Dan ini harus kamu modify sekarang.
Selamat datang di dunia legacy code.
Setiap developer pasti pernah menghadapi ini — entah itu codebase warisan dari developer sebelumnya, project lama milik sendiri, atau “temporary solution” yang sudah jadi permanent. Dan sekarang, dengan bantuan AI, kita punya tools yang lebih baik untuk menghadapi situasi ini.
Tapi AI bukan tongkat ajaib. Refactoring yang ceroboh bisa merusak sistem yang sebelumnya “jelek tapi jalan.” Artikel ini adalah panduan praktis dan realistis.
Mengapa Legacy Code Itu Susah Disentuh?
Sebelum bicara solusi, penting memahami masalahnya:
Tidak ada test — tidak ada safety net. Kamu tidak tahu apakah perubahan kamu merusak sesuatu sampai ada yang laporan bug di production.
Tight coupling — semua hal terhubung ke semua hal. Ubah satu bagian, tiga bagian lain ikut rusak.
Context yang hilang — kenapa kode ini ditulis seperti ini? Ada bisnis rule tersembunyi? Ada workaround untuk bug di library tertentu? Dokumentasinya: tidak ada.
Fear of change — “kalau masih jalan, jangan disentuh” adalah wisdom yang populer tapi juga trap yang membuat sistem makin susah di-maintain.
Strategi Dasar: Understand Before You Change
Rule nomor satu refactoring: jangan ubah kode yang tidak kamu mengerti.
Ini bukan tentang paham setiap baris — tapi paham apa yang sistem ini lakukan secara keseluruhan, input apa yang masuk, output apa yang keluar, dan apa saja side effects-nya.
Di Sinilah AI Sangat Membantu: Code Comprehension
Sebelum ubah apapun, minta AI untuk bantu kamu memahami kodenya.
Prompt yang efektif:
Ini adalah fungsi [nama] dari codebase lama kami.
Tolong jelaskan:
- Apa yang fungsi ini lakukan secara high-level
- Apa saja edge cases yang di-handle
- Ada tidak pola yang tidak umum atau mungkin workaround untuk bug tertentu
- Apa yang mungkin akan rusak kalau fungsi ini diubah
[paste kode]
AI tidak akan selalu benar — dia tidak tahu konteks bisnis kamu. Tapi dia bisa membantu kamu melihat pola yang mungkin terlewat ketika membaca cepat, dan mengajukan pertanyaan yang tepat.
Framework Refactoring: Langkah Demi Langkah
Fase 1: Characterization Tests
Sebelum refactor, tulis test yang mendokumentasikan behavior saat ini — bukan behavior yang seharusnya. Ini yang disebut characterization tests atau approval tests.
Tujuannya bukan memvalidasi kebenaran kode, tapi memastikan behavior tidak berubah setelah refactoring.
Minta AI untuk bantu generate characterization test:
Berikut adalah fungsi yang mau saya refactor:
[paste kode]
Tolong buatkan characterization tests menggunakan Jest yang:
- Capture behavior saat ini (bukan yang seharusnya)
- Cover semua branch yang ada
- Gunakan input yang realistis berdasarkan kode yang ada
- Tambahkan komentar yang menjelaskan KENAPA test ini ada
Fokus pada mendokumentasikan apa yang terjadi sekarang, bukan apa yang seharusnya terjadi.
Fase 2: Safe Zone Analysis
Identifikasi bagian mana yang aman diubah dan mana yang berisiko:
Relatif aman diubah:
- Nama variable dan function (dengan rename yang proper)
- Formatting dan whitespace
- Extract method untuk blok kode yang ada
- Komentar dan dokumentasi
- Tipe data (dengan hati-hati)
Butuh sangat hati-hati:
- Logic bisnis yang ada
- Urutan operasi
- Error handling
- Anything menyangkut database transactions
- Code yang menyentuh external API
Fase 3: Refactoring Bertahap
Jangan lakukan big bang refactoring. Lakukan perubahan kecil, jalankan test setelah setiap perubahan.
Urutan yang disarankan:
- Rename — perbaiki nama variable dan function yang tidak jelas
- Extract — pindahkan code blocks ke function terpisah tanpa mengubah logic
- Inline — hapus abstraksi yang tidak perlu
- Simplify conditionals — sederhanakan if-else yang complex
- Remove duplication — setelah kamu paham, baru konsolidasi yang duplikat
Teknik Spesifik dengan AI
1. Explain Complex Logic
Tolong explain code ini baris per baris.
Kemudian identifikasi bagian yang paling complex dan suggest cara
untuk membuatnya lebih readable tanpa mengubah behavior.
[paste kode]
2. Rename Suggestions
Variable dan function names berikut tidak cukup descriptive.
Berikan suggestion nama yang lebih baik berdasarkan apa yang kode ini lakukan:
- data2 → ?
- tempVar → ?
- processIt() → ?
- flag → ?
Konteks: [jelaskan apa yang kode ini lakukan]
3. Extract Function
Ini adalah fungsi yang terlalu panjang (400+ baris).
Tolong identifikasi logical boundaries yang bisa di-extract
menjadi function terpisah tanpa mengubah behavior.
Berikan output dalam format:
- Nama function baru yang disarankan
- Baris mana yang masuk ke function tersebut
- Parameter yang dibutuhkan
- Return value
[paste kode]
4. Detect Patterns dan Antipatterns
Review kode berikut dan identifikasi:
- Design patterns yang sudah diimplementasikan (bahkan kalau tidak disengaja)
- Antipatterns yang perlu diaddress
- Coupling yang berlebihan antara komponen
- Violation dari SOLID principles
[paste kode]
Trap yang Harus Dihindari
Jangan Minta AI untuk “Rewrite Everything”
Ini godaan terbesar. Kamu paste seluruh file dan bilang “tolong rewrite ini jadi clean code.”
Masalahnya: AI tidak tahu business rules tersembunyi. Dia tidak tahu bahwa if (status === 3) itu sebenarnya adalah “kondisi khusus untuk merchant yang join sebelum tahun 2023.” Kode yang dihasilkan mungkin lebih bersih tapi kehilangan logic penting.
Selalu refactor satu bagian kecil pada satu waktu, dan verify setelah setiap langkah.
Jangan Abaikan Test yang Fail
Kalau characterization test yang kamu tulis fail setelah refactoring, itu signal bahwa kamu mengubah behavior — baik sengaja maupun tidak. Investigasi dulu sebelum lanjut.
Jangan Percaya AI 100% untuk Security-Critical Code
Autentikasi, otorisasi, enkripsi, validasi input — review ini secara manual. AI mungkin menghasilkan kode yang terlihat bersih tapi punya subtle security issue.
Toolkit Refactoring dengan AI
Untuk Code Understanding:
- Claude atau GPT-4 — explain dan analyze kode
- GitHub Copilot Chat — inline explanation di editor
Untuk Automated Refactoring:
- Cursor / Windsurf — multi-file refactoring dengan konteks
- JetBrains IDE — built-in refactoring tools yang kuat (rename, extract, inline)
- VS Code refactoring tools — lebih basic tapi cukup untuk banyak kasus
Untuk Testing:
- Jest / Vitest — unit testing untuk JavaScript/TypeScript
- Stryker — mutation testing untuk verify test quality
Untuk Code Analysis:
- SonarQube — static analysis untuk detect code smells
- ESLint/TSLint dengan rule sets yang comprehensive
Kasus Nyata: Refactoring God Function
God function adalah function yang melakukan terlalu banyak hal — bisa ratusan bahkan ribuan baris. Ini salah satu yang paling umum di legacy code.
Pendekatan step by step:
- Minta AI jelaskan apa yang function ini lakukan
- Identifikasi “natural sections” di dalam function
- Extract setiap section ke function terpisah dengan nama yang descriptive
- Test bahwa behavior sama
- Baru, kalau perlu, refactor lebih dalam di masing-masing function yang sudah di-extract
Perlu diingat: tujuan awal bukan membuat kode sempurna — tapi membuat kode yang cukup dapat dipahami untuk bisa dimodifikasi dengan aman.
Kapan Rewrite vs Refactor?
Pertanyaan yang tidak ada jawaban universal:
Pilih refactor ketika:
- Sistem masih jalan dan ada user yang bergantung padanya
- Business logic tersembunyi di kode, susah untuk didokumentasikan ulang dari awal
- Risk of rewrite lebih tinggi dari benefit
- Tim tidak punya waktu untuk rewrite total
Pertimbangkan rewrite ketika:
- Teknologi yang digunakan sudah tidak supported
- Biaya maintenance lebih tinggi dari biaya rewrite
- Kode sudah terlalu korup untuk diperbaiki secara incremental
- Ada clear spec yang bisa jadi foundation untuk versi baru
Rewrite total hampir selalu lebih susah dari yang diperkirakan. Mulai dari refactor, dan escalate ke rewrite hanya kalau refactor benar-benar tidak feasible.
Kesimpulan
Legacy code bukan musuh — ini aset yang perlu dirawat. AI sangat membantu untuk mempercepat pemahaman dan menemukan pola, tapi judgment dan kehati-hatian tetap di tangan kamu.
Pendekatan yang benar: pelan, terstruktur, selalu ada test, dan ubah satu hal kecil pada satu waktu. Hasilnya mungkin tidak secepat yang diinginkan, tapi jauh lebih aman daripada refactoring yang tergesa-gesa.
Punya codebase lama yang perlu dimodernisasi tapi tidak tahu harus mulai dari mana? Atau butuh bantuan merencanakan strategi refactoring yang aman? Yuk ngobrol — hubungi mafadev dan kita tackle bareng.

Leave a Reply