Technical Debt: Utang Mana yang Wajib Dibayar, Mana yang Biarkan Sampai Kiamat
Semua utang itu jahat? Salah. Yang jahat bukan utang — tapi utang yang tidak kamu sadari sedang kamu ambil.
Empat Kuadran (Martin Fowler)
Sumbu: sengaja vs tidak sengaja × bijak vs ceroboh.
| Ceroboh (Reckless) | Bijak (Prudent) | |
|---|---|---|
| Sengaja | "Deadline besok, gak sempat bikin test. Ship aja." | "Kita tahu ini jebakan. Rilis dulu, refactor minggu depan — tiket sudah ada." |
| Tidak sengaja | "Apa itu layer? Apa itu index DB?" | "Sekarang baru paham cara yang benar. Kode lama ditulis sebelum kita tahu." |
Hanya kuadran kanan atas yang benar-benar "utang" dalam arti finansial: kamu pinjam waktu, bunga tercatat, ada rencana bayar. Tiga kuadran lain bukan utang — itu kerusakan atau ketidaktahuan.
Yang WAJIB dibayar (bunga tinggi, makin lama makin mahal)
- Kode yang sering disentuh. Ukur dengan
git log --since="3 months" --name-only | sort | uniq -c | sort -rn | head -20. File paling sering diubah + paling berantakan = prioritas. Ini "hotspot analysis" versi murah, tanpa tool. - Bagian yang bikin on-call bangun jam 3 pagi. Utang di jalur kritis produksi = bunga berbunga.
- Yang menghalangi orang lain bekerja. Naming kacau, modul tanpa batas jelas, config tersebar di 5 tempat. Biaya terbesarnya bukan mesin, tapi waktu orientasi manusia.
- Yang bikin test susah ditulis. Kalau tiap perubahan kecil butuh 20 menit setup, orang berhenti nulis test. Itu utang yang memproduksi utang.
Yang boleh dibiarkan
- Kode di jalur mati. Feature flag mati, script sekali pakai, halaman admin yang dibuka 3 kali setahun. Rasio sentuh-nya nol. Bunga nol.
- Yang tidak akan pernah berubah skalanya. Tool internal 5 user, query 200ms. Optimasi di sini = kerja tanpa hasil.
- Duplikasi kecil yang stabil. "DRY" yang memaksa abstraksi rapuh lebih mahal daripada 30 baris kembar yang jelas. Duplikasi itu murah; abstraksi yang salah itu mahal.
- Yang tidak kamu mengerti. Refactor kode yang kamu belum paham = menukar utang ceroboh dengan utang tidak sengaja. Baca dulu, karakterisasi test dulu.
Aturan praktis
Debt tanpa tiket = bukan debt, itu sampah. Setiap utang yang sengaja diambil harus punya jejak: komentar // ponytail: atau // DEBT: dengan alasan + kondisi kapan harus dibayar. Kalau tidak ada kondisinya, jangan tulis.
// DEBT: cache in-memory, single instance only. Pindah ke Redis kalau replica > 1.
Satu baris. Nol meeting. Orang berikutnya langsung tahu batasnya.
Yang bisa langsung dipakai
Jalankan ini di repo sekarang, 30 detik:
git log --since="3 months" --pretty=format: --name-only | grep -v '^$' | sort | uniq -c | sort -rn | head -15
15 file teratas = tempat utangmu paling mahal. Bukan yang paling jelek — yang paling sering disentuh. Bayar di situ. Sisanya diamkan tanpa rasa bersalah.
Takeaway
Utang teknis bukan soal kode jelek. Soal kode jelek yang sering kamu lewati. Yang tidak pernah dilewati bukan utang — itu museum.