Kollegin KI

5 Anwendungsfälle für KI als Pairing-Partner

Die vielversprechenden Möglichkeiten der Generativen KI sollten weder überbewertet noch unterschätzt werden. Es ist wichtig zu betonen, dass Generative KI keine "Künstliche Allgemeine Intelligenz" (AGI) ist und dieser nach wie vor unterlegen bleibt. Allerdings haben Large Language Models (LLM) mittlerweile die Fähigkeit entwickelt, Aufgaben innerhalb von Sekunden zu bewältigen, die zuvor viel Zeit in Anspruch nahmen.

Bei kluger Anwendung bietet Generative KI ein erhebliches Potenzial zur Unterstützung in der Software-Entwicklung. Die Frage, ob die KI im Jahr 2024 ihre Rolle als Assistent verlassen wird und zu einem vollwertigen Partner für Codierende wird, bleibt spannend. Daniel Lehmann von Taktsoft zeigt in fünf Anwendungsfällen, wie dies aussehen könnte, und beleuchtet die Möglichkeiten sowie Grenzen dieser Technologie für Entwicklerinnen und Entwickler.

Status Quo: KI-Anwendungsfälle und ungenutztes Potential in der Entwicklung

Die Tech-Welt hat sich in den letzten Jahren zunehmend von KI-getriebenen Entwicklungen beeinflussen lassen. Von experimentellen Anwendungsfällen bis hin zu etablierten Workflows erstreckt sich das breite Spektrum ihrer Use Cases. Aktuelle Beispiele für den Einsatz von KI in der Entwicklung verdeutlichen die Vielseitigkeit dieser Technologie:

Automatisierung von Routineaufgaben

  1. KI ermöglicht die Automatisierung von langwierigen und repetitiven Aufgaben sowie gut strukturierten Änderungen. Dadurch bleibt den Entwicklerinnen und Entwicklern mehr Zeit für komplexe Aufgaben und kreative Prozesse. Zusätzlich kann KI als virtuelles "zweites Paar Augen" dienen, um Lösungen zu überprüfen und dabei menschliche Fehlerquellen zu eliminieren.

Formulierung von Problemstellungen

  1. Die Fähigkeit, klare und präzise Anfragen zu formulieren, wird durch die Notwendigkeit, Prompts zu erstellen, geschärft. Dies trägt dazu bei, dass Entwicklerinnen und Entwickler Probleme deutlich kommunizieren können, was zu fokussierterem und produktiverem Arbeiten an Coding-Herausforderungen führt.

Diese Anwendungsfälle zeigen, wie KI bereits heute einen bedeutenden Beitrag zur Vereinfachung von Programmieraufgaben leistet. Dennoch gibt es auch Bereiche, in denen KI noch nicht vollständig ausgereift ist:

Bewältigung von Komplexität

  1. KI-Tools sind derzeit vor allem bei überschaubaren Problemen wirksam, wie sie beispielsweise bei Programmier-Puzzles auftreten. Bei komplexeren Herausforderungen ist jedoch weiterhin die Lenkung durch erfahrene menschliche Begleiter erforderlich.

Selbstständige Problemlösung

  1. Bei komplexen Problemen stoßen KI-Modelle noch an ihre Grenzen und sind auf die Anleitung erfahrener menschlicher Begleiter angewiesen. Das Potenzial autonomer Problemlösungen durch KI muss daher noch weiter erforscht und entwickelt werden.

Zwischen den aktuellen Erfolgen und dem ungenutzten Potenzial der KI in der Entwicklung bleibt noch einiger Raum für neue Wege. Es gilt, bewährte Anwendungsfälle zu festigen und gleichzeitig innovative Wege zu finden, um die Komplexität von KI-gesteuerten Aufgaben weiter zu meistern. Eine vielversprechende Perspektive bietet das Pair-Programming.

Teamarbeit, die zählt: Pairing Partnern in der Softwareentwicklung

Die Methode des Pair Programming ist in der Softwareentwicklung weit verbreitet und bietet zahlreiche Vorteile. Die gemeinsame Arbeit von zwei Entwickler:innen fördert eine konzentrierte Zusammenarbeit, reduziert Fehler, verbessert die Codequalität und unterstützt den Wissenstransfer im Team. Einmal erlebt, möchte man diese Arbeitsweise oft nicht mehr missen. Angesichts dieser positiven Erfahrungen liegt es nahe, darüber nachzudenken, die KI als Partner für das Pair Programming einzusetzen. Obwohl die KI als Co-Pilot nicht denselben Beitrag leistet wie ein menschlicher Partner, kann sie dennoch eine wertvolle Unterstützung bieten, wie anhand von fünf Anwendungsbeispielen und Coding-Prompts verdeutlicht wird.

  1. Code-Erzeugung

Heutzutage haben KI-basierte Systeme die Fähigkeit erlangt, Code zu generieren, vorausgesetzt, die Aufgabenstellung ist präzise formuliert. Ein konkretes Beispiel hierfür ist die Integration eines neuen Features in den View-Code einer Webanwendung. In einer Cursor-IDE wird der relevante Code, auf den Bezug genommen wird, ausgewählt und als Kontext in den Eingabeprompt eingefügt. Die darauf folgende Anfrage bleibt unverändert: "Können wir hier einen Hinweis 'valid json' anzeigen, wenn sich expected_result fehlerfrei zu JSON parsen lässt?" Die resultierende Antwort erfüllt ihren Zweck, indem sie die gewünschte Funktionalität bereitstellt. Jedoch könnte die Einbindung dieser Logik in die View-Schicht möglicherweise an anderer Stelle besser geeignet sein.

2. Code-Review und Qualitätssicherung

KI-basierte Systeme verfügen heute über die Kapazität, bekannte Fehler im Code zu erkennen oder Vorschläge zur Steigerung der Codequalität, zur Verbesserung des Stils und zur Implementierung bewährter Praktiken zu unterbreiten.

In einem spezifischen Szenario wird die Datei aus dem vorherigen Beispiel in den Kontext des Eingabeprompt eingefügt und um die Frage ergänzt:

"Was würdest Du an der aktuellen Datei refaktorieren?" Die daraufhin generierte Antwort ist auch in dieser Situation angemessen. Die genannten drei Aspekte können allesamt beim Refactoring berücksichtigt werden. Dennoch werden die Punkte 1 und 3 nicht weiterverfolgt, da sie möglicherweise nicht mit dem Gesamtdesign der Anwendung übereinstimmen.

3. Code-Refactoring

Intelligente Systeme verfügen über die Fertigkeit, potenzielle Verbesserungen im Code zu identifizieren und sicherere sowie effizientere Refactoring-Methoden vorzuschlagen.

Die vorherige Unterhaltung setzt den Dialog fort:

"Lass uns auf die Logik innerhalb des begin-rescue konzentrieren. Lagere das in Helper aus." Hierdurch wird der Vorschlag des Autors für das bevorzugte Refactoring-Thema aufgenommen und die KI entsprechend ausgerichtet. Im Anschluss daran präsentiert die KI zwei passende Vorschläge, welche unmittelbar in den Anwendungscode eingebunden werden können.

Obwohl die vorgeschlagene Lösung akzeptabel ist, äußert der Autor dennoch Bedenken, da weiterhin Logik im View-Layer der Webanwendung verbleibt. Durch die nachfolgende Aufforderung "Kannst Du stattdessen ein Struct einführen, das die unterschiedlichen CSS-Klassen und Texte enthält?" wird auch dieser Gesichtspunkt angesprochen. Es wird deutlich, dass eine präzise Formulierung der Anfragen nicht zwangsläufig erforderlich ist, um eine geeignete und qualitativ hochwertige Antwort zu erhalten. Dieser iterative Prozess verdeutlicht, dass durch die Verwendung der vier Anfragen ordentlicher Code erstellt wurde. Es bleibt zu diskutieren, ob dies insgesamt zu einer Zeitersparnis führt.

4. Fehlerbehebung und Debugging

Die KI zeigt ihre Kompetenz, Fehler im Code zu erkennen und Lösungsvorschläge zu machen, die auf bereits behobenen Problemen in einer Datenbank basieren.

Nach einem Update des genutzten Frameworks, in diesem Fall Ruby on Rails, stellte sich heraus, dass eine Datenbankabfrage fehlerhafte Ergebnisse lieferte. Trotz eines Tippfehlers im Prompt konnte dieser die passende Antwort liefern:

 "@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 einer fehlerhaften Abfrage und bietet dann eine Problembeschreibung auf Deutsch. Die Syntax @sick_day.rb integriert im Kontext der verwendeten Cursor-IDE eine Datei in den Prompt-Kontext. Die erzeugte Antwort beschreibt die Ursache präzise. Das gezeigte Codebeispiel lässt sich mühelos übernehmen und testen, was die erfolgreiche Behebung des Problems verdeutlicht.

5. Generieren von Testfällen 

Durch von KI generierte Testfälle wird die Codeabdeckung verbessert und sichergestellt, dass die Anwendung gemäß den Erwartungen funktioniert, insbesondere wenn das Test-Setup komplex ist.

In einem bestimmten Szenario war es erforderlich, einen Test hinzuzufügen, um einen spezifischen Fehlerfall zu behandeln. Die entsprechende Anfrage lautete wie folgt:

 "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." 

In diesem Fall wurde neben der zu testenden Klasse OpenAiClient auch die Codebase als Kontext angegeben. Diese Funktion der genutzten Cursor-IDE greift auf einen lokalen Index aller Quellcode-Dateien des Projekts zu und versucht, relevante Dateien für die Bearbeitung des Prompts auszuwählen und im Kontext des Prompts bereitzustellen.

Das erstellte Beispiel testet auch in dieser Situation das aktuelle Verhalten der Anwendung auf die gewünschte Weise und erfüllt die Anforderungen.

Bonus: KI als Ersatz für eine tiefere Webrecherche

KI-Modelle, besonders Large Language Models (LLMs), verfügen über ein umfangreiches Wissensrepertoire aus dem Internet. In jüngsten Fortschritten liegt der Zeitpunkt des Wissens-Cutoffs, also der Zeitpunkt, bis zu dem die neuesten Informationen beim Training des LLM verwendet wurden, relativ aktuell und reicht nicht mehr viele Monate in die Vergangenheit zurück. Dies ermöglicht einem KI-Assistenten nun, Webrecherchen zu substituieren.

Ein prägnantes Beispiel verdeutlicht die Integration eines KI-Bots in den Team-Chat, der auf OpenAI-APIs zurückgreift. Der Bot wurde mit folgendem Prompt gefüttert:

"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?" Die Antwort des Bots präsentierte verschiedene Lösungsansätze, wobei der erste bereits zum gewünschten Ergebnis führte.

Fazit

Wie KI als Partner im Cockpit dienen kann

Kann Künstliche Intelligenz also zu einem vollwertigen Kooperationspartner avancieren? Die angebotenen Empfehlungen sind zwar oft treffend und passend, neigen jedoch eher zur Mittelmäßigkeit, was eventuell inhärent ist. 

Der Ausdruck "Co-Pilot", geprägt von Plattformen wie GitHub und nun von Microsoft vorangetrieben, beleuchtet diese Frage anschaulich. Doch ohne einen Kapitän, der die Richtung bestimmt und zwischen herausragenden und durchschnittlichen Lösungen unterscheidet, bleibt ein reibungsloser Verlauf (noch) unsicher.

Eine anspruchsvolle Herausforderung liegt im rasanten technologischen Fortschritt. Um das volle Potenzial auszuschöpfen, gilt es fortwährend, die Grenzen des derzeit Möglichen zu erkunden. Dies erfordert nicht nur eine beträchtliche Portion Neugier, sondern auch einen beachtlichen Zeitaufwand.

Über den Autor

Daniel Lehmann ist Geschäftsführer von Taktsoft. Schon vor seinem Informatik-Studium war klar, dass sein Berufsweg ihn über die Tastatur zu Bits und Bytes führen wird. Beim steten Grübeln über mögliche Lösungswege hat er irgendwann 1 und 1 zusammengezählt und als technischer Leiter seinen Platz gefunden. Diese Rolle erlaubt es ihm, seinen technischen und organisatorischen Erfahrungsschatz immer weiter auszubauen, neues zu lernen und Haltungen zu entwickeln, die er mit Leidenschaft seinem Team vorlebt und so die Menschen um sich fachlich wie auch persönlich inspiriert.