Tech Insights

Mijn AI-toolchain voor code van hoge kwaliteit

Ik ga er geen doekjes om winden: ik geloof niet in de vibe-coding-, agentic-coding- of loop-coding-hypes. Simpelweg omdat ik al te veel code voorbij heb zien komen die op deze manier gestart is en zo slecht in elkaar zit dat ze onbruikbaar, niet te onderhouden en vaak zelfs ronduit onveilig zijn.

Wanneer mensen die geen kennis van softwareontwikkeling hebben op deze manier gaan ontwikkelen, is dat vergelijkbaar met een willekeurig iemand het beste chirurgische mes geven en laten opereren. AI is net als het mes: een superwaardevolle tool in de handen van een specialist, en een supergevaarlijke tool van iemand die geen idee heeft wat deze ermee moet doen.

Mijn AI-standpunt

Ik denk dat ik daarmee mijn standpunt rond AI in een klap duidelijk maak. Voor mij is het absoluut een waardevolle tool, maar wel in de handen van iemand die het zonder die tool ook hetzelfde werk zou kunnen doen. In dat geval zorgt het voor meer snelheid en hoge kwaliteit.

Een specialist die AI als tool gebruikt, weet namelijk waarop gelet moet worden. Die specialist weet dat er niet enkel op de tool vertrouwd moet worden, maar op eigen kennis. Dat je de tool niet de vrijheid moet geven, maar heel precies en secuur moet gebruiken. Net zoals een chirurg met dat mes omgaat.

Vertrouw niet alleen op je eigen kennis

Wanneer ik met Laravel aan de slag ben, weet ik dat ik de specialist ben. Ik begrijp het framework door en door. Ik snap waar alles zit en hoe het op de beste manier samenwerkt. Toch vertrouw ik niet volledig op mijn kennis. Om de simpele reden dat een codebase groeit en ook ik daardoor dingen over het hoofd kan zien.

Gelukkig zijn er verschillende tools die je in kunt zetten om de kwaliteit van je code te bewaken. Tools die overigens enorm goed werken zonder dat er AI bij komt kijken!

In dit artikel kijk ik naar de tools die ik standaard gebruik voor statische analyse, codekwaliteit en refactoring, beveiliging en dependencies en automatisch testen. Door de combinatie van deze tools weet ik zeker dat mijn code kwalitatief goed en veilig is. Zelfs als ik AI-tools gebruik om code te laten genereren!

Statische analyse

Fouten in je code opsporen voordat de klant ze in je productieomgeving ontdekt. Dat is wat je met statische analysetools doet. Om verwarring te voorkomen: het gaat niet om het testen van je code, maar puur om fouten op een dieper niveau. Denk daarbij aan fouten van types die door elkaar gebruikt worden. Bijvoorbeeld deze situatie:

<?php
float $factuurbedrag = 9.99;
$factuurbedrag = “9,99 Euro”;

Larastan / PHPStan

Een krachtige tool om dit soort fouten op te sporen is Larastan en PHPStan. Eigenlijk gaat het om dezelfde tool, waarbij Larastan voortreffelijke toevoegingen heeft om Laravel-code goed te begrijpen en te interpreteren.

Deze tool vindt bugs, typefouten en logische fouten zonder de code uit te voeren. Belangrijk te onthouden is dat deze tool geen problemen voor je oplost. Het laat je precies zien waar de risico’s zitten en laat het aan jou, als specialist, om daar de juiste oplossingen voor te maken.

Laravel Pint

Laravel Pint is een tool waar ik, sinds het eerste gebruik, bijna verliefd op ben geworden! Met een simpel commando via de command line zorgt Pint ervoor dat mijn code automatisch formatteert volgens de PSR-12- en Laravel-standaarden. Het verwijdert onnodige spaties, lijnt de code netjes uit en zorgt dat mijn code er met één commando strak en professioneel uitziet.

Dat is uiteraard niet alleen leuk omdat het er zo goed uitziet in mijn Git-repository; het helpt ook de code makkelijker te lezen en aan te passen.

Code Kwaliteit & Refactoring

Veel refactoring kan worden uitgevoerd door tools. Deze maken de kwaliteit van de code stukken beter, zonder dat je daar zelf voor hoeft te zwoegen. Er zijn twee belangrijke tools die ik hiervoor gebruik.

Rector PHP

Als ontwikkelaar ben je natuurlijk bekend met het bekende switch-statement. Veel gebruikt om eindeloze if-then-else constructies te voorkomen. Maar heel eerlijk: echt mooi is zo’n switch nu ook weer niet. Gelukkig heeft PHP vanaf versie 8.0 een veel mooiere oplossing: match!

Nu kun je natuurlijk je hele codebase door om overal switch-statements te vervangen door match, maar je hebt waarschijnlijk wel iets beters te doen. Gelukkig is er Rector PHP die dat ook voor je kan doen. Met een simpel commando pakt Rector je hele codebase in één keer aan.

Een tool gebruiken om van switch-statements naar match-statements te gaan? Is dat niet een beetje overdreven? Waarschijnlijk wel, maar Rector kan veel meer. Het voorbeeld dat ik geef wordt een ‘rule’ genoemd in Rector. Op dit moment zijn er 1055 van dit soort rules. Het gaat gelukkig dus wel een heel stuk verder dan alleen switchen naar match!

Laravel IDE Helper

Laravel voelt soms een beetje als magie. Niet alleen omdat je er razendsnel software mee bouwt van hoge kwaliteit, maar ook omdat door al die facades en Eloquent-modellen heel veel verborgen blijft. Een IDE als PHPStorm of VS Code begrijpt niet goed wat er allemaal gebeurt en geeft je daarom minder waardevolle code-completion-suggesties.

De tool Laravel IDE Helper lost dit voor je op. Het genereert helperbestanden die door je IDE gelezen worden. Hierdoor is je IDE in staat precies te begrijpen wat er onder de motorkap van Laravel gebeurt en geeft je daardoor wel de zinvolle auto-complete suggesties.

Beveiliging & Dependencies

De tijd dat je werkelijk alle code zelf schreef, is al lang voorbij. Al lang voordat AI de code voor je ging schrijven. PHP heeft een fantastisch systeem met packages die in je applicatie geladen kunnen worden. Packages die je zelf schrijft, of die door anderen ontwikkeld zijn. En daar kan natuurlijk weleens een ‘foutje’ in sluipen.

Composer Require Checker

Het pakketbeheersysteem van PHP is echt geweldig. Je kunt er enorm veel mee vinden en het is super eenvoudig om functionaliteit toe te voegen zonder zelf te programmeren. Wil je gebruikmaken van een externe API en is daar een package voor? Dan is die zo geïnstalleerd.

Het risico zit alleen in de pakketten die je daardoor mee-installeert. Om die API te gebruiken, heb je ook een tool nodig om de verzoeken uit te voeren. Daarvoor wordt weer een ander pakket gebruikt. Superhandig, want nu dat pakket er is, kun je zelf ook andere verzoeken sturen.

Maar wat nu als het API-pakket besluit een ander pakket te gaan gebruiken voor die externe verzoeken? Je doet de update en ineens werken je eigen verzoeken niet meer! Dat is waar Composer Require Checker je mee helpt. Het scant welke ‘verborgen’ pakketten er geïnstalleerd zijn en geeft je advies deze zelf als los pakket aan het composer.json bestand toe te voegen. Op die manier voorkom je dat je code breekt bij toekomstige updates.

Automatisch Testen

Wanneer je jouw code in productie gaat brengen, wil je zeker weten dat er geen rare fouten in zitten. Automatische testen zijn hiervoor een belangrijk hulpmiddel. Als ik code oplever, is deze altijd getest.

PestPHP

En om die code te testen gebruik ik altijd PestPHP. Deze tool maakt testen mooi, elegant en simpelweg leuk. Je tests zijn enorm eenvoudig te lezen en te begrijpen, waardoor je zelfs met iemand van ‘de business’ kunt bespreken of de applicatie doet wat de bedoeling is.

Het PestPHP-framework is gebouwd bovenop PHPUnit, een absoluut krachtige en bewezen oplossing. PestPHP maakt het testen vooral veel eenvoudiger. Het is tegenwoordig de standaardkeuze in Laravel. Vooral vanwege de zeer leesbare en fijne syntax.

Van handmatig naar automatisch

Uiteraard draaien deze tools op mijn lokale ontwikkelomgeving. Wanneer ik aan het ontwikkelen ben, voer ik regelmatig de tools uit om te controleren of alles nog goed gaat. Maar ik ga hier nog een stap verder in. Ik wil er natuurlijk zeker van zijn dat mijn code ook buiten mijn ontwikkelomgeving goed blijft functioneren.

CI/CD

Tegenwoordig zijn Continuous Integration / Continuous Delivery, of kortweg CI/CD, de standaard voor veel ontwikkelprojecten. Waar dat vroeger nog vroeg om externe systemen die de code bouwden en live zetten, kan dat nu via het versiebeheersysteem.

Mijn standaard is dan ook om hier GitHub Actions (of welk versiebeheer het project ook heeft) voor in te zetten. Dit zorgt ervoor dat mijn code altijd gecheckt wordt op de bovenstaande onderdelen, voordat deze naar productie gaat.

Geen pre-commit-hook

Er zijn ook oplossingen om op een stap eerder al deze checks te doen: de pre-commit-hook. Dit zorgt ervoor dat de checks worden uitgevoerd voordat de code wordt gecommit. Hoewel dit voorkomt dat je ‘slechte’ code in je versiebeheer krijgt, ben ik er zelf minder fan van.

Voor mij is versiebeheer precies dat: versiebeheer. Ik kan er misschien wel een heel goede reden voor hebben om code toch in versiebeheer te hebben. Als is het alleen al voor het hebben van een goede backup. Als ik dan tegen wordt gehouden omdat er een test niet draait, of de code niet aan de standaarden voldoet wordt daarmee mijn workflow geblokkeerd.

Door alle checks in CI/CD in te bouwen weet ik zeker dat er geen ‘slechte’ code naar productie gaat, dat is de plek waar de kwaliteitsstandaarden het allerbelangrijkste zijn!

0% concessie

Als het om kwaliteit gaat doe ik 0% concessie. Zeker als het om code gaat die in productie genomen moet worden. Niet omdat ik heel puristisch ben, maar omdat ik weet dat een heel klein, ogenschijnlijk onbelangrijk, foutje een enorme impact kan hebben op de applicatie zelf.

Werk je dus met Laravel code, zeker in combinatie met AI? Zorg dan dat je de bovenstaande tools absoluut in je workflow hebt opgenomen!

Overzicht van de tools

Voor het totaalbeeld vind je hieronder een overzicht van de genoemde packages: