De applicatie compileert en alle testen slagen. Ik scroll terug door de diff en besef dat ik op dit moment niet aan een collega zou kunnen uitleggen waar die tweede loop voor dient.
Het is geen grote functie. Veertig regels, misschien. Claude schreef de functie nadat ik beschreef wat ik wilde. De aanpassing zelf werkt, en de test die ik (eigenlijk Claude) toegevoegd heb, raakt de voor de hand liggende paden. Volgens elke check die ik ken zou dit een schone PR zijn.
Toch maak ik de PR nog niet.
Onze eigen kanaries
Mijnwerkers namen vroeger kanaries mee de mijn in omdat de vogels sneller ademden en eerder reageerden op koolmonoxide dan mensen. Zolang de kanarie zong was de lucht veilig. Als je de kanarie niet meer hoorde klom je zo snel als je kon naar boven.
Software heeft altijd zijn eigen kanaries gehad. Dingen waar je op lette als ontwikkelaar. Het aantal stories met fouten per sprint. De team velocity. De totale test coverage. Ze waren niet perfect, maar het waren onze kanaries om te zien of alles nog liep. Als deze kanaries stilvielen was er iets mis, en meestal kon je vinden wat.
Het is de vraag of deze kanaries nog wel werken.
Nog steeds in de juiste toon
Neem velocity. Het grootste deel van mijn carrière was velocity een ruwe maatstaf voor snelheid: hoe snel kan een team nieuwe functionaliteit bouwen. Nu produceert Claude duizend regels werkende code in een uur. Velocity is losgekoppeld van begrip. Een sprint die twee keer zoveel tickets sluit, betekent niet dat het team twee keer zo hard nadacht. Het kan betekenen dat het team half zo veel nadacht.
Test coverage is een andere metric die niets meer zegt. Coverage was altijd een proxy: edge-case testen betekenden dat iemand over die edges had nagedacht. Nu schrijft hetzelfde model dat de code schrijft, ook de tests. Een hoog coverage-getal vertelt je dat de vraag aan Claude gesteld is om testen te maken. Het vertelt je niet dat iemand heeft overwogen wat niet zou moeten werken, of welke scenario's denkbaar zijn. Net zoals vroeger is nu de auteur van de code en die van de testen dezelfde, vroeger de ontwikkelaar, nu Claude of een andere AI. Het probleem is dat Claude niet dezelfde edge-cases test.
Of denk aan bug counts. De eerste indruk is dat AI ze verlaagt: bekende patronen en bugs worden sneller opgelost. Het echte beeld is anders. Codebases groeien nu sneller, en bugs lopen maanden achter op het schrijven of treden pas op na een bepaalde kritische massa. De bug count van vandaag weerspiegelt de code van vóór de versnelling. De lijn op de grafiek kan er gezond uitzien tot het moment dat dat niet meer zo is.
Dit waren nooit perfecte kanaries. Maar ze zongen vroeger een lied waar je wat mee kon. Nu zingen ze in de juiste toon terwijl we de mijn zelf niet meer kennen.
Wat blijft er over
Toen ik bij die veertig regels code kwam en de tweede loop niet kon uitleggen, was wat me waarschuwde geen harde, meetbare metric. Het was de afstand tussen de code die ik (eigenlijk Claude) geschreven had en de code die ik begreep. Mijn begrip van de code is smal, en de afstand tussen de code en mijn begrip groot.
Die afstand is de kanarie.
Als ik een aanpassing aan de code aan een andere ontwikkelaar kan uitleggen, ken ik de mijn nog. Lukt me dat niet, dan loop ik op gevoel. Betrap ik mezelf op de gedachte het werkt omdat Claude het zei, dan is de vogel gestopt met zingen.
De metrics zijn verhuisd van harde cijfers op het dashboard naar de ontwikkelaar. Dat is ongemakkelijk. Dashboards zijn makkelijk te delen en makkelijk te auditen in een reviewmeeting. Een claim over je eigen begrip van de code is moeilijker te verifiëren. Maar hij is ook moeilijker te faken. Je kunt een coverage-getal manipuleren. Het is veel moeilijker om vijf minuten lang door code heen te bluffen die je nooit echt hebt begrepen.
Voor de merge
Als ik een pull request maak, kijk ik naar de diff en analyseer waarom de aanpassing gemaakt is zoals hij gemaakt is. Lukt dat niet, dan open ik geen PR. Ik ga terug en lees. Soms herschrijf ik. Soms ontdek ik dat wat Claude voorstelde en wat ik nodig had stilletjes uit elkaar waren gelopen terwijl alles bleef compileren.
Het is de enige manier op dit moment om te vangen wat tests en harde metrics niet kunnen: code die werkt zonder dat iemand snapt wat het doet.
De kanarie is er nog. Hij zingt alleen nu in je hoofd. De truc is hem te horen voor je de PR maakt.