Blog
AI Driven Development. Teil 1 von 2
Künstliche Intelligenz (KI) hält immer stärker Einzug in unser tägliches Leben und unsere alltägliche Arbeit. Sie hilft uns beim Zusammenfassen großer Dokumente, beim Formulieren von Texten oder erzeugt Bilder für zahlreiche verschiedene Verwendungszwecke.
Besonders vielversprechend ist die Nutzung von KI auch in der Softwareentwicklung. Vor allem der Gebrauch von Sprachmodellen (auch LLMs) ist hier sehr hilfreich, da diese eine wertvolle Unterstützung bei häufig auftretenden monotonen Arbeiten bieten.
Eine häufig wiederkehrende Herausforderung in diesem Kontext ist die Einarbeitung in bestehende Softwareprojekte – sei es bei personellen Neuzugängen im Projekt, bei der Arbeit mit Legacy-Systemen oder bei Übernahme eines Projekts von einem anderen Dienstleister. Schlechte Dokumentation, unscharfe Requirements oder der Weggang von Mitarbeitenden und das damit verloren gehende Wissen sind hier typische Fallstricke. Vor diesem Hintergrund können LLMs besonders den Einarbeitungs- und Entwicklungsprozess unterstützen.
LLMs (beispielsweise in Kombination mit Vector Stores, Agenten oder in RAG-Anwendungen) können hier etwa als neues Interface für bestehendes Wissen genutzt werden und so den Umgang mit Dokumentationen, das Aufarbeiten von Requirements und das Verständnis des Codes erleichtern und beschleunigen.
Im Folgenden stelle ich einen KI-gestützten Entwicklungsprozess vor, welcher LLMs, inklusive Technologien wie Vector Stores und Agenten, in den Softwareentwicklungsprozess einbindet und so versucht, die jeweiligen Verantwortlichen bestmöglich zu unterstützen.
Zum Zeitpunkt des Erscheinens dieses Beitrags befinden sich diese Schritte auf unterschiedlichen Reifegraden. Die Lösung einzelner Aufgaben mit separaten Modellen ermöglicht uns den Einsatz des bestmöglichen Modells für jeden Schritt. Unabhängig vom Reifegrad der einzelnen Schritte, soll dieser Blogbeitrag auch dazu dienen, ein umfassendes Bild und die Möglichkeiten des Einsatzes von KI im Softwareentwicklungsprozess aufzuzeigen.
Requirements
Einer der ersten Schritte in jedem Projekt ist die Erstellung von Anforderungen (Requirements). Eine einheitliche Sprache und ein ausgereiftes Requirements Template können spätere Verwirrung und Unklarheiten wesentlich reduzieren und die Umsetzung des Projekts positiv beeinflussen. Der Einsatz von KI im AI-Driven-Development-Prozess vereinfacht die Erstellung von Requirements und erleichtert den Prozess für die Nutzenden.
Ein Beispiel hierfür ist die Vollständigkeit der Requirements: Grundsätzlich werden alle nötigen Informationen für ein Requirement in einem zugehörigen Template festgehalten. Solche Templates können auch von Sprachmodellen genutzt werden, um anhand dessen die Requirements auf Vollständigkeit zu prüfen. Sollten sie vom Template abweichen, kann das LLM den/die Nutzenden auffordern, die fehlenden Punkte zu ergänzen.
Eine weitere Anwendung ist die Übersetzung von Fließtext, z. B. aus einer E-Mail, in ein entsprechendes Requirement. Hierbei füllt das Sprachmodell das Requirement anhand des zugehörigen Templates bestmöglich aus und gibt offene Punkte an den/die Nutzenden zurück. So bleiben diese dauerhaft im Loop und können, auch bei möglichen Fehlentscheidungen oder Fehlinterpretationen des LLMs, jederzeit eingreifen.
Design
Ein weiterer zentraler Aspekt der klassischen Softwareentwicklung ist das initiale Design und die Architektur der Anwendung. Auch hier kann AI Driven Development angewendet werden, um Designer und Architektinnen zu unterstützen. In diesem Fall kann das LLM als intelligentes Quietscheentchen! verstanden werden, sei es zum Sammeln von Ideen oder zum Überprüfen bestehender Ideen, basierend auf den erstellten Anforderungen, welche dem Sprachmodell den Kontext liefern.
Zum einen kann dies die Qualität des Designs und der Architektur erhöhen, weil deren Resultate kontinuierlich durch die KI evaluiert werden können. Zum anderen kann sichergestellt werden, dass die Resultate konsistent zu allen Requirements sind. Dies ist zwar auch ohne Einsatz eines Sprachmodells möglich, dieses erleichtert jedoch den Umgang mit einer großen Anzahl an Anforderungen und beschleunigt die Überprüfung, ob diese durch das Design oder die Architektur erfüllt sind.
Planning
Nach dem Erstellen der initialen Requirements, des initialen Designs und der Architektur beginnt der eigentliche Zyklus der agilen Softwareentwicklung. In der Planung (Planning) findet je nach Projektform eine Bewertung einzelner Tasks nach Aufwand statt, eine Priorisierung von Tickets, die Dokumentation von Risiken sowie beispielsweise die Zuweisung der einzelnen Tickets zu den passenden Sprints.
Typischerweise werden die einzelnen Tickets/Tasks durch die Entwickelnden selbst geschätzt. Für ihre Bewertung werden dabei häufig Storypoints verwendet, die die Komplexität der Aufgaben widerspiegeln. Sollte es hier zu unterschiedlichen Einschätzungen kommen, werden diese diskutiert, bis das Team sich auf eine finale Schätzung einigen kann.
Bei kleineren oder neu entstehenden Teams können hier schnell Fehleinschätzungen entstehen, da zum Beispiel die Erfahrung oder die Diskussionsgrundlage fehlen. Hier kann der Einsatz von LLMs Vorteile bringen, weil die Schätzungen damit anhand der Requirements schnell validiert und eventuell korrigiert werden können.
Auch bei größeren, eingespielten Teams kann die Nutzung von LLMs die Qualität der Schätzungen erhöhen, wobei ihr Einfluss hier nicht zwangsläufig so groß ist, wie bei nicht eingespielten Teams. So oder so erlaubt der Einsatz eines Sprachmodells in Verbindung mit einer Datenbank auch hier den einfachen Zugriff auf bereits bewertete Tickets und kann helfen, dass aktuelle Schätzungen konsistent mit bereits bestehenden Schätzungen sind. Falls in dieser Interaktion eine große Abweichung festgestellt wird, sollte auch hier das Team hinterfragen, ob potentielle Risiken übersehen oder falsch eingeschätzt worden sind.
Development
Wie der Name des Artikels bereits sagt, ist der zentrale Aspekt des AI Driven Developments die eigentliche Entwicklung (Development) der Software. Hier kann KI quasi in allen Bereichen unterstützen. Die bekanntesten Tools sind wahrscheinlich ChatGPT und Github Copilot. Solche Tools unterstützen Entwickelnde in ihrer täglichen Arbeit auf unterschiedliche Weise.
Ein Beispiel ist die Generierung von Code durch Github Copilot bzw. Github Copilot Chat. Copilot ist mittlerweile in den meisten gängigen Entwicklungsumgebungen verfügbar und bietet Code-Vorschläge an, basierend auf dem aktuellen Projekt. Besonders repetitive Stellen wie Logging, Getter/Setter oder useStates in React können damit automatisiert generiert werden, was das Entwickeln deutlich effizienter macht.
Zusätzlich erleichtert der Einsatz von AI Driven Development die Praxis im Test Driven Development. Hierbei werden zuerst die nötigen Testfälle geschrieben und anschließend die eigentliche Logik umgesetzt. Dazu werden auf Basis der Anforderungen und mithilfe von Sprachmodellen Testfälle erzeugt und anschließend in praktische Tests umgesetzt. Durch die Umsetzung dieser Tests in Code entsteht ein neuer Kontext, der z. B. durch Copilot genutzt werden kann, um Vorschläge für die eigentliche Umsetzung der Anforderungen zu verbessern.
Des Weiteren bieten KI-Tools die Möglichkeit, Methoden zu generieren und so eine Grundstruktur für diese Methoden zu liefern. Dabei ist jedoch zu beachten, dass die Wahl der Programmiersprache und die Komplexität der zu generierenden Methoden Auswirkungen auf das Resultat hat.
Sprachen, die häufig genutzt werden und somit einen essentiellen Teil beim Training der zugrundeliegenden Sprachmodelle beitragen, erhalten meistens auch bessere Ergebnisse. Sprachen wie Typescript, Python oder Java sind also im Vorteil.
Ein wichtiges Kriterium ist außerdem die Komplexität der Methoden. Je komplexer die zu generierende Methode, desto höher ist nämlich die Wahrscheinlichkeit, dass Teile durch Halluzinationen beeinflusst werden. Daher sollten sie am besten in kleinere, nicht zu komplexe Methoden aufgeteilt werden.
Ein weiterer wichtiger Teil des AI Driven Developments in der Entwicklung ist die Migration auf neue Versionen genutzter Bibliotheken. Dies ist häufig mit dem Wälzen umfangreicher Migrationsguides verbunden. Auch hier können auf Sprachmodellen basierende Tools die Entwickelnden wirksam unterstützen. Nutzen wir nämlich den Guide und den anzupassenden Code als Kontext für die Anfrage an das Sprachmodell, können Teile der Migration gleich vom LLM generiert und der Code entsprechend angepasst werden. Natürlich muss dieser noch durch den/die Entwickelnde/n geprüft werden, jedoch wird der allgemeine Aufwand reduziert.
Testing
Einer der wichtigsten Aspekte der Softwareentwicklung ist die Erstellung umfangreicher Tests (Testing). Denn Tests stellen sicher, dass sich eine Anwendung auch noch nach Anpassungen wie erwartet verhält. Diese Tests zu schreiben und up-to-date zu halten, erfordert jedoch einiges an Aufwand und zählt darum nicht zu den beliebtesten Aufgaben unter Entwickelnden.
Hier bietet AI Driven Development vor allem diesen Vorteil: Tests für bestehende Klassen können damit automatisch generiert werden und so eine Grundabdeckung sicherstellen. Entwickelnde müssen diese Tests natürlich weiterhin überprüfen und ergänzen, jedoch müssen sie keine trivialen Fälle mehr abdecken. Dies reduziert zum einen den Grundaufwand deutlich und hebt zum anderen die Motivation der Entwickelnden, da ermüdende und repetitive Aufgaben automatisiert erledigt werden können.
Reviewing
Nach der Entwicklung und dem Testen des Codes fehlt nur noch ein Review, bevor der Code auf die entsprechenden Umgebungen deployt werden kann. Auch hier kann KI bei repetitiven Aufgaben unterstützen und die Effizienz der Entwicklung steigern. In diesem Fall überprüft sie, ob Methoden und Variablen korrekt und sprechend benannt sind, ob Code-Duplikate, Klassen und Methoden existieren, die ähnliche Aufgaben bereits lösen. Eine weitere Möglichkeit ist die semi-automatisierte Behebung von SonarQube-Findings. Dabei werden während des Reviews Vorschläge gemacht, die von den Entwickelnden eingebunden werden können.
Deployment
Es folgt das Deployment. Hierbei müssen die neuen Features noch auf die entsprechenden Stages verteilt werden. Auch hier findet AI Driven Development einen Platz. Ein Sprachmodell kann zum Beispiel Vorschläge bei der initialen Erstellung der CI/CD-Pipelines liefern. Dies kann den Aufwand zur Inbetriebnahme reduzieren, da Scripts teilweise generiert werden können und durch die Entwickelnden nur noch angepasst werden können.
Maintenance und Monitoring
Um eine effiziente Wartung (Maintenance) von Anwendungen sicherzustellen, brauchen wir für die Entwicklung eine gute und umfangreiche Dokumentation. Eine solche zu erstellen, ist jedoch mühsam und sehr zeitaufwendig. Zum Glück können KI-Tools wie ChatGPT oder Github Copilot uns heute dabei unterstützen. Diese Tools können etwa dazu genutzt werden, um Klassen und Methoden zu kommentieren und so einen wichtigen Teil der Dokumentation zu beschleunigen. Eine Überprüfung durch uns Entwickelnde ist zwar weiterhin nötig und auch unabdingbar, aber der gesamte Prozess der Dokumentation wird effizienter, da große Teile automatisch generiert werden können.
Zusätzlich bieten Sprachmodelle die Möglichkeit, mit der Dokumentation zu “sprechen”, was einen einfachen und schnellen Zugang zu den darin enthaltenen Informationen ermöglicht.
Während des Betriebs einer Software fallen ferner unzählige Daten an, die wichtige Informationen über das Laufzeitverhalten der Applikation liefern. Hier kann eine Vielzahl von Algorithmen aus allen Bereichen der Künstlichen Intelligenz genutzt werden, um das Laufzeitverhalten der Anwendung zu analysieren und auf Fehler bzw. unerwartetes Verhalten schnell reagieren zu können.
Beispielsweise könnten statistische Verfahren sowie Trendanalysen genutzt werden, um frühzeitig zu warnen, falls bestimmte Typen von Log-Nachrichten häufiger auftreten als erwartet.
Zusätzlich können weitere Kennzahlen wie Speicher- oder CPU-Nutzung überwacht und die Entwickelnden bzw. Betreiber informiert werden, falls diese Werte signifikant abweichen. Die Möglichkeiten sind hier so vielfältig, dass sie den Rahmen dieses Blogbeitrags sprengen würden.
Kommunikation und Zusammenarbeit
Zu guter Letzt erleichtert der Einsatz von AI Driven Development die Kommunikation und die Zusammenarbeit im Entwicklungsteam und mit dem Kunden. Speech2Text-Tools können verwendet werden, um Meetings zu dokumentieren, zusammenzufassen und auf der gemeinsamen Arbeitsplattform abzulegen. Diese Informationen dienen dann als Wissensbasis für einen KI-Chatbot, der einen intuitiven Zugang zum gespeicherten Wissen ermöglicht und somit die Zusammenarbeit erleichtert und fördert.
Fazit
Künstliche Intelligenz hat bereits einen großen Einfluss auf die Softwareentwicklung – der in Zukunft nur noch größer werden wird. Wie in den vorherigen Abschnitten beschrieben, ist AI Driven Development ein essentieller Bestandteil unseres Softwareentwicklungszyklus.
Interesse geweckt?
In unserem zweiten Blogbeitrag zum Thema werden wir Einblicke in unsere Strategie des AI Driven Development geben sowie eine Einführung in Langfuse. Sie dürfen gespannt sein!