Einheit 8 / 12

Refactoring und technisches Schuldenmanagement

Gewinne:

  • Möglichkeit, ein Testsicherheitsnetz einzurichten, das das aktuelle Verhalten vor dem Refactoring erfasst
  • Möglichkeit, die KI um kleine, einstufige, verhaltenserhaltende Transformationen zu bitten und jeden Schritt zu validieren
  • Fähigkeit, technische Schulden im Geschäftskontext zu identifizieren und zu priorisieren

Beim Refactoring wird die interne Struktur eines Codes verbessert, ohne sein äußeres Verhalten zu ändern: Dadurch wird er lesbarer, einfacher und wartbarer. Bei technischen Schulden hingegen handelt es sich um einen Designkompromiss, der im Interesse einer schnellen Lösung eingegangen und im Laufe der Zeit „mit Zinsen“ zurückgezahlt wird – jede Ecke, die Sie heute abschneiden, wird morgen als Verlangsamung oder Fehler zurückkommen. Künstliche Intelligenz ist ein leistungsstarker Assistent, der sich wiederholende und mechanische Refactoring-Aufgaben beschleunigt; Aber es gibt eine goldene Regel beim Refactoring, die KI allein nicht garantieren kann: Das Verhalten darf sich nicht ändern.

In dieser Einheit lernen wir, wie man sicheres Refactoring mit KI durchführt: kleine und umkehrbare Schritte, Schutz durch Tests, Erkennung von Code-Gerüchen und Priorisierung technischer Schulden. Der entscheidende Punkt ist folgender: Es sind die bestandenen Tests, nicht das Wort der KI, die beweisen, dass das Verhalten erhalten bleibt.

Die goldene Regel des Refactorings: Verhalten bleibt konstant

Was Refactoring gefährlich macht, ist die unbewusste Verhaltensänderung, während man sagt: „Ich verbessere mich.“ Das Weglassen eines Randfalls beim Vereinfachen einer Bedingung, das Unterbrechen der Reihenfolge beim Transformieren einer Schleife, das Fehlen eines Nebeneffekts beim Teilen einer Funktion – all das führt zu „sauber aussehendem“, aber fehlerhaftem Code.

Aus diesem Grund ist das Testen eine Voraussetzung für das Refactoring: Vor Änderungen müssen Tests durchgeführt werden, die das vorhandene Verhalten erfassen. Diese Tests sind ein „Sicherheitsnetz“; Wenn Sie während des Refactorings versehentlich etwas kaputt machen, werden sie kaputt gehen und Sie warnen. Wenn Sie keine Tests haben, schreiben Sie zuerst Tests, die bestehendes Verhalten beheben (wie wir in Einheit 5 gelernt haben) – hier kommt der KI eine Starthilfe.

Achtung: KI-gestütztes Refactoring ohne Testnetz ist eine der heimtückischsten Fehlerquellen. Es ist leicht zu sagen: „Ich habe das Verhalten beibehalten“; Der Beweis besteht darin, dass vor und nach der Änderung dieselben Tests bestanden werden.

Schritt für Schritt: Sicherer Refactoring-Ablauf

  1. Bauen Sie das Sicherheitsnetz auf. Lassen Sie es Tests geben, die das aktuelle Verhalten des Codes erfassen, den Sie umgestalten möchten. Wenn nicht, schreiben Sie sie zuerst auf (und sehen Sie zu, wie sie durchgehen).
  2. Benennen Sie den Geruch. Was verbessern Sie und warum? „Diese Funktion macht drei Dinge“, „die gleiche Logik wiederholt sich an vier Stellen“, „Namen sind irreführend“.
  3. Bitten Sie um kleine, einstufige Schritte. Bitten Sie die KI um eine einzelne Transformation (z. B. einfach „diese Funktion in zwei Hälften teilen“) und nicht darum, die gesamte Datei neu zu schreiben.
  4. Führen Sie die Tests durch. Nach jedem Schritt. Wenn es grün ist, fahren Sie fort, wenn es rot ist, nehmen Sie es zurück.
  5. Lesen Sie Diff. Bestätigen Sie Zeile für Zeile, dass die Änderung tatsächlich verhaltenserhaltend ist; Es liegt möglicherweise ein logischer Fehler vor, wenn man sagt, KI sei „nur Struktur“.
  6. In kleine Stücke mischen. Große einmalige Refactoring-PRs sind sowohl riskant als auch nicht überprüfbar.

Drei Mini-Hüllen

Fall 1 – 220-Zeilen-Funktion sicher aufgeteilt. Ein Team verfügte über eine Auftragsbearbeitungsfunktion mit 220 Leitungen. Zuerst wurden 14 Tests geschrieben (mit Hilfe von KI), die das aktuelle Verhalten erfassten, alle bestanden. Anschließend wurde die Funktion von der KI Schritt für Schritt in 5 kleinere Funktionen aufgeteilt; Nach jedem Schritt wurden Tests durchgeführt. Zwei Tests wurden in einem Schritt unterbrochen – die KI hatte die Rückkehr in einem Grenzfall verpasst. Tests haben das sofort erkannt und behoben. Ohne das Netzwerk hätte der Fehler bis in die Produktion reichen können.

Fall 2 – Katastrophe ohne Testnetz. Ein anderer Entwickler hat ein Datumsberechnungsmodul „aufgeräumt“, das keine Tests mit KI hatte. Der Code sah besser aus, aber er berechnete das Schaltjahr falsch; Der Fehler trat zwei Wochen später durch eine Kundenbeschwerde ans Licht. Der Verlust überwog bei weitem die durch die Umgestaltung eingesparte Zeit. Lektion: Refactoring ohne Tests ist ein Glücksspiel.

Fall 3 – Priorisierung technischer Schulden. Ein Team gab der KI einen Rückstand von etwa 30 „verbesserbaren“ Punkten und ließ jeden Punkt auf der Achse „Änderungshäufigkeit × Risiko × Aufwand“ punkten. In der resultierenden Tabelle hatte ein hässliches Modul, das selten berührt wurde, tatsächlich eine niedrige Priorität, während ein Modul mittlerer Komplexität, das sich häufig änderte, eine hohe Priorität hatte. Das Team hat seine Energie an die richtige Stelle gelenkt.

Vier kopierbare Vorlagen

Code-Geruchserkennung und Priorisierung:

Listen Sie die „Gerüche“ des Refactoring-Kandidaten in diesem Code auf: lange Funktion, Wiederholung (DRYViolation), irreführender Name, tief verschachtelte Bedingung, versteckter Nebeneffekt, magische Zahl. Für jeden: Standort, Ursache des Problems, vorgeschlagener kleiner Schritt, geschätztes Risiko (niedrig/mittel/hoch). Ändern Sie den Code noch NICHT, planen Sie einfach.{{code}}

Einstufige, verhaltenserhaltende Transformation:

Machen Sie einfach Folgendes: {{einzelne Konvertierung, z.B. Teilen Sie diese Funktion in 3 kleinere benannte Funktionen}}. ÄNDERN Sie das sichtbare Verhalten, die Signatur und die Rückgabewerte. Schreiben Sie in einem Satz, warum alles, was Sie geändert haben, das Verhalten beibehält.{{code}}

Sicherheitsnetz vor Refactoring (Charakterisierungstests):

Schreiben Sie Tests, die das AKTUELLE Verhalten dieser Funktion erfassen (richtig oder nicht); Das Ziel besteht darin, festzustellen, ob sich das Verhalten während des Refactorings ändert. Schließen Sie typische + Edge-Einträge ein. Schreiben Sie Erwartungen basierend auf der aktuellen Ausgabe der Funktion.{{function}}

Generierung von technischen Schuldenaufzeichnungen (Rückstand):

Fügen Sie die folgende Liste von Gerüchen in eine Priorisierungstabelle ein: Substanz, betroffener Bereich, Häufigkeit der Änderung (mein Wissen: {{...}}), Risiko, geschätzter Aufwand, empfohlene Priorität. Platzieren Sie die Maßnahmen mit hoher Wirkung und geringem Aufwand ganz oben. {{smell_list}}

Schwache Eingabeaufforderung / Starke Eingabeaufforderung

Schwach: „Bereinigen Sie diesen Code und verbessern Sie ihn.“
Strong: „Teilen Sie diese 90-Zeilen-Funktion in 3 kleinere Funktionen mit einer einzigen Verantwortung auf, ohne ihr äußeres Verhalten und ihre Signatur zu ändern. Behalten Sie die Nebenwirkungen (DB-Schreibvorgänge) in der aktuellen Reihenfolge bei. Ich habe Tests, das Verhalten sollte gleich bleiben. Geben Sie den Unterschied an und erklären Sie in einem Satz, warum jede Aufteilung verhaltenserhaltend ist. [Code]“

Leistungsstarke Version; Es erfordert eine einzige spezifische Transformation, legt explizit eine Verhaltens- und Signaturbeschränkung fest und erfordert eine Begründung. Vage Aufforderungen wie „besser machen“ führen zu unkontrollierten und riskanten Veränderungen.

Refactoring-Typ

KI-Zuverlässigkeit

Voraussetzung

umbenennen

hoch

Stimmt der Umfang?

Funktionsaufteilung

mittelhoch

Testnet ist ein Muss

Wiederholung teilen

mittel

Verhaltensunterschiede können verborgen bleiben

Algorithmus-/Strukturänderung

niedrig

Umfangreiche Tests + menschliche Validierung

Architektonische Neuordnung

niedrig

Von Menschen geführt, KI-unterstützt

Technische Schulden verwalten, nicht zurücksetzen

Technische Schulden sind nicht nur schlecht; Manchmal ist eine bewusste Kreditaufnahme (um einer Lieferung nachzukommen) die richtige Entscheidung. Das Ziel besteht nicht darin, Schulden abzubauen, sondern sie sichtbar und beherrschbar zu machen. KI erkennt und priorisiert Schulden schnell, aber die Entscheidung, „welche Schulden beglichen und welche aufgegeben werden sollen“, erfordert einen geschäftlichen Kontext: Wie oft ändert sich dieses Modul, wie viele Personen sind davon betroffen, wie hoch ist das Risiko? Diese Entscheidung wird von dem Team getroffen, das die Codebasis und das Produkt kennt; KI verdeutlicht lediglich die Optionen.

Tipp: Halten Sie Ihre Refactoring-PR getrennt von PRs, die Verhaltensänderungen beinhalten. Wenn Sie sagen können: „Diese PR ist nur eine Umgestaltung, das Verhalten ist das gleiche“, erleichtert die Untersuchung und ermöglicht es Ihnen, die Ursache schnell einzugrenzen, wenn ein Problem auftritt.

Häufige Fehler

  • Refactoring ohne Testnetz. Ihnen bleibt nichts übrig, um zu beweisen, dass das Verhalten erhalten bleibt.
  • Es bedeutet „gesamte Datei löschen“. Große, unkontrollierte Änderungen verbergen den Fehler und können nicht untersucht werden.
  • Diff akzeptieren, ohne es zu lesen. Möglicherweise ist der KI etwas Logik entgangen, als sie „nur Struktur“ sagte.
  • Verwechslung von Refactoring mit Verhaltensänderung. Wenn beides in derselben PR durchgeführt wird, ist die Verfolgung der Grundursache unmöglich.
  • Ich versuche jeden Geruch zu beseitigen. Hässlicher Code, der sich selten ändert, hat oft eine niedrige Priorität. Ordnen Sie Energie dem Ort zu, der sich häufig verändert.

Zusammenfassend

Die einzige Regel beim Refactoring ist, dass das Verhalten konstant bleibt, und der Beweis dafür sind die Tests. KI ist leistungsstark bei der Erkennung von Code-Gerüchen, einstufigen Transformationen und der Priorisierung technischer Schulden; Sie müssen jedoch das Sicherheitsnetz einrichten, die Tests durchführen und nach jedem Schritt den Unterschied lesen. Machen Sie kleine, umkehrbare Schritte; zwischen Refactoring und Verhaltensänderung unterscheiden; und lassen Sie das Team, das den Geschäftskontext kennt, entscheiden, welche Schulden beglichen werden sollen.

Anwendungsaufgabe

Wählen Sie aus Ihrer Codebasis eine Funktion aus, die Ihnen lang oder komplex erscheint. Drucken Sie zunächst Tests aus, die das aktuelle Verhalten mit der Vorlage „Sicherheitsnetz“ erfassen, und prüfen Sie, ob sie alle bestehen. Lassen Sie dann die Funktion auf eine einzige Weise umgestalten (z. B. in zwei Hälften aufteilen) mit dem Muster „einstufige, verhaltenserhaltende Transformation“ und führen Sie die Tests erneut aus. Wenn ein Test fehlschlägt, finden Sie heraus, warum; Wenn überhaupt kein Fehler auftritt, lesen Sie den Unterschied Zeile für Zeile, um sicherzustellen, dass das Verhalten tatsächlich erhalten bleibt.

Checkliste

  • [ ] Ich weiß, dass Refactoring das Verhalten nicht ändern sollte, und es gibt Tests, die das beweisen.
  • [ ] Ich richte ein Sicherheitsnetz ein, das das aktuelle Verhalten vor der Umgestaltung erfasst.
  • [ ] Ich möchte kleine, einstufige Transformationen durch KI, keine großen Einzelfälle.
  • [ ] Nach jedem Schritt führe ich die Tests durch und lese den Unterschied.
  • [ ] Ich überarbeite die PR immer getrennt von der PR zur Verhaltensänderung.
  • [ ] Ich priorisiere technische Schulden im geschäftlichen Kontext und versuche nicht blind, sie auf Null zu setzen.