20. Künstliche Intelligenz in der Softwareentwicklung
- Open Access
- 2026
- OriginalPaper
- Chapter
Activate our intelligent search to find suitable subject content or patents.
Select sections of text to find matching patents with Artificial Intelligence. powered by
Select sections of text to find additional relevant content using AI-assisted search. powered by (Link opens in a new window)
Zusammenfassung
Bereits seit einigen Jahren ist der Einfluss der Künstlichen Intelligenz auf die Softwareentwicklung ein wichtiges Thema in Wissenschaft und Praxis. Während in der Zeit nach der Jahrtausendwende hauptsächlich intelligente Suchmethoden und probabilistisches Reasoning als wichtige Techniken auf der Agenda standen (z. B. Harman, 2012), kamen später Entwicklungen im Machine Learning und der automatischen Sprachverarbeitung hinzu (Feldt et al., 2018). Bereits nach der Einführung des ersten großen Sprachmodells BERT im Jahre 2018 (Devlin et al., 2019) kamen neue Anwendungen hinzu, doch spätestens seit der Veröffentlichung von ChatGPT und dem darunterliegenden Sprachmodell im November 2022 haben die Diskussionen über das Potential, das diese Technologien zur Veränderung des Arbeitsalltags von Entwicklern haben, die breite Masse erreicht.
Allerdings sind nicht nur Entwickler an der Produktion von Software beteiligt. Auch Produkt- und Projektmanager, Tester, Sicherheitsexperten und Experten für User Experience Design (UX) sind von den Produkten und Ideen, die innovative KI-Lösungen mit sich bringen, betroffen und können von ihnen im Arbeitsalltag profitieren.
Advertisement
In diesem Kapitel zeigen wir auf, welche Möglichkeiten Künstliche Intelligenz während des Entwicklungszyklus eines Softwareproduktes für verschiedene Aktivitäten der Softwareentwicklung anbietet. Dabei gehen wir auf das Anforderungsmanagement, die Entwicklung der Benutzerschnittstellen, die Produktion von Quellcode, die Analyse der produzierten Software, die Validierung und Verifizierung des Produktes und schließlich die Softwaresicherheit ein. Wir beenden das Kapitel mit einer kurzen Analyse der voraussichtlichen Auswirkungen innovativer KI-Techniken auf die Softwareentwicklung. Dabei erheben wir selbstverständlich im Folgenden keinen Anspruch auf Vollständigkeit – der Markt ist aktuell viel zu volatil, um einen umfassenden Überblick geben zu können. Stattdessen ist unser Anspruch, wichtige Trends zu erfassen, aufzuzeigen, wo KI (oft schon seit Jahren) im Einsatz ist und wo die Reise hingehen könnte.
20.1 KI im Anforderungsmanagement
Dadurch dass Anforderungen, z. B. in einem Ticketingsystem oder Lasten- oder Pflichtenheft, in natürlicher Sprache verfasst sind, werden schon seit einigen Jahren Methoden des Natural Language Processing (NLP) verwendet, um sie aufzubereiten und zu managen. In der Forschung sind dabei etliche Lösungen entstanden, von denen allerdings nur wenige in Produkten bzw. in der Praxis angekommen sind.
So wurde die Verarbeitung natürlicher Sprache etwa zur Identifikation von Fehlern in Anforderungsspezifikationen eingesetzt (Körner et al., 2014), um Zweideutigkeiten zu identifizieren, die zu Missverständnissen führen können (Ferrari et al., 2014, 2018), um Anforderungen zu validieren (Dell’Anna et al., 2018) oder um diese zu klassifizieren (Chatterjee et al., 2020; Anish et al., 2019). Einige Ansätze haben bereits vor der weiten Verbreitung großer Sprachmodelle generative Elemente integriert. So lassen sich aus natürlichsprachigen Anforderungen beispielsweise UML-Diagramme generieren (Sharma et al., 2015; Shen & Breaux, 2022), Domänenwissen aus Anforderungen gewinnen (Abad et al., 2018) oder Anforderungen selbst aus anderen Artefakten extrahieren (Guo et al., 2018; Rahman et al., 2023).
Deep-Learning-Verfahren, die von Grund auf trainiert werden – also mehrschichtige neuronale Netzwerke, die mit den verfügbaren anwendungsspezifischen Daten trainiert werden – werden seltener eingesetzt, mutmaßlich weil die benötigten Datenmengen für das Anlernen von neuronalen Netzen oft schwer zu beschaffen sind. Eine Ausnahme stellen Habib et al. (2021) dar, die einen Ansatz zur Anforderungsanalyse beschreiben.
Advertisement
Große Sprachmodelle (engl. Large Language Models, LLMs), die auf Deep Learning basieren und Transformer-Architekturen verwenden (Vaswani et al., 2017), haben insbesondere in den zuletzt genannten Use Cases schnell Anwendung gefunden, beispielsweise in der Klassifizierung von Anforderungen (Mehder & Aydemir, 2022). Es zeigt sich, dass große Sprachmodelle hierbei deutlich bessere Ergebnisse erzielen als die auf klassischen NLP-Architekturen basierenden Vorgänger. Die fortschreitende Verbesserung von LLMs, die z. B. beim Schritt von GPT-3.5 auf GPT-4 deutlich wurde, wird den Abstand noch weiter wachsen lassen. Aber vornehmlich generative Anwendungen werden durch LLMs auch künftig Aufwind erfahren. So sind bereits erste Arbeiten erschienen, die aus Sicherheitsanforderungen zumindest die Grundgerüste von Safety Assurance Cases, also strukturierten Argumentationen, warum ein System sicher ist, automatisch erzeugen (Sivakumar et al., 2024). LLMs bieten auch Lösungen für die Erhebung von Anforderungen: Gudaparthi et al. (2023) beschreiben eine Technik, um neue, kreative Alternativen für Anforderungen aus dem Korpus der existierenden Anforderungen zu generieren.
Eine der großen Herausforderungen im Requirements Engineering ist die Nachverfolgbarkeit (Traceability) der Anforderungen. In vielen Projekten, insbesondere solchen, die sicherheitskritisch sind, ist es notwendig oder gar vorgeschrieben, nachweisen zu können, an welchen Stellen im Quellcode Anforderungen umgesetzt wurden, wie sie validiert wurden und dass die Validierung erfolgreich war. Traceability ist und bleibt ein Problem in der Industrie (Maro et al., 2018), unter anderem weil der manuelle Aufwand, die Verbindungen zwischen Anforderungen und anderen Entwicklungsartefakten zu erstellen und zu pflegen, sehr hoch ist. Deswegen wurden bereits vor Jahren Methoden entwickelt, um NLP für diesen Zweck einzusetzen (Borg et al., 2014; Guo et al., 2024). Jedoch blieb bisher die Qualität in diesen Arbeiten immer so niedrig, dass ein produktiver Einsatz nicht sinnvoll war. Das Gleiche gilt für einen Ansatz, der die Verknüpfungen zwischen Entwicklungsartefakten als Netzwerk interpretiert und Ideen aus der Netzwerktheorie für die Erstellung neuer Verknüpfungen verwendet (Nicholson et al., 2020). Ansätze, die von Grund auf trainiertes Deep Learning verwenden (z. B. Guo et al., 2017), sind zwar vielversprechend, jedoch in der Praxis aufgrund der geringen Datenmengen, die kein effektives Training dieser anwendungsspezifischen Deep-Learning-Modelle erlauben, nicht einsetzbar. Erste Ideen, für die Erstellung von Verknüpfungen LLMs zu verwenden, wurden bereits publiziert (Rodriguez et al., 2023; Hassine, 2024). Eine genaue Überprüfung der Skalierbarkeit und Performance dieser Ansätze, besonders im industriellen Kontext, steht aber noch aus.
Ein für das Alltagsgeschäft von Entwicklungsteams relevanter Themenbereich ist das Backlog-Management. Anforderungen werden in der agilen Softwareentwicklung oft in priorisierten Listen vorgehalten, häufig in Form von User Stories oder Epics. Diese User Stories müssen geschrieben und angepasst, priorisiert und ggf. geschätzt werden. Außerdem müssen Querverbindungen zu anderen Stories und zu Testfällen erstellt werden (siehe oben). Häufig erledigen Product Owner diese Arbeiten. Das Backlog enthält also sehr viele Informationen, wobei eine Mischung aus natürlicher Sprache (Anforderungen, Akzeptanzkriterien) und strukturierten Daten (z. B. die Querverbindungen) vorliegt. Es existieren erste kommerzielle Ansätze, das Backlog-Management mithilfe von generativer KI zu automatisieren, etwa Zen.AI,1 der Product Copilot von DevBoost2 oder der Copilot4DevOps von Modern Requirements.3 Diese Lösungen stecken allerdings aktuell noch in den Kinderschuhen. In der Forschung wird derzeit an ähnlichen Themen gearbeitet, z. B. an der Schätzung des Aufwands einer User Story mit Machine Learning (Abadeer & Sabetzadeh, 2021) oder an der Verbesserung von User Stories mithilfe von LLMs (Zhang et al., 2024).
Fazit
KI-Methoden zur natürlichen Sprachverarbeitung für Anforderungen sind in der wissenschaftlichen Literatur weitverbreitet. Große Sprachmodelle haben hier enormes Potential und werden bisherige Ansätze mittelfristig ablösen. Es gibt bereits erste kommerzielle Angebote, deren Reifegrad allerdings noch zu wünschen übriglässt. In den nächsten Jahren ist aber damit zu rechnen, dass das Anforderungsmanagement massiv von kommerziellen Produkten, die LLMs integrieren, unterstützt werden wird.
20.2 KI in der Entwicklung von Benutzerschnittstellen
Benutzerschnittstellen oder, etwas weiter gefasst, die User Experience (UX) behandeln, wie die Endnutzer das entstehende System vor der Nutzung, während der Nutzung und nach der Nutzung erleben. Dieses Erlebnis beruht auf der Benutzerschnittstelle des Systems, aber auch auf dem Markenbild, den Vorlieben und den Kompetenzen der Nutzer und zahlreichen anderen Elementen (DIN EN ISO 9241-210, 2011). In vielen Fällen sind in der modernen Softwareentwicklung das Erheben von Anforderungen und das Erstellen von Benutzerschnittstellen eng miteinander verzahnt: Bereits früh im Prozess entstehen in Kollaboration mit den Interessenvertretern sowohl Anforderungen als auch Entwürfe der Benutzerschnittstelle, z. B. im Rahmen von Design Thinking (Hehn & Uebernickel, 2018) oder User-centred Design (Preece et al., 2023).
Einen Überblick über den Einsatz von KI im Entwurf von Benutzerschnittstellen geben Stige et al. (2023). Sie differenzieren verschiedene Arten, in denen KI in UX genutzt wird. Ansätze wie Computational Creativity (Feldman, 2017; Mateja & Heinzl, 2021) unterstützen UX-Experten dabei, neue, kreative Ideen und Ansätze zu entwickeln. Andererseits existieren Methoden, um Personas (Beschreibungen der archetypischen Benutzer eines Systems) automatisch generieren zu lassen (Salminen et al., 2019) oder um aus einfachen Skizzen einer Benutzeroberfläche mithilfe von KI komplexe und detaillierte Entwürfe zu generieren (Suleri et al., 2019). Viele Ansätze beschäftigen sich mit der tatsächlichen Generierung von Benutzerschnittstellen. Dabei reichen die Ideen vom Vorschlagen von Entwurfsmustern auf Basis der Anforderungen (Silva-Rodríguez et al., 2020) bis hin zur Optimierung von Layouts (Duan et al., 2020). Interessanterweise haben Stige et al. (2023) keine Ansätze gefunden, die das Design vollständig automatisieren. Außerdem wurden etliche Arbeiten identifiziert, in denen sich menschliche Designer kritisch gegenüber Automatisierung im Design geäußert haben – sei es, weil sie das Gefühl hatten, die Kontrolle zu verlieren (O’Donovan et al., 2015) oder weil die KI das Problem nicht vollständig erfasste (Feldman, 2017). Die Evaluation von Benutzerschnittstellen mithilfe von KI ist ebenfalls möglich (Yang et al., 2020), allerdings zeigt die Evaluation, dass mithilfe der KI manche Aspekte der User Experience (Lernen, Effektivität) nicht verbessert werden können.
Weiterhin gibt es einige Ansätze, um direkt aus Entwürfen für Benutzerschnittstellen Code zu generieren. Dave et al. (2021) vergleichen drei davon, die alle auf Deep Learning basieren. Keiner der vorgestellten Ansätze hat allerdings eine Qualität, die für den produktiven Einsatz notwendig wäre. Es ist erwähnenswert, dass auch ChatGPT seit März 2024 eine ähnliche Funktionalität anbietet, allerdings gibt es aktuell noch keine wissenschaftliche Evaluation dieser Fähigkeit. Ähnliche Möglichkeiten werden derzeit auch in andere kommerzielle Werkzeuge integriert. Das beliebte Tool Figma zum Erstellen von Entwürfen für Benutzerschnittstellen bietet beispielsweise eine entsprechende Erweiterung an, die sich allerdings bei Redaktionsschluss noch im Beta-Test befindet.4
Fazit
Auch bei der Erstellung von Benutzerschnittstellen und bei der Generierung von Code aus Entwürfen gibt es bereits seit einiger Zeit vielversprechende Ansätze, die allerdings nie das notwendige Niveau für den produktiven Einsatz erreicht haben. Generative KI hat das Potential, viele dieser Ansätze abzulösen und menschliche UX-Experten zu unterstützen, doch die konkreten Fähigkeiten und Beschränkungen sind aktuell noch nicht klar.
20.3 Coding Assistants
Wenn in der Berichterstattung von der Ablösung des Softwareentwicklers die Rede ist, dann beziehen sich die Journalisten normalerweise auf generative KIs, die als sogenannte Coding Assistants in der Softwareprogrammierung Einzug halten. Bei einem Coding Assistant handelt es sich meist um ein Plugin, das direkt in der Entwicklungsumgebung, also dem Programm, in dem Entwickler Quellcode schreiben, KI-Funktionalitäten bereitstellt. Von den Anbietern werden diese auch als „AI Pair Programmer“ beworben,5 um die Idee zu vermitteln, dass eine zweite „Person“ jederzeit mit auf den Code schaut und Vorschläge macht.
Im Folgenden beziehen wir uns auf den Marktführer6 GitHub Copilot5. Die Handhabung der Konkurrenzprodukte wie Tabnine,7 Codeium,8 qodo,9 Amazon Q10 oder Continue11 ist jedoch sehr ähnlich.
Die Benutzerschnittstelle von Coding Assistants besteht üblicherweise aus zwei Teilen: einer Integration in den Quelltexteditor, mit der ein Entwickler direkt im Quellcode mit dem Coding Assistant interagieren kann, und einem Chatfenster, das in einer Seitenleiste der Entwicklungsumgebung fest angedockt wird.12
Das Sprachmodell, mit dem hier kommuniziert wird, wurde durch sogenanntes „Fine-Tuning“ auf Programmierthemen spezialisiert. Des Weiteren steht dem Sprachmodell der vorhandene Projektcode als Kontext zur Verfügung. Codevorschläge durch das Sprachmodell können direkt in das Projekt übernommen und Kommandozeilenbefehle direkt ausgeführt werden.13
Die Integration in den Editor bietet weitere KI-basierte Features. Während Code geschrieben wird, generiert das Sprachmodell im Hintergrund Vorschläge, wie die Zeile beendet werden kann und wie die folgenden Zeilen aussehen können. Diese werden als blasser Text direkt im Code eingeblendet und lassen sich mit nur einem Tastendruck übernehmen. Über spezialisierte Menüeinträge ist es möglich, bestimmte Anfragen zu stellen, ohne eine Chatnachricht schreiben zu müssen.14 So gibt es z. B. Funktionen, um Fehler suchen zu lassen oder Dokumentation zu generieren. Dieselben Funktionen lassen sich, ähnlich wie in Chatprogrammen, auch durch Schrägstrichbefehle wie „/fix“ auslösen.15
In Abschn. 20.3.1 werden zunächst die Verwendungsmöglichkeiten von Coding Assistants beschrieben. Anschließend wird in Abschn. 20.3.2 deren Einfluss auf die Produktivität von Entwicklern untersucht.
20.3.1 Features von Coding Assistants
Im Folgenden werden die Verwendungsmöglichkeiten von Coding Assistants genauer beleuchtet.
Codegenerierung/Vervollständigung
Der wichtigste Einsatzzweck eines Coding Assistants ist die Generierung von Code. Die Benutzeroberfläche bietet hierfür zwei Einstiegsmöglichkeiten.
-
Der Programmierer beschreibt im angedockten Chatfenster die gewünschte Funktionalität, die Anforderungen und die zu verwendenden Bibliotheken. Wenn bereits vorhandene Funktionalität integriert werden soll, bietet es sich an, diese ebenfalls direkt zu erwähnen. Das Sprachmodell antwortet darauf mit einem Code-Vorschlag und einer Erklärung. Der Programmierer prüft den Code und stellt Rückfragen, worauf das Sprachmodell mit einem überarbeiteten Vorschlag antwortet. Der generierte Code kann dann direkt in den Projektquellcode übernommen werden.16
-
Während der Programmierer tippt, bietet der Coding Assistant direkt Vorschläge an, die im Codeeditor in blasserem Text angezeigt werden. Diese Vorschläge erfolgen auf Basis des umliegenden Kontextes. So kann der Programmierer z. B. einen Kommentar schreiben, der eine noch nicht implementierte Funktion beschreibt, und die KI generiert dann die Implementierung der Funktion. Je nach Ausmaß des vorhandenen Kontexts umfasst der Vorschlag nur den Rest der Zeile oder mehrere Zeilen. Der Programmierer kann den Vorschlag mit einem Tastendruck akzeptieren oder durch mehrere alternative Vorschläge durchwechseln.17 Es findet keine direkte Diskussion mit dem Coding Assistant statt. Stattdessen wird der Vorschlag im Nachhinein als Text bearbeitet, oder der Programmierer eröffnet einen neuen Chat auf Basis des neuen Codeabschnitts.
Refactoring
Der Coding Assistant bietet die Möglichkeit, ein Refactoring vorzunehmen, also Umstellungen des vorhandenen Codes. Dabei reicht es, dem Coding Assistant eine allgemeine Anweisung wie „Verbessere die Fehlerbehandlung“ zu geben.18 Gemäß Erfahrungsberichten19 ist es auch möglich, die Vorschläge im Programmcode für Refactoring zu nutzen. In diesem Fall nimmt der Programmierer die ersten Änderungen des Refactorings, wie z. B. das Extrahieren von sich wiederholendem Code, von Hand vor. Bei weiteren Vorkommen macht der Coding Assistant dann direkt den entsprechenden Vorschlag, und der Programmierer muss diesen lediglich bestätigen.
Generierung von Dokumentation
Es ist möglich, den Coding Assistant zu verwenden, um Dokumentation für vorhandenen undokumentierten Code zu erstellen. Dafür reicht es aus, den vorhandenen Code auszuwählen und die Dokumentationsfunktion auszulösen.20 Daraufhin generiert der Coding Assistant auf Basis von Namen und weiterem Kontext einen Dokumentationsvorschlag. Die Dokumentation erfolgt in derselben Datei wie der Code und kann mit anderen (nicht-KI) Werkzeugen in eine Website umgewandelt werden.21
Beantworten von Fragen
Coding Assistants können Fragen zu vorhandenem Code beantworten. Dafür kann im Chatfenster auf vorhandenen Code verwiesen und eine entsprechende Frage gestellt werden.22 Auch weitere Rückfragen sind möglich. In begrenztem Umfang ist es auch möglich, den Coding Assistant zu Code zu befragen, der nicht im aktuellen Fenster sichtbar ist. Heutige Sprachmodelle sind nicht in der Lage, ein komplettes Projekt gleichzeitig zu erfassen. Stattdessen verwendet GitHub Copilot einen vorher erstellten semantischen Index,23 um die Frage zu beantworten.
Fehlersuche
Coding Assistants können zum Finden und Lösen aller möglichen Arten von Programmierfehlern benutzt werden. In manchen Fällen reicht es bereits aus, den fehlerhaften Codeabschnitt auszuwählen und die entsprechende Funktion auszulösen24 oder den Link in der Fehlermeldung anzuklicken.25 Bessere Ergebnisse erzielt man jedoch, wenn man dem Coding Assistant weitere Details, wie den Text einer Fehlermeldung, mitteilen kann. Der Coding Assistant versteht dabei sowohl Fehler, die vom Compiler gefunden werden, als auch typische Laufzeitfehler. Es ist ebenfalls möglich, das Fehlverhalten umgangssprachlich zu beschreiben. GitHub Copilot bietet weiterhin die Möglichkeit, die Fehlermeldung des Compilers zu erklären oder den fehlerhaften Code sogar direkt zu reparieren.
Generierung von Testfällen
Es ist möglich, den Coding Assistant zur Generierung von Testfällen zu benutzen. Dabei wird zunächst zu der entsprechenden Codestelle navigiert. Anschließend wird dem Coding Assistant eine kurze Beschreibung, meist ein Satz oder weniger, übergeben. Auf dieser Basis wird dann ein Testfall generiert,26 meist in Form eines sogenannten Unit Tests. Dies ist eine relativ simple Form der Testgenerierung. In Abschn. 20.5 werden weitere Ansätze beschrieben, wie KI zur Unterstützung bei der Validierung und Verifizierung genutzt werden kann.
Abarbeiten von Tickets
Es wird z. B. in Form von GitHub Copilot Workspace27 daran gearbeitet, dass Coding Assistants in Zukunft ganze Tickets selbst abarbeiten können. Ein Ticket beschreibt entweder einen Fehler im Programm oder ein neues Feature. Dabei formuliert der Coding Assistant aus dem Tickettext einen Plan, wie die Umsetzung aussehen könnte. Dieser Plan kann vom Entwickler noch angepasst werden. Anschließend nimmt der Coding Assistant die komplette Umsetzung selbstständig vor.
Fazit
Coding Assistants sind direkt in die Entwicklungsumgebung integriert und ermöglichen es Entwicklern, mit einem Sprachmodell über den Code zu chatten. Sie können außerdem bei einer Vielzahl von Aufgabenstellungen, wie z. B. Codegenerierung, Refactoring, Dokumentation, Fehlersuche und Testen, Vorschläge machen. Diese Vorschläge müssen aktuell immer noch von einem Entwickler validiert und freigegeben werden. Es wird jedoch daran gearbeitet, dass Coding Assistants zukünftig Tickets autonom abarbeiten können.
20.3.2 Einfluss auf die Produktivität
Während sich Coding Assistants zumindest gemessen an Downloadzahlen und Präsenz in den (sozialen) Medien großer Beliebtheit erfreuen, steckt die Erforschung ihrer Auswirkung auf die Produktivität von Entwicklern noch in den Kinderschuhen. Yetiştiren et al. (2023) zeigen, dass die Qualität des produzierten Codes noch recht niedrig ist. Das bedeutet, dass Entwickler, die Coding Assistants benutzen, den generierten Code verstehen und überprüfen müssen. Insbesondere sind zuverlässige Testfälle notwendig. Ziegler et al. (2024) weisen Produktivitätsgewinne besonders bei unerfahrenen Entwicklern nach. Allerdings sind die verwendeten Metriken in gewissem Maße fragwürdig. Wie Ziegler et al. (2024) selbst schreiben, verändern erfahrene Entwickler die generierten Vorschläge stärker als unerfahrene. Tatsächliche Zeitersparnisse und Effizienzsteigerungen sind nur schwer zu quantifizieren, vor allem weil simple Metriken, wie produzierte Codezeilen, den qualitativen Charakter des Programmierens nicht erfassen.
Eine weitere Schwachstelle der aktuellen Forschung ist, dass sich die meisten Studien zu Codequalität mit sehr einfachen Programmierbeispielen beschäftigen, die nicht der Komplexität tatsächlicher Programmieraufgaben aus der Praxis entsprechen (z. B. in Yetiştiren et al., 2023). Auf der anderen Seite sind mögliche Anwendungsfelder noch kaum erforscht: So bieten Coding Assistants beispielsweise die Möglichkeit, Code aus nicht mehr gewarteten Programmen (sog. Legacy Code) für Entwickler leichter zugänglich zu machen. Die Wartung von Legacy Code stellt erhebliche Herausforderungen dar (Langer, 2016), die aus dem Mangel an Wissen über das Altsystem und der Verwendung von überholten Technologien und Architekturen resultieren. Coding Assistants können Entwickler bei der Analyse des Systems unterstützen und Code in ungewohnten Programmiersprachen und für veraltete Technologien erzeugen. Erste Ergebnisse zeigen, dass Entwickler Coding Assistants in solchen Szenarien bereits einsetzen (Davila et al., 2024), aber es fehlen empirische Evaluationen der Effektivität und der Grenzen von Coding Assistants in diesem Anwendungsfall.
Auch die Migration von Quellcode, beispielsweise hin zu neuen Versionen einer Programmiersprache (was auch stets mit einer Migration zu neuen Versionen der verwendeten Bibliotheken einhergeht), ist ein spannender Anwendungsfall von Coding Assistants (Ishaani et al., 2024). Selbst wenn die Programmiersprache die gleiche bleibt, kommt es in der Industrie zu Migrationen, z. B. zu einer neuen Technologie für die Benutzerschnittstelle. Inwiefern Coding Assistants in diesem Bereich unterstützen können, ist noch offen. Bisherige Arbeiten setzen hier eher auf etablierte nicht-KI Techniken wie Modelltransformationen (s. z. B. Fleurey et al., 2007).
Eine weitere offene Frage ist die Qualität der Vorschläge von Coding Assistants für verschiedene Programmiersprachen und verschiedene eingesetzte Technologien. Die vorliegenden Studien benutzen weitverbreitete Sprachen wie C++ und JavaScript und wenige oder sehr populäre Frameworks. Es ist unklar, wie sich die Codequalität und die Güte der Vorschläge bei Nischensprachen oder mit weniger weitverbreiteten Frameworks verhalten. Abseits des wissenschaftlichen Diskurses vernimmt man aus der Praxis aber Stimmen, die von guter Unterstützung beim Erlernen von Programmiersprachen berichten, die den Entwicklern bisher unbekannt waren.
Schließlich gibt es verschiedene Untersuchungen, die sich mit der Sicherheit des generierten Codes beschäftigen. Während Sandoval et al. (2023) im Vergleich zu manuell geschriebenem Code keine signifikante Verschlechterung von generiertem Code feststellen, finden Perry et al. (2023) das genaue Gegenteil. Hier sind u. U. die Kohorten der Studien signifikant: Während Sandoval et al. (2023) mit Studenten gearbeitet haben, rekrutierten Perry et al. (2023) ihre Studienteilnehmer aus erfahrenen Entwicklern. Dass Studenten Code mit geringerer Qualität produzieren als erfahrene Entwickler, ist wenig erstaunlich.
Insgesamt ergibt sich aus den Studien zu Produktivität und Codequalität, dass es einen großen Unterschied macht, ob unerfahrene oder erfahrene Entwickler Coding Assistants einsetzen. Während erfahrene Entwickler in der Lage sind, die Vorschläge zu verändern und anzupassen, übernehmen unerfahrene Entwickler Vorschläge eher direkt. Allerdings tendieren auch erfahrene Entwickler dazu, Sicherheitslücken in generiertem Code zu übernehmen (Perry et al., 2023).
Fazit
Während erste Ergebnisse zeigen, dass Coding Assistants in gewissem Umfang zu Produktivitätsgewinnen führen können, ist noch offen, in welchen Situationen und für welche Benutzergruppe die Produktivität von Entwicklern für realistische Beispiele tatsächlich steigt. Kritisch zu sehen ist die Gefahr, durch die Verwendung von Coding Assistants zusätzliche Sicherheitslücken oder andere Qualitätsprobleme in Software zu integrieren. In der Praxis möchten aber sowohl erfahrene als auch unerfahrene Entwickler die Unterstützung durch Coding Assistants nicht mehr missen.
20.4 Statische und dynamische Codeanalyse
Um sicherzustellen, dass Quellcode keine typischen Programmierfehler oder Schwachstellen enthält, wird er häufig einer statischen oder dynamischen Codeanalyse unterworfen. Bei statischen Verfahren wird der Quellcode direkt auf bestimmte Muster hin untersucht, die auf häufige Programmierfehler oder Sicherheitsschwachstellen hinweisen. Bei der dynamischen Codeanalyse wird der Quellcode zu einem gewissen Grad ausgeführt, um komplexere Fehler, wie z. B. Interaktionen mit anderen Systemteilen, detektieren zu können. Beide Analysearten sind sehr aufwendig und bringen oft eine große Anzahl von Falschmeldungen mit sich, die von Entwicklern dann mit viel Aufwand manuell überprüft werden müssen.
Giray et al. (2023) geben einen Überblick zu KI-Ansätzen, um Fehler in Quellcode zu finden. Die meisten der gefundenen Ansätze verwenden dabei Machine Learning oder Deep Learning. Diesen Methoden ist gemein, dass hochqualitative Datensätze notwendig sind, um gute Ergebnisse zu erzielen. Daran mangelt es in der Praxis jedoch. Die Autoren stellen auch fest, dass es wenig Evidenz dafür gibt, dass die Ansätze in der Praxis eingesetzt werden. Eine genauere Analyse der verwendeten KI-Methoden liefern Sharma et al. (2021). Sie beschreiben auch die Herausforderungen für den Einsatz von Machine Learning für diesen Einsatzzweck. Dabei erwähnen sie, dass die Reproduzierbarkeit der Ergebnisse oft nicht gewährleistet ist, weisen aber auch darauf hin, dass vortrainierte Modelle Probleme mit Datensicherheit und Privatsphäre mit sich bringen können.
Auch LLMs werden für die statische Codeanalyse eingesetzt, wobei hier in den meisten Fällen noch keine Automatisierung stattfindet, sondern Forscher manuell Code in das LLM einspeisen. Dies eignet sich nicht für die praktische Softwareentwicklung: Statische Analysewerkzeuge sind üblicherweise in den kontinuierlichen Integrationsprozess eingewoben, so dass Entwickler vollautomatisch und ohne Benutzung separater Tools Rückmeldung zur Codequalität bekommen. Solche praktischen Ansätze befinden sich gerade noch in der Entstehung.
Ein weiterer Anwendungsfall für LLMs ist die Überprüfung der Ergebnisse von statischen Analysetools. Um Falschmeldungen abzufangen, bevor sie die Entwickler erreichen und von diesen manuell aussortiert werden müssen, verwenden Li et al. (2024) beispielsweise GPT-4 mit spezialisierten Prompting-Techniken, um die Ergebnisse eines statischen Analysetools auszuwerten.
Weitere Ansätze, bei denen LLMs gezielt zur Identifikation von Sicherheitslücken eingesetzt werden, sind in Abschn. 20.6 beschrieben.
Fazit
Während traditionelle KI-Methoden bereits in der statischen und dynamischen Codeanalyse eingesetzt werden, steckt die Verwendung von modernen LLMs zu diesem Zweck noch in den Kinderschuhen. Insbesondere fehlt noch die Einbindung in die Automatisierung des Integrationsprozesses. Große Sprachmodelle zeigen allerdings vielversprechende Fähigkeiten, vornehmlich auch zur Bewertung der Resultate anderer Analysetools.
20.5 KI in der Validierung und Verifizierung
Die Generierung von Softwaretests ist schon seit vielen Jahren aufgrund der hohen Komplexität und der Schwierigkeit, alle möglichen Fehlerfälle abzudecken, ein wichtiges Automatisierungsthema (z. B. Anand et al., 2013; Ricca et al., 2021). Dabei spielen auch schon lange bestimmte KI-Techniken eine Rolle, z. B. die Verwendung neuronaler Netze, um das korrekte Verhalten eines Systems vorherzusagen (das sogenannte „Test-Orakel“) (Shahamiri et al., 2011), vereinfachte Verwaltung großer Testsuiten mithilfe von generierten Kontrollflussgraphen (Baral et al., 2021), die Priorisierung von Testfällen in sehr großen Testsuiten (Bertolino et al., 2020) oder die Verarbeitung natürlichsprachiger Testbeschreibungen (Sarmiento et al., 2014).
Gerade Letzteres ist auch das Anwendungsgebiet großer Sprachmodelle, die in den letzten Jahren an Bedeutung bei der Validierung und Verifizierung gewonnen haben. Einen Überblick über aktuelle Entwicklungen geben Wang et al. (2024). Dabei spielt die Generierung von Testfällen eine wichtige Rolle, die unter anderem durch Fine-Tuning der LLMs und durch geschicktes Prompt-Engineering verbessert werden kann. Auch die Generierung von Testorakeln aus natürlichsprachigen Anforderungen und die Generierung von Eingabedaten für die Tests werden diskutiert.
Einen Schritt weiter gehen Jensen et al. (2024): Sie beschreiben die Verwendung von LLMs zur Automatisierung von Code Reviews. Dieser wichtige Schritt in der Überprüfung der Codequalität kann sehr aufwendig sein, bietet aber neben Vorteilen für das Endprodukt auch weiteren Nutzen, z. B. indem erfahrene Entwickler ihr Wissen weitergeben können (Badampudi et al., 2023). Statische Analyseverfahren (s. Abschn. 20.4) stellen eine Möglichkeit dar, zumindest den Teil der Reviews zu automatisieren, der sich mit Fehlern im Code beschäftigt. In der Vergangenheit wurde aber auch Deep Learning verwendet, um aus existierenden Code Reviews und den dazugehörigen Quellcode-Abschnitten direkt zu lernen und das Review für unbekannten Code vorherzusagen (Gupta & Sundaresan, 2018). LLMs haben in solchen Fällen den Vorteil, dass neuer, sinnvoller Text produziert wird, anstatt existierende Bausteine neu zu kombinieren. Während die Ergebnisse von Jensen et al. (2024) für die Bewertung der Funktionalität des Codes vielversprechend sind, ist die tatsächliche Nutzbarkeit des Feedbacks für die Entwickler noch eine offene Frage. Frömmgen et al. (2024) berichten über einen Assistenten, der aus den Kommentaren der Reviewer Codevorschläge generiert. Diese Vorschläge werden aktuell in 7,5 % der Fälle von den Entwicklern akzeptiert. Dies ist ein erster Schritt hin zu (teil-)automatisierten Reviews.
Fazit
LLMs werden in den nächsten Jahren eine große Rolle bei der Generierung von Testfällen spielen, besonders direkt aus Anforderungen, sowie bei der Analyse von Quellcode. Diese wichtigen Aktivitäten bei der Validierung und Verifizierung lassen sich bereits mit der aktuellen Technologie zu einem hohen Grad automatisieren. Noch offen ist, inwiefern automatisiertes Feedback von KIs konstruktive, hochqualitative Verbesserungsvorschläge für Entwickler liefern kann.
20.6 Software Security
Sicherheitsfragen spielen während des gesamten Softwareentwicklungsprozesses eine Rolle. Nina et al. (2021) untersuchten 586 Publikationen, die sich mit sicherer Softwareentwicklung beschäftigten, und fanden, dass sich 20 % davon mit Anforderungen, 24 % mit dem Design, 42 % mit der Konstruktion und 14 % mit dem Testing auseinandersetzten. KI-Methoden werden dabei ebenso in allen Phasen eingesetzt. Im Folgenden diskutieren wir kurz die verschiedenen Phasen an, die wir auch bereits in vorhergehenden Kapiteln behandelt haben, dort aber nicht aus Sicherheitsperspektiven. Im Allgemeinen wird für sicherheitskritische Systeme zunächst eine sogenannte TARA (Threat Analysis and Risk Assessment) durchgeführt. Dabei werden potenzielle Bedrohungen und die damit verbundenen Risiken systematisch gesichtet. Dann werden für die wichtigsten Bedrohungen entsprechende Gegenmaßnahmen definiert, die wiederum in Sicherheitsanforderungen münden.
Im Kontrast zur Entwicklung sicherer Software steht Cybersicherheit im Allgemeinen, also z. B. bei der Absicherung von Computernetzwerken. Auch dort werden vermehrt KI-Techniken eingesetzt. Einen guten Überblick zu diesen Themen bieten Sarker et al. (2021).
Anforderungen
Ein wichtiger Schritt in der Anforderungsanalyse ist die Identifikation von Anforderungen, die Sicherheitsaspekte beinhalten und entsprechend z. B. in der Risikoanalyse berücksichtigt werden müssen. Mohamad et al. (2022) verwenden Natural Language Processing, um Sicherheitsanforderungen in regulatorischen Dokumenten zu identifizieren. Noch einen Schritt weiter gehen Silvestri et al. (2023): Die Autoren verwenden NLP, um einen großen Korpus von Dokumenten, die unter anderem Sicherheitslücken beschreiben, auszuwerten und die gefundenen Schwachstellen und Sicherheitslücken direkt auf die Artefakte eines Systems aus dem Gesundheitswesen zu mappen. Dies ermöglicht es den Entwicklern, die TARA kontinuierlich semi-automatisch weiterzuentwickeln und das System so aktuell zu halten.
Design
Ahmed et al. (2024) verwenden ein LLM, um direkt aus Sicherheitsanforderungen Metriken zu generieren, die zur Überwachung eines Systems verwendet werden können. Das LLM schlägt z. B. vor, zu messen, wie oft ein Benutzer sich neu authentifiziert und wie viele Details im Benutzerprofil ausgefüllt sind, um bösartige Logins zu detektieren. Solche Ansätze sind hilfreich beim Design von Sicherheitssystemen und bei der Reaktion auf Sicherheitsrisiken. Sie können menschliche Entwickler dabei unterstützen, auch Randfälle abzudecken.
Konstruktion
Aktuelle Arbeiten zeigen auf, dass von LLMs generierter Code Sicherheitsschwachstellen enthalten kann. Tihanyi et al. (2023) ließen von GPT-3.5 Turbo insgesamt 112.000 Beispiele mit einer Durchschnittslänge von 79 Zeilen in der Programmiersprache C generieren, die verschiedene Aufträge (etwa Sortieren) und verschiedene Programmierstile (etwa Verwendung mehrerer Threads) abdeckten. Mehr als 50 % dieser Beispiele wurden von einem statischen Analysetool als verwundbar identifiziert. Viele der Beispiele enthielten gleich mehrere Schwachstellen. Auch wenn Analysetools dafür bekannt sind, viele falsch-positive Antworten zu liefern, ist diese Anzahl alarmierend. Die häufigsten Probleme waren verschiedene Overflows, die zu den typischen Programmierfehlern gehören und gerade von Programmierneulingen nur schwer zu entdecken sind.
Validierung
Rajapaksha et al. (2022) stellen ein Codeanalyse-Werkzeug vor, das mithilfe zweier Klassifizierer zunächst überprüft, ob der Code verwundbar ist, und dann mithilfe einer Multiklassifikation die dazugehörigen Schwachstellen identifiziert. Die Ergebnisse werden durch Methoden der erklärbaren KI aufbereitet, um dem Benutzer Einblick in die Entscheidung zu geben. Die Lösung zeigt dabei eine Genauigkeit, die gut genug für den Praxiseinsatz ist.
Einen direkten Vergleich zwischen statischen Codeanalyse-Werkzeugen und ChatGPT nehmen Ozturk et al. (2023) vor. Sie stellen fest, dass ChatGPT für PHP-Quellcode bessere Ergebnisse bei der Identifikation von Sicherheitsschwachstellen erzielt als zehn verbreitete Analysewerkzeuge. Die Autoren nennen zwar nicht die konkrete Version von GPT, die verwendet wurde, doch das Veröffentlichungsdatum legt nahe, dass es sich um die Originalversion von ChatGPT handelte, also GPT-3.5. Aktuelle OpenAI LLMs, wie z. B. ChatGPT-4o, sind deutlich leistungsfähiger (Li & Murr, 2024), was nahelegt, dass sich die Ergebnisse weiter verbessert haben.
Sicherheit von LLMs
Der vermehrte Einsatz von großen Sprachmodellen, speziell als Chatbots, bringt selbst einige neue Sicherheitsherausforderungen mit sich. So sind LLMs anfällig für Prompt-Injection-Attacken, bei denen ein Angreifer über den natürlichsprachigen Input (den Prompt) das Verhalten des LLMs verändert, so dass es sich außerhalb des vorgesetzten Einsatzzweckes verhält. Dies nennt man auch einen „Jailbreak“ (Wei et al., 2023). Die sich daraus ergebenden Sicherheitsanforderungen sind aktuell noch unklar, auch wenn erste Arbeiten existieren, die dieses Thema adressieren (z. B. Varshney et al., 2023).
Fazit
KI-Methoden haben das Potential, komplexe Softwareanwendungen sicherer und robuster gegen Angriffe zu machen. Besonders die Unterstützung bei der Threats and Risk Analysis und der darauf aufbauenden Formulierung von Sicherheitsmaßnahmen kann hierbei eine große Hebelwirkung haben, auch wenn kommerzielle Angebote hier noch auf sich warten lassen. Eine weitere vielversprechende Anwendung ist die Generierung von Sicherheitstests, wobei hierbei insbesondere LLMs großes Potential zeigen. Der Einsatz großer Sprachmodelle bringt allerdings ebenfalls Sicherheitsprobleme mit sich, die wir gerade erst verstehen lernen.
20.7 Auswirkungen auf die Softwareentwicklung
Lücken der aktuellen Lösungen
In diesem Kapitel haben wir die Einsatzmöglichkeiten von KI in der Softwareentwicklung sehr breit beleuchtet. Dabei haben wir Anwendungsfälle aus verschiedenen Phasen des Entwicklungsprozesses herausgearbeitet. In fast allen Fällen finden sich klassische KI-Methoden und vermehrt große Sprachmodelle als die Techniken der Wahl wieder. Die rasante Entwicklung von LLMs hat dabei zu einer Vielzahl neuer Ideen geführt. Viele der Ideen für den Einsatz von LLMs sind dabei aber noch nicht sehr ausgereift. Zwar werden viele Produkte angekündigt und viel Forschung wird betrieben, aber es gibt (von Coding Assistants abgesehen) wenige Produkte, die wirklich Marktreife haben, und die Forschung weist noch erhebliche Lücken auf. Zwei wichtige Lücken sind dabei der Mangel an Automatisierung und die fehlende Integration.
Der Entwicklungsprozess ist an vielen Stellen hochautomatisiert. Ein Entwickler stellt einen Codeabschnitt fertig und veröffentlicht seine Änderung in einem Repository der Versionsverwaltung, also dort, wo der gesamte Quellcode des Projektes liegt. Ein sogenannter Continuous Integration Server stellt daraufhin den aktuellen Quellcode zusammen, kompiliert diesen (überführt ihn also in Maschinensprache), lässt Tests sowie statische und dynamische Analyse laufen und installiert anschließend den aktuellen Stand auf einem Server zum manuellen Testen. Der Entwickler kann sich dann nach Abschluss dieses automatischen Durchlaufs die Testergebnisse und die Ergebnisse der Analysen ansehen und entsprechend reagieren. Den aktuellen KI-Lösungen fehlt noch die Möglichkeit, sich in diesen automatischen Prozess zu integrieren. So müssen die auf LLMs basierenden Ansätze zur Codeanalyse (Abschn. 20.4) und für die Security (Abschn. 20.6) aktuell noch manuell bedient werden.
Weiterhin fällt auf, dass die Anwendungsfälle noch recht spezifisch sind. In der Zukunft werden wir aber Integrationen benötigen, in denen Anforderungen, Benutzerschnittstelle, Architektur, Code und Validierung zusammen angegangen werden. Änderungen in den Anforderungen schlagen sich auf alle Bereiche durch. Separate KI-Tools für jeden der Bereiche machen es schwieriger, Änderungen durch das gesamte System zu propagieren, da es zwischen den Tools Bruchstellen gibt, die u. U. manuell überwunden werden müssen. Bisher sind integrierte Lösungen allerdings noch nicht in Sicht. Aktuelle Vorschläge beschränken sich auf einen, höchstens zwei Bereiche im Fall der Tools für das Anforderungsmanagement. Auch hier gibt es bereits erste Versuche einer höheren Integration. Allerdings wurde der laut seinem Hersteller „erste AI Software Engineer“ Devin nach seiner Veröffentlichung schnell entzaubert (s. z. B. Xia et al., 2024).
Entwicklungsteam der Zukunft
Schon jetzt verwenden Entwickler KI-Tools, beispielsweise zur Codevervollständigung oder zur Codeanalyse. Der Einsatz dieser Tools wird sich in Zukunft noch stärker verbreiten und neue Felder, wie die Softwarearchitektur oder die Dokumentation der Software, erschließen. Coding Assistants und die anderen in diesem Kapitel vorgestellten Tools und Ansätze sind nur erste Schritte in diese Richtung.
Daher wird das Entwicklungsteam der Zukunft ein hybrides Team aus KI und menschlichen Entwicklern sein. Dabei werden die KI-Tools zunächst Aufgaben übernehmen, die für den Menschen schwierig oder uninteressant sind, wie z. B. das Schreiben von Dokumentation oder das Entwickeln von Testfällen. Nach und nach werden sicherlich auch die Codeproduktion und eventuell auch einige Aufgaben des Anforderungsmanagements abgelöst werden. Dabei werden sich „Ökosysteme von Bots“ (Platis et al., 2024) herausbilden, welche unterschiedliche Aufgaben übernehmen und andere KI-Tools oder menschliche Entwickler mit Informationen füttern. Insbesondere wird dies den Arbeitsablauf verändern, indem das Lernen der Entwickler und die Abarbeitung uninteressanter oder sich wiederholender Arbeitsschritte von der KI unterstützt wird (Ulfsnes et al., 2024). Gleichzeitig besteht die Chance, dass die Qualität der ausgelieferten Software steigt.
Auf mittlere und auch längere Sicht werden Softwareentwickler durch KI nicht obsolet werden. Darauf deuten einige der aktuellen Forschungsergebnisse hin. Auch wenn in der Softwareentwicklung das Fehlen eines Konzeptes von „Wahrheit“ in LLMs nicht ganz so relevant ist wie in anderen Domänen (Hicks et al., 2024), so ist doch eine sorgfältige Überprüfung der Outputs solcher Systeme von größter Wichtigkeit, um zu vermeiden, dass sich Fehler oder sogar Sicherheitslücken einschleichen. Diese Fähigkeit wird auch in Zukunft gefragt sein. Entwickler müssen weiterhin die Fähigkeiten haben, die Vorschläge der KI zu bewerten und abzuändern. ChatGPT und Co. sind daher hauptsächlich als Werkzeuge für Experten anzusehen (Azaria et al., 2024; Spinellis, 2024). Außerdem müssen menschliche Entwickler weiterhin für die Orchestrierung des Ökosystems an KI-Tools sorgen und Aufgaben auf höherer kognitiver Ebene, wie z. B. zur Systemarchitektur, übernehmen. Es wird von äußerster Wichtigkeit sein, Nachwuchsentwickler für diese Aufgaben auszubilden und zu trainieren.
Open Access Dieses Kapitel wird unter der Creative Commons Namensnennung - Nicht kommerziell - Keine Bearbeitung 4.0 International Lizenz (http://creativecommons.org/licenses/by-nc-nd/4.0/deed.de) veröffentlicht, welche die nicht-kommerzielle Nutzung, Vervielfältigung, Verbreitung und Wiedergabe in jeglichem Medium und Format erlaubt, sofern Sie den/die ursprünglichen Autor(en) und die Quelle ordnungsgemäß nennen, einen Link zur Creative Commons Lizenz beifügen und angeben, ob Änderungen vorgenommen wurden. Die Lizenz gibt Ihnen nicht das Recht, bearbeitete oder sonst wie umgestaltete Fassungen dieses Werkes zu verbreiten oder öffentlich wiederzugeben.
Die in diesem Kapitel enthaltenen Bilder und sonstiges Drittmaterial unterliegen ebenfalls der genannten Creative Commons Lizenz, sofern sich aus der Abbildungslegende nichts anderes ergibt. Sofern das betreffende Material nicht unter der genannten Creative Commons Lizenz steht und die betreffende Handlung nicht nach gesetzlichen Vorschriften erlaubt ist, ist auch für die oben aufgeführten nicht-kommerziellen Weiterverwendungen des Materials die Einwilligung des jeweiligen Rechteinhabers einzuholen.