Zum Inhalt springen

Ursachen-Metriken

Theorie: Newman 2004, Graph-Community-Erkennung.

Misst, wie gut sich der Abhaengigkeitsgraph in unabhaengige Cluster zerlegen laesst. Vergleicht die tatsaechliche Kantendichte innerhalb von Modulen mit einem Zufallsgraphen gleicher Gradsequenz.

Q = (1/m) × Σ [A_ij - k_out_i × k_in_j / m] × δ(c_i, c_j)
  • Wertebereich: [-0,5, 1,0]. Q > 0,3 = signifikante modulare Struktur.
  • Nicht manipulierbar: Das Hinzufuegen nutzloser Kanten naehert den Graphen einem Zufallsgraphen an, was Q verringert. Nur echte modulare Restrukturierung verbessert Q.
  • Sprachunabhaengig: Funktioniert auf JEDEM Graphen. Nutzt sowohl Import-Kanten als auch Aufruf-Kanten.
  • Ersetzt: Kopplung + Kohaesion + God-Files + Hotspots (alles Symptome eines niedrigen Q).

Theorie: Martin 2003, Prinzip der azyklischen Abhaengigkeiten.

Misst die Abwesenheit von zirkulaeren Abhaengigkeiten. Zyklen machen die Build-Reihenfolge undefiniert, die Aenderungsausbreitung unvorhersehbar und das Testen schwierig.

  • Berechnung: Tarjans SCC-Algorithmus zaehlt stark zusammenhaengende Komponenten mit mehr als einem Element.
  • Normalisierung: score = 1 / (1 + cycle_count) — Sigmoid, da die Anzahl unbegrenzt ist.
  • Fundamental: A haengt von B ab, B haengt von A ab — keines kann unabhaengig verstanden oder getestet werden.

Theorie: Lakos 1996, Levelisierung und Schichtenarchitektur.

Misst die laengste Abhaengigkeitskette im DAG. Tiefe Ketten bedeuten, dass eine Aenderung am unteren Ende sich durch viele Schichten ausbreitet.

  • Berechnung: Iterative Laengste-Pfad-DFS von Einstiegspunkten.
  • Normalisierung: score = 1 / (1 + depth / 8) — Mittelpunkt 8 (Tiefe 8 = Score 0,5).
  • Unabhaengig von Q: Ein Graph kann perfekte Modularitaet haben und trotzdem eine Kette von 20 Modulen aufweisen, die sequenziell voneinander abhaengen.

Theorie: Gini 1912, urspruenglich aus der Oekonomie (Vermoegensungleichheit).

Misst, wie gleichmaessig die Komplexitaet ueber Funktionen verteilt ist. Eine Codebasis, in der eine God-Funktion CC=200 hat und alle anderen CC=2, hat einen hohen Gini-Wert. Eine Codebasis, in der alle Funktionen CC=5-10 haben, hat einen niedrigen Gini-Wert.

Sort values ascending.
G = Σ (2i - n - 1) × x_i / (n × Σ x_i)
  • Score: 1 - G (niedrigerer Gini = bessere Gleichheit = hoeherer Score).
  • Warum es wichtig ist: God-Files sind die Hauptursache fuer Verwirrung bei KI-Agenten. Wenn 40 % der Komplexitaet in einer Datei steckt, kann der Agent nicht effektiv darueber nachdenken.

Theorie: Kolmogorov-Komplexitaet — die Luecke zwischen tatsaechlichem Code und minimal aequivalentem Code.

Kombiniert tote Funktionen (von keiner Aufrufstelle referenziert) und doppelte Funktionen (identische Body-Hashes).

R = (dead_count + duplicate_count) / total_functions
score = 1 - R
  • Fundamental: Jede Zeile toter oder doppelter Code ist strukturelle Verschwendung — vergroessert den Suchraum des KI-Agenten, ohne zum Verhalten beizutragen.

Ein gerichteter Graph mit attributierten Knoten hat diese unabhaengigen strukturellen Eigenschaften:

DimensionWas sie erfasstEigenschaft von
ModularitaetKanten-ClusteringKanten
AzyklizitaetZirkulaere KantenKanten
TiefeKantenkettenlaengeKanten
GleichheitKnoteneigenschafts-KonzentrationKnoten
RedundanzUnnoetige KnotenKnoten

3 Kanteneigenschaften + 2 Knoteneigenschaften = 5 insgesamt. Mehr hinzuzufuegen wuerde entweder ueberlappen (Entropie ueberlappt mit Gini) oder etwas ausserhalb der statischen Analyse messen (Laufzeitverhalten).