speakr.blog

Thomas Huijzer

Thomas Huijzer

| 31 views

AI gebruiken om te programmeren: een nieuwe manier van werken

Om AI te laten programmeren moet je een 'agent' gebruiken. Een agent is in staat om een taak op te splitsen in meerdere onderdelen en om wijzigingen aan te brengen in je project, gegevens op te zoeken via internet, database aanpassingen te maken, enz. enz.

Ik wilde weten of het mogelijk is een volledige webapplicatie te maken zonder zelf een regel code te schrijven. En dat kan. In deze post omschrijf ik een aantal van mijn bevindingen.

Als agent gebruikte ik Junie van Jetbrain.

Hoe te beginnen?

Mijn ervaring is dat het handig is om te beginnen met een algemene specificatie. Bijvoorbeeld met de programmeertaal die je wilt gebruiken (inclusief de versie), het soort database, of en welke dependencies gewenst zijn, de manier waarop je je project in wilt delen, een framework, enz. enz. Je kan deze specificatie zelf als bestand in een map zetten, maar je kan deze natuurlijk ook laten genereren door de agent.

Het is wel belangrijk om te weten dat een agent opdrachten direct uit voert. Wil je dat niet, dan moet je dat de agent heel duidelijk vertellen. Wanneer je bijvoorbeeld in je specificatie zet dat je gebruik wilt maken van een bepaalde API, dan kan het zomaar zo zijn dat de agent direct code gaat ontwikkelen om met deze API te communiceren. Je moet hier in je prompt echt rekening mee houden, bijvoorbeeld: `Lees de specificaties uit het bestand 'specifications.md', maar genereer nog geen code, lees alleen de specificaties.`

Code genereren

Wanneer de agent je specificaties heeft gelezen kan je beginnen met het opzetten van wat basiszaken. Zelf was ik nieuwsgierig of de agent een systeem kon maken dat database-migraties uit kan voeren: `Maak een systeem dat mogelijk maakt om databasemigraties uit te voeren.` Het resultaat zag er goed uit, maar na controle zag ik dat de database-credentials hard in de code werden opgeslagen. Een nieuwe prompt met: `Zorg er voor dat de database-credentials niet in de code worden opgeslagen, maar in een configuratiebestand` zorgde er voor dat het probleem netjes werd opgelost.

Dit laat wel zien dat je een agent niet zomaar kan vertrouwen. Het neemt veel werk uit handen, maar je moet als programmeur actief bezig blijven met het controleren van de geschreven code.

Specificeer wat je wilt maken

Als de basis is opgezet kan je beginnen met het maken van je applicatie. Mijn ervaring is dat een agent het best werkt wanneer je goed specificeert wat er moet gebeuren. Die specificatie hoef je zelf niet volledig uit te schrijven, je kan de agent vragen dit te doen. Bijvoorbeeld een specificatie over de autorisatie en authenticatie van je applicatie. Je kan bijvoorbeeld aangeven dat er gebruikers zijn die geautoriseerd worden met een gebruikersnaam en wachtwoord. En dat een gebruiker één of meerdere rollen kan hebben.

Vervolgens kan je de agent vragen om een webapi te maken op basis van deze specificatie. Bijvoorbeeld met een prompt als: ``` Maak een webapi endpoint `/api/auth/token` waarbij een gebruiker een token op kan vragen met een gebuikersnaam en wachtwoord. Dit token moet later gebruikt worden in de Authorization header als Bearer token. Gebruik als specificatie de gegevens in het bestand 'auth_specifications.md'. Maak ook database migraties zodat gebruikers opgeslagen kunnen worden. ```

En dan begint de 'magie'. Je zal zien dat je agent aan de slag gaat en code gaat schrijven.

Blijven opletten

Hoewel het er op lijkt dat je als ontwikkelaar achterover kan leunen moet je actief bezig blijven met code-reviews. De kwaliteit van de code is afhankelijk van het gebruikte AI-model. En verder blijft AI voorlopig nog 'dom'. Een agent kan niet redeneren zoals een mens dat kan. Zo zag ik bijvoorbeeld dat alle `SELECT` queries voor de database altijd alle kolommen ophalen (`SELECT * FROM table`). Dat is vaak niet wenselijk. Maar je hoeft dat zelf niet aan te passen. Je kan de agent daar opdracht voor geven: `Zorg er voor dat alleen de benodigde kolommen geselecteerd worden uit de database. En doe dit vervolgens altijd`.

Krachtig of hype?

Het werken met AI is waarschijnlijk de toekomst. Veel werk gaat veranderen. Toch denk ik niet of hierdoor de baan als ontwikkelaar gaat verdwijnen. Iemand die totaal geen verstand heeft van programmeren kan met een agent zeker wel mooie apps maken, maar het is ook duidelijk dat een agent problemen kan veroorzaken wanneer je als ontwikkelaar de regie niet houdt. Het kunnen kleine problemen zijn, zoals het niet werken van een knop, maar ook grote problemen waardoor dataverlies kan ontstaan of hackers ongewenst toegang krijgen tot je data.

Verder is het ook echt de vraag of je wel sneller bent wanneer je code door een agent laat genereren. Er zijn onderzoeken die aantonen dat dit niet altijd het geval is omdat er soms ook veel tijd nodig is voor code-reviews en het bedenken van de juiste prompts en specificaties.

Mijn ervaring is wel dat je door het werken met een agent veel betere documentatie van je project krijgt. Je specificeert meer en de agent houdt bij wat nodig is om de opdrachten uit te voeren. In het geval van Junie wordt er constant een update gemaakt in `README.md`. Dit bestand bevat de volledige documentatie van de werking van het project. Handig voor de agent, maar zeker ook voor de mensen die werken aan het project.

Een agent is erg goed in het ordenen van informatie. Daar kan je heel goed gebruik van maken. Je kan bijvoorbeeld een user story omschrijven als een stuk tekst en de agent kan daar hele mooie documentatie van maken. Of een gewenste workflow. Je geeft aan wat een gebruiker moet kunnen en de agent kan behoorlijk goed uitpluizen welke API endpoints daar voor nodig zijn.

Het is een nieuw manier van werken die waarschijnlijk de toekomst is. Maar je ervaring als ontwikkelaar blijft belangrijk. Een agent is een hulpmiddel die je moet blijven sturen en waar je de regie over moet houden.