KI als Pairing-Partner in der Software-Entwicklung

Pair Programming ist eine verbreitete Methode in der Softwareentwicklung mit vielen positiven Effekten, erklärt Daniel Lehmann von Taktsoft.

Pair Programming ist eine verbreitete Methode in der Softwareentwicklung mit vielen positiven Effekten. Die parallele Arbeit von zwei Entwicklern fördert fokussierte Zusammenarbeit, führt zu weniger Fehlern, besserer Codequalität und fördert die Wissensvermittlung im Team. Wer einmal so gearbeitet hat, möchte es nicht mehr missen. Da liegt es nahe, die KI als Pairing-Partner in Betracht zu ziehen. Auch wenn die KI als Co-Pilot nicht das Gleiche ist, wie ein menschlicher Pairing-Partner, kann sie eine tolle Unterstützung sein, wie fünf Anwendungsfälle und Coding-Prompts zeigen.

Code-Erzeugung

KI-basierte Systeme können heute auch Code generieren – vorausgesetzt, die Aufgabe ist präzise genug beschrieben. Ein konkretes Beispiel dafür ist die Implementierung eines neuen Features im View-Code einer Webanwendung. Innerhalb einer Cursor-IDE wird der relevante Code, auf den Bezug genommen wird, ausgewählt und als Kontext in den Eingabeprompt eingebracht. Die ergänzte Anfrage lautet: “Können wir hier einen Hinweis ‘valid json’ anzeigen, wenn sich expected_result fehlerfrei zu JSON parsen lässt?” Die generierte Antwort erfüllt zwar ihren Zweck, indem sie die gewünschte Funktionalität einbringt. Allerdings integriert sie Logik in die View-Schicht, die möglicherweise an anderer Stelle besser aufgehoben wäre.

Code-Review und Qualitätssicherung

KI-basierte Systeme können heute gängige Fehler im Code identifizieren oder Vorschläge zur Verbesserung der Codequalität, des Stils und bewährter Praktiken machen.

In einem konkreten Anwendungsfall wird die Datei aus dem vorherigen Beispiel in den Eingabepromptkontext eingefügt und um die Frage erweitert: “Was würdest Du an der aktuellen Datei refaktorieren?” Die generierte Antwort ist auch in diesem Fall angemessen. Alle drei genannten Aspekte können bei einem Refactoring berücksichtigt werden. Allerdings werden die Punkte 1 und 3 aufgrund ihrer möglichen Inkongruenz mit dem Gesamtdesign der Anwendung nicht weiterverfolgt.

Code-Refactoring

Intelligente Systeme können darüber hinaus potenzielle Verbesserungen im Code erkennen und sicherere sowie effizientere Refactoring-Methoden vorschlagen.

Die Fortsetzung der vorangegangenen Konversation verwendet den Prompt: “Lass uns auf die Logik innerhalb des begin-rescue konzentrieren. Lagere das in Helper aus.” Damit greift der Prompt die Vorschläge aus dem Eingangsbeispiel auf und lenkt die KI auf den bevorzugten Refactoring-Vorschlag des Autors. Die KI präsentiert daraufhin zwei geeignete Vorschläge, die durch einen Klick direkt in den Anwendungscode übernommen werden können.

Obwohl der Lösungsvorschlag angemessen ist, ist der Autor nicht begeistert, da immer noch Logik im View-Layer der Webanwendung verbleibt. Durch den weiteren Prompt “Kannst Du stattdessen ein Struct einführen, das die unterschiedlichen CSS-Klassen und Texte enthält?” wird auch dieser Aspekt angesprochen. Sprachliche Präzision in den Prompts ist demnach nicht unbedingt erforderlich, um eine passende und qualitativ gute Antwort zu erhalten.

Dieses iterative Vorgehen verdeutlicht, dass durch die Verwendung der 4 Prompts ordentlicher Code generiert wurde. Die Frage, ob dies insgesamt Zeitersparnis bedeutet, kann diskutiert werden.

Fehlerbehebung und Debugging

Die KI kann Fehler im Code identifizieren und Vorschläge zur Fehlerbehebung unterbreiten, die auf bereits gelösten Problemen in einer Datenbank basieren.

Nach einem Update des genutzten Frameworks, in diesem Fall Ruby on Rails, ergab eine Abfrage an die Datenbank falsche Ergebnisse. Der darauf folgende Prompt brachte trotz eines Schreibfehlers die richtige Antwort hervor: “@sick_days_in_year = SickDay.order_by_start_date.for_user(current_user).in_year(@selected_year).to_a Ich habe das Problem, dass alle Nutzer alle Sickdays eines Jahres angezeigt werden. Der Scope for_user scheint nicht zu funktionieren @sick_day.rb. Was ist die Ursache?”

Der Prompt beginnt mit der fehlerhaften Abfrage und enthält dann die in Deutsch verfasste Problembeschreibung. Die Syntax @sick_day.rb fügt im Kontext der hier verwendeten Cursor-IDE (vgl. https://cursor.sh) eine Datei dem Prompt-Kontext hinzu. Die generierte Antwort beschreibt die Ursache korrekt. Das dargestellte Codebeispiel kann mühelos per Klick übernommen und getestet werden, was die erfolgreiche Lösung des Problems zeigt.

 Generieren von Testfällen

 KI-generierte Testfälle erhöhen die Codeabdeckung und stellen sicher, dass die Anwendung gemäß den Erwartungen funktioniert. Dies ist besonders nützlich, wenn das Setup der Tests komplex ist.

In einem konkreten Beispiel sollte ein Test hinzugefügt werden, der einen bestimmten Fehlerfall abdeckt. Der entsprechende Prompt lautete: “Bitte erstelle mir einen Testcase für @open_ai_client.rb, mit dem ich das Verhalten testen und dokumentieren kann, wenn ich in das Ratelimit laufe. Verwende dabei das in der Codebase genutzte Testframework.” Diesmal wurde zusätzlich zur zu testenden Klasse OpenAiClient auch die Codebase als Kontext mitgegeben. Dieses Feature der hier verwendeten Cursor-IDE arbeitet mit einem lokalen Index aller Quellcode-Dateien des Projekts und versucht, relevante Dateien für die Bearbeitung des Prompts auszuwählen und im Kontext des Prompts zur Verfügung zu stellen.

Das generierte Beispiel ist auch in diesem Fall korrekt und testet das aktuelle Verhalten der Anwendung auf die gewünschte Weise.

Bonus: KI als Ersatz für eine tiefere Webrecherche

KI-Modelle verfügen in ihren Large Language Models (LLMs) über das Wissen des Internets. In neueren Entwicklungen ist der Wissens-Cutoff, also der Zeitpunkt der neuesten Informationen, die beim Training des LLM verwendet wurden, relativ aktuell und nicht mehr viele Monate in der Vergangenheit. Daher eignet sich ein KI-Assistent nun auch dazu, Webrecherchen zu ersetzen.

In einem konkreten Beispiel wurde der in den Team-Chat integrierte AI-Bot, der auf OpenAI-APIs zurückgreift, mit dem Prompt “Wir haben ein Canonical Ubuntu Pro Account und haben es mit ‘sudo pro attach [DEIN TOKEN]’ aktiviert. Wie können wir nun herausfinden, ob es aktiv ist?” gefüttert. Die Antwort des Bots schlug verschiedene Lösungsmöglichkeiten vor, wobei die erste bereits zum gewünschten Ergebnis führte.

Prädikant: Durchschnitt, Potential: Gigantisch – Das kann KI als Co-Pilot

Kann also die KI zum vollwertigen Pairing-Partner werden? Die bereitgestellten Vorschläge sind oft korrekt und angemessen, jedoch tendenziell von durchschnittlicher Qualität, was möglicherweise in der Natur der Sache begründet ist. Der Begriff des “Copiloten”, geprägt von Github und nun von Microsoft vorangetrieben, greift diese Thematik gut auf. Ohne einen Piloten, der die Richtung vorgibt und zwischen guten und durchschnittlichen Lösungen unterscheidet, ist ein reibungsloser Ablauf (noch) nicht gewährleistet.

Eine herausfordernde Komponente dabei ist der rasante technische Fortschritt. Um die Potentiale voll auszuschöpfen, ist es notwendig, kontinuierlich die Grenzen des derzeit Machbaren zu erkunden. Dies erfordert nicht nur eine gehörige Portion Neugier, sondern auch einen gewissen Zeitaufwand.

 

Daniel Lehmann

ist Geschäftsführer von Taktsoft.