KI in Entwicklerumgebungen: Spurkontrolle für Programmierer

Die ersten Nachrichten zu KI in der Softwareentwicklung waren regelrechte Hiobsbotschaften - über Systeme, die Programme automatisch vervollständigen und Programmierer damit überflüssig machen sollten. Schnell wurde jedoch klar: Es geht eigentlich nicht darum, wie schnell und wie viel Code eine KI schreibt. Es geht darum, ob Automatisierung es uns erlaubt, uns auf Wichtigeres zu konzentrieren, als immer wieder die gleichen Lösungen zu programmieren. Aktuell sind wir in der Phase, in der wir ausloten, wie KI unser Leben als Programmierer leichter machen kann. Denn das tut sie.
Viele intelligente, lernende Systeme haben sich in unserem Alltag schon etabliert: Die Bildersuche auf unseren Handys findet Bilder von Hunden, obwohl wir der Maschine niemals gesagt haben, dass dieses Foto von Waldi ist, und fast jede Textverarbeitung hat eine intelligente Vervollständigung von Sätzen, die in einem bestimmten Kontext erwartet werden.
Als mit Github Copilot und Amazon Codewhisperer die automatische Vervollständigung und Code-Erstellung aus Kommentaren auch in der Programmierwelt ankam, war es faszinierend zu sehen, wie schnell der Gartner Hype Cycle(öffnet im neuen Fenster) aus zu hohen Erwartungen, Enttäuschungen und einem vernünftigen Mittelweg von uns Programmierern angewandt wurde.


Dabei haben wir den Hype selbst geschürt, indem wir Beispiele zeigten, in denen man einen Kommentar schrieb und den passenden Code erstellt bekam. Oder in denen man eine Funktion mit einem sinnvollem Namen schrieb und automatisch Programmcode generiert wurde, der machte, was der Funktionsname verspricht. Die größte Neuerung war, dass dieser Programmcode aus anderen Lösungen auf Github kam oder gut bewertete Antworten in Foren erhielt und daher schon einmal von anderen Entwicklern für sinnvoll befunden wurde.
Das sind beeindruckende Beispiele, die viel weiter gehen, als das, was wir bisher an Code-Vervollständigung hatten. Oft ist es die Automatisierung dessen, was wir sonst von Hand machen. Wenn Entwickler steckenbleiben, sehen sie im Internet nach, ob jemand schon eine Lösung hat, und kopieren sie.
Andererseits sind diese Beispiele nur ein kleiner Einblick in das, was ein intelligentes System, das unsere Programmierung analysiert, für uns tun kann.
KI braucht zweierlei: viele Daten und viele Nutzer
Künstliche Intelligenz braucht zwei Dinge, um Menschen effektiv zu helfen: eine riesige Menge Daten und Endnutzer, die mit dem System arbeiten. Natürlich sind die ersten automatisch erstellten Ergebnisse eines jeden Systems erstmal fehlerhaft. Künstliche Intelligenz braucht Rückmeldungen, um Fehler zu vermeiden und von Nutzerverhalten zu lernen. Die Datenmenge haben wir, nun ist es unsere Aufgabe, die Spreu vom Weizen zu trennen. Das funktioniert, indem wir diese Systeme verwenden und fehlerhaften Code, der uns angeboten wird, als nicht sinnvoll bewerten.
Ich hatte schon sehr früh Zugang zu Github Copilot und Amazon Codewhisperer und bin zu dem Ergebnis gekommen, dass Systeme, die unseren Code intelligent vervollständigen, die Zukunft der effektiven Softwareentwicklung sind. Nicht nur für mich selbst, sondern vor allem auch für größere Teams.
Am Anfang ist maschinenunterstütze Programmierung gewöhnungsbedürftig. Man will Code schreiben und wird ständig unterbrochen. Noch schlimmer ist es, wenn die angebotenen Lösungen sich anders anfühlen als das, was man selbst programmiert hätte. Die meisten Lösungen werden als "KI Pair Programmer" beworben - und es wäre auch keine gute Erfahrung mit einem menschlichen Entwickler als Programmierpartner, der ganz andere Vorstellungen davon hat, was effektiv ist.
Aber: Je mehr man das System nutzt und mit eigenen Programmen füttert, desto besser werden die angebotenen Ergebnisse. Bei mir war es so: Während es sich in den ersten paar Tagen so anfühlte, als biete jemand anderes mir dauernd irgendwelchen fremden und seltsam geschriebenen Code, habe ich jetzt den Eindruck, als wüsste das System, was ich machen möchte, und zeigt mir Ergebnisse, die ich genau so von Hand geschrieben hätte.
Das überrascht eigentlich nicht: Das Handy gewöhnt sich ja auch daran, wie sein Nutzer Nachrichten verfasst und macht irgendwann passende Vorschläge - statt solcher, die zum Beispiel auch aus einem Pressebericht stammen könnten.
Richtig interessant wird es, wenn das intelligente System Kontext erkennt.
Automatische Kontexterkennung
Ich war beeindruckt, als ich merkte, dass Copilot erkennt, wie HTML und Javascript zusammenspielen. Für ein Projekt musste ich eine HTML-Tabelle mit Informationen zu Bildern erstellen. Also schrieb ich eine Tabelle mit einem Kopf, der definierte, was ich darstellen wollte:
<table>
<thead>
<tr>
<th>Name</th>
<th>Width</th>
<th>Height</th>
</tr>
</thead>
<tbody></tbody>
</table>
In meinem Skript definierte ich eine Liste der Bilder, eine Referenz zu der Tabelle und einen leeren String.
<script>
let names = [
"husky-bed.jpg",
"husky-cuddles.jpg",
"larry-ball.jpg",
"larry-kitchen.jpg",
"larry-raincoat.jpg",
"larry-sleeping-on-sofa.jpg",
"larry-sleeping.jpg",
"socke-looking.jpg",
"socke-with-ball.jpg",
"socke.jpg"
];
let tablebody = document.querySelector('tbody');
let out = '';
</script>
Copilot bot mir sofort eine Schleife durch das Array an und den Code, der die Bildinformation ausliest.
for (let i = 0; i < names.length; i++) {
let img = new Image();
img.src = 'img/' + names[i];
img.onload = function() {
out += '<tr><td>' + names[i] + '</td><td>' + this.width + '</td><td>' + this.height + '</td></tr>';
tablebody.innerHTML = out;
}
}
Ein anderes Mal wollte ich einen "Kopieren"-Knopf erstellen. Ich definierte ein HTML-Button-Element mit einem Datenattribut mit dem Namen "snippet" in einer HTML-Liste.
<ul id="snippets">
<li>{{text}}<button data-snippet="{{ data }}">copy</button></li>
</ul>
Das war alles, was Copilot brauchte, um ein Script anzubieten, das nicht nur erkannte, dass ich nur auf Knöpfe reagieren will, sondern auch das Datenattribut ausliest. Da meine Knöpfe "copy" als Text hatten, erkannte das System auch, dass ich diese Information in die Zwischenablage kopieren wollte.
<ul id="snippets">
<li>{{text}}<button data-snippet="{{ data }}">copy</button></li>
</ul>
<script>
document.querySelector('#snippets').addEventListener('click', function(e) {
if (e.target.tagName === 'BUTTON') {
let snippet = e.target.getAttribute('data-snippet');
navigator.clipboard.writeText(snippet);
}
});
</script>
Maschinenunterstützte Programmierung als "Gib mir ein Ergebnis aus Github oder dem Web, das meine Aufgabe erfüllt" ist nicht, worum es hier geht. Viel interessanter ist, was passiert, wenn man diese Systeme in eigenen, größeren Projekten anwendet.
Sobald das System analysiert wurde, werden bestehende Funktionen und Zusammenhänge erkannt und als erste Ergebnisse angeboten - und nicht generische Lösungen aus dem Internet.
Automatisierte Code-Standards?
Wenn ein ganzes Entwicklerteam ein solches System verwendet und mit bestehenden, qualitativ hochwertigen und dem Firmenstandard entsprechenden Code füttert, entsteht ein interessanter Automatisierungseffekt.
Vervollständigungen, die von Entwicklern für gut befunden und angenommen wurden, bekommen im System eine höhere Wertung und werden somit auch anderen Team-Mitgliedern angeboten.
Dadurch werden Entwickler effektiver, da beispielsweise eine schon bestehende Funktionalität nicht neu geschrieben und es einfacher wird, eine konsistente Syntax einzuhalten.
Wiederverwendbare Bibliotheken und Funktionen werden automatisch angeboten, während man programmiert. Natürlich bedeutet das nicht, dass diese ohne Analyse und Lizenzabfrage sofort verwendet werden können. Aber es erleichtert die Suche ungemein. Ich habe Monate meines Lebens als leitender Entwickler damit verbracht, effektive Lösungen in Produkten zu erkennen und im Team als Standard zu etablieren.
Viele dieser Lösungen führten dazu, dass das Team viel effizienter arbeiten konnte - aber es dauerte immer eine lange Zeit, bis bestimmte Vorgehensweisen angewendet wurden. Wenn der Code vom System für mich generiert wird und mittels eines Tastendrucks eingefügt werden kann, gibt es dieses Problem gar nicht erst. Natürlich ist es gefährlich, Code einzufügen, den man nicht versteht, doch auch da helfen die KI-Produkte. Man kann das System fragen, was dieser Code macht, und dann immer noch Änderungen vornehmen.
Dokumentation und Beschreibung von Code
Eine der für mich arrogantesten und fundamental falschen Aussagen, die man in Entwicklerkreisen immer wieder hört, ist: "Guter Code erklärt sich selbst." Es wäre toll, wenn das so wäre. Doch jeder Mensch tickt anders, und was von dem einen als "super lesbar und effektiv" angesehen wird, kann für andere nur als Sonderzeichensalat gesehen werden.
Klar: Saubere, gut strukturierte Programme sind einfacher zu verstehen als Spaghetticode. Aber das ist nicht alles. Oft passiert es, dass man Monate später seine eigenen Produkte ansieht und nicht wirklich weiß, warum sie funktionieren. Gute Kommentare zu schreiben, ist eine Kunst - und leider eine, die nicht viele Fans hat.
Eines der tollsten Beispiele für ML-unterstütze Programmierung ist, dass man Code aus einem Kommentar oder Schema generieren kann. Noch interessanter ist allerdings der umgekehrte Fall.
Produkte wie Copilot oder Ghostwriter AI Mode erlauben es Nutzern, ein Programm zu markieren und sich in einfacher Sprache erklären zu lassen, was passiert, wenn es ausgeführt wird. Zum Beispiel kann man erfahren, warum ein CSS Stylesheet komische Prozentangaben hat.


Spurkontrolle und Tempomat für Teams
Es gibt beim Thema ML-gestützte Programmierung einiges zu diskutieren, vor allem wenn es um Lizenzen und Rechte geht. Für mich als Entwickler ist es aber wirklich interessant zu sehen, wie Github Copilot, Amazon Codewhisperer oder andere uns helfen können, Aufgaben zu automatisieren. Aufgaben, die eigentlich keinen Menschen brauchen.
Gute Entwickler haben kreative Faulheit als Teil ihrer Arbeitsauffassung - und ein selbstlernendes System erlaubt es uns, eine Menge Lösungen, die wir immer wieder von Neuem schreiben würden, einfach mit einem Tastendruck einzufügen.
Christian Heilmann ist seit über 25 Jahren Entwickler, Buchautor, Trainer und leitete Teams in Yahoo, Mozilla und Microsoft. Derzeit arbeitet er als Principal Program Manager für die Developer Tools im Chromium-Projekt. Er lebte in Amerika, Indien, England und jetzt in Berlin und bloggt seit 2005 bei christianheilmann.com und als "codepo8" in den sozialen Netzen.



