Minstens een jaar voordat ChatGPT werd gelanceerd en onze manier van werken veranderde, had één beroepsgroep al een voorsprong op de rest. Softwareontwikkelaars gebruikten generatieve AI toen al in hun dagelijkse werk. GitHub Copilot werd in 2021 aangekondigd. Sindsdien is een gestage stroom programmeerassistenten met generatieve AI op gang gekomen. Sommige zijn voor gewone stervelingen bijna niet te begrijpen. Andere leidden tot hyperbolische marketingclaims als: “Het einde van programmeren is nabij!”

Al deze AI-programmeerhulpmiddelen hebben hetzelfde einddoel: AI-ondersteund programmeren.

Toen ik dit artikel in 2024 schreef, waren GitHub Copilot en Replit twee toonaangevende oplossingen. Beide kozen voor een iets andere benadering. Replit werkte in de cloud, in een eigen webgebaseerde code-editor. GitHub Copilot integreerde diep met ontwikkelomgevingen als Visual Studio en VS Code, waar het fungeerde als assistent op afroep voor een programmeur. In dit artikel richt ik me op GitHub Copilot, omdat het aansloot op onze manier van werken en de hulpmiddelen die we dagelijks gebruikten. De precieze functies en opdrachten kunnen inmiddels zijn veranderd.

Dit artikel is geschreven met de bedoeling vaktermen uit softwareontwikkeling af te wisselen met eenvoudige, algemene uitleg. Het bevat voorbeelden uit een recent project van ons, waarin Robin een spraak-naar-teksttranscriptietool met generatieve AI bouwde. Je hoeft de codevoorbeelden niet te begrijpen, maar als je nog nooit met ontwikkelaars hebt gewerkt kan dit artikel lastig te volgen zijn. Vragen en feedback zijn altijd welkom.

Laten we beginnen met de wereld waarin Copilot leeft: de code-editor.

Deze ontwikkelomgevingen zijn de hamers en spijkers waarmee het digitale tijdperk waarin we leven is gebouwd. Ze bestaan al sinds het begin. Ik kan geen enkele logische reden bedenken waarom ze niet ook de fundering zullen leggen voor wat hierna komt, of dat nu quantumcomputing is of een bizarre fotonische neurocomputer. Disclaimer: dat laatste heb ik zojuist verzonnen.

Er bestaan veel code-editors en uitgebreidere ontwikkelomgevingen, doorgaans IDE’s genoemd: Integrated Development Environments. Simpel gezegd bieden ze een werkruimte waarin een ontwikkelaar software kan bouwen.

Voor dit artikel gebruik ik twee IDE’s, opnieuw omdat we daar zelf mee bouwen.

VS Code: een lichte opensource-code-editor die gratis te gebruiken is, een enorme hoeveelheid plug-ins heeft en sterk aanpasbaar is.

Visual Studio: een “zwaardere” closed-sourceapplicatie met een gratis variant. De applicatie biedt een reeks sjablonen en werkprocessen voor serieuze .NET-ontwikkeling, maar minder mogelijkheden voor aanpassing.

GitHub Copilot integreert met beide omgevingen en voegt chat- en suggestiefuncties toe naast en binnen de code. In dit voorbeeld heeft AI-engineer Robin Egberts Copilot aan de rechterkant van het scherm geopend terwijl hij verder programmeert. Het is conversationele AI. Rechtsonder zie je de toenmalige tekst: “Vraag Copilot: typ / voor opdrachten en # om naar code te verwijzen.”

De ontwikkelaar formuleert het verzoek aan de AI-assistent in gewone taal en voegt vervolgens een opdracht of verwijzing met # toe om context te geven.

Dit zijn de opdrachten die we gaan gebruiken:

  • /explain om de code uit te leggen
  • /fix om een oplossing voor problemen in de geselecteerde code voor te stellen
  • /optimize om de prestaties en uitvoeringstijd van de geselecteerde code te analyseren en te verbeteren
  • /tests om unit tests voor de geselecteerde code te maken

(Er bestonden ook opdrachten die daadwerkelijk code genereerden op basis van een vraag, maar die heb ik bewust weggelaten. Een andere interessante opdracht was /document, die volgens de toenmalige versie betekenisvolle documentatie kon genereren. We hadden die nog niet vaak genoeg gebruikt om de opdracht te kunnen aanbevelen. Controleer voor de huidige werking altijd de documentatie van GitHub Copilot.)

De hashtag richt de vraag simpelweg op een bepaald bestand en voegt zo context toe aan de opdracht of vraag van de ontwikkelaar.

Hier volgen een paar voorbeelden van hoe dit werkt.

We gebruiken een voorbeeld van Robin, waarin hij een gebruiker aan een database wil toevoegen.

Om te beginnen selecteren we de code die Copilot moet uitleggen:

Geweldig, het werkt! Copilot neemt de methode en ontleedt die stap voor stap. Het legt de logica en de afzonderlijke onderdelen uit. Dat is nuttig voor ontwikkelaars die moeten werken aan code die ze niet zelf hebben geschreven, aan bestaande of overgenomen code, of aan code waaraan meerdere mensen samenwerken en die ze snel moeten doorgronden. Het is ook een bijzonder effectief leermiddel voor mensen die net beginnen in de prachtige wereld van softwareontwikkeling.

Vervolgens vragen we Copilot enkele unit tests voor deze methode te schrijven. Het idee van test-driven development is prachtig. Het vormt een integraal onderdeel van agile softwareontwikkeling, als je weet wat je wilt en hoe je effectief test.

Hier is een interessante video over het idee achter TDD, oftewel test-driven development.

Het kost echter ook veel tijd. Voor senior ontwikkelaars kan het bovendien een klus worden om voor iedere methode in een complex codeproject unit tests te schrijven.

Hier gebruiken we de slash-opdracht “tests” en richten we deze met # op de module waarvoor we tests nodig hebben.

Onthoud dat Copilot dit in het gesprek genereert, niet rechtstreeks in je code. Dit bedoelen we met AI-ondersteund programmeren. Robin vroeg Copilot niet om de productcode zelf te schrijven. Copilot genereert voorstellen voor unit-tests en Robin beslist welke hij overneemt, controleert en uitvoert voor de methode waaraan hij werkt. Persoonlijk denk ik dat dit ontwikkelaars een flinke impuls in productiviteit en kwaliteit kan geven. Het zou me niet verbazen als veel ontwikkelaars door AI gegenereerde unit-tests als een belangrijk verkoopargument van deze dienst zien. Vooral ervaren ontwikkelaars kunnen hiermee tijd besparen op testwerk dat ze al talloze keren hebben uitgevoerd.

Bij testen wordt vaak gewerkt met mocks. Nee, dat betekent niet dat je iemands code belachelijk maakt. Een mock is een gesimuleerde versie van een onderdeel waarvan je de interactie wilt testen. Wikipedia vergelijkt het met een botsproefpop. Volgens mij is dat een prima metafoor.

Hier kunnen we Copilot vragen om mockdata voor ons toe te voegen:

Buiten het testscenario, dichter bij het schrijven van productcode, kon je de opdracht /optimize gebruiken om suggesties voor efficiëntere code te krijgen. Dit onderdeel van Robins code moet zo efficiënt mogelijk worden uitgevoerd. Hij heeft het al geschreven, maar zoekt ideeën om de prestaties verder te verbeteren.

Tot slot is er de opdracht /fix, die binnen Robins code wordt uitgevoerd en in een dialoog een oplossing biedt voor een bepaald probleem. Copilot toont de ontwikkelaar twee weergaven: één waarin zichtbaar is wat er gebeurt en één met de mogelijke oplossing. Van hieruit kan de ontwikkelaar de oplossing accepteren en doorgaan naar de volgende bug.

In dit voorbeeld gaat het om een heel eenvoudige typefout, maar Copilot stelt ook voor complexere problemen behoorlijk goede oplossingen voor.

Er bestaat wel een dilemma rond AI-ondersteund programmeren. Als ontwikkelaars inderdaad de efficiëntiewinst van 50 of 60 procent behalen waarmee deze hulpmiddelen destijds adverteerden, hoeft dat niet per se goed nieuws te zijn. Zulke marketingcijfers verschillen bovendien sterk per taak en werkomgeving.

Wat bedoel ik daarmee? Als je ooit in een softwareproject hebt gewerkt, weet je dat de honger naar nieuwe functies nooit verdwijnt. De grenzen van onze tijd, mogelijkheden en technologie hebben vaak een gezond effect op een project. Ze voorkomen ook dat we als legbatterijkippen worden opgejaagd. Mijn zorg is dat AI-assistenten ons een tijdperk van hyperproductiviteit in duwen waarin ieder project met functies wordt overladen, en de kwaliteit van producten en diensten daar uiteindelijk onder lijdt.

Mijn conclusie is dat er altijd behoefte blijft aan mensen die effectief schakelen tussen gebruikers, belanghebbenden en ontwikkelaars, zoals product owners en projectmanagers.

Stof tot nadenken. Heb je feedback, of ben je het ermee eens of oneens? Laat het me weten.

Bedankt voor het lezen,

Kai