Integrating Structural and Semantic Analysis for Code Smell Refactoring Prediction
Dieses Paper schlägt ein Machine-Learning-Framework zur Vorhersage von Code-Smell-Refactoring in Java-Projekten vor und evaluiert dieses empirisch, wobei es zeigt, dass die Kombination traditioneller objektorientierter Metriken mit semantischen und syntaktischen graphenbasierten Embeddings zuverlässige Vorhersagen liefert, indem sie komplementäre Signale erfasst, die über rein strukturelle Metriken hinausgehen.
Originalarbeit lizenziert unter CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/). Dies ist eine KI-generierte Erklärung des untenstehenden Papers. Sie wurde nicht von den Autoren verfasst oder gebilligt. Für technische Genauigkeit konsultieren Sie das Originalpaper. Vollständigen Haftungsausschluss lesen
Software ist niemals wirklich fertig. Wie eine Stadt, die über Jahrzehnte hinweg organisch wächst, häufen Computerprogramme Schichten von Ergänzungen, Patches und schnellen Korrekturen an. Im Laufe der Zeit kann dieses organische Wachstum zu strukturellen Schwächen führen, ähnlich wie bei einem Gebäude, bei dem ein Flur verbreitert wurde, ohne die Wände zu verstärken. In der Welt des Software-Engineerings werden diese lokalisierten Mängel als „Code Smells“ bezeichnet. Es handelt sich dabei nicht um Fehler, die ein Programm zum Absturz bringen, sondern vielmehr um Anzeichen für ein schlechtes Design, das den Code schwer verständlich, änderbar oder wartbar macht. Wenn Entwickler diese Gerüche bemerken, führen sie oft ein „Refactoring“ durch – einen sorgfältigen Prozess der Umstrukturierung des Codes, um dessen Struktur zu verbessern, ohne die eigentliche Funktion der Software zu verändern. Die Herausforderung besteht darin, dass Entwickler nicht immer jeden gefundenen Geruch beheben, und die Vorhersage, welche davon behoben werden, schwierig ist, da die Entscheidung oft von menschlicher Absicht und Kontext abhängt und nicht nur vom Code selbst.
Ein Forscherteam der Universität Milano-Bicocca unternahm den Versuch herauszufinden, ob Maschinen lernen können, diese menschlichen Entscheidungen vorherzusagen. Sie wollten wissen, ob ein Computer ein Stück Code betrachten, einen Mangel identifizieren und präzise erraten kann, ob ein Entwickler es schließlich bereinigen wird. Zu diesem Zweck entwickelten sie ein System, das zwei verschiedene Arten der Betrachtung von Code kombiniert. Der erste Weg ist traditionell: das Zählen von Eigenschaften wie die Länge einer Methode oder die Anzahl der verwendeten Variablen. Der zweite Weg ist moderner und komplexer: den Code in eine Karte seiner Logik und seines Verhaltens zu verwandeln und diese Karte dann in eine mathematische Repräsentation zu übersetzen, die ein Computer auf verborgene Muster analysieren kann. Indem sie diese kombinierten Informationen in Machine-Learning-Modelle einspeisten, testeten die Forscher, ob Computer die subtilen Regeln erlernen können, die Entwickler leiten, wenn sie sich für ein Refactoring entscheiden.
Die Forscher sammelten Daten aus 79 Open-Source-Java-Projekten, einer Sammlung von Software, die über lange Zeit von vielen verschiedenen Personen entwickelt und gepflegt wurde. Sie nutzten automatisierte Werkzeuge, um die Historie dieser Projekte zu scannen, identifizierten tausende Instanzen, in denen Code Smells vorhanden waren, und verfolgten, welche davon später durch spezifische Refactoring-Aktionen behoben wurden, wie etwa das Umbenennen einer Variable, das Extrahieren einer Methode in ein kleineres Stück oder das Ändern eines Parameters. Anschließend erstellten sie für jedes Stück Code einen hybriden Datensatz. Dieser Datensatz enthielt Standardmessungen, wie die Anzahl der Zeilen in einer Methode, neben zwei verschiedenen Arten von „Embeddings“. Eine Art von Embedding bildete den Kontrollfluss ab und zeigte die Reihenfolge, in der Instruktionen ausgeführt werden. Die andere, fortschrittlichere Art bildete die tieferen semantischen Beziehungen ab, erfasste, wie Daten durch das Programm fließen und wie verschiedene Teile des Codes voneinander abhängen, wodurch effektiv ein reichhaltiges, mehrdimensionales Porträt des Verhaltens des Codes erstellt wurde.
Die Ergebnisse zeigten, dass Machine-Learning-Modelle tatsächlich in der Lage sind, Refactorings mit einem hohen Grad an Zuverlässigkeit vorherzusagen. Wenn die Modelle auf zehn verschiedene Arten von Refactoring-Operationen getestet wurden, erreichten sie häufig AUC-Werte deutlich über 0,70, und bei einigen Aufgaben übertrafen sie sogar 0,80. Dies deutet darauf hin, dass es tatsächlich detektierbare Muster im Code gibt, die die Absicht eines Entwicklers signalisieren, den Code zu bereinigen. Die Studie offenbarte jedoch eine entscheidende Nuance: Nicht alle Code Smells sind gleichwertig. Die Modelle waren außergewöhnlich gut darin, strukturelle Änderungen vorherzusagen, wie etwa das Hinzufügen eines Parameters zu einer Methode oder das Ändern eines Variablentyps. Diese Aktionen werden oft durch klare, messbare Faktoren wie die Länge einer Anweisung oder die Komplexität einer Berechnung getrieben. Im Gegensatz dazu hatten die Modelle Schwierigkeiten, konzeptionelle Änderungen vorherzusagen, wie etwa das Umbenennen einer Methode. Das Umbenennen ist oft eine subjektive Entscheidung, die darauf basiert, wie ein Entwickler den Zweck des Codes wahrnimmt – ein Faktor, der allein durch Zahlen oder strukturelle Karten schwer zu erfassen ist.
Der vielleicht bedeutendste Befund betraf die Art der Datenrepräsentation. Die Forscher hatten ursprünglich erwartet, dass das bloße Hinzufügen komplexerer Karten des Ausführungsflusses des Codes die Vorhersagen verbessern würde. Stattdessen entdeckten sie, dass eine bestimmte Art von Flusskarte, die die Reihenfolge der Anweisungen verfolgte, tatsächlich Rauschen einführte, das die Modelle verwirrte. Wenn diese Flusskarte mit den traditionellen Messungen kombiniert wurde, verschlechterte dies oft die Vorhersagen, da der Computer Schwierigkeiten hatte, die irrelevanten Details zu ignorieren. Als die Forscher jedoch zur fortschrittlicheren Repräsentation wechselten, die strukturelle Abhängigkeiten mit dem tatsächlichen Text und der Logik des Codes kombinierte, änderten sich die Ergebnisse dramatisch. Diese reichhaltigere Repräsentation lieferte ein komplementäres Signal, das die Modelle effektiv nutzen konnten. Tatsächlich schnitten die Modelle, die ausschließlich auf dieser fortgeschrittenen Repräsentation trainiert wurden, bei einigen Aufgaben fast so gut ab wie jene, die mit dem vollständigen Datensatz trainiert wurden, was bewies, dass das tiefe strukturelle und semantische Verständnis des Codes eine leistungsstarke Prädiktion an sich darstellt.
Die Studie verdeutlichte auch die Grenzen dessen, was aus Code allein vorhergesagt werden kann. Während die Modelle technische Korrekturen, die durch Komplexität getrieben sind, zuverlässig prognostizieren konnten, konnten sie menschliche Entscheidungen hinter dem Umbenennen oder der Umstrukturierung von Code zur besseren Verständlichkeit nicht ohne Weiteres voraussehen. Dies deutet darauf hin, dass Maschinen zwar exzellent darin sein können, festzustellen, wann eine Software technisch überfällig für eine Wartung ist, die endgültige Entscheidung für ein Refactoring jedoch oft auf der Vision und dem Kontext eines Entwicklers beruht, der außerhalb des Codes existiert. Die Forschung kommt zu dem Schluss, dass die Zukunft der automatisierten Softwarewartung nicht im Ersatz des menschlichen Urteilsvermögens liegt, sondern darin, diese prädiktiven Werkzeuge zu nutzen, um die strukturellen Schulden hervorzuheben, die am dringendsten sind, damit Entwickler ihre begrenzte Zeit auf die Änderungen konzentrieren können, die am wichtigsten sind. Indem wir verstehen, welche Signale stark und welche Rauschen sind, können wir bessere Werkzeuge bauen, um unsere digitale Infrastruktur gesund und nachhaltig zu halten.
Ertrinken Sie in Arbeiten in Ihrem Fachgebiet?
Erhalten Sie tägliche Digests der neuesten Arbeiten passend zu Ihren Forschungsbegriffen — mit technischen Zusammenfassungen, in Ihrer Sprache.