Junk dalam pengembangan — apa itu, mengapa junk-code berbahaya dan cara menghapusnya

Penulis: IT Sectr Diterbitkan: 2026-07-27 Waktu membaca: 10 mnt

Junk (junk code) — adalah kode dan ketergantungan yang tidak memberikan manfaat bagi proyek, tetapi meningkatkan volumenya, waktu pembangunan, dan beban kognitif tim. Berbeda dengan kode mati yang tidak pernah dijalankan, junk mungkin berfungsi, tetapi melakukannya secara tidak efisien atau berlebihan: pustaka duplikat, impor yang tidak digunakan, blok yang dikomentari, polyfill usang, dan abstraksi dekoratif. Menurut laporan CodeScene Code Health Report (2025), rata-rata 15 persen ketergantungan dalam proyek seluler tidak digunakan secara langsung, hanya menarik paket transitif. Junk-code adalah „kelebihan berat” proyek: membuat basis kode lebih tebal, tetapi tidak lebih kuat. Audit ketergantungan secara teratur dan penghapusan abstraksi berlebihan secara langsung meningkatkan kecepatan pembangunan dan kualitas kode.

Poin Utama

  • Junk — kode dan ketergantungan yang tidak berguna atau berlebihan yang memperbesar ukuran proyek tanpa manfaat.
  • Jenis junk: ketergantungan mati, pustaka duplikat, kode yang dikomentari, abstraksi kosong.
  • Ketergantungan junk meningkatkan permukaan serangan dan memperlambat pipeline CI.
  • Alat audit: Gradle dependencies (Android), SwiftPM audit (iOS), depcheck (Node.js).
  • Membersihkan junk secara teratur adalah bagian dari pemeliharaan teknis proyek sama seperti menulis kode baru.

Apa itu junk?

Junk (junk code) — istilah kolektif untuk kode, konfigurasi, dan ketergantungan yang ada dalam proyek tetapi tidak memiliki nilai fungsional. Junk belum tentu rusak atau tidak digunakan — masalahnya adalah keberadaannya memperburuk metrik proyek tanpa pembenaran yang memadai.

Junk dibagi menjadi empat kategori. Pertama — ketergantungan berlebihan: pustaka yang ditambahkan untuk satu fungsi yang dapat diimplementasikan dengan alat standar. Kedua — beban mati: blok yang dikomentari, TODO tanpa tiket, metode kosong, dan kelas stub. Ketiga — solusi duplikat: dua pustaka yang melakukan hal yang sama (misalnya, Gson dan Kotlin Serialization dalam satu proyek). Keempat — over-engineering: lapisan arsitektur yang tidak digunakan tetapi dipelihara „untuk masa depan”.

Menurut penelitian Stripe Engineering Productivity (2025), menghapus 10 persen junk dari proyek tipikal mengurangi waktu pembangunan penuh rata-rata 22 persen. Alasannya: setiap ketergantungan tambahan memperbesar grafik pembangunan, setiap abstraksi kosong membutuhkan waktu untuk dipahami, setiap blok yang dikomentari mengalihkan perhatian.

Kesulitan utama dalam memerangi junk adalah tidak adanya konsekuensi langsung. Proyek dengan junk-code tetap dikompilasi dan berfungsi. Masalah menumpuk secara bertahap: pembangunan melambat, jumlah ketergantungan transitif bertambah, dan setelah satu tahun menambahkan fitur baru memakan waktu dua kali lebih lama dari seharusnya.

Ketergantungan junk dan cara mengidentifikasinya

Ketergantungan junk — adalah pustaka dan paket yang terhubung ke proyek tetapi tidak digunakan secara langsung dalam kode, atau hanya digunakan dalam satu fungsi yang lebih mudah diimplementasikan dengan API standar.

Contoh tipikal: pustaka untuk bekerja dengan JSON ketika proyek sudah menggunakan Kotlin Serialization (dua parser — itu junk); pustaka Apache Commons Lang untuk satu metode StringUtils.isEmpty, yang dapat diganti dengan ekstensi Kotlin isNullOrBlank; pustaka DI yang digunakan dalam satu dari sepuluh modul, sementara yang lainnya mendapatkan ketergantungan secara manual melalui konstruktor.

Setiap ketergantungan tambahan bukan hanya kode ekstra dalam biner. Ini juga meningkatkan permukaan serangan untuk kerentanan: menurut GitHub Advisory Database (2025), 40 persen CVE kritis dalam proyek seluler berasal dari ketergantungan transitif yang tidak dikendalikan oleh pengembang. Semakin sedikit ketergantungan — semakin kecil permukaan serangan.

Analisis ketergantungan proyek Android

groovy
// Lihat pohon ketergantungan Gradle
./gradlew app:dependencies --configuration releaseRuntimeClasspath

// Temukan ketergantungan tidak digunakan (plugin Gradle)
plugins {
    id "com.autonomousapps.dependency-analysis" version "2.0.0"
}

// Hasilkan laporan pustaka tidak digunakan
./gradlew buildHealth

Untuk iOS gunakan perintah swift package show-dependencies, yang menampilkan pohon ketergantungan lengkap. Alat Xcode Build Timeline menunjukkan berapa banyak waktu yang ditambahkan setiap pustaka ke pembangunan. Jika pustaka memakan 30 persen waktu kompilasi tetapi hanya digunakan di satu layar — itu adalah kandidat untuk dihapus atau diganti.

Untuk Node.js (React Native) gunakan depcheck — utilitas yang menemukan ketergantungan tidak digunakan di package.json, dan npm-check, yang juga menunjukkan versi usang. Terapkan aturan: setiap ketergantungan baru harus melewati code review dengan justifikasi „mengapa tidak bisa dengan alat standar”.

Impor mati dan kode yang dikomentari

Impor mati — jenis junk yang paling umum. Mereka tidak mempengaruhi runtime, tetapi meningkatkan waktu kompilasi: kompiler memproses setiap impor, bahkan jika tidak digunakan. Dalam proyek besar, menghapus impor yang tidak digunakan mengurangi waktu pembangunan sebesar 5–10 persen.

IDE modern secara otomatis menyorot impor yang tidak digunakan dengan warna abu-abu. Konfigurasikan pembersihan otomatis saat menyimpan file: di IntelliJ IDEA — Optimize Imports on the fly, di Xcode — Editor > Remove Unused Imports. Di CI tambahkan pemeriksaan: linter harus memblokir commit dengan impor yang tidak digunakan.

Kode yang dikomentari — jenis junk lainnya. Pengembang memberi komentar pada blok agar tidak kehilangan fungsionalitas saat refactoring. Namun git menyimpan riwayat lengkap perubahan: kode yang dihapus dapat dipulihkan dengan satu perintah git revert atau git log -S . Kode yang dikomentari di master adalah tidak hormat kepada tim: setiap pengembang menghabiskan energi mental untuk bertanya „mengapa ini dikomentari dan kapan harus dibuka komentarnya”.

Aturan: tidak ada kode yang dikomentari di repositori. Jika kode tidak diperlukan — hapus selamanya. Jika kode diperlukan tetapi dinonaktifkan sementara — gunakan feature toggle dengan tiket dan tenggat waktu. Komentar seperti // TODO: remove after migration — jangan tinggalkan tanpa tenggat. Beri tanggal dan atur pengingat di kalender.

Abstraksi berlebihan dan over-engineering

Over-engineering — menciptakan lapisan arsitektur yang tidak menyelesaikan masalah saat ini tetapi membutuhkan pemeliharaan. Ini adalah salah satu jenis junk yang paling sulit karena secara formal kodenya „benar”: mematuhi SOLID, dilindungi pengujian, dan sesuai dengan arsitektur. Masalahnya adalah tidak diperlukan.

Contoh klasik — kelas abstrak UseCase dengan satu metode invoke yang hanya memanggil repositori. Jika UseCase tidak menambahkan logika (caching, retry, transformasi), hanya meneruskan panggilan — itu adalah entitas berlebihan. Ini meningkatkan navigasi melalui proyek: pengembang membuka UseCase, melihat invoke → repository — dan menutupnya. Waktu terbuang, manfaat nol.

Contoh lain — parameterisasi berlebihan. Antarmuka generik dengan enam parameter tipe, digunakan di satu tempat. Setiap parameter tipe adalah beban kognitif: saat membaca kode, Anda harus mengingat enam tipe, padahal hanya dua yang benar-benar digunakan. Jika abstraksi tidak digunakan kembali — itu berlebihan.

Kriteria pemotongan: jika abstraksi tidak digunakan kembali dalam tiga konteks berbeda — hapus. Abstraksi dibenarkan ketika benar-benar memecahkan masalah duplikasi, bukan ketika memprediksi skenario masa depan hipotetis. YAGNI (You Ain't Gonna Need It) — prinsip terbaik pencegahan over-engineering.

Alat audit junk

Audit junk memerlukan kombinasi analisis statis, analisis ketergantungan, dan pemeriksaan manual. Pencarian abstraksi berlebihan tidak dapat sepenuhnya diotomatisasi, tetapi junk teknis (impor mati, pustaka tidak digunakan, kode yang dikomentari) dapat ditemukan dengan alat.

KategoriAlatApa yang diperiksa
Ketergantungan tidak digunakandependency-analysis (Gradle)Pustaka yang tidak digunakan dalam kode
Ketergantungan tidak digunakandepcheck (Node.js)Paket dari package.json tanpa impor
Ketergantungan tidak digunakanswift package --show-dependenciesPohon ketergantungan SwiftPM
Impor matiIDE (Optimize Imports)Ekspresi impor yang tidak digunakan
Kode yang dikomentarigrep -r "//" / rg "^\s*//"Blok komentar dengan kode
Metode/kelas kosongSonarQube / CodeClimateMetode tanpa tubuh atau dengan tubuh kosong
Pustaka duplikatGradle lint (duplicate classes)Konflik kelas dari pustaka berbeda

Untuk audit lengkap, jalankan buildHealth (Android) atau depcheck (Node.js) sekali per sprint. Buat dashboard di CI yang menunjukkan dinamika jumlah ketergantungan dari sprint ke sprint. Jika jumlahnya meningkat tetapi fungsionalitas tidak meningkat secara proporsional — tim sedang menumpuk junk.

Perhatikan duplicate classes — kesalahan ketika dua pustaka berisi kelas yang sama. Ini bukan hanya junk, tetapi juga sumber langsung konflik pembangunan. Di Gradle, konflik semacam itu diselesaikan melalui force atau exclude, tetapi setiap penyelesaian semacam itu adalah sinyal bahwa salah satu pustaka berlebihan.

Proses pembersihan proyek secara teratur

Membersihkan junk bukanlah tindakan satu kali, melainkan proses teratur. Tanpa aturan, junk kembali dalam dua hingga tiga sprint. Praktik terbaik — alokasikan 10–15 persen kapasitas setiap sprint untuk pembersihan teknis, termasuk audit junk.

Prosesnya terdiri dari empat langkah. Pertama — diagnostik: menjalankan alat, mendapatkan laporan, memprioritaskan. Prioritas tinggi — ketergantungan dengan CVE yang diketahui dan pustaka duplikat. Sedang — impor mati dan kode yang dikomentari. Rendah — abstraksi berlebihan (memerlukan analisis manual).

Kedua — pembersihan: menghapus ketergantungan mati, mengganti pustaka duplikat dengan satu, menghapus kode yang dikomentari. Setiap perubahan dibuat dalam commit terpisah dengan pesan yang jelas: „remove unused dependency: gson (replaced by kotlinx.serialization)”, „delete commented code in LoginViewModel”.

Ketiga — verifikasi: membangun proyek, menjalankan pengujian, memeriksa UI. Jika setelah menghapus ketergantungan pengujian lulus — ketergantungan memang tidak diperlukan. Jika pengujian gagal — berarti ada referensi tersembunyi yang tidak terdeteksi oleh penganalisis statis.

Keempat — pencegahan: memperbarui daftar periksa code review, menambahkan aturan „tidak ada ketergantungan baru tanpa justifikasi” ke Definition of Done, mengatur pemeriksaan otomatis di CI. Pencegahan adalah satu-satunya cara untuk mencegah penumpukan junk berulang.

Pertanyaan yang Sering Diajukan

Apa perbedaan junk dengan utang teknis?

Utang teknis adalah keputusan kompromi yang disadari (cepat, tetapi berkualitas rendah) yang direncanakan untuk diperbaiki. Junk bukanlah keputusan yang disadari, melainkan sampah yang terkumpul: ketergantungan berlebihan, kode yang dikomentari, abstraksi kosong yang tidak direncanakan dan tidak ingin dipelihara oleh siapa pun.

Seberapa sering junk harus dibersihkan?

Irama optimal — setiap sprint alokasikan 10 persen waktu untuk pembersihan teknis. Ini memungkinkan junk tetap terkendali tanpa menumpuk massa kritis. Jika ada banyak junk dalam proyek — mulailah dengan satu sprint pembersihan besar, lalu beralih ke irama teratur.

Bagaimana meyakinkan tim untuk menghapus junk?

Ukur dan tunjukkan angka: ukur waktu pembangunan sebelum dan setelah menghapus 3–5 ketergantungan berlebihan. Penghematan 15–30 detik per pembangunan dikalikan dengan jumlah pembangunan per hari memberikan jam waktu tim yang dihemat. Angka lebih meyakinkan daripada seruan abstrak untuk kebersihan.

Apakah layak menghapus junk dari ketergantungan jika proyek stabil?

Ya, terutama jika ketergantungan memiliki CVE. Bahkan jika proyek stabil, kerentanan dalam ketergantungan transitif adalah risiko keamanan. Selain itu, saat memperbarui SDK atau bahasa, ketergantungan lama mungkin menjadi tidak kompatibel, dan menghapusnya sebelum upgrade menghemat jam migrasi.

Apa yang harus dilakukan dengan TODO dalam kode?

Setiap TODO tanpa tiket adalah junk. Tetapkan aturan: TODO hanya ditulis dalam format // TODO(PROJECT-1234): fix dengan tautan ke tugas di pelacak. Periksa TODO secara teratur dan tutup yang sudah tidak relevan. Hapus TODO yang kedaluwarsa — jika masalah tidak muncul dalam setengah tahun, itu tidak kritis.

Ringkasan

  • Junk — kode tidak berguna, ketergantungan tidak digunakan, dan abstraksi berlebihan yang memperbesar proyek tanpa manfaat.
  • Empat kategori: ketergantungan berlebihan, beban mati, pustaka duplikat, dan over-engineering.
  • Setiap ketergantungan tambahan berarti peningkatan waktu pembangunan, permukaan serangan, dan beban kognitif.
  • Alat audit: dependency-analysis (Gradle), depcheck (Node.js), SonarQube, grep untuk kode yang dikomentari.
  • Pembersihan teratur: 10–15 persen sprint untuk pekerjaan teknis, audit ketergantungan sekali per sprint.
  • Pencegahan: code review dengan pemeriksaan ketergantungan baru, YAGNI dalam desain, pembersihan impor otomatis.
  • Aturan: tidak ada ketergantungan baru tanpa justifikasi, tidak ada TODO tanpa tiket, tidak ada baris kode yang dikomentari di master.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga