Afbeelding: Toekomst van softwareontwikkeling met AI

Zijn ontwikkelaars van software in de toekomst nog nodig?

Geschreven door Rob Dekkers

Sinds de introductie van ChatGPT, eind 2022, is de belangstelling voor generatieve AI (Artificial Intelligence) en AI en ML (Machine Learning) in het algemeen enorm toegenomen. Essays, samenvattingen, gedichten, programmacode, afbeeldingen en video kunnen bijna levensecht worden gegenereerd. Er zijn berichten die aan de ene kant veelbelovend en aan de andere kant bedreigend klinken. Zo haalt Google’s Med-PaLM met gemak het artsexamen, wordt een aflevering van South Park volledig door AI ingevuld, hebben door AI gegenereerde foto’s van mensen op Instagram vele volgers en vergaderen Kamerleden met een deepfake-imitatie van de stafchef van Navalny.

NVidia

Jen-Hsun Huang, medeoprichter en CEO van het Amerikaanse Nvidia, wereldleider in computerchips voor grafische verwerking en AI, heeft in 2022 al aangegeven dat hij verwacht dat binnen 10 jaar LLM’s (Large Language Models) voldoende zijn ontwikkeld om programmacode te genereren op basis van natuurlijke taal. “Software engineers may eventually be able to get away without learning coding at all”. Hij verwacht dat gespecialiseerde LLM’s voor codegeneratie beter gaan presteren dan menselijke programmeurs. Er zijn sindsdien diverse artikelen gepubliceerd die zinspelen op het vervangen van programmeurs door AI en zelfs met het advies om maar geen programmeertaal meer te leren. Klinkt best bedreigend als je softwareontwikkelaar bent. Wat moeten we verwachten?

Software ontwikkelen

Het ontwikkelen van complexe softwaresystemen is een minutieus proces. Uitgaande van behoeften van een organisatie en haar gebruikers ter ondersteuning of vervanging van werk, dient er vanuit een doel een creatieve oplossingsrichting te worden bedacht. Die oplossing dient vormgegeven te worden in functionele (en niet-functionele) specificaties. Vervolgens vindt detaillering plaats van architectuur en ontwerp tot code die door een computer kan worden geëxecuteerd. De software wordt door een computer uitgevoerd, waarna het functionele gedrag wordt getest of de gewenste processen en business logica worden gevolgd. Er zijn verschillende methoden hoe deze taken en hun resultaten in een project vorm te geven.

In het begin van het proces wordt veel in natuurlijke taal gecommuniceerd, maar naarmate het proces vordert wordt de gebruikte taal steeds formeler, exacter en uiteindelijk ondubbelzinnig voor een computer. De grammatica van de taal wordt ook steeds eenvoudiger. Er wordt tijdens het formaliseren gebruik gemaakt van specificatietechnieken, diagramtechieken, pseudocode en uiteindelijk programmacode, maar ook van proof of concepts en demonstratiesoftware.

Abstractie

Het instrueren van een computer wordt in het algemeen aangeduid als programmeren of coderen. Dit kan in verschillende talen. De mate van “abstractie” van de programmeertaal is omgekeerd evenredig met de hoeveelheid informatie die de computer aangereikt moet krijgen hoe de taken uitgevoerd moeten worden (dit in tegenstelling tot wat het resultaat moet zijn). In een imperatieve programmeertaal worden uitvoerbare opdrachten beschreven, terwijl bijvoorbeeld in SQL een meer wiskundige beschrijving van het resultaat wordt gedefinieerd, terwijl de database engine zelf moet uitzoeken hoe dat resultaat bereikt wordt.

Een low-code platform als Mendix abstraheert zich ook van allerlei details, zoals bijvoorbeeld de HTML van de user interface, integratie via webservices, de autorisatie van data en security-aspecten, waardoor de productiviteit van de softwareontwikkeling hoog kan liggen. Er is bij een ontwikkelaar veel minder kennis nodig van al deze details. Mendix claimt zelfs dat een applicatie in principe ontwikkeld kan worden door de gebruiker zelf, de zogenaamde citizen developer. Klinkt trouwens ook bedreigend voor een programmeur.

Codegeneratie met een LLM

Een gespecialiseerd LLM dat code kan genereren is getraind op basis van een enorme hoeveelheid voorbeeldcode met bijbehorende specificaties. Het kan onder andere op basis van een specificatie in natuurlijke taal een computerprogramma vormen dat functioneel overeen zou moeten komen met die specificatie. Deze LLM’s worden nu al door programmeurs gebruikt om technische vragen te beantwoorden, auto-complete van code uit te voeren, stukjes code te schrijven en fouten in code te vinden. Het is een zeer nuttig hulpmiddel, maar in de huidige vorm zeker nog niet geschikt om zelfstandig te programmeren. Er vindt onder andere te veel hallucinatie plaats, waarbij methoden in API’s helemaal niet blijken te bestaan. Maar de LLM’s worden steeds beter en stel je voor dat ze wel in staat zouden zijn om zelfstandig correcte code te genereren die aan onze verwachtingen voldoet. Dat is wat de voorspellingen aangeven.

Rol van ontwikkelaar

Al zouden we ervan uit kunnen gaan dat AI uitstekende code genereert op basis van natuurlijke taal, dan nog steeds blijft het noodzakelijk om de stappen vanuit een business doelstelling tot die specificaties uit te voeren en te begeleiden. Complexe software bestaat uit vele duizenden business rules, rekenformules, processtappen, criteria en if-then-else situaties die allemaal onderkend en gedefinieerd moeten worden om er correcte software van te produceren. Het is een enorme opgave om dit compleet en consistent te houden. Daardoor is sourcecode vaak de beste documentatie.

Het vertalen van de wensen van gebruikers naar die duizenden business rules, vergt specifieke vaardigheden, zoals analytisch vermogen, ontwerptalent en computational thinking. Eigenschappen die we normaliter vinden bij softwareontwikkelaars.

Daarnaast blijkt dat natuurlijke taal vaak ambigu is. In de praktijk zijn deze specificaties nooit voldoende expliciet en gedetailleerd. Dat vergt dan toch weer een mate van formalisering in taal, zoals bijvoorbeeld domein specifieke talen, waarbij het toch weer in de richting van programmeren gaat.

Verwachtingen van AI

De verwachting is dat AI zeker helpt om de productiviteit van softwareontwikkeling te verbeteren. Vooral codegeneratie van redelijk gestandaardiseerde functionaliteit kan door AI worden overgenomen. Echter lijkt het niet aannemelijk dat complexe software kan worden ontwikkeld op basis van natuurlijke taal zonder een traject van het formaliseren van specificaties. En daar blijft de rol van softwareontwikkelaar noodzakelijk. Men spreekt van een “shift to left”, waarbij de programmeur opschuift naar links richting de gebruiker met meer afstand tot de computer.

In feite is dit met low-code ook al de situatie: ontwikkeling in nauwe samenwerking met de gebruiker en abstractie van details van de computer. Niets nieuws onder de zon.