Junk in der Entwicklung — was es ist, warum Junk-Code schadet und wie man ihn entfernt

Autor: IT Sectr Veröffentlicht: 2026-07-27 Lesezeit: 10 Min.

Junk-Code bezeichnet Code und Abhängigkeiten, die einem Projekt keinen Nutzen bringen, aber dessen Größe, Build-Zeit und kognitive Belastung für das Team erhöhen. Im Gegensatz zu totem Code, der nie ausgeführt wird, kann Junk funktionieren, tut dies jedoch ineffizient oder redundant: doppelte Bibliotheken, ungenutzte Importe, auskommentierte Blöcke, veraltete Polyfills und dekorative Abstraktionen. Laut dem CodeScene Code Health Report (2025) werden durchschnittlich 15 Prozent der Abhängigkeiten in mobilen Projekten nicht direkt genutzt, sondern ziehen nur transitive Pakete. Junk-Code ist das „Übergewicht“ eines Projekts: Er macht die Codebasis dicker, aber nicht stärker. Regelmäßige Abhängigkeitsaudits und die Entfernung redundanter Abstraktionen verbessern direkt die Build-Geschwindigkeit und Codequalität.

Wichtige Erkenntnisse

  • Junk ist nutzloser oder redundanter Code und Abhängigkeiten, die die Projektgröße ohne Nutzen erhöhen.
  • Arten von Junk: tote Abhängigkeiten, doppelte Bibliotheken, auskommentierter Code, leere Abstraktionen.
  • Junk-Abhängigkeiten vergrößern die Angriffsfläche und verlangsamen die CI-Pipeline.
  • Audit-Tools: Gradle dependencies (Android), SwiftPM audit (iOS), depcheck (Node.js).
  • Regelmäßige Junk-Bereinigung ist genauso Teil der Projektwartung wie das Schreiben neuen Codes.

Was ist Junk-Code?

Junk (Junk-Code) ist ein Sammelbegriff für Code, Konfigurationen und Abhängigkeiten, die in einem Projekt vorhanden sind, aber keinen funktionalen Wert bieten. Junk ist nicht unbedingt kaputt oder ungenutzt — das Problem ist, dass seine Anwesenheit die Projektmetriken ohne angemessene Rechtfertigung verschlechtert.

Junk wird in vier Kategorien unterteilt. Erste — redundante Abhängigkeiten: Bibliotheken, die für eine einzelne Funktion hinzugefügt wurden, die mit Standardwerkzeugen hätte implementiert werden können. Zweite — totes Gewicht: auskommentierte Blöcke, TODO ohne Tickets, leere Methoden und Stub-Klassen. Dritte — doppelte Lösungen: zwei Bibliotheken, die dasselbe tun (z. B. Gson und Kotlin Serialization in einem Projekt). Vierte — Über-Engineering: Architekturschichten, die nicht genutzt werden, aber „für alle Fälle“ gewartet werden.

Laut einer Studie von Stripe Engineering Productivity (2025) reduziert die Entfernung von 10 Prozent Junk aus einem typischen Projekt die vollständige Build-Zeit um durchschnittlich 22 Prozent. Der Grund: Jede zusätzliche Abhängigkeit erhöht den Build-Graphen, jede leere Abstraktion benötigt Zeit zum Verstehen, jeder auskommentierte Block lenkt ab.

Die Hauptschwierigkeit im Kampf gegen Junk ist das Fehlen unmittelbarer Konsequenzen. Ein Projekt mit Junk-Code kompiliert und funktioniert. Probleme sammeln sich allmählich an: Der Build wird langsamer, die Anzahl transitiver Abhängigkeiten wächst, und nach einem Jahr dauert das Hinzufügen einer neuen Funktion doppelt so lange wie nötig.

Junk-Abhängigkeiten und wie man sie identifiziert

Junk-Abhängigkeiten sind Bibliotheken und Pakete, die einem Projekt hinzugefügt wurden, aber nicht direkt im Code verwendet werden, oder nur für eine einzige Funktion verwendet werden, die mit Standard-APIs einfacher zu implementieren wäre.

Typische Beispiele: eine Bibliothek zur JSON-Verarbeitung, wenn das Projekt bereits Kotlin Serialization verwendet (zwei Parser sind Junk); die Apache Commons Lang-Bibliothek für einen einzelnen StringUtils.isEmpty-Aufruf, der durch die Kotlin-Erweiterung isNullOrBlank ersetzt werden könnte; eine DI-Bibliothek, die in einem von zehn Modulen verwendet wird, während die anderen Abhängigkeiten manuell über den Konstruktor erhalten.

Jede zusätzliche Abhängigkeit ist nicht nur zusätzlicher Code im Binärprogramm. Sie vergrößert die Angriffsfläche für Schwachstellen: Laut GitHub Advisory Database (2025) stammen 40 Prozent der kritischen CVEs in mobilen Projekten von transitiven Abhängigkeiten, die Entwickler nicht kontrollieren. Je weniger Abhängigkeiten, desto kleiner die Angriffsfläche.

Analyse von Android-Projektabhängigkeiten

groovy
// View Gradle dependency tree
./gradlew app:dependencies --configuration releaseRuntimeClasspath

// Find unused dependencies (Gradle plugin)
plugins {
    id "com.autonomousapps.dependency-analysis" version "2.0.0"
}

// Generate unused library report
./gradlew buildHealth

Verwenden Sie für iOS den Befehl swift package show-dependencies, der den vollständigen Abhängigkeitsbaum anzeigt. Das Tool Xcode Build Timeline zeigt, wie viel Build-Zeit jede Bibliothek hinzufügt. Wenn eine Bibliothek 30 Prozent der Kompilierungszeit beansprucht, aber auf einem einzigen Bildschirm verwendet wird, ist sie ein Kandidat für die Entfernung oder Ersetzung.

Verwenden Sie für Node.js (React Native) depcheck — ein Dienstprogramm, das ungenutzte Abhängigkeiten in package.json findet, und npm-check, das zusätzlich veraltete Versionen anzeigt. Führen Sie eine Regel ein: Jede neue Abhängigkeit muss ein Code-Review mit einer Begründung durchlaufen, „warum Standardwerkzeuge nicht verwendet werden können.“

Tote Importe und auskommentierter Code

Tote Importe sind die häufigste Art von Junk. Sie beeinträchtigen die Laufzeit nicht, erhöhen aber die Kompilierungszeit: Der Compiler verarbeitet jeden Import, auch ungenutzte. In großen Projekten reduziert die Entfernung ungenutzter Importe die Build-Zeit um 5–10 Prozent.

Moderne IDEs heben ungenutzte Importe automatisch grau hervor. Richten Sie die automatische Bereinigung beim Speichern ein: in IntelliJ IDEA — Optimize Imports on the fly, in Xcode — Editor > Remove Unused Imports. Fügen Sie eine CI-Prüfung hinzu: Der Linter soll Commits mit ungenutzten Importen blockieren.

Auskommentierter Code ist eine weitere Art von Junk. Entwickler kommentieren Blücke aus, um Funktionalität während der Refaktorisierung „nicht zu verlieren.“ Git speichert jedoch die vollständige Historie der Änderungen: Jeder entfernte Code kann mit einem einzigen git revert- oder git log -S -Befehl wiederhergestellt werden. Auskommentierter Code im Master ist respektlos gegenüber dem Team: Jeder Entwickler verschwendet geistige Energie mit der Frage „warum ist dies auskommentiert und wann sollte es einkommentiert werden?“

Die Regel: Es gibt keinen auskommentierten Code im Repository. Wenn Code nicht benötigt wird, löschen Sie ihn dauerhaft. Wenn Code benötigt wird, aber vorübergehend deaktiviert ist, verwenden Sie einen Feature-Toggle mit einem Ticket und einem Ablaufdatum. Kommentare wie // TODO: remove after migration — hinterlassen Sie sie nicht ohne Frist. Setzen Sie ein Datum und erinnern Sie sich mit einem Kalender.

Redundante Abstraktionen und Über-Engineering

Über-Engineering ist die Erstellung von Architekturschichten, die aktuelle Probleme nicht lösen, aber Wartung erfordern. Dies ist eine der schwierigsten Arten von Junk, weil der Code formal „richtig“ ist: Er folgt SOLID, ist durch Tests abgedeckt und entspricht der Architektur. Das Problem ist, dass er unnötig ist.

Ein klassisches Beispiel ist eine abstrakte UseCase-Klasse mit einer einzigen invoke-Methode, die einfach ein Repository aufruft. Wenn der UseCase keine Logik hinzufügt (Caching, Wiederholung, Transformation), sondern den Aufruf nur durchreicht, ist er eine überflüssige Entität. Er erhöht die Navigation im Projekt: Ein Entwickler öffnet den UseCase, sieht invoke → Repository und schließt ihn. Zeit verschwendet, Nutzen null.

Ein weiteres Beispiel ist übermäßige Parametrisierung. Eine generische Schnittstelle mit sechs Typparametern, die an einer einzigen Stelle verwendet wird. Jeder Typparameter bedeutet kognitive Belastung: Beim Lesen des Codes muss man sechs Typen im Kopf behalten, obwohl nur zwei tatsächlich verwendet werden. Wenn eine Abstraktion nicht wiederverwendet wird, ist sie redundant.

Das Ausschlusskriterium: Wenn eine Abstraktion nicht in drei verschiedenen Kontexten wiederverwendet wird, entfernen Sie sie. Eine Abstraktion ist gerechtfertigt, wenn sie tatsächlich ein Duplikationsproblem löst, nicht wenn sie hypothetische Zukunftsszenarien vorhersagt. YAGNI (You Ain’t Gonna Need It) ist das beste Prinzip zur Vermeidung von Über-Engineering.

Junk-Audit-Tools

Das Junk-Audit erfordert eine Kombination aus statischer Analyse, Abhängigkeitsanalyse und manueller Überprüfung. Es ist unmöglich, die Erkennung redundanter Abstraktionen vollständig zu automatisieren, aber technischer Junk (tote Importe, ungenutzte Bibliotheken, auskommentierter Code) kann mit Tools gefunden werden.

KategorieToolWas es prüft
Ungenutzte Abhängigkeitendependency-analysis (Gradle)Im Code ungenutzte Bibliotheken
Ungenutzte Abhängigkeitendepcheck (Node.js)Pakete aus package.json ohne Importe
Ungenutzte Abhängigkeitenswift package --show-dependenciesSwiftPM-Abhängigkeitsbaum
Tote ImporteIDE (Optimize Imports)Ungenutzte Import-Anweisungen
Auskommentierter Codegrep -r “//” / rg “^\s*//”Kommentarblöcke mit Code
Leere Methoden/KlassenSonarQube / CodeClimateMethoden ohne Rumpf oder mit leerem Rumpf
Doppelte BibliothekenGradle lint (duplicate classes)Klassenkonflikte aus verschiedenen Bibliotheken

Für ein vollständiges Audit führen Sie buildHealth (Android) oder depcheck (Node.js) einmal pro Sprint aus. Erstellen Sie ein CI-Dashboard, das den Trend der Abhängigkeitsanzahl über die Sprints hinweg anzeigt. Wenn die Anzahl steigt, aber die Funktionalität nicht proportional wächst, häuft das Team Junk an.

Achten Sie auf doppelte Klassen — einen Fehler, der auftritt, wenn zwei Bibliotheken dieselbe Klasse enthalten. Dies ist nicht nur Junk, sondern auch eine direkte Quelle für Build-Konflikte. In Gradle werden solche Konflikte über force oder exclude gelöst, aber jede solche Lösung ist ein Signal, dass eine der Bibliotheken überflüssig ist.

Regelmäßiger Projektbereinigungsprozess

Die Junk-Bereinigung ist keine einmalige Aktion, sondern ein regelmäßiger Prozess. Ohne Verfahren kehrt Junk innerhalb von zwei bis drei Sprints zurück. Die beste Praxis ist, 10–15 Prozent der Kapazität jedes Sprints für die technische Bereinigung einschließlich Junk-Audit aufzuwenden.

Der Prozess besteht aus vier Schritten. Erster — Diagnose: Tools ausführen, Bericht erhalten, priorisieren. Hohe Priorität: Abhängigkeiten mit bekannten CVEs und doppelte Bibliotheken. Mittlere Priorität: tote Importe und auskommentierter Code. Niedrige Priorität: redundante Abstraktionen (erfordern manuelle Analyse).

Zweiter — Bereinigung: tote Abhängigkeiten entfernen, doppelte Bibliotheken durch eine ersetzen, auskommentierten Code löschen. Jede Änderung sollte ein separater Commit mit einer klaren Nachricht sein: “remove unused dependency: gson (replaced by kotlinx.serialization)“, “delete commented code in LoginViewModel.“

Dritter — Verifikation: Projekt bauen, Tests ausführen, UI prüfen. Wenn Tests nach dem Entfernen einer Abhängigkeit bestehen, war die Abhängigkeit tatsächlich unnötig. Wenn Tests fehlschlagen, gibt es irgendwo einen versteckten Verweis, den der statische Analysator nicht erkannt hat.

Vierter — Prävention: die Code-Review-Checkliste aktualisieren, eine Regel „keine neue Abhängigkeit ohne Begründung“ zur Definition of Done hinzufügen, automatische Prüfungen in CI einrichten. Prävention ist der einzige Weg, um eine erneute Anhäufung von Junk zu verhindern.

Häufig gestellte Fragen

Wie unterscheidet sich Junk von technischen Schulden?

Technische Schulden sind ein bewusster Kompromiss (schnell, aber qualitativ minderwertig), dessen Behebung geplant ist. Junk ist keine bewusste Entscheidung, sondern angesammelter Müll: überflüssige Abhängigkeiten, auskommentierter Code, leere Abstraktionen, die niemand geplant hat oder warten möchte.

Wie oft sollte Junk bereinigt werden?

Der optimale Rhythmus ist, 10 Prozent jedes Sprints für die technische Bereinigung aufzuwenden. Dies hält Junk unter Kontrolle, ohne kritische Masse anzuhäufen. Wenn ein Projekt viel Junk hat, beginnen Sie mit einem großen Bereinigungssprint und wechseln Sie dann zu einem regelmäßigen Rhythmus.

Wie überzeugt man das Team, Junk zu entfernen?

Messen und zeigen Sie die Zahlen: Messen Sie die Build-Zeit vor und nach der Entfernung von 3–5 überflüssigen Abhängigkeiten. Eine Reduzierung um 15–30 Sekunden pro Build multipliziert mit der Anzahl der Builds pro Tag ergibt Stunden eingesparter Teamzeit. Zahlen überzeugen besser als abstrakte Aufrufe zur Sauberkeit.

Sollte man Junk aus Abhängigkeiten entfernen, wenn das Projekt stabil ist?

Ja, besonders wenn die Abhängigkeit ein CVE hat. Selbst wenn das Projekt stabil ist, ist eine Schwachstelle in einer transitiven Abhängigkeit ein Sicherheitsrisiko. Darüber hinaus kann eine alte Abhängigkeit bei der Aktualisierung eines SDK oder einer Sprache inkompatibel werden, und ihre Entfernung vor dem Upgrade spart Stunden der Migration.

Was tun mit TODO im Code?

Jedes TODO ohne Ticket ist Junk. Legen Sie eine Regel fest: TODO wird nur im Format // TODO(PROJECT-1234): fix geschrieben, verknüpft mit einer Aufgabe im Tracker. Überprüfen Sie TODOs regelmäßig und schließen Sie diejenigen, die ihre Relevanz verloren haben. Entfernen Sie abgelaufene TODOs — wenn das Problem in sechs Monaten nicht aufgetreten ist, ist es nicht kritisch.

Zusammenfassung

  • Junk ist nutzloser Code, ungenutzte Abhängigkeiten und redundante Abstraktionen, die das Projekt ohne Nutzen vergrößern.
  • Vier Kategorien: redundante Abhängigkeiten, totes Gewicht, doppelte Bibliotheken und Über-Engineering.
  • Jede zusätzliche Abhängigkeit erhöht Build-Zeit, Angriffsfläche und kognitive Belastung.
  • Audit-Tools: dependency-analysis (Gradle), depcheck (Node.js), SonarQube, grep für auskommentierten Code.
  • Regelmäßige Bereinigung: 10–15 Prozent des Sprints für technische Arbeit, Abhängigkeitsaudit einmal pro Sprint.
  • Prävention: Code-Review mit Prüfung neuer Abhängigkeiten, YAGNI beim Design, automatische Importbereinigung.
  • Regel: keine neue Abhängigkeit ohne Begründung, kein TODO ohne Ticket, keine Zeile auskommentierten Codes im Master.

Wir entwickeln eine mobile Applikation schlüsselfertig

IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.

Projekt besprechen

Lesen Sie auch