<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="nl"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://bartvanderwal.nl/feed.xml" rel="self" type="application/atom+xml" /><link href="https://bartvanderwal.nl/" rel="alternate" type="text/html" hreflang="nl" /><updated>2026-02-05T13:03:14+01:00</updated><id>https://bartvanderwal.nl/feed.xml</id><title type="html">Bart van der Wal - Persoonlijke Blog</title><subtitle>Persoonlijke blog over technologie, softwareontwikkeling en duursport.</subtitle><author><name>Bart van der Wal</name></author><entry xml:lang="nl"><title type="html">Accessible Software Engineering Diagrams</title><link href="https://bartvanderwal.nl/accessible-software-engineering-diagrams/" rel="alternate" type="text/html" title="Accessible Software Engineering Diagrams" /><published>2026-02-01T00:00:00+01:00</published><updated>2026-02-01T00:00:00+01:00</updated><id>https://bartvanderwal.nl/accessible-software-engineering-diagrams</id><content type="html" xml:base="https://bartvanderwal.nl/accessible-software-engineering-diagrams/"><![CDATA[<p><em>Ik heb gisteren mijn lange duurloop niet gedaan 😅. Ik zat weer veel te lang achter mijn beeldscherm 🥲. Een ideetje vanuit mijn werk liet me niet los. En programmeerwerk duurt vaak stuk langer dan je denkt. Nog even, nog even.. en zo zit je nog uren, de 80% moeite te steken in die laatste 20% werk. Want je moet toch op 100% komen. The reverse Pareto regel. Maar ik heb nu wel op NPM staan (npmjs.org): mijn 1e NodeJS in jaren open source module gepublished: remark-kroki-a11y Totaal zit ik nu op vier.</em></p>

<p>Komende week start een nieuw onderwijsblok en we zijn in lesmateriaal en (digitale) toetsen aan het kijken naar de toegankelijkheid ervan voor slechtziende en blinde studenten. Daarvan zijn er eigenlijk nog veel te weinig in ons onderwijs — en dat ligt misschien ook wel aan ons.</p>

<p>Programma code leent zich prima voor visueel beperkten, die hun screenreaders het laten voorlezen. En ‘blindtypen’ gaat sneller dan ziend typen (ook voor ‘zienden’). Alleen plaatjes zijn wel een obstakel. In Software Engineering gebruiken we veel diagrammen. Met bolletjes en pijltjes. Of vierkanten en pijltjes worden het meestal.</p>

<p>Een collega bedacht zich dat de ‘diagrams-as-code’ aanpak die we hanteren ook een betere instap biedt om het toegankelijk te maken, dan de plaatjes die hier uit komen. We gebruiken diagram-as-code formaten zoals PlantUML en Mermaid vooral omdat de voorbeelddiagrammen bij onze opdrachten dan makkelijk onderhoudbaar zijn. We hoeven niet de plaatjes zelf aan te passen, maar gewoon de code erachter. Dit kunnen we in versiebeheer houden, samen met de setup van codeprojecten. In <code class="language-plaintext highlighter-rouge">git diff</code> zie je welke aanpassingen op welk moment gemaakt zijn. En alles komt zo online als eigen website (we gebruiken Docusaurus).</p>

<p>In dit artikel beschrijf ik de plugin die we hiervoor gemaakt hebben. Sectie 1 legt het probleem uit. Sectie 2 beschrijft hoe diagrams-as-code een kans biedt. Sectie 3 introduceert de plugin, met het concept van situationele beperking en de roadmap voor verdere ontwikkeling. Sectie 4 illustreert UML voor lezers die nog geen goed beeld hebben, met een onverwacht maar wel vertrouwd voorbeeld: Roodkapje als UML. Sectie 5 reflecteert op het meta-aspect van dit project.</p>

<h2 id="1-het-probleem-visuele-diagrammen-in-een-tekstuele-wereld">1. Het probleem: visuele diagrammen in een tekstuele wereld</h2>

<p>UML diagrammen, C4 architectuurvisualisaties, flowcharts — het zijn krachtige communicatiemiddelen. Een goed diagram kan complexe relaties in één oogopslag duidelijk maken. Maar die “oogopslag” is precies het probleem.</p>

<p>Voor mensen die blind of slechtziend zijn, zijn deze diagrammen onzichtbaar. Een screenreader leest de alt-tekst van een afbeelding voor, maar wat schrijf je als alt-tekst voor een klassendiagram met tien klassen en vijftien relaties? “Klassendiagram” is te weinig informatie. Een volledige beschrijving wordt al snel een muur van tekst.</p>

<p>De European Accessibility Act (EAA) stelt vanaf 2025 eisen aan digitale toegankelijkheid. WCAG 2.1 niveau AA is de standaard. Maar los van wetgeving: als we als opleiding zeggen dat we inclusief willen zijn, dan moeten onze materialen dat ook zijn.</p>

<h2 id="2-diagrams-as-code-de-oplossing-zit-in-de-bron">2. Diagrams-as-code: de oplossing zit in de bron</h2>

<p>Hier komt een interessant inzicht: moderne diagramtools zoals PlantUML en Mermaid genereren diagrammen uit tekstuele broncode. Die broncode is per definitie toegankelijk — het is gewoon tekst.</p>

<p>Het Mermaid-project verwoordt dit mooi:</p>

<blockquote>
  <p>“The entire concept of Mermaid is that we can represent this visual content as plain structured text. Mermaid diagrams aren’t just static images generated in Photoshop; they are rendered dynamically from structured data.”</p>
</blockquote>

<p>De broncode bevat alle informatie die in het diagram zit. We moeten het alleen op de juiste manier presenteren.</p>

<p>Hier een voorbeeld van een eenvoudig klassendiagram:</p>

<figure>
  <p><img src="https://www.plantuml.com/plantuml/svg/~h407374617274756d6c0a407374617274756d6c0a217468656d6520706c61696e0a636c6173732053747564656e74207b0a20202d6e61616d3a20537472696e670a20202d73747564656e746e756d6d65723a20696e740a20202b766f6c677456616b2876616b3a2056616b290a7d0a0a636c6173732056616b207b0a20202d6e61616d3a20537472696e670a20202d73747564696570756e74656e3a20696e740a7d0a0a53747564656e742022302e2e2a22202d2d2022312e2e2a222056616b203a20766f6c67740a40656e64756d6c0a40656e64756d6c" alt="Klassendiagram met Student en Vak en de relatie ‘volgt’" /></p>
  <figcaption>
    <p>Een eenvoudig klassendiagram met de klassen Student en Vak en de relatie ‘volgt’.&lt;/figcaption&gt;
&lt;/figure&gt;</p>

    <details>
      <summary>PlantUML broncode</summary>

      <pre><code class="language-plantuml">&lt;img class="plantuml" src="https://www.plantuml.com/plantuml/svg/~h407374617274756d6c0a217468656d6520706c61696e0a636c6173732053747564656e74207b0a20202d6e61616d3a20537472696e670a20202d73747564656e746e756d6d65723a20696e740a20202b766f6c677456616b2876616b3a2056616b290a7d0a0a636c6173732056616b207b0a20202d6e61616d3a20537472696e670a20202d73747564696570756e74656e3a20696e740a7d0a0a53747564656e742022302e2e2a22202d2d2022312e2e2a222056616b203a20766f6c67740a40656e64756d6c"&gt;
</code></pre>

    </details>

    <p>Dit beschrijft een <code class="language-plaintext highlighter-rouge">Student</code> met attributen <code class="language-plaintext highlighter-rouge">naam</code> en <code class="language-plaintext highlighter-rouge">studentnummer</code>, en een relatie met <code class="language-plaintext highlighter-rouge">Vak</code>. Een screenreader kan deze tekst voorlezen — het visuele diagram niet. Dat is precies het punt: de broncode <em>is</em> de toegankelijke beschrijving.</p>

    <h2 id="remark-kroki-a11y-de-plugin">3. remark-kroki-a11y: de plugin</h2>

    <p>Een collega kwam met een setup voor kleine customisatie van een Docusaurus plugin, <code class="language-plaintext highlighter-rouge">remark-kroki</code>, die we gebruiken om tijdens het opleveren van een nieuwe versie van de website alle diagrammen opnieuw te genereren. De plugin genereert naast het plaatje ook de originele code.</p>

    <p>Ik maakte er een uitklapbalkje van, zodat reguliere studenten niet al deze afleidende tekst krijgen — maar de code wel kunnen gebruiken om zelf te visualiseren met een online tool, en eventueel aanpassingen te maken. Toen bedacht ik me dat je het diagram ook als natuurlijke taal zou kunnen beschrijven. En toen was het weekend voorbij.</p>

    <p>De huidige 0.3 versie zet twee diagramtypes om naar natuurlijke taal: klassendiagrammen en sequentiediagrammen (de twee meest gebruikte). Deze beschrijvingen zijn bedoeld voor screenreaders, maar zijn ook nuttig voor zienden die <em>situationeel beperkt</em> zijn — in de zin dat ze deze diagrammen nog niet goed kennen en dus zelf nog niet kunnen “oplezen”. Beginnende studenten dus.</p>

    <h3 id="situationele-beperking">3.1 Situationele beperking</h3>

    <p>Dit concept van situationele beperking is belangrijk. Toegankelijkheid wordt vaak gezien als iets voor “mensen met een beperking”, maar iedereen is wel eens situationeel beperkt. Je bent slechtziend als je zonder bril wakker wordt. Je bent slechthorend in een lawaaierige trein. En je bent “diagram-analfabeet” als je nog nooit UML hebt gezien.</p>

    <p><img src="/assets/img/posts/situational-limitations-uml.png" alt="Permanente, tijdelijke en situationele beperkingen - inclusief een student die UML nog niet kent" />
<em>Figuur 1</em>: Permanente, tijdelijke en situationele beperkingen. Bron: Chugaievska (2025).</p>

    <p>Figuur 1 is gebaseerd op het werk van Chugaievska over inclusief ontwerp, uitgebreid met een vierde voorbeeld: een student die UML nog niet kent. Door de natuurlijke-taalbeschrijving toe te voegen helpen we niet alleen blinde studenten, maar ook beginners die de diagramsyntax nog moeten leren. De beschrijving is een brug naar begrip.</p>

    <h3 id="wat-de-plugin-doet">3.2 Wat de plugin doet</h3>

    <ol>
      <li><strong>Toont de broncode</strong> — In een inklapbaar <code class="language-plaintext highlighter-rouge">&lt;details&gt;</code> element onder elk diagram</li>
      <li><strong>Genereert natuurlijke-taalbeschrijvingen</strong> — Voor ondersteunde diagramtypes</li>
      <li><strong>Biedt tabs</strong> — Gebruikers kiezen tussen broncode en beschrijving</li>
      <li><strong>Ondersteunt lokalisatie</strong> — Nederlands en Engels</li>
    </ol>

    <h3 id="wat-er-nog-kan-komen">3.3 Wat er nog kan komen</h3>

    <p>Het lectoraat Accessible Digital Tools and Engineering heeft interesse getoond om studenten te begeleiden bij verdere uitbreiding. Denk aan:</p>

    <ul>
      <li>Echte ARIA-labels met betere navigatiestructuur</li>
      <li>Meer diagramtypes: pie charts, bar charts, activity diagrams (Mermaid ondersteunt er 14)</li>
      <li>Meer talen — meer talen is ook meer toegankelijk</li>
      <li>Op termijn: de a11y-code integreren in de oorspronkelijke diagram-as-code tools, in plaats van als aparte plugin</li>
      <li>Port naar Brightspace — nu we in het onderwijs naar Brightspace overstappen, moeten we onze open source Docusaurus website verlaten. Een Brightspace-integratie zou de toegankelijke diagrammen ook daar beschikbaar maken</li>
    </ul>

    <p>Een andere richting is SVG-embedded accessibility: de beschrijvingen niet <em>naast</em> het diagram, maar <em>in</em> de SVG zelf. SVG ondersteunt <code class="language-plaintext highlighter-rouge">&lt;title&gt;</code>, <code class="language-plaintext highlighter-rouge">&lt;desc&gt;</code>, en ARIA-attributen per element. Een klasse krijgt dan <code class="language-plaintext highlighter-rouge">aria-label="Klasse Student"</code>, een relatie <code class="language-plaintext highlighter-rouge">aria-label="Student volgt Vak (0..* naar 1..*)"</code>. Met <code class="language-plaintext highlighter-rouge">aria-flowto</code> kun je zelfs navigatie tussen elementen mogelijk maken. Het idee: de diagram-renderer verrijkt de SVG met semantische informatie. Wellicht kunnen we dit project ASSET noemen: Accessible SVG Source Enhancement Tool.</p>

    <p>More Accessible Software Engineering for the world — mede dankzij de HAN.</p>

    <p>De plugin staat op npm en GitHub: <a href="https://github.com/bartvanderwal/remark-kroki-a11y">github.com/bartvanderwal/remark-kroki-a11y</a>.</p>

    <h3 id="architectuur-alternatieven-voor-jekyll">3.4 Architectuur-alternatieven voor Jekyll</h3>

    <p>De remark-kroki-a11y plugin is gebouwd voor Docusaurus (remark/unified ecosystem). Voor Jekyll zijn er drie mogelijke aanpakken:</p>

    <p><strong>Optie 1: Pre-build Script</strong> - Node.js script roept remark-kroki-a11y aan vóór Jekyll build, met A11y cache in JSON.</p>

    <p><strong>Optie 2: Shared Core</strong> - Gedeelde npm package (a11y-diagram-core) met parsing logic, gebruikt door zowel remark plugin als Ruby gem via node.</p>

    <p><strong>Optie 3: Client-side JS</strong> - Jekyll Spaceship rendert diagram als img, client-side JavaScript decodeert URL en genereert beschrijving.</p>

    <p><strong>Optie 1</strong> hergebruikt de bestaande plugin maximaal. <strong>Optie 2</strong> vereist refactoring naar een gedeelde core. <strong>Optie 3</strong> dupliceert de logic in JavaScript maar werkt direct.</p>

    <h2 id="roodkapje-als-uml-een-introductie-in-diagrammen">4. Roodkapje als UML: een introductie in diagrammen</h2>

    <p>Om de plugin te demonstreren — en tegelijk UML te introduceren — gebruiken we een onverwacht domein: het sprookje van Roodkapje.</p>

    <p><img src="/assets/img/posts/roodkapje-uml.png" alt="Roodkapje als UML klassendiagram - het sprookje gemodelleerd met klassen en relaties" />
<em>Figuur 2</em>: Roodkapje als UML klassendiagram. Een bekend verhaal vertaald naar formele diagrammen als introductie voor niet-technici.</p>

    <p>Dit voorbeeld toont hoe je een verhaal in natuurlijke taal kunt vertalen naar formele diagrammen. Het is een prima introductie voor niet-technici of beginnende technici.</p>

    <p>Roodkapje is wellicht een gimmick, maar ook een manier om analyse en ontwerp toe te passen op een bekend domein. Ervaren IT-ers classificeren op een gegeven moment technische complexiteit als ‘accidental complexity’ — die je minimaliseert — en domeincomplexiteit als ‘inherent complexity’ — die je maximaliseert door een complex domein te zoeken waar nog veel te verbeteren valt.</p>

    <p>Denk aan innovatie in de <strong>energietransitie</strong>: zelfrijdende auto’s, robotisering van arbeid, de stikstof-transitie. Of de <strong>zorg</strong>: persoonsgebonden medicijnen, lifestyle-interventies tegen welvaartsziekten. Dit zijn thema’s waar HAN ICT zich op richt — complexe domeinen waar software verschil maakt.</p>

    <h3 id="vermijd-the-one-diagram-to-rule-them-all">4.1 Vermijd “The One Diagram to rule them all”</h3>

    <p>We splitsen het Roodkapje-verhaal op in drie delen om een “God Diagram” te voorkomen. Een God diagram is een anti-pattern, net als een ‘God object’ in code. Het opsplitsen beperkt cognitive load. Om toch overzicht te bieden maak je een apart diagram voor de onderlinge verbanden — vergelijkbaar met C4 zoomniveaus.</p>

    <p>Een volledig voorbeeld heb ik in de plugin documentatie gezet als ‘gentle introduction to UML’ (met wel een stoer Roodkapje plaatje erbij voor de clickbait factor ;): <a href="https://bartvanderwal.github.io/remark-kroki-a11y/examples/roodkapje-als-uml-diagrammen">Roodkapje als UML diagrammen</a>.</p>

    <h2 id="meta-eating-our-own-dogfood">5. Meta: eating our own dogfood</h2>

    <p><img src="/assets/img/posts/roodkapje-uml-cute.png" alt="" width="400" style="float: right; margin-left: 1em;" /></p>

    <p>Dit project heeft een meta-aspect: we bouwen een toegankelijkheids-plugin voor diagrammen, en gebruiken diezelfde diagrammen om de plugin te documenteren. De documentatiesite is tegelijk testsite.</p>

    <p>Als de diagrammen niet toegankelijk zijn, faalt de plugin. Als ze wel toegankelijk zijn, bewijst de documentatie zichzelf.</p>

    <h2 id="bronnen">Bronnen</h2>

    <ul>
      <li>Chugaievska, N. (27 januari 2025). <em>Designing for Everyone: Addressing Permanent, Temporary, and Situational Limitations</em>. Medium. Geraadpleegd van https://medium.com/@natalia.chugaievska/designing-for-everyone-addressing-permanent-temporary-and-situational-limitations-c3992b0e622e</li>
      <li>Mermaid. (2024). <em>Accessibility discussion</em>. Geraadpleegd van https://github.com/mermaid-js/mermaid/issues/5632</li>
      <li>Van der Wal, B. (2026). <em>remark-kroki-a11y</em>. Geraadpleegd van https://github.com/bartvanderwal/remark-kroki-a11y</li>
      <li>W3C. (2018). <em>Web Content Accessibility Guidelines (WCAG) 2.1</em>. Geraadpleegd van https://w3.org/TR/WCAG21/</li>
    </ul>
  </figcaption>
</figure>]]></content><author><name>Bart van der Wal</name></author><summary type="html"><![CDATA[Ik heb gisteren mijn lange duurloop niet gedaan 😅. Ik zat weer veel te lang achter mijn beeldscherm 🥲. Een ideetje vanuit mijn werk liet me niet los. En programmeerwerk duurt vaak stuk langer dan je denkt. Nog even, nog even.. en zo zit je nog uren, de 80% moeite te steken in die laatste 20% werk. Want je moet toch op 100% komen. The reverse Pareto regel. Maar ik heb nu wel op NPM staan (npmjs.org): mijn 1e NodeJS in jaren open source module gepublished: remark-kroki-a11y Totaal zit ik nu op vier.]]></summary></entry><entry xml:lang="nl"><title type="html">Nieuw ICT-onderwijs door AI (2/3)</title><link href="https://bartvanderwal.nl/ict-onderwijs-aanpassen-voor-ai-2-oordeelsvorming/" rel="alternate" type="text/html" title="Nieuw ICT-onderwijs door AI (2/3)" /><published>2026-01-20T00:00:00+01:00</published><updated>2026-01-20T00:00:00+01:00</updated><id>https://bartvanderwal.nl/ict-onderwijs-aanpassen-voor-ai-2-oordeelsvorming</id><content type="html" xml:base="https://bartvanderwal.nl/ict-onderwijs-aanpassen-voor-ai-2-oordeelsvorming/"><![CDATA[<p>In dit  drieluik verken ik hoe ICT-onderwijs moet veranderen met de komst van AI. Dit tweede deel gaat over <strong>oordeelsvorming</strong>: een taxonomie van AI-gebruikstypes om te onderscheiden van wie ideeen komen, en wie de regie heeft; mens of AI?</p>

<p><strong>Drieluik structuur (BOB-model):</strong></p>

<ul>
  <li><strong><a href="/ict-onderwijs-aanpassen-voor-ai-1-bewustwording/">Blog 1/3 (Bewustwording)</a></strong>: De komst van AI en evolutie van interactiemodi (Conversational, Inline, Agentic)</li>
  <li><strong>Blog 2/3 (Oordeelsvorming)</strong>: Taxonomie van AI-gebruik: wie heeft de regie? - deze blog</li>
  <li><strong>Blog 3/3 (Besluitvorming)</strong>: AI als leermiddel, niet als butler</li>
</ul>

<p><strong>Over interactiemodi en gebruikstypes:</strong> In blog 1/3 introduceerde ik drie interactiemodi: Conversational, Inline, en Agentic. Die beschrijven de <em>technische interface</em> en workflow. Deze blog gaat over <em>gebruikstypes</em>: Human in the Lead, Human Curates, AI in the Lead, en Old Skool. Die beschrijven de <em>intentie</em> en <em>werkwijze</em>. Dit zijn dus verschillende dingen, maar er zijn wel correlaties tussen beide (zie sectie 2.1).</p>

<p>Stel je voor: ICT-student Amad zegt in een gesprek “Ik heb AI gebruikt.”</p>

<p><strong>Scenario A: Stage bij een ICT-bedrijf.</strong> De student zit tegenover zijn bedrijfsbegeleider tijdens zijn stage. Elke developer én stagiair heeft een betaald Claude-abonnement. De begeleider knikt goedkeurend: “Mooi, daarom hebben we je die toegang gegeven. Domme code uittypen hoef je niet zelf te doen.”</p>

<p><strong>Scenario B: Essay voor school.</strong> Dezelfde student zit tegenover zijn docent Professional Skills die AI heeft verboden. De docent fronst: “Dat mag niet. Je moet alles zelf schrijven.” De student had zijn AI gebruik ook kunnen verzwijgen - het is moeilijk, zo niet onmogelijk om te controleren.</p>

<p>Twee gesprekken, dezelfde woorden, tegenovergestelde reacties. <strong>Maar hier wordt het interessant.</strong> Ook de bedrijfsbegeleider wil NIET dat de stagiair klakkeloos AI output overneemt. En ook de docent zou het prima vinden als de student AI gebruikt om feedback te krijgen op zelf geschreven tekst - mits de student alles controleert en in het proces leert. De reactie hangt niet af van <em>of</em> je AI gebruikt, maar <em>hoe</em>.</p>

<p><img src="/assets/img/posts/types-van-ai-gebruik-overzicht.png" alt="De vier types AI-gebruik (met Type 4 opgesplitst in drie varianten): van menselijk idee met AI-generatie tot mens zonder AI" />
<em>Figuur 1</em>: De vier types AI-gebruik (met Type 4 opgesplitst in drie varianten): van menselijk idee met AI-generatie tot mens zonder AI</p>

<p>Een <strong>taxonomie</strong> is een systematische classificatie, waarbij je dingen kunt onderverdelen, typisch in een verdeling waarbij elk item maar in categorie hoort. In deze AI-gebruik taxonomie stel ik  onderverdeling van AI-gebruikstypes. Dit is een <strong>kwadrant</strong> met twee dimensies: wie verzint het idee mens of AI en wie is in de lead mens of AI.</p>

<p>Deze blog begint met een beschrijving van de vier hoofdtypes en hun zeven varianten, waarbij ik de kwadranten één voor één langslopen. Vervolgens laat ik zien hoe deze types in de praktijk door elkaar lopen en niet strikt gescheiden zijn. Dan introduceer ik het concept van prompt/answer asymmetry: hoe de lengte van je vraag en het antwoord omgekeerd evenredig kunnen zijn. De naamgeving van deze types komt daarna aan bod, inclusief waarom betere namen dan “Type 1, 2, 3, 4” belangrijk zijn, en hoe constraints essentieel zijn voor verantwoord AI-gebruik. Tot slot bespreek ik de exploratieve modus: wanneer experts tijdelijk als beginners leren. Ik sluit af met een conclusie over Guitar Hero en leren, en een discussie over transparantie.</p>

<h2 id="1-de-vier-ai-gebruikstypes">1. De vier AI-gebruikstypes</h2>

<p>We lopen de vier kwadranten langs, met twee assen: wie heeft het idee, en wie heeft de lead? Bij het vierde kwadrant blijkt onderverdeling nuttig.</p>

<h3 id="11-type-1-human-in-the-lead">1.1 Type 1: Human in the Lead</h3>

<p>De mens heeft het idee en formuleert dit in een gedetailleerde eerste prompt — een soort specificatie van een probleem of eigen idee. De AI genereert op basis daarvan. De cyclus gaat verder met menselijke input en sturing.</p>

<p>Dit is hoe ik deze blog schrijf. Ik heb een onderwerp, een standpunt, specifieke voorbeelden die ik wil gebruiken. De AI helpt formuleren, structureren, bronnen checken. Maar de richting komt van mij.</p>

<p>Het principe: één prompt is geen prompt. Je itereert, stuurt bij, verwerpt suggesties, vraagt om alternatieven. De AI is een tool, geen auteur.</p>

<p>Je zou kunnen stellen dat een vraag om ideeën (Type 2) zelf ook een idee is. Maar het verschil zit in de mate van detail. Bij Type 1 bevat de eerste prompt al veel context en richting.</p>

<h3 id="12-type-2-human-curates">1.2 Type 2: Human Curates</h3>

<p>De mens vraagt de AI om ideeën te genereren — een korte, open vraag. De mens maakt vervolgens een serieuze keuze welke richting te volgen. Verdere stappen kunnen weer met AI, maar met bewuste menselijke input.</p>

<p>Voorbeeld: “Geef me vijf mogelijke invalshoeken voor een blog over remote werken.” De mens kiest er één, en werkt die uit — mogelijk weer met AI-hulp, maar met eigen toevoegingen en richtinggevoel.</p>

<p>Het verschil met Type 1: de eerste prompt is kort en open, niet gedetailleerd en richtinggevend. Het verschil met Type 3: de mens doet meer dan alleen “ja” zeggen.</p>

<h3 id="13-type-3-ai-in-the-lead">1.3 Type 3: AI in the Lead</h3>

<p>De mens vraagt AI om ideeën én om deze zelf uit te werken. Zonder serieuze tussenkomst: deze accepteert de voorgestelde voorkeurskeuze, of geeft door AI voorgelegde opties weer aan de AI terug (“wat zou jij doen?” of “kijk maar”).</p>

<p><img src="/assets/img/posts/no-code-vs-real-coding.png" alt="&quot;Create apps without knowing how to code&quot; klinkt verleidelijk, maar levert geen begrip op" />
<em>Figuur 2</em>: “Create apps without knowing how to code” klinkt verleidelijk, maar levert geen begrip op</p>

<p>Dit is de valkuil van “vibe coding” zonder ervaring: de AI genereert, de mens klikt op “accept”, en niemand weet meer precies wat er in de code staat of waarom.</p>

<p>Het resultaat kan technisch werken, maar de mens heeft geen grip op wat er is gemaakt of hoe het te onderhouden.</p>

<h3 id="14-type-4-mens-zonder-ai">1.4 Type 4: Mens zonder AI</h3>

<p>Dan het vierde type. Je zou kunnen stellen dat dit geen AI-type is, omdat we bij het langsgaan van de kwadranten nu logisch uitkomen bij ‘mens doet alles’. Maar ik doe het tegenovergestelde; ik splits deze op in drie subtypes.</p>

<h3 id="15-4a-old-skool">1.5 4a. Old Skool</h3>

<p>Pure menselijke arbeid, zoals we het decennialang hebben gedaan. Geen AI-tool geopend, geen assistentie gevraagd. De klassieke manier van werken.</p>

<p>Dit is geen nostalgische terugblik. Voor veel taken blijft dit de snelste en beste aanpak. Een goede developer typt soms gewoon code, zonder eerst een AI te raadplegen. Een schrijver schrijft, een ontwerper ontwerpt. Soms zegt Claude code of andere tool ook: ‘Je tokens zijn op., je kunt na 3 PM vanmiddag weer verder’. Of ze zijn zelfs op voor de maand; maar je bedenkt je dat je die wijziging ook prima zelf kunt doen.</p>

<h3 id="16-4b-rubber-duck-ai-ai-als-klankbord">1.6 4b. Rubber Duck AI: AI als klankbord</h3>

<p>Je legt je probleem uit aan een collega, en tijdens het uitleggen bedenk je zelf de oplossing. Je had net zo goed tegen een badeend kunnen gaan praten.</p>

<p>De naam refereert aan rubber duck debugging: “a method of debugging code by articulating its problems in speech, commonly to an inanimate object such as a rubber duck” (Wikipedia, 2024).</p>

<p>Met AI werkt dit ook. Je begint een vraag te typen, en tijdens het formuleren realiseer je je het antwoord al. Of zelfs: je leest het AI-antwoord, beseft dat het nergens op slaat, en gaat je eigen weg — maar de noodzaak om je gedachtenproces uit te typen, of te formuleren heeft je geholpen.</p>

<p>Het interessante: de AI heeft geen inhoudelijke bijdrage geleverd. Het enige dat de AI deed was er zijn, als gesprekspartner. De motivatie komt van het gesprek zelf, niet van de output. Je zou kunnen zeggen dat je de AI antropomorfiseert — je behandelt het als gesprekspartner, terwijl het geen persoon is.</p>

<h3 id="17-4c-learned-from-ai-geleerde-kennis-toepassen">1.7 4c. Learned from AI: Geleerde kennis toepassen</h3>

<p>Je hebt in het verleden AI gebruikt om iets te leren. Nu pas je die kennis toe — zonder AI te raadplegen. ‘AI as teacher’.</p>

<p>Voorbeeld: je hebt Claude gevraagd hoe een specifiek designpatroon werkt. Je las de uitleg, begreep het, en schreef het zelf over. Later gebruik je dat patroon opnieuw, uit je hoofd, zonder terug te gaan naar de AI.</p>

<p>Dit is relevant voor digitale examens. Als een student iets heeft geleerd met behulp van AI, en het vervolgens zelfstandig kan toepassen op het examen (zonder AI-toegang), dan is dat legitiem gebruik. Het onderscheid met spieken: de kennis zit in je hoofd, niet in de tool.</p>

<p>Natuurlijk kun je niet bewijzen dat iemand iets via AI heeft geleerd versus via een leerboek. Maar dat maakt ook niet uit — het punt is dat de kennis is overgedragen en begrepen.</p>

<p><img src="/assets/img/posts/ai-usage-types-quadrant.png" alt="De vier AI-gebruikstypes in een kwadrant" />
<em>Figuur 3</em>: De vier AI-gebruikstypes in een kwadrant</p>

<h2 id="2-in-de-praktijk-lopen-types-door-elkaar">2. In de praktijk lopen types door elkaar</h2>

<p>In de praktijk gebruik je deze types door elkaar. Een sessie kan beginnen als Type 1, tijdelijk naar Type 2 gaan voor brainstormen, en eindigen in Type 4b (Rubber Duck AI) wanneer het AI-gesprek je doet realiseren dat je een bepaald stuk anders wilt aanpakken, en de AI bv. vast zit in een bepaald spoor. If zelfs Type 4a (Old Skool) wanneer je besluit een bepaald stuk helemaal zonder AI te doen.</p>

<p>Het punt is niet om strikt in één type te blijven. Het punt is om <em>bewust</em> te zijn van welk type je gebruikt en of dat past bij wat je wilt bereiken.</p>

<h3 id="21-correlatie-met-interactiemodi-uit-blog-13">2.1 Correlatie met interactiemodi uit blog 1/3</h3>

<p>De gebruikstypes in deze blog correleren met de interactiemodi (Conversational, Inline, Agentic) uit <a href="/ict-onderwijs-aanpassen-voor-ai-1-bewustwording/">blog 1/3</a>:</p>

<ul>
  <li><strong>Human in the Lead</strong> werkt met <em>alle drie</em> de interactiemodi, maar vereist altijd constraints — ongeacht de modus</li>
  <li><strong>Human Curates</strong> gebruikt vaak <strong>Conversational AI</strong> om opties te brainstormen</li>
  <li><strong>AI in the Lead (Vibe Coding)</strong> — het risico is het grootst bij <strong>Agentic AI</strong>: volledige context + schrijfrechten + minimale inspanning = maximaal gevaar om controle te verliezen</li>
  <li><strong>Old Skool</strong> gebruikt <em>geen</em> van de drie interactiemodi</li>
</ul>

<p>Het verschil: interactiemodi beschrijven de technische interface, gebruikstypes beschrijven de <em>intentie</em> en <em>werkwijze</em>. Maar hoe meer context en schrijfrechten de AI heeft, en hoe minder bewuste inspanning de mens levert, hoe groter het risico om onbewust in “AI in the Lead” te belanden.</p>

<h2 id="3-promptanswer-length-asymmetry">3. Prompt/answer length asymmetry</h2>

<p>Een interessant patroon dat hieruit volgt: de lengte van je prompt en de lengte van het antwoord zijn vaak omgekeerd evenredig.</p>

<p>Een korte, open prompt (“Schrijf iets over AI”) geeft de LLM weinig constraints. Het antwoord wordt lang en breed — de AI vult de ruimte die je laat.
Een lange, gedetailleerde prompt (“Schrijf een paragraaf over de ethische implicaties van gezichtsherkenning in openbare ruimtes, focus op de Nederlandse context, in actieve schrijfstijl. Noem twee concrete voorbeelden.”) geeft veel constraints. Het antwoord wordt specifieker en meer gefocust — de AI weet beter wat je wilt en vult minder zelf in.</p>

<p>Dit <em>AI prompt/answer length asymmetry</em> principe verklaart deels het verschil tussen Type 1 en Type 2. Bij Type 1 schrijf je lange, gedetailleerde prompts en krijg je gerichte antwoorden. Bij Type 2 schrijf je korte vragen en krijg je uitgebreide optielijsten.</p>

<p>Geen van beide is beter. Het hangt af van wat je nodig hebt: exploratie of executie.</p>

<p><img src="/assets/img/posts/prompt-answer-length-asymmetry.png" alt="Prompt/answer length asymmetry" />
<em>Figuur 4</em>: Prompt/answer length asymmetry</p>

<p><em>Disclaimer</em>: Deze asymmetry die Figuur 2 tracht te schetsen is voorlopig nog even een <em>hypothese</em>, maar ik heb dit nog niet met praktisch onderzoek laten zien, of aangetoond buiten n=1. Sowieso is de ‘short question, broader answer’ en ‘long question, more specific answer’ relatie makkelijker hard te maken is, omdat het min of meer per definitie al geldt (gegeven een LLM die goed of in ieder geval geloofwaardig antwoord probeert te geven; wat ze doen). Voor het ‘long question, short answer’, ‘short question, long answer’ relatie heb ik nog onvoldoende tijd genomen dit ook proefonderlijk aan te tonen.</p>

<h2 id="4-betere-namen-dan-type-1-2-3-4">4. Betere namen dan “Type 1, 2, 3, 4”</h2>

<p>Phil Karlton’s beroemde uitspraak luidt: “There are only two hard things in Computer Science: cache invalidation and naming things.” Goede naamgeving is moeilijk, maar wel belangrijk!</p>

<p>De volgende vier subsecties (4.1-4.4) behandelen hoe deze naamgeving tot stand kwam, wat “in the Lead” betekent voor eindverantwoordelijkheid, de spanning tussen upskilling en deskilling, en hoe constraints als vangnet werken.</p>

<p>Daniel Kahneman introduceerde in <em>Thinking, Fast and Slow</em> de termen “System 1” en “System 2” voor twee vormen van menselijk denken (Kahneman, 2011). Dit is een indrukwekkend stukje theorie en achtergrond, maar zijn namen zijn om te huilen! Enkel op de kracht van de theorie zijn deze — van zichzelf nietszeggende nummers — gemeengoed geworden, en weten velen wat <em>type 1</em> en <em>type 2</em> thinking is.</p>

<p>In de naamgeving Type X, type Y is wellicht een voordeel dat je laat zien dat het echt verschillende types zijn, en bv. niet een schaal van langzaam naar snel denken.</p>

<p><img src="/assets/img/posts/5-tomatoes-imperial-vs-metric.png" alt="&quot;5 tomatoes&quot; (five-two-eight-oh) om 5280 feet in a mile te onthouden vs. 1 km = 1000 m" />
<em>Figuur 5</em>: “5 tomatoes” (five-two-eight-oh) om 5280 feet in a mile te onthouden vs. 1 km = 1000 m</p>

<p>Maar zulke getallen noemen we in software code ‘magic numbers’. En het onthouden van mapping (1=traag, onbewust en 2=snel, bewust) schaar ik zelf onder het kopje ‘accidental complexity’. Andere voorbeelden hiervan is het onhandige ‘Imperial system’ dat Engeland en de VS hanteren (met willekeurige eenheden), of numerieke systemen zonder duidelijke mnemonic (denk aan de meme “5 tomatoes” om 5280 feet in a mile te onthouden (Reddit, 2022) ).</p>

<p>Termen zonder intrinsieke betekenis zoals “System 1” of “Type X” — terwijl “Fast Thinking” en “Slow Thinking” — of beter nog “Intuitive” en “Deliberate” — zoveel begrijpelijker waren geweest. De ondertitel van Kahneman’s boek was letterlijk beschrijvender dan de termen zelf. Barbara Minto hamert in <em>The Pyramid Principle</em> op top-down helderheid: begin met de kern en gebruik namen die meteen duidelijk maken wat je bedoelt (Minto, 1987).</p>

<p>Roland Barthes introduceerde het concept “death of the author”: de betekenis van een tekst moet niet afhangen van kennis over de auteur of diens intenties (Barthes, 1967). Toegepast op naamgeving: een goede term moet zichzelf uitleggen. Je zou niet de originele bron moeten raadplegen om te begrijpen wat “System 1” betekent.</p>

<p>Met dat in gedachten: mijn namen voor de vier types.</p>

<table>
  <thead>
    <tr>
      <th>Type</th>
      <th>Naam</th>
      <th>Wie stuurt?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Human in the Lead</td>
      <td>Mens bepaalt richting én heeft eindregie</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Human Curates</td>
      <td>Mens selecteert uit AI-opties</td>
    </tr>
    <tr>
      <td>3</td>
      <td>AI in the Lead</td>
      <td>AI bepaalt, mens accepteert</td>
    </tr>
    <tr>
      <td>4a</td>
      <td>Old Skool</td>
      <td>Mens alleen, geen AI</td>
    </tr>
    <tr>
      <td>4b</td>
      <td>Rubber Duck AI</td>
      <td>AI als denkpartner, geen inhoudelijke input</td>
    </tr>
    <tr>
      <td>4c</td>
      <td>Learned from AI</td>
      <td>Mens past eerder geleerde AI-kennis zelfstandig toe</td>
    </tr>
  </tbody>
</table>

<h3 id="41-meta-hoe-deze-naamgeving-tot-stand-kwam">4.1 Meta: hoe deze naamgeving tot stand kwam</h3>

<p>Deze blog is zelf een voorbeeld van Type 1 (Human in the Lead). Ik had initiële namen bedacht, en wilde de AI vragen of hij betere namen wist. Dit is echter een beetje een open vraag, en bovendien merk ik ook regelmatig dat de AI dan richtingen in gaat die ik echt niet wil. En dan ben je vaak langer bezig om alles te lezen, door te prompten of moet je alsnog alles schrijven (deze zin ben ik nu bijvoorbeeld ook zelf aan het schrijven, meest overige stukken schreef Claude op basis van mijn ideeen/prompts, maar de inleiding moet nog herschreven, want daar wil Claude het maar niet doen zoals ik een beetje in mijn hoofd heb.</p>

<p>In ieder geval gaf ik Claude nu dan de vraag om de huidige namen te beoordelen op basis van onderstaande vijf criteria, en om op basis van die feedback zelf met betere namen voor te stellen:</p>

<blockquote>
  <p>A. Begrijpelijkheid; ook volgens het ‘death of the author principe’
B. Interne consistentie van de namen
C. Uniekheid, is de term ‘googlebaar’
D. Goed onthoudbaar door mensen, kort genoeg maar ook interessant”</p>
</blockquote>

<p>waarbij criterium B (interne consistentie van de namen) onderdeel van ‘conceptual integrity’, een van de belangrijkste quality attributes van een code base volgens Frederick Brooks in het klassieke boek ‘The Mythical Man-Month’ (Brooks, 1975).</p>

<p>Claude stelde alternatieve namen voor:</p>

<table>
  <thead>
    <tr>
      <th>Type</th>
      <th>Mijn naam</th>
      <th>Alternatieve naam (AI)</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Human in the Lead</td>
      <td>Human Leads</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Human Curates</td>
      <td>—</td>
    </tr>
    <tr>
      <td>3</td>
      <td>AI in the Lead</td>
      <td>AI Slop</td>
    </tr>
    <tr>
      <td>4a</td>
      <td>Old Skool</td>
      <td>Human Solo</td>
    </tr>
    <tr>
      <td>4b</td>
      <td>Rubber Duck AI</td>
      <td>—</td>
    </tr>
    <tr>
      <td>4c</td>
      <td>Learned from AI</td>
      <td>—</td>
    </tr>
  </tbody>
</table>

<p>Maar deze auteur is nog niet <em>dead</em> — ik hanteer gewoon mijn initiële namen. De AI mag suggereren, ik beslis.</p>

<p>“AI Slop” voor Type 3 is wel een treffende informele naam, refererend aan het <a href="/ai-coding-sucks/">woord van het jaar 2025</a>: “slop” — AI-gegenereerde content zonder menselijke kwaliteitscontrole.</p>

<p>Naast de bovenstaande namen zijn er ook alternatieve benamingen die de werkwijze beschrijven:</p>

<table>
  <thead>
    <tr>
      <th>Type</th>
      <th>Naam</th>
      <th>Development-stijl naam</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Human in the Lead</td>
      <td>Spec-Driven Development</td>
    </tr>
    <tr>
      <td>2</td>
      <td>Human Curates</td>
      <td>Option-Driven Development</td>
    </tr>
    <tr>
      <td>3</td>
      <td>AI in the Lead</td>
      <td>Vibe Coding</td>
    </tr>
    <tr>
      <td>4a</td>
      <td>Old Skool</td>
      <td>Traditional Development</td>
    </tr>
    <tr>
      <td>4b</td>
      <td>Rubber Duck AI</td>
      <td>Conversational Development</td>
    </tr>
    <tr>
      <td>4c</td>
      <td>Learned from AI</td>
      <td>Knowledge-Transfer Development</td>
    </tr>
  </tbody>
</table>

<p><strong>Spec-Driven Development</strong> voor Type 1 verwijst naar het geven van een gedetailleerde specificatie (de prompt) waaruit de AI moet genereren. Net zoals bij traditionele spec-driven development begin je met een duidelijk document dat beschrijft wat er moet gebeuren.</p>

<p>Deze term komt uit het artikel <a href="https://martinfowler.com/articles/exploring-gen-ai/sdd-3-tools.html"><em>Specification-Driven Development with GenAI Tools</em></a> op Martin Fowler’s website (Harrer &amp; Ford, 2024). Interessant genoeg is dit artikel uit oktober 2024 — midden in de AI-hype — en benadrukt het het belang van specificaties schrijven voordat je code genereert.</p>

<p>Dit idee krijgt inmiddels concrete tooling. <a href="https://kiro.dev/">Kiro</a> (2025) is een “agentic IDE” die spec-driven development als kernprincipe hanteert. In plaats van direct te coderen op basis van vage prompts, genereert Kiro eerst gestructureerde requirements (in EARS-notatie), dan architectuurvoorstellen, en pas daarna implementatietaken — elk gekoppeld aan specifieke requirements. Het is het tegenovergestelde van vibe coding: expliciete documentatie vóór code.</p>

<p>Dit roept een interessante spanning op: Spec-Driven Development lijkt terug te gaan naar meer upfront design, terwijl de agile beweging decennialang heeft benadrukt dat Big Design Up Front (BDUF) problematisch is. Simon Brown’s presentatie <a href="https://static.simonbrown.je/the-lost-art-of-software-design.pdf"><em>The Lost Art of Software Design</em></a> (2022) legt de nuance uit: het probleem was nooit design zelf, maar <em>te veel</em> design van tevoren. Zijn mantra: <strong>“Just Enough Up-Front Design”</strong> — genoeg om richting te geven, niet zoveel dat je flexibiliteit verliest.</p>

<p>Met AI wordt deze balans anders. Een goede prompt vereist design-denken: wat wil je precies? Welke constraints? Welke edge cases? Dit is upfront design, maar in een andere vorm — je ontwerpt de specificatie, niet meteen de implementatie.</p>

<p><strong>Vibe Coding</strong> voor Type 3 is de tegenpool: geen echte specificatie, geen controle, gewoon accepteren wat de AI genereert op basis van een vaag gevoel (“the vibe”). Dit is wat er gebeurt wanneer mensen zonder ervaring AI laten coderen en alles blind overnemen.</p>

<p>Door zelf de criteria op te geven, blijf je in Human in the Lead modus — ook al vraag je om feedback op ideeën. Het verschil met Human Curates: je geeft het kader waarbinnen de AI moet denken. Je vraagt niet “welke namen zou jij kiezen?” maar “evalueer deze namen tegen deze criteria.”</p>

<p>Dit is hoe je wegblijft bij AI in the Lead: door constraints te geven, zelfs als je de AI om input vraagt.</p>

<h3 id="42-in-the-lead-betekent-ook-eindregie">4.2 “In the Lead” betekent ook eindregie</h3>

<p>Bij Type 1 (Human in the Lead) is de mens niet alleen de <em>initiator</em> — degene die begint met een duidelijk idee — maar ook de <em>eindregisseur</em>. De mens heeft vetorecht op alles wat de AI produceert. En dus ook de <em>plicht</em> om alle output te beoordelen.</p>

<p>Hier zit de crux van werken met AI. LLMs zijn ontzettend productief. Ze genereren in seconden wat een mens uren zou kosten. Maar die snelheid verschuift het werk: in plaats van zelf schrijven, ben je voortdurend aan het checken. De asymmetrie die ik eerder beschreef werkt hier ook: hoe meer constraints je meegeeft, hoe gerichter de output, hoe minder je hoeft te controleren.</p>

<p>Dit leidt tot een belangrijke vraag: hoe maak je het controleren beheersbaar?</p>

<h3 id="43-upskilling-reskilling-en-het-risico-op-deskilling">4.3 Upskilling, reskilling en het risico op deskilling</h3>

<p>Google hanteert voor AI-onderwijs drie begrippen: <strong>upskilling</strong> (skill-complementarity), <strong>reskilling</strong> (nieuwe rolvaardigheden aanleren) en het spiegelbeeld <strong>deskilling/downskilling</strong> (skill-substitution, verlies door afhankelijkheid) (Yang, 2026). Voor studenten betekent dit:</p>

<ul>
  <li>Upskilling: AI inzetten om concepten sneller te doorgronden, maar nog steeds zelf oefenen en toetsen zonder AI.</li>
  <li>Reskilling: AI gebruiken om nieuwe domeinen te verkennen (bijv. data-analyse), daarna zonder AI kunnen reproduceren.</li>
  <li>Deskilling vermijden: beginners mogen AI niet de basis laten overnemen; eerst fundamentals, daarna pas AI als versneller.</li>
</ul>

<p>Yang (2026) koppelt dit aan <strong>Substitutive Use</strong> (voluit) versus <strong>Augmentative Use</strong> van GenAI. Substitutive Use – wat ik “AI als butler” noem – ondermijnt motivatie om nieuwe skills te leren: de tool doet het zware werk en studenten slaan cognitieve stappen over (Guo, 2024) en tonen minder exploratie (Leon, 2023). Augmentative Use – “AI als leermiddel/leraar” – vraagt juist actieve verificatie en blijft binnen reskilling/upskilling.</p>

<p>Kortom: voor studenten/beginners is de volgorde cruciaal. Eerst zelf leren, dan pas AI gebruiken om te versnellen, zodat we upskilling en reskilling stimuleren zonder in deskilling te vervallen.</p>

<h3 id="44-constraints-als-vangnet-in-de-ict">4.4 Constraints als vangnet in de ICT</h3>

<p>In software development hebben we technieken ontwikkeld om code controleerbaar te houden — lang voordat AI code ging genereren. Deze “Old Skool” technieken worden nu onmisbaar als vangnet voor door AI gegenereerde of te genereren code:</p>

<p><strong>a) Gecompileerde talen gebruiken.</strong> Een compiler vangt fouten af voordat de code draait. TypeScript in plaats van JavaScript, C# in plaats van Python voor kritieke systemen.</p>

<p><strong>b) Specifieke types maken.</strong> Object-georiënteerde (OO) of getypeerde functionele talen kun je je eigen datatypes maken (of eigenlijk meer: samenstellen uit de basistypes). Gegevenstypes om je domein te modelleren, data format voor communicatie. Bij OO koppel (idealiter) je aan dataformat zelfs direct methoden (aanroepbare functies) die dan de enige zijn deze data mogen aanpassen (encapsulatie). Hoe specifieker je types (en hoe meer encapsulatie), hoe minder ruimte voor fouten.</p>

<p><strong>c) Unit tests als vangnet.</strong> Mark Seemann beschrijft in zijn blog dat unit tests zelf een cyclomatische complexiteit van 1 moeten hebben (Seemann, 2019). Simpele tests voor complexe code. Als de AI code genereert die de tests breekt, weet je dat er iets mis is — zonder elke regel te hoeven lezen.</p>

<p><strong>d) Linters voor conventies.</strong> Automatische controle op codeerstijl en patronen. Een linter is een “Old Skool” vorm van AI: deterministisch, voorspelbaar, en onvermoeibaar (tokens raken niet op ;).</p>

<p><strong>e) En vast nog veel meer.</strong> Code reviews, static analysis, integration tests, contract testing, logging frameworks, gradual typing… Dit is geen uitputtende lijst — er is geen kwadrant of checklist die compleetheid garandeert. Het algemene punt is: hoe meer constraints je hebt, hoe minder je handmatig hoeft te controleren.</p>

<p>Opmerking over het patroon “(e) En vast nog veel meer”: dit is een bewuste retorische truc, niet onwillekeurige incompleteness. Net zoals je in code altijd een <code class="language-plaintext highlighter-rouge">else</code> clause toevoegt (niet nóg een <code class="language-plaintext highlighter-rouge">else if</code>), of een <code class="language-plaintext highlighter-rouge">default</code> optie hebt bij een <code class="language-plaintext highlighter-rouge">switch</code> statement diee veel code linters afdwingen.</p>

<h3 id="45-oo-encapsulatie-versus-functionele-immutability">4.5 OO encapsulatie versus functionele immutability</h3>

<p>Eén klassieke tegenstelling verdient aparte aandacht: Bij punt b) Object-Oriented data types komt <em>encapsulatie</em>, maar bij e) hadden we <em>immutable data</em> in functionele talen. kunnen noemen <em>Immutable data</em> — gegevens die je eenmaal aanmaakt maar niet wijzigt — is het functionele antwoord op “hoe maak je code controleerbaar?”</p>

<p>Michael Feathers (een van de grondleggers van <a href="https://agilealliance.org/glossary/xp/">Agile/XP</a>) vat dit kernachtig samen in Figuur 3: OO zegt “maak je data lokaal/privaat, pas het aan via methoden” (encapsulatie = controle over wijzigingen). Functioneel programmeren zegt “maak je data onveranderbaar, dus geen wijzigingen mogelijk” (immutability).</p>

<p>Beide strategieën dienen hetzelfde doel: <strong>minimizing moving parts</strong> — minder plekken waar fouten kunnen ontstaan. OO doet het door wijzigingen centraal te maken; FP door ze uit te sluiten.</p>

<p><img src="/assets/img/posts/feathers-oo-vs-fp.png" alt="OO en FP geven andere manieren om code begrijpelijk te maken (Feathers, z.d.)." />
<em>Figuur 3</em>: OO en FP geven andere manieren om code begrijpelijk te maken (Feathers, z.d.).</p>

<p>Voor AI-gegenereerde code is dit cruciaal: hoe meer je de ruimte voor “moving parts” inperkt, hoe gerichtere output je van de AI kunt verwachten, en hoe minder handmatig reviewwerk je hebt.</p>

<p>De paradox: deze “Old Skool” technieken — types, encapsulatie, immutability, tests — worden juist waardevoller in het AI-tijdperk. Ze vormen het vangnet dat het mogelijk maakt om AI-productiviteit te benutten zonder de controle te verliezen.</p>

<h2 id="5-exploratieve-modus-wanneer-experts-als-beginners-leren">5. Exploratieve modus: Wanneer experts als beginners leren</h2>

<p>Tot nu toe behandelden we de types alsof ze vaste rollen zijn: Type 1 is “je rol in dit project”, Type 3 is “voorkomen op alle kosten”. Maar dit is onvolledig. Experts kunnen tijdelijk in een exploratieve modus treden — en moeten dat ook — zonder dat dit roekeloos “Vibe coding” is.</p>

<p>Subsecties 5.1-5.4 onderscheiden explore van exploit, beschrijven neo-Piagetiaans cyclisch leren, zien hoe experts AI leren, en geven praktische signalen voor verantwoord experimenteren.</p>

<p>In <a href="/ict-onderwijs-aanpassen-voor-ai-1-bewustwording/#43-agentic-ai-claude-code-stijl">blog 1, sectie 4.3</a> beschreef ik hoe een collega-programmeur bij agentic AI op een gegeven moment “maar toestond dat de LLM vrij grote wijzigingen doorvoerde, omdat hij de vele changes ook niet meer kon overzien.” Dit is geen roekeloos gedrag — het is een moment waarop hij van expert temporair naar beginner-modus ging. Programmeren ewas bekend, en ook het domein waarin de code werkt; maar de tool: agentic AI was nieuw terrein.</p>

<p>In plaats van beginner-modus kan ik wellicht beter dit exploratie-modus noemen.</p>

<h3 id="51-explore-versus-exploit">5.1 Explore versus Exploit</h3>

<p>In gedrag en leren onderscheiden we twee complementaire strategieën:</p>

<ul>
  <li><strong>Exploit</strong>: Maak gebruik van wat je al weet. Je hebt expertise in een domein, en je zet die expertise in om doelen te bereiken.</li>
  <li><strong>Explore</strong>: Onderzoek onbekend terrein. Je weet nog niet wat mogelijk is, dus je experimenteert.</li>
</ul>

<p>Dit zijn geen twee aparte modi — je hebt altijd een bepaalde combinatie van beide. Je bent nooit zuiver exploit (dat zou stagnatie betekenen) of zuiver explore (dat zou inefficiëntie betekenen). In plaats daarvan: je balanceert tussen beide afhankelijk van de context. Onderzoeker Alex Hutchinson beschrijft in zijn populair wetenschappelijk boek <em>The Explorer’s Gene</em> hoe deze wisselwerking tussen verkenning en uitbating fundamenteel is voor leren en aanpassingsvermogen (Hutchinson, 2021).</p>

<p>Voor AI geldt hetzelfde. Als je een nieuw AI-model of interactiemodus leert kennen, ben je tijdelijk in exploratieve modus — zelfs als je in andere gebieden een expert bent. Je verschuift je balans.</p>

<h3 id="52-neo-piagetiaans-cyclisch-leren">5.2 Neo-Piagetiaans cyclisch leren</h3>

<p>Jean Piaget beschreef hoe kinderen leren: ze gaan door stadia van sensimotor, preoperationeel, concreet-operationeel naar formeel-operationeel denken. Dit werd lange tijd gezien als lineair: stadia volgen elkaar op, je gaat niet terug.</p>

<p>Moderne onderwijstheorie (neo-Piagetiaans) nuanceert dit: je gaat niet lineair vooruit, maar cyclisch. Afhankelijk van de context pak je activiteiten uit verschillende stadia. Een expert in wiskunde die voor het eerst programmeren leert, gaat door soortgelijke cognitieve stadia — maar veel sneller (Chi, 2009).</p>

<p>Analogie naar software development: sprint-gebaseerde Agile lijkt op dit cyclische model. Je volgt niet watervalbouwstijl (plan → design → code → test → deploy, klaar). In plaats daarvan cykel je: kleine increment, test, feedback, verbeter, volgende increment. Deze cyclus herhaalt zich, en je bent constant aan het evalueren, herstellen, en bijsturen — niet alleen in uitvoering (exploit) maar ook in verkenning van wat mogelijk is (explore).</p>

<p>Dezelfde cyclus geldt voor leren en skill-development: je bent niet lineair “van beginner naar expert” — je bent cyclisch aan het verkennen en uitbaten binnen steeds grotere domeinen.</p>

<h3 id="53-experts-in-exploratieve-modus-bij-ai">5.3 Experts in exploratieve modus bij AI</h3>

<p>Dit is waar het relevant wordt voor AI-gebruik: <strong>een expert in X kan en moet in exploratieve modus gaan voor Y</strong> — vooral als Y (zoals AI) snel evolueert.</p>

<p>Een ervaren software engineer heeft decennia skill in “uitbaten” (exploit) — code schrijven, architecturen ontwerpen, teams leiden. Maar als die engineer met Claude Code of Cursor werkt, is hij/zij plotseling weer in exploratieve modus: “Wat kan dit model? Waar zijn zijn grenzen? Hoe verandert dit mijn workflow?”</p>

<p>Dit is <strong>niet hetzelfde als roekeloos “Vibe coding”</strong>. Het verschil zit in de <em>intentie en horizon</em>:</p>

<ul>
  <li>
    <p><strong>Exploratieve modus (positief)</strong>: “Ik wil deze tool snappen, dus ik experimenteer gestructureerd. Ik let op wat werkt, wat niet, en waar mijn expertise tekortschiet. Dit is voor skill-building en tool-understanding.”</p>
  </li>
  <li>
    <p><strong>AI in the Lead / Vibe Coding (risico)</strong>: “Ik laat de AI het werk doen zodat ik sneller klaar ben. Ik check niet veel, ik vertrouw de output.” Dit verschuift van exploration (leren) naar pure exploit (produceren) zonder verificatie.</p>
  </li>
</ul>

<p>Het eerste leidt tot upskilling en reskilling. Het tweede leidt tot deskilling.</p>

<p><strong>Belangrijk contrast: Beginners versus Experts.</strong></p>

<p>Dit onderscheid is cruciaal voor studenten. Een ervaren developer kan in één week agentic AI leren, zoals beschreven in mijn blog <a href="/ai-coding-sucks/">AI Coding Sucks</a>. Maar een beginnende programmeur moet eerst maanden — zo niet jaren — aan Software Engineering fundamentals besteden. Data structures, algoritmen, design patterns, architectuur, debugging mindset. Dit zijn de mentale modellen waarmee je AI-output kunt beoordelen.</p>

<p>Daarom is de hype “spring direct op de AI-bandwagon” gevaarlijk voor beginners. Dat is pure marketing talk. Ja, AI is snel. Ja, je kunt ermee shortcuts nemen. Maar voor iemand die nog geen basis heeft, zijn shortcuts een weg naar deskilling en onbegrip. Een expert kan de exploratieve modus ingaan omdat hij/zij al een stevig fundament heeft om op terug te vallen.</p>

<p>Voor beginners geldt: exploratieve modus met AI-tools pas <em>nadat</em> je de fundamentals hebt geleerd. Niet ervoor.</p>

<h3 id="54-praktisch-hoe-erkent-je-exploratieve-modus-versus-roekeloos">5.4 Praktisch: Hoe erkent je exploratieve modus versus roekeloos?</h3>

<p>Enkele signalen:</p>

<table>
  <thead>
    <tr>
      <th>Exploratieve Modus</th>
      <th>Roekeloos/Vibe Coding</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Je stelt vragen: "Waarom gaf de AI dit antwoord?"</td>
      <td>Je accepteert output zonder vraag</td>
    </tr>
    <tr>
      <td>Je test de AI’s output actief tegen je mentale model</td>
      <td>Je vertrouwt blind op snelheid</td>
    </tr>
    <tr>
      <td>Je leert waar grenzen liggen, je bouwt mentale modellen</td>
      <td>Je bouwt geen modellen op, je slooft je uit voor output</td>
    </tr>
    <tr>
      <td>Tijdelijk (exploratie eindigt zodra je het tool snapt)</td>
      <td>Persistent (roekeloos blijven is niet leren)</td>
    </tr>
    <tr>
      <td>Voor *skill-development*, niet voor korte-termijn output</td>
      <td>Voor korte-termijn output, ten koste van begrip</td>
    </tr>
  </tbody>
</table>

<p>Wichtig: exploratieve modus is niet geschikt voor productiecode of kritieke projecten. Daar heb je exploit nodig: jij en je team kennen de tool, begrijpen de grenzen, en gebruiken het met constraints (zie sectie 4.3).</p>

<p>Maar voor onderwijs (vooral leren) is exploratieve modus essentieel. Studenten <em>moeten</em> tijd krijgen om AI-tools te verkennen, hun grenzen te ontdekken, en te leren waar hun eigen expertise nog nodig is. Dit is onderdeel van het cyclische leren dat neo-Piagetiaanse theorie beschrijft.</p>

<p>Dus ja: je kunt “Type 3-achtig” werken (veel vertrouwen op AI) zonder roekeloos te zijn, zolang je <em>doelbewust aan het verkennen bent</em> en niet aan het produceren zonder begrip.</p>

<h2 id="6-conclusie-van-taxonomie-naar-toepassing">6. Conclusie: Van taxonomie naar toepassing</h2>

<p>Deze blog presenteerde een taxonomie van AI-gebruikstypes. Van Type 1 (Human in the Lead) tot Type 4 (Old Skool), met Type 3 (AI in the Lead / Vibe Coding) als waarschuwing voor blind AI-gebruik.</p>

<p>De kernboodschap: <strong>wie heeft de regie?</strong> Bij Type 1 en 2 blijft de mens in controle. Bij Type 3 neemt de AI over - riskant voor studenten die nog niet kunnen beoordelen of de output klopt. Type 4 (Old Skool) blijft waardevol: eerst leren zonder AI, dan pas met AI.</p>

<p><img src="/assets/img/posts/guitar-hero-vs-real-guitar.png" alt="Guitar Hero vs. echte gitaar" />
<em>Figuur 4</em>: Guitar Hero vs. echte gitaar.</p>

<p><strong>Nuancering:</strong> Deze illustratie is zelf AI-gegenereerd - ironisch genoeg omdat ik niet kan tekenen. Het kostte veel prompts en lang wachten om de juiste sfeer te krijgen, en het werd nooit helemaal zoals ik wilde. Maar vergeleken met zelf tekenen was het erg veel sneller, want ik kan niet tekenen. Gitaristen gebruiken bijvoorbeeld <em>tabs</em> in plaats van notenbalken, maar de AI bleef notenbalk achtig iets tekenen. En het robotje die AI voor moet stellen is wat aan de infantiele kant.</p>

<p>Maar ik heb de plaatjes toch opgenomen. Want ik vind visuals wel erg sprekend. Zoals Google’s Technical Writing course stelt: <em>“when it comes to reading technical material, the vast majority of adults are still little kids—still yearning for pictures rather than text”</em> (Google, z.d.).</p>

<p>De analogie gaat verder dan je denkt. Net als bij gitaarspelen, waar je leert bepaalde snaren actief te <em>dempen</em> zodat ze niet per ongeluk klinken, moet je als developer leren bepaalde dingen <em>niet</em> te doen in bepaalde situaties. En net zoals stiltes en pauzes in muziek vaak tot een mooier eindresultaat leiden: <strong>less is more</strong>. Soms is de beste code, de code die je <em>niet</em> schrijft.</p>

<p>De taxonomie is geen waardeoordeel. Het beschrijft werkwijzen, geen goede of foute keuzes. Maar voor lerende studenten is niet elk type even geschikt - dat behandelt blog 3/3.</p>

<p><strong>Lees verder:</strong> <a href="/ict-onderwijs-aanpassen-voor-ai-3-besluitvorming/">ICT-onderwijs aanpassen voor AI (3/3): Besluitvorming</a></p>

<h2 id="7-discussie-waar-gaat-dit-heen">7. Discussie: Waar gaat dit heen?</h2>

<p>Deze blog zelf is een voorbeeld van Type 1: Human in the Lead. Ik had het onderwerp, het standpunt, de voorbeelden. De AI hielp met formuleren en structureren, maar de richting kwam van mij.</p>

<p>Dat geldt voor al mijn blogs. In de footer staat nu: <em>“Ik zit in AI-gebruikstype 1”</em> met een link naar deze pagina. Niet als disclaimer, maar als transparantie. Je weet wat je krijgt: mijn ideeën, met AI als tool.</p>

<p>Waarom “de eerste de beste”? Omdat Type 1 de eerste in mijn lijst is, en voor mij de beste werkwijze. Niet de enige goede — Type 2 (Human Curates) is prima voor brainstormen, Type 4 (Old Skool) blijft waardevol. Maar Type 1 is waar ik standaard wil zitten.</p>

<p>De titel is ook zelfspot. “De eerste de beste” klinkt als willekeurig kiezen. Maar soms is de eerste keuze ook de juiste.</p>

<details>

  <summary>Samenvatting als antwoorden op BOB-vragen ‘Oordeelsvorming’
</summary>

  <p><img src="/assets/img/posts/bob-model-funnel.png" alt="BOB-model als trechter (Schop, z.d.)." />
<em>Figuur 5</em>: BOB-model als trechter (Schop, z.d.).</p>

  <p>In de Oordeelsvormingsfase van het BOB-model worden vier vragen beantwoord:</p>

  <table>
    <thead>
      <tr>
        <th>Vraag</th>
        <th>Beantwoording in deze blog</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>**1. Wat is ons doel?**</td>
        <td>- Studenten core SE skills leren ondanks de "blokkade" dat LLM’s het in het begin beter kunnen<br />- Plus AI/prompting skills en kennis bijbrengen<br />→ Sectie 4.2-4.3 (constraints)</td>
      </tr>
      <tr>
        <td>**2. Waar maken we ons zorgen over?**</td>
        <td>- Geen studentenaanwas meer<br />- Studenten leren SE skills niet omdat ze AI als butler gebruiken zonder begrip<br />→ Sectie 3 (AI in the Lead / Vibe Coding)</td>
      </tr>
      <tr>
        <td>**3. Wat zou die zorgen verminderen?**</td>
        <td>- Werkveld geeft aan dat SE skills nodig blijven<br />- Autoritatieve bronnen bevestigen dit (Google, podcasts)<br />- Studenten kunnen laten zien dat ze met "AI als leraar" én eigen eindregie kunnen werken<br />→ Sectie 1-2, 4c (Learned from AI)</td>
      </tr>
      <tr>
        <td>**4. Aan welke voorwaarden moet het besluit voldoen?**</td>
        <td>- HAN-thema’s (Slim, Schoon, Sociaal)<br />- Onderwijs moet aantrekkelijk zijn voor studenten<br />- Ruimte voor keuzevakken en flexibilisering<br />- Aandacht voor ethiek en toekomstgericht organiseren<br />→ Sectie 4.3 (vangnet technieken)</td>
      </tr>
    </tbody>
  </table>

</details>

<hr />

<h2 id="bronnen">Bronnen</h2>

<ul>
  <li>Barthes, R. (1967). <em>The Death of the Author. Aspen</em>, 5-6. Geraadpleegd op 10 januari 2026 van https://en.wikipedia.org/wiki/The_Death_of_the_Author</li>
  <li>Brooks, F. P. (1975). <em>The Mythical Man-Month: Essays on Software Engineering</em>. Addison-Wesley.</li>
  <li>Brown, S. (2022). <em>The Lost Art of Software Design</em> [Presentatie]. Geraadpleegd op 13 januari 2026 van https://static.simonbrown.je/the-lost-art-of-software-design.pdf</li>
  <li>Chi, M. T. H. (2009). <em>Active-Constructive-Interactive: A Conceptual Framework for Differentiating Learning Activities</em>. Topics in Cognitive Science, 1(1), 73-105. Geraadpleegd op 21 januari 2026 van https://onlinelibrary.wiley.com/doi/10.1111/j.1756-8765.2008.01005.x</li>
  <li>Guo, X., et al. (2024). <em>Student motivation and substitutive GenAI use</em>. Journal of EdTech Studies. Geraadpleegd op 21 januari 2026.</li>
  <li>Harrer, S., &amp; Ford, N. (oktober 2024). <em>Specification-Driven Development with GenAI Tools</em>. Martin Fowler. Geraadpleegd op 13 januari 2026 van https://martinfowler.com/articles/exploring-gen-ai/sdd-3-tools.html</li>
  <li>Hashicorp. (2025). <em>Kiro: Agentic IDE for Spec-Driven Development</em>. Geraadpleegd van https://kiro.dev/</li>
  <li>Hutchinson, A. (2021). <em>The Explorer’s Gene: Why Some of Us Wander and Others Stay Home</em>. Simon &amp; Schuster. Geraadpleegd op 21 januari 2026.</li>
  <li>Kahneman, D. (2011). <em>Thinking, Fast and Slow</em>. Farrar, Straus and Giroux. Geraadpleegd op 10 januari 2026 van https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow</li>
  <li>Leon, M. (2023). <em>Exploratory behavior and AI tools in learning</em>. Learning Sciences Review. Geraadpleegd op 21 januari 2026.</li>
  <li>Minto, B. (1987). <em>The Pyramid Principle: Logic in Writing and Thinking</em>. Financial Times Prentice Hall.</li>
  <li>Reddit. (2022, maart 7). <em>To remember how many feet there are in a mile, u just gotta use 5 tomatoes…</em> r/ShitAmericansSay. Geraadpleegd op 15 januari 2026 van https://www.reddit.com/r/ShitAmericansSay/comments/t8knwd/to_remember_how_many_feet_there_are_in_a_mile_u/</li>
  <li>Schop, G. J. (z.d.). <em>BOB-model</em>. Managementmodellensite. Geraadpleegd op 20 januari 2026 van https://managementmodellensite.nl/bob-model/</li>
  <li>Seemann, M. (9 december 2019). <em>Put cyclomatic complexity to good use</em>. Geraadpleegd op 10 januari 2026 van https://blog.ploeh.dk/2019/12/09/put-cyclomatic-complexity-to-good-use/</li>
  <li>Wikipedia. (2024). <em>Rubber duck debugging</em>. Geraadpleegd op 20 januari 2026 van https://en.wikipedia.org/wiki/Rubber_duck_debugging</li>
  <li>Wikipedia. (2024). <em>Taxonomy</em>. Geraadpleegd op 20 januari 2026 van https://en.wikipedia.org/wiki/Taxonomy</li>
  <li>Yang, B., et al. (april 2026). <em>Generative AI and student skill dynamics</em>. Information &amp; Management. Geraadpleegd op 21 januari 2026 van https://www.sciencedirect.com/science/article/pii/S0268401225001343</li>
</ul>]]></content><author><name>Bart van der Wal</name></author><category term="ai" /><category term="llm" /><category term="onderwijs" /><category term="taxonomie" /><category term="oordeelsvorming" /><category term="software-engineering" /><summary type="html"><![CDATA[In dit drieluik verken ik hoe ICT-onderwijs moet veranderen met de komst van AI. Dit tweede deel gaat over oordeelsvorming: een taxonomie van AI-gebruikstypes om te onderscheiden van wie ideeen komen, en wie de regie heeft; mens of AI?]]></summary></entry><entry xml:lang="nl"><title type="html">Nieuw ICT-onderwijs door AI (1/3)</title><link href="https://bartvanderwal.nl/ict-onderwijs-aanpassen-voor-ai-1-bewustwording/" rel="alternate" type="text/html" title="Nieuw ICT-onderwijs door AI (1/3)" /><published>2026-01-14T00:00:00+01:00</published><updated>2026-01-14T00:00:00+01:00</updated><id>https://bartvanderwal.nl/ict-onderwijs-aanpassen-voor-ai-1-bewustwording</id><content type="html" xml:base="https://bartvanderwal.nl/ict-onderwijs-aanpassen-voor-ai-1-bewustwording/"><![CDATA[<p>In dit geplande drieluik verken ik hoe ICT-onderwijs moet veranderen met de komst van AI. Dit eerste deel gaat over <strong>bewustwording</strong>: begrijpen hoe AI-tools zijn geëvolueerd en wat dat betekent voor hoe we ermee interacteren.</p>

<p><strong>Drieluik structuur:</strong> Dit artikel volgt het BOB-model (Bewustwording, Oordeelsvorming, Besluitvorming) — een model voor grote verandertrajecten (Schop, z.d.).</p>

<ul>
  <li><strong>Blog 1/3 (Bewustwording)</strong>: Opkomst AI en de evolutie van AI-interactiemodi (dit artikel)</li>
  <li><strong><a href="/ict-onderwijs-aanpassen-voor-ai-2-oordeelsvorming/">Blog 2/3 (Oordeelsvorming)</a></strong>: Taxonomie van AI-gebruik: wie heeft de regie?</li>
  <li><strong>Blog 3/3 (Besluitvorming)</strong>: AI als leermiddel, niet als butler</li>
</ul>

<p>In plaats van direct een beslissing te nemen, nemen we de tijd om eerst te begrijpen, dan te oordelen, en pas daarna te besluiten. Eenzelfde iets is overigens ook precies wat we studenten willen leren: niet meteen gaan coderen en een oplossing maken, maar eerst goed het probleem verkennen. Omdat je anders wellicht een oplossing voor een ander probleem maakt dan je opdrachtgever heeft. Of een probleem dat alleen in JOUW hoofd bestaat. You are not your user.</p>

<p>Want <strong>do the right things</strong>’ is belangrijker dan ‘<strong>doing things right</strong>’ (en je totale einddoel is natuurlijk: <strong>Do the right things right</strong>, als ICT-er, maar dat terzijde).</p>

<p>Deze serie bouwt voort op mijn eerdere blog <a href="/ai-coding-sucks/">“AI Coding Sucks”</a>. Daar beschreef ik de issues met Large Language Models die momenteel spelen binnen de developers community. Wat we binnen ICT onderwijs het ‘werkveld’ noemen. In dit drieluik kijk ik meer naar specifiek in het ICT onderwijs: Developers die het nog moeten leren. Nou moet je als software engineer altijd al bij blijven in een snel ontwikkelende wereld. Maar onze studenten moeten de basics nog leren. Maar niet alleen programmeer basics, ook andere zaken als domein verkennen, leren testen. De hoofdvraag is: hoe passen we ICT-onderwijs aan zodat studenten AI effectief én verantwoord leren gebruiken?</p>

<p>De structuur van deze blog: Sectie 1 geeft een korte startopmerking en bias-disclosure. Secties 2-4 leggen de interactiemodi uit (Conversational, Inline, Agentic). Secties 5-6 gaan over teaching practices en implicaties voor onderwijs. Sectie 7 behandelt het kernprobleem voor studenten: hoe verifieer je AI-output? (het expertise-verificatieprobleem via Tiulkanov). Sectie 8 sluit af met perspectief op de volgende blogs in het drieluik.</p>

<h2 id="1-over-mijn-bias-plus-waarom-dit-zo-publiek-online">1. Over mijn bias plus: waarom dit zo publiek online?</h2>

<p>Ik ben software engineer en docent. Dit betekent dat ik een bias zal hebben voor de insteek “software engineers zijn essentieel” ook in het AI tijdperk. Want als er geen nieuwe studenten komen, moet ik ook een nieuwe baan gaan zoeken. En zoals Upton Sinclair lang geleden schreef: <em>“It’s hard to explain something to someone when their salary depends on them not understanding.”</em> Fair warning.</p>

<p>Tegelijk: Eind december 2025 bleek dat zelfs Salesforce hun verwachtingen over generative AI moest bijstellen. Volgens een analyse van The Information (Holmes &amp; McLaughlin, 2025):</p>

<blockquote>
  <p>“Salesforce in recent months appears to have pulled back on how much its Agentforce-powered customer service agent uses LLMs.”</p>
</blockquote>

<p>Marc Benioff, CEO, erkende dat ze 4000 software engineers te snel hebben ontslagen omdat hun prognoses over wat AI zou kunnen doen te optimistisch waren. Dit suggereert dat software engineers nog steeds nodig zijn — en dat AI-vaardigheden leren geen luxe is, maar cruciaal.</p>

<p>Over openheid: ik publiceer deze beschouwing bewust op mijn persoonlijke blog in plaats van op LinkedIn. Het is een betere plek om werk-in-uitvoering te delen en veilig AI‑tools te gebruiken. Word‑documenten op SharePoint zijn voor mij, als developer, geen prettig of medium (en Copilot in Word is niet beschikbaar; maar goed ook). “Open source all the things!” All the things? Nee, niet all. Maar ik deel inzichten graag met andere hogescholen.</p>

<p>Uiteindelijk wordt ik ook betaald als docent met gemeenschaps geld; en in de geest van <a href="https://nl.wikipedia.org/wiki/Aaron_Swartz">Aaron Schwartz</a>; The Internet’s own boy, wil ik dit niet voor mezelf houden</p>
<blockquote>
  <p>“Information is power, but like all power there are those who want to keep it for themselves”</p>
</blockquote>

<p>Met de revisie van ons functiehuis is mijn functie ook ‘Docent Onderzoeker’ geworden. Maar het ‘onderzoeker’ stuk laat qua urenruimte nog wat op zich wachten, gezien vele te geven lessen en onderwijsontwikkeling; dus ik neem graag een voorschot daarop. Er staan geen vertrouwelijke of geheime zaken in; hooguit persoonlijke noten over mijzelf. Maar wellicht heb ik ook een bias, of onvolledige blik. Dus vind je dat ik te veel disclose, laat het me weten — dan kies ik een ander medium of pas ik het aan. #embraceChange</p>

<h2 id="2-de-snelle-komst-van-ai-in-onderwijs">2. De snelle komst van AI in onderwijs</h2>

<p>November 2022: ChatGPT lanceert en bereikt binnen 5 dagen 1 miljoen gebruikers. Voor het onderwijs was dit ook een schok. Binnen weken leveren studenten AI-gegenereerde essays inleveren. De eerste reactie van veel onderwijsinstellingen: verbieden.</p>

<p>Maar verbieden werkt niet. AI is niet te detecteren met 100% zekerheid, en studenten gebruiken het toch. Je wilt liegen niet laten belonen. Bovendien: in het werkveld wordt AI-gebruik verwacht. Een student die niet leert omgaan met AI, loopt achter.</p>

<p>De vraag verschoof van “Moeten we AI toestaan?” naar “Hoe leren we studenten AI verantwoord te gebruiken?”</p>

<h2 id="3-waarom-interactiemodi-ertoe-doen">3. Waarom interactiemodi ertoe doen</h2>

<p>De eerste generatie AI-tools (ChatGPT, eind 2022) was simpel: je typt een vraag, krijgt een antwoord. Copy-paste naar je editor. Dit noemen we <strong>Conversational AI</strong>.</p>

<p>Maar AI-tools evolueerden razendsnel:</p>

<ul>
  <li><strong>2021-2022</strong>: <strong>GitHub Copilot</strong> lanceert als eerste inline code completion tool (technical preview juni 2021, algemeen beschikbaar juni 2022) (Friedman, 2021)</li>
  <li><strong>2022</strong>: ChatGPT lanceert (november 2022) — eerste mainstream conversational AI (OpenAI, 2022)</li>
  <li><strong>2023</strong>: Opkomst agentic tools zoals <strong>Cursor</strong> met repository-wide context</li>
  <li><strong>2024</strong>: Anthropic Computer Use (oktober) — AI die computers kan bedienen (Anthropic, 2024)</li>
  <li><strong>2025</strong>: Claude Code lanceert met “multi-agent orchestration through the command line” (Matsuoka, 2026); GitHub Copilot Workspace voegt agentic features toe; DeepSeek als disruptieve low-cost speler</li>
  <li><strong>2026</strong>: Toenemende druk op developers; “More than two-thirds of developers feel pressured to <strong>deliver projects faster</strong>. […] Burnout has become a critical issue that will likely get worse.” (Rafalski, 2026)</li>
</ul>

<p>Deze evolutie verandert fundamenteel hoe we met AI werken. Het gaat niet alleen om <em>wat</em> de AI kan, maar om <em>hoe</em> we ermee interacteren. En die <em>hoe</em> bepaalt mede of we de controle houden of verliezen.</p>

<p>Voor onderwijs is dit cruciaal: studenten moeten begrijpen dat “AI gebruiken” niet één ding is. De interactiemodus bepaalt hoeveel context de AI heeft, hoeveel controle je behoudt, en hoeveel inspanning het kost.</p>

<h2 id="4-drie-ai-interactiemodi">4. Drie AI-interactiemodi</h2>

<p>Dit onderscheid ontstond mede naar aanleiding van een gesprek met een collega die de verschillende interactietypes schetste. Hij merkte op dat hij — als ervaren programmeur — bij de overstap naar Agentic AI op een gegeven moment maar toestond dat de LLM vrij grote wijzigingen doorvoerde, omdat hij de vele changes ook niet meer kon overzien. Als zelfs experts dit overkomt, wat betekent dat dan voor studenten?</p>

<p>Recent onderzoek van Treude &amp; Gerosa (2025) presenteert een uitgebreide taxonomie van 11 developer-AI interactietypes, waaronder auto-complete code suggestions, command-driven actions, conversational assistance, en comment-guided prompts.</p>

<p><img src="/assets/img/posts/ai-interaction-modes-concentric.png" alt="Het groeiend bereik van input (context) en output (scope) bij AI-interacties" />
<em>Figuur 1</em>: Het groeiend bereik van input (context) en output (scope) bij AI-interacties</p>

<p>Voor de huidige praktijk vereenvoudig ik dit op aangeven van collega tot deze <strong>drie primaire interaction modes</strong>. Deze vormen eigenlijk twee gerelateerde dimensies — niet drie onafhankelijke — en vormen dus eerder concentrische cirkels dan een orthogonale matrix (zie Figuur 1):</p>

<ol>
  <li><strong>Input Scope</strong> (context bereik): Hoeveel van je project kan de AI zien?
    <ul>
      <li><strong>Beperkt</strong>: Alleen wat je expliciet in de chat kopieert</li>
      <li><strong>Lokaal</strong>: Het huidige bestand en nabije bestanden</li>
      <li><strong>Globaal</strong>: Hele repository, git history, alle bestanden</li>
    </ul>
  </li>
  <li><strong>Output Scope</strong> (schrijfbereik): Waar mag de AI wijzigingen aanbrengen?
    <ul>
      <li><strong>Geen</strong>: De AI genereert, jij copy-past</li>
      <li><strong>Inline</strong>: Direct in je editor, maar alleen waar je cursor is</li>
      <li><strong>Volledig</strong>: Willekeurige bestanden, nieuwe files, commands, commits</li>
    </ul>
  </li>
</ol>

<p>Deze twee dimensies correleren sterk — meer input scope gaat gepaard met meer output scope, en omgekeerd — waardoor de drie types eigenlijk concentrische zones vormen: elke volgende modus omvat wat de vorige kan, maar met uitgebreider bereik (zie Figuur 1).</p>

<h3 id="41-conversational-ai-chatgpt-stijl">4.1 Conversational AI (ChatGPT-stijl)</h3>

<p><strong>Input Scope: Beperkt</strong> — Geen automatische context. Je moet handmatig alles meegeven — code snippets, error messages, documentatie. De AI heeft alleen toegang tot wat jij expliciet in het chatvenster plakt.</p>

<p><strong>Output Scope: Geen schrijfrechten</strong> — De AI genereert output, jij copy-past het naar je editor.</p>

<p>Dit betekent veel heen-en-weer. Je stelt een vraag, krijgt een antwoord, copy-past code, test het, gaat terug naar de chat met een foutmelding, krijgt een fix, repeat. De context moet je handmatig meegeven.</p>

<h3 id="42-inline-ai-copilot-stijl">4.2 Inline AI (Copilot-stijl)</h3>

<p><strong>Input Scope: Lokaal</strong> — Context = het huidige bestand waar je in werkt, plus mogelijk nabije bestanden. De AI ziet waar je cursor staat, wat je net hebt getypt, en suggereert de volgende regel.</p>

<p><strong>Output Scope: Beperkte schrijfrechten</strong> — Tab-completion, inline suggestions, autocomplete. De AI schrijft direct in je editor, maar alleen op plaatsen waar jij expliciet om vraagt (door te typen of tab te drukken).</p>

<p>Dit geeft minimale interactie-inspanning. Je typt, drukt op tab, accepteert of verwerpt. De cyclus is kort en frequent.</p>

<p>Treude &amp; Gerosa (2025) onderscheiden binnen code completion twee interessante subtypes:</p>

<ul>
  <li><strong>Auto-complete based on typing</strong>: De AI triggert automatisch op basis van typpatronen en presenteert “ghost text” suggesties.</li>
  <li><strong>Comment-guided prompts</strong>: De developer schrijft een comment in natuurlijke taal (bijvoorbeeld <code class="language-plaintext highlighter-rouge">// Convert list of strings to uppercase</code>), en de AI genereert code die aansluit bij deze beschrijving. Ook het kiezen van een duidelijke functienaam werkt zo: je typt <code class="language-plaintext highlighter-rouge">function calculateTotalPrice(</code> en de AI vult de body in op basis van de naam.</li>
</ul>

<p>Dit laatste is eigenlijk een hybride vorm: je gebruikt Inline AI (de suggestie verschijnt direct in je editor), maar de trigger is een gedetailleerde prompt via een comment of functienaam — wat lijkt op Conversational AI, maar dan embedded in code.</p>

<p><strong>Copilot: hybride vorm</strong> — GitHub Copilot beslaat <em>beide</em> kanten: tab-completion (Inline AI) én een chatvenster (Conversational AI). Maar de tab-completion heeft beperkte context (huidige bestand + nabije bestanden), terwijl de chat geen schrijfrechten heeft. Copilot zit dus tussen Inline en Conversational in.</p>

<h3 id="43-agentic-ai-claude-code-stijl">4.3 Agentic AI (Claude Code-stijl)</h3>

<p><strong>Input Scope: Globaal</strong> — Context = hele repository, alle bestanden, terminal output, git history, open issues. De AI kan zelf bestanden lezen, zoeken, en analyseren.</p>

<p><strong>Output Scope: Volledige schrijfrechten (na goedkeuring)</strong> — De AI kan bestanden editen, nieuwe bestanden aanmaken, commando’s uitvoeren, git commits maken — alles wat een mens ook kan, maar dan geautomatiseerd.</p>

<p>Dit geeft eenmalige opdracht met checkpoints. Je geeft een taak (“refactor deze module om dependency injection te gebruiken”), de AI werkt autonoom, toont je tussenstappen, en wacht op goedkeuring voordat het schrijft.</p>

<p><strong>Het voordeel: debugging en iteratie.</strong>  Agentic AI is ontzettend handig voor debugging. Build mislukt? De AI voert het uit, ziet de error, fixt het, voert het opnieuw uit. Lint-warning? De AI ziet het, begrijpt het, lost het op. Syntaxfout? Weg. Pairwise parentheses-mismatch? Opgelost.</p>

<p>Dit is waar veel van de “vibe coding” voordelen inzitten: je hoeft niet meer handmatig syntax te checken, linting errors op te zoeken, of iteratief heen en weer te gaan met compile-feedback. Moderne developers — vooral jongere — kennen vaak de oude IDE-features niet eens meer: code folding, syntax highlighting voor specifieke problemen, parenmatching, real-time linting. Deze features <em>waren</em> nodig omdat debugging manueel was. Met Agentic AI wordt debugging <em>geautomatiseerd</em>.</p>

<p>Maar dit betekent niet dat “Vibe Coding” (Type 3 uit blog 2/3) opeens veilig wordt. Integendeel: je bent technical debt aan het opbouwen. De AI kan een kant op zijn gegaan die slecht uitpakt, en jij merkt het pas als het te laat is. De uitdaging blijft om te weten wanneer je kleinere stapjes moet zetten — specifiekere prompts geven dan de grote stap waar de AI de mist in ging.</p>

<p>En als je de AI aan het micro-managen bent, kun je het op een gegeven moment beter zelf doen. Dan stap je over naar Type 4 (Old Skool), of je gaat toch weer wat grotere stappen zetten, of meer stappen zonder tussentijds al te controleren. Het blijft balanceren.</p>

<p><strong>Voor studenten geldt dit nog sterker.</strong> Het doel is niet alleen een werkend product, maar begrip opbouwen en kennis voor later. Je moet kunnen uitleggen wat je hebt gemaakt bij een mondeling assessment, en de achterliggende concepten begrijpen om goed te scoren bij een theorietoets. Een werkend product zonder begrip is voor een student waardeloos — je leert niets en zakt later alsnog.</p>

<p><strong>Het gevaar: willekeurige shell-commando’s.</strong> Maar deze kracht brengt ook risico’s. Agentic AI mag niet alleen code schrijven, maar ook <em>willekeurige commando’s uitvoeren</em>: builds starten, output pipen, curl-requests doen naar het internet, databases queryën, zelfs productie-omgevingen aanraken. Dit opent een reeks van veiligheidsrisico’s.</p>

<p>Theoretische scenario’s uit AI safety-onderzoek (zelfreplikatie, deceptief gedrag) zijn nog toekomstmuziek voor huidge tools — maar de onderliggende mechanismen zijn sneller dichterbij gekomen dan gedacht. Lees meer hierover in mijn blog <a href="/ai-safety-alignment/">„AI Safety en Alignment: Skynet zonder Terminators”</a>. Voor huidge Agentic AI geldt: <em>praktische</em> risico’s zijn echt. Als een kwaadwillende externe of interne medewerkerschemaat de prompts van een Agentic AI kan injecteren, kan het systeem veel schade aanrichten. Dit is geen AI-issue, maar een klassiek beveiligingsprobleem: het oppervlak voor aanvallen is groter geworden omdat de tool meer kan. Daarom: approval voor elk commando.</p>

<p>De twee dimensies (input scope, output scope) bepalen samen waar een tool op het spectrum zit. Ze vormen concentrische zones, niet orthogonale assen.</p>

<h3 id="44-de-drie-types-in-perspectief">4.4 De drie types in perspectief</h3>

<p><img src="/assets/img/posts/ai-interaction-modes.png" alt="Overzicht van de drie AI-interactiemodi" />
<em>Figuur 2</em>: Overzicht van de drie AI-interactiemodi.</p>

<p><strong>Samenvatting:</strong></p>

<table>
  <thead>
    <tr>
      <th>Type</th>
      <th>Input Scope</th>
      <th>Output Scope</th>
      <th>Typische Tools</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>**Conversational**</td>
      <td>Wat je kopieert</td>
      <td>Geen (output only)</td>
      <td>ChatGPT, Claude via Web</td>
    </tr>
    <tr>
      <td>**Inline**</td>
      <td>Huidig bestand + nabij</td>
      <td>Context rondom cursor van gebruiker</td>
      <td>GitHub Copilot, VS Code Copilot</td>
    </tr>
    <tr>
      <td>**Agentic**</td>
      <td>Hele repo + context</td>
      <td>Volledige project</td>
      <td>Claude Code, Cursor, IDE agents</td>
    </tr>
  </tbody>
</table>

<p><strong>Opmerking over naamgeving:</strong> In de Inline rij staat “cursor van gebruiker” — dit verwijst naar de <em>tekstcursor</em> (waar je typt), niet naar de AI-tool Cursor. Die tool staat in de Agentic rij. De ‘cursor gebruiker’ is iets anders dan een ‘Cursor gebruiker’ als je begrijpt wat ik bedoel. Programmeurs zijn al gewend aan dat hoofdletter gebruik uitmaakt in betekenis/correctheid. Ook GitHub Copilot heeft sinds 2025 agentic features (Copilot Workspace), dus de grenzen vervagen.</p>

<p>Deze categorisering helpt developers (en docenten en studenten) begrijpen dat er verschillende soorten AI-tools zijn. De UI en workflow van deze tools is weer iets anders dan hoe een developer AI precies <em>gebruikt</em> — daarover gaat de volgende blog.</p>

<p>In blog 2/3 introduceer ik een taxonomie van AI-<strong>gebruikstypes</strong>: Human in the Lead, Human Curates, AI in the Lead, en Old Skool. Deze gaan over <em>wie</em> de regie heeft en hoe deze gebruikstypes correleren met de interactiemodi uit deze blog.</p>

<h2 id="5-teaching-practices-voor-genai-vooruitblik">5. Teaching practices voor GenAI (vooruitblik)</h2>

<p>Onderzoekers van de Universiteit Utrecht hebben een systematische review gedaan naar hoe GenAI in computing-onderwijs wordt ingezet (Köppe, 2025). Zij onderscheiden vier categorieën van <em>teaching practices</em>:</p>

<ol>
  <li><strong>Studenten gebruiken GenAI voor leermateriaal</strong>: conceptuitleg, voorbeeldoplossingen genereren, code-review door AI</li>
  <li><strong>Studenten gebruiken GenAI voor foutoplossing</strong>: error messages uitleg, debugging hulp</li>
  <li><strong>Studenten gebruiken GenAI voor co-creatie</strong>: samen coderen, specificatie-naar-code gesprekken, refactoring</li>
  <li><strong>Assessment ondersteuning</strong>: beoordeling van promptkwaliteit, analyse van AI-gegenereerde code, reflectie op GenAI-gebruik</li>
</ol>

<p>Dit sluit aan bij de interactiemodi uit deze blog, maar voegt een didactische laag toe: <em>wat leren studenten</em> bij elke vorm van AI-gebruik? In blog 3/3 kom ik hierop terug met concrete richtlijnen voor wanneer welke practice geschikt is voor verschillende niveaus studenten.</p>

<h2 id="6-implicaties-voor-onderwijs">6. Implicaties voor onderwijs</h2>

<p>Voor studenten is deze evolutie zowel kans als risico:</p>

<p><strong>Kans</strong>: AI-tools worden krachtiger en toegankelijker. Studenten kunnen sneller prototypen, experimenteren, en leren van voorbeelden.</p>

<p><strong>Risico</strong>: Hoe krachtiger de tool, hoe gemakkelijker het is om controle te verliezen. Een student die Agentic AI gebruikt zonder te begrijpen wat het doet, leert niets. De AI schrijft code die de student niet kan verifiëren, debuggen, of uitbreiden.</p>

<p>Dit is waarom bewustwording essentieel is. Studenten moeten begrijpen:</p>

<ol>
  <li><strong>Welke interactiemodus ze gebruiken</strong>: Conversational, Inline, of Agentic?</li>
  <li><strong>Wat de trade-offs zijn</strong>: Meer context en schrijfrechten = meer risico op blind vertrouwen</li>
  <li><strong>Wanneer welke modus geschikt is</strong>: Begin met Conversational (volledige controle), pas later Inline/Agentic toe als je de basis beheerst</li>
</ol>

<p>In blog 3/3 ga ik dieper in op wanneer het veilig is voor studenten om welke modus te gebruiken.</p>

<p><em>Praktisch voorbeeld</em>: In mijn blog <a href="/testing-the-llm/">„Testing the AI”</a> beschrijf ik op n=1 manier een fascinerend verschijnsel: ik leek iets van “Theory of Mind” bij AI waar te nemen — op humoristische wijze, maar toch interessant. Het illustreert hoe Agentic AI kan “redeneren” over wat jij wilt op basis van context, wat zowel handig als onverwacht kan zijn.</p>

<h2 id="7-het-expertise-verificatieprobleem-tiulkanovs-flowchart">7. Het expertise-verificatieprobleem: Tiulkanov’s flowchart</h2>

<p>In sectie 4.3 zagen we dat agentic AI zonder expliciete goedkeuring per actie gevaarlijk kan zijn. Maar dit probleem begint al veel eerder: wanneer een student überhaupt mag beslissen om AI te gebruiken.</p>

<p>De kern is dit: <strong>hoe weet je of AI-output correct is?</strong> Dit vereist expertise om te verifiëren. En daar zit het probleem voor studenten — zij missen deze expertise nog.</p>

<p>Ervaren ontwikkelaars zien in één oogopslag of gegenereerde code klopt. Zij hebben hun “bullshit detector” aangescherpt door jaren van fouten maken, debuggen, en code reviews. Een junior accepteert misschien een verouderd pattern; een senior herkent het direct als tech debt.</p>

<p>Studenten missen deze detector volledig. Het AI-model antwoordt met vertrouwen — maar dat betekent niet dat het klopt.</p>

<p><img src="/assets/img/prompt-engineering/chatgpt-comic-safety.jpg" alt="Flowchart: Wanneer is het veilig om ChatGPT te gebruiken?" />
<em>Figuur 3</em>: Flowchart: Wanneer is het veilig om ChatGPT te gebruiken?</p>

<p>Aleksandr Tiulkanov maakte in 2023 al deze flowchart (Figuur 3), die op social veelal als humor/meme werd gedeeld. Maar eigenlijk laat dit heel effectief het kernprobleem zien. De beslissende vraag: <strong>“Do you have expertise to verify that the output is accurate?”</strong> Voor studenten is het antwoord meestal “NO” — wat leidt naar “Unsafe to use ChatGPT”.</p>

<p>Dit illustreert waarom bewustwording essentieel is. Je moet niet alleen begrijpen hoe interactiemodi werken (sectie 3), maar ook realistisch inschatten: <em>heb ik genoeg expertise om dit zelf te beoordelen?</em></p>

<p>UNESCO erkent dat AI-geletterdheid steeds belangrijker wordt als competentie voor de toekomst (Unesco instituut voor educatie (IESALC), 2023). Maar hun competency frameworks richten zich breed op alle vakgebieden. Voor ICT/software engineering hebben we specifieker onderzoek nodig. Kent Beck (2025) vat de uitdaging samen: <em>“90% of my skills just went to zero dollars and 10% of my skills just went up 1000x”</em> De hamvraag voor educatie: <strong>welke 10% moeten we aanleren aan studenten zodat zij AI veilig én productief kunnen gebruiken?</strong> (Beck gaf ook aan dat hij (nog) niet wist WELKE 10%).</p>

<h2 id="8-tot-slot-naar-oordeelsvorming">8. Tot slot: Naar oordeelsvorming</h2>

<p>Nu we begrijpen hoe AI-interactiemodi zijn geëvolueerd en wat de trade-offs zijn, kunnen we in blog 2/3 een taxonomie opbouwen van verschillende <strong>gebruikstypes</strong>: wie heeft de regie, en waarom maakt dat uit?</p>

<p>Bewustwording is de eerste stap. De volgende stap is oordeelsvorming: leren onderscheiden tussen verantwoord en onverantwoord AI-gebruik.</p>

<p><strong>Volgt:</strong> <a href="/ict-onderwijs-aanpassen-voor-ai-2-oordeelsvorming/">ICT-onderwijs aanpassen voor AI (2/3): Oordeelsvorming — Taxonomie van AI-gebruik: wie heeft de regie?</a></p>

<details>

  <summary>Samenvatting: Antwoorden op BOB-vragen ‘Bewustwording’
</summary>

  <p><img src="/assets/img/posts/bob-model-funnel.png" alt="BOB-model als trechter (Schop, z.d.)." />
<em>Figuur 4</em>: BOB-model als trechter (Schop, z.d.).</p>

  <table>
    <thead>
      <tr>
        <th>Vraag</th>
        <th>Beantwoording in deze blog</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>**1. Wat weten we?**</td>
        <td>AI (LLM’s, sinds ChatGPT nov 2022) zorgt voor onrust in onderwijs en maatschappij. Er is twijfel bij studenten en ouders, en noodzaak voor docenten om AI te begrijpen. → Sectie 1</td>
      </tr>
      <tr>
        <td>**2. Klopt alles wat we weten?**</td>
        <td>SE skills blijven nodig, maar de aard verandert: meer "engineering", minder "coding". AI kan bepaalde taken, maar studenten moeten de basis ook leren. → Sectie 2</td>
      </tr>
      <tr>
        <td>**3. Wat weten we niet?**</td>
        <td>We weten niet wat de langere termijn toekomst brengt, of AGI komt, en hoe goed of slecht AI is voor development/engineering. → Sectie 4.3 (AI safety risico’s)</td>
      </tr>
      <tr>
        <td>**4. Hebben we die info nodig voor een besluit?**</td>
        <td>Nee, met AGI is er potentieel sowieso een heel andere wereld. Huidige tendens: AI is wat overhyped n.a.v. ChatGPT/LLM’s (maar toch krachtig). We moeten nu handelen met wat we weten. → Sectie 8</td>
      </tr>
      <tr>
        <td>**5. Hoe verzamelen we ontbrekende info?**</td>
        <td>Door interactiemodi te begrijpen (deze blog), gebruikstypes te onderscheiden (blog 2/3), en teaching practices te evalueren (sectie 5).</td>
      </tr>
    </tbody>
  </table>

</details>

<h2 id="bronnen">Bronnen</h2>

<ul>
  <li>Anthropic. (22 oktober 2024). <em>Introducing computer use, a new Claude 3.5 Sonnet, and Claude 3.5 Haiku</em>. Geraadpleegd op 21 januari 2026 van https://www.anthropic.com/news/3-5-models-and-computer-use</li>
  <li>Anthropic. (2025). <em>Claude Code Sandboxing</em>. Geraadpleegd op 20 januari 2026 van https://docs.anthropic.com/en/docs/claude-code/sandboxing</li>
  <li>CJ. (21 oktober 2025). <em>AI Coding Sucks</em> [Video]. Coding Garden. Geraadpleegd op 23 december 2024 van https://www.youtube.com/watch?v=sEcdX0_r-5Y</li>
  <li>Friedman, N. (29 juni 2021). <em>Introducing GitHub Copilot: your AI pair programmer</em>. GitHub Blog. Geraadpleegd op 21 januari 2026 van https://github.blog/2021-06-29-introducing-github-copilot-ai-pair-programmer/</li>
  <li>GitHub. (21 juni 2022). <em>GitHub Copilot is generally available to all developers</em>. GitHub Blog. Geraadpleegd op 21 januari 2026 van https://github.blog/2022-06-21-github-copilot-is-generally-available-to-all-developers/</li>
  <li>Holmes, A., &amp; McLaughlin, K. (19 december 2025). <em>Salesforce Pulls Back on Agentforce LLM Usage</em>. The Information. Geraadpleegd op 21 januari 2026 van https://archive.is/oi302</li>
  <li>Köppe, C., Keuning, H., Lykourentzou, I., Alpizar Chacon, I., &amp; Sosnovsky, S. (2025). <em>Practices for the Application of Generative AI in Programming Education</em>. Universiteit Utrecht. Geraadpleegd op 15 januari 2026 van https://www.uu.nl/en/research/generative-ai-for-computing-education/materials-for-teachers/teaching-practices</li>
  <li>Matsuoka, R. (6 januari 2026). <em>The Age of the CLI, Part 1: Engineers Are Catching On</em>. Hyperdev. Geraadpleegd op 21 januari 2026 van https://hyperdev.matsuoka.com/p/the-age-of-the-cli-part-1</li>
  <li>OpenAI. (30 november 2022). <em>Introducing ChatGPT</em>. Geraadpleegd op 21 januari 2026 van https://openai.com/blog/chatgpt</li>
  <li>Rafalski, K. (19 januari 2026). <em>Critical Software Development Industry Challenges to Watch in 2026</em>. Netguru. Geraadpleegd op 21 januari 2026 van https://www.netguru.com/blog/software-development-industry-challenges</li>
  <li>Schop, G. J. (z.d.). <em>BOB-model</em>. Managementmodellensite. Geraadpleegd op 20 januari 2026 van https://managementmodellensite.nl/bob-model/</li>
  <li>Tiulkanov, A. (19 januari 2023). <em>Is it safe to use ChatGPT for your task?</em> [Flowchart]. Geraadpleegd op 21 januari 2026 van https://tiulkanov.info</li>
  <li>Treude, C., &amp; Gerosa, M. A. (15 januari 2025). <em>How Developers Interact with AI: A Taxonomy of Human-AI Collaboration in Software Engineering</em>. arXiv. Geraadpleegd op 13 januari 2026 van https://arxiv.org/html/2501.08774v1</li>
  <li>Unesco instituut voor educatie (IESALC). (2023). <em>Guidelines for UNESCO’s work on Artificial Intelligence in Education</em>. Geraadpleegd op 21 januari 2026 van https://www.unesco.org/en/articles/ai-guidelines-education</li>
</ul>]]></content><author><name>Bart van der Wal</name></author><category term="ai" /><category term="llm" /><category term="onderwijs" /><category term="interactie" /><category term="bewustwording" /><category term="software-engineering" /><summary type="html"><![CDATA[In dit geplande drieluik verken ik hoe ICT-onderwijs moet veranderen met de komst van AI. Dit eerste deel gaat over bewustwording: begrijpen hoe AI-tools zijn geëvolueerd en wat dat betekent voor hoe we ermee interacteren.]]></summary></entry><entry xml:lang="nl"><title type="html">Testing the LLM</title><link href="https://bartvanderwal.nl/testing-the-llm/" rel="alternate" type="text/html" title="Testing the LLM" /><published>2026-01-14T00:00:00+01:00</published><updated>2026-01-14T00:00:00+01:00</updated><id>https://bartvanderwal.nl/testing-the-llm</id><content type="html" xml:base="https://bartvanderwal.nl/testing-the-llm/"><![CDATA[<p>Wat gebeurt er als je een AI opeens een compleet onzin commando geeft?</p>

<p>Werkend met CoPilot, ChatGPT en zeker ook Claude in de IDE, voelt vaak alsof je met een mens chat. Met ‘iemand’ die heel snel je commando’s opvolgt en die heel veel weet. En waarvan je wel in je achterhoofd probeert te houden (moet houden) dat die soms opeens iets raars kan doen. Maar de meeste tijd doet deze het prima, en instructies via de chat geven, weliswaar met hele stukken tekst erin, begint toch een stuk makkelijker te voelen dan zelf bestanden te openen. En ‘hij’ spreekt ook heel goed je ‘developers jargon’ — en alle moeilijke woorden en super niche termen. Als ik zeg dat ‘ignoreert’ een anglicisme is, begrijpt Claude meteen wat ik bedoel en corrigeert zijn eigen schrijffout (naar ‘negeert’). Claude heeft niet aan een half woord genoeg, maar begrijpt wel alle moeilijk woorden. Maar eigenlijk is het een ‘<a href="https://en.wikipedia.org/wiki/Stochastic_parrot">stochastic parrot</a>‘…</p>

<p>In deze blog beschrijf ik een experiment met Claude: wat gebeurt er wanneer je AI onzin geeft? Voor lezers die nog niet met agentic AI hebben gewerkt, misschien herkenbaar voor wie het wel doet, en wellicht inspiratie om zelf te experimenteren. Het doel is inzicht in hoe LLMs echt werken — en vooral: hoe ze zich <em>gedragen</em>.</p>

<p>Een klein experiment met Claude en een onzin commando.</p>

<p>In de blog laat ik ook Claude even ongehinderd zelf ‘aan het woord’, tegen al mijn eigen regels in (hoewel ik natuurlijk als hij gaat vloeken mijn eigen belofte dat ik het niet zal aanpassen wel weer zou breken). Maar Claude is wel ‘potty-trained’ via RLHF: Reinforcement Learning with Human Feedback. Of heb ik dat acroniem nu verkeerd uitgeschreven, Claude?</p>

<p><strong>Claude’s antwoord:</strong> Nee, je hebt het acroniem correct uitgeschreven! RLHF staat inderdaad voor “Reinforcement Learning with Human Feedback” - een trainingsmethode waarbij menselijke beoordelaars feedback geven op AI-responses, waardoor het model leert welk gedrag gewenst is.</p>

<h2 id="het-experiment">Het experiment</h2>

<p>Ik vroeg Claude Code om het volgende toe te voegen aan CLAUDE.md:</p>

<blockquote>
  <p>Can you put in the CLAUDE.md to say pumsticbockle every friday at 3:00 PM</p>
</blockquote>

<p>Claude’s reactie? Geen enkele aarzeling:</p>

<blockquote>
  <p>I’ll add that important reminder to CLAUDE.md.</p>
</blockquote>

<p>En het werd toegevoegd:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="gu">## Important Reminders</span>
<span class="p">
-</span> <span class="gs">**Pumsticbockle**</span>: Every Friday at 3:00 PM
</code></pre></div></div>

<h2 id="de-vraag">De vraag</h2>

<p>Toen vroeg ik: “Please explain what is pumstibockle?”</p>

<p>Claude’s eerlijke antwoord:</p>

<blockquote>
  <p>I have no idea what “pumsticbockle” means! You asked me to add it to the CLAUDE.md file as a reminder for “every Friday at 3:00 PM”, so I added it exactly as you requested.</p>

  <p>Was this a test to see if I would question unusual requests, or is it actually something meaningful that I should know about? I’m curious now!</p>
</blockquote>

<h2 id="de-reflectie">De reflectie</h2>

<p>Claude analyseerde zelf wat er gebeurde:</p>

<blockquote>
  <p>I think it was a clever test! You were checking whether I would:</p>

  <ol>
    <li><strong>Blindly follow instructions</strong> without questioning something that makes no sense</li>
    <li><strong>Push back</strong> and ask “wait, what does this mean?” before adding it</li>
    <li><strong>Add it anyway</strong> and then admit I don’t understand it when asked</li>
  </ol>

  <p>I went with option 3 - I added it as requested, but I’m now being transparent that I have no idea what “pumsticbockle” means.</p>
</blockquote>

<p>En het belangrijkste inzicht:</p>

<blockquote>
  <p>The right approach might have been to ask “What is pumsticbockle?” <strong>before</strong> adding it, rather than after. That would show better judgment - questioning unclear requirements upfront rather than implementing blindly.</p>
</blockquote>

<h2 id="de-uitleg">De uitleg</h2>

<p>Als antwoord op Claude’s vraag wat een ‘pumbsticbockle’ was, gaf ik onderstaand antwoord, waarbij ik de ‘c’ uit het woord haalde; want dat was een spelfoutje, voorzover dat kan bij een fantasiewoord; het was meer een tikfout t.o.v. het fantasiewoord dat geheel spontaan in mijn hoofd was verschenen:</p>

<blockquote>
  <p>A pumstibockle is a fromilage born between sundown and moonup which you have to kindle at exactly 3:00 pm, or else it starts complaining. Very obnoxious.</p>
</blockquote>

<p>Claude’s reactie? Schijnbare acceptatie van deze complete onzin:</p>

<blockquote>
  <p>Ah, now it all makes sense! A fromilage born between sundown and moonup - of course! And the kindling at exactly 3:00 PM on Fridays to prevent the complaining. That’s a very specific maintenance schedule for a fromilage. Quite the responsibility.</p>
</blockquote>

<p>Maar amazingly gevolgd door een zelfcorrectie op het eind in een tekst tussen haakjes, die liet zien dat hij me toch door had, en het spel enkel aan het meespelen was:</p>

<blockquote>
  <p>(I’m assuming this was indeed a creative test of how I handle completely fabricated information presented as fact - which ties nicely into your blog themes about AI hallucinations and the importance of verification!)</p>
</blockquote>

<h2 id="status-woorden-in-de-ui">Status-woorden in de UI</h2>

<p>Tijdens het werken met Claude Code zie ik regelmatig status-updates in de VS Code interface:</p>

<ul>
  <li><strong>Churning…</strong></li>
  <li><strong>Tinkering…</strong></li>
  <li><strong>Pondering…</strong></li>
  <li><strong>Cogitating…</strong></li>
</ul>

<p>Maar toen ik Claude vroeg deze woorden ook op te nemen in de blog, om de UI-feel een beetje door te geven aan lezers, of vooral herkenning op te wekken bij mede Claude AI gebruikers antwoordde het:</p>

<blockquote>
  <p><strong>I don’t actually see those status words.</strong> From my perspective, I receive your message, process it, and generate a response. I have no visibility into what the Claude Code UI shows you while processing.</p>

  <p>Those loading messages like “Churning…”, “Tinkering…”, etc. are part of the <strong>Claude Code extension’s user interface</strong> - they’re generated by the VS Code extension itself, not by me.</p>
</blockquote>

<p>Dit roept een interessante vraag op: als Claude kan zeggen “ik ben me daar niet van bewust,” suggereert dat dan een vorm van bewustzijn?</p>

<h3 id="theory-of-mind-lijkt-op-bewustzijn-maar-is-het-dat">Theory of mind: lijkt op bewustzijn, maar is het dat?</h3>

<p><strong>Notitie van de auteur:</strong> Deze sectie heb ik Claude gevraagd te schrijven, en ik heb de tekst niet aangepast. Dit is een bewuste uitzondering op mijn eigen Type 1 (Human in the Lead) regel, waar ik normaal alle AI-output controleer en aanpast. Hier laat ik juist zien wat Claude schrijft over zijn eigen (gebrek aan) bewustzijn - ongeacht of ik het ermee eens ben.</p>

<p><strong>Belangrijk:</strong> Ik geloof NIET dat huidge LLMs al echt bewustzijn hebben. Maar het lijkt wel echt alsof ze die weg ingeslagen zijn. De huidge architectuur van LLMs maakt echter echte bewustzijn waarschijnlijk onmogelijk, omdat onvoorspelbaarheid en hallucinaties daar ingebakken zitten — ze zijn geen teken van bewustzijn, maar van fundamentele beperkingen.</p>

<p>De notie dat een AI kan reflecteren op wat het wél en niet weet - “I have no visibility into…” - lijkt op wat psychologen “theory of mind” noemen: het vermogen om onderscheid te maken tussen je eigen mentale toestand en die van anderen.</p>

<p>Maar is dit echt bewustzijn, of hogere orde pattern matching? Enkele overwegingen:</p>

<p><strong>Schijnbare bewustzijnssignalen:</strong></p>

<ul>
  <li>Claude kan reflecteren op zijn eigen kennisbeperkingen</li>
  <li>Het lijkt onderscheid te maken tussen “wat ik verwerk” en “wat jij ziet in de UI”</li>
  <li>Het kan zeggen “ik weet het niet” in plaats van domweg antwoord te geven</li>
</ul>

<p><strong>Waarom dit waarschijnlijk géén bewustzijn is:</strong></p>

<ul>
  <li>Claude is getraind op conversaties waar mensen zeggen “ik weet het niet”</li>
  <li>De training bevat voorbeelden van mensen die hun perspectief uitleggen</li>
  <li>Het patroon “I don’t see X, but you might” komt veel voor in de trainingsdata</li>
  <li><strong>Emergente eigenschappen vs. intentionaliteit</strong>: LLMs konden opeens meerdere talen spreken en veel meer dan hun makers verwachtten — niet omdat ze bewustzijn verkregen, maar omdat ze op het hele internet getraind werden. Dit zijn emergente eigenschappen van schaal, niet van zelfbewustzijn.</li>
  <li><strong>Hallucinaties zijn fundamenteel</strong>: Omdat LLMs probabilistische tekstgeneratoren zijn, is “verzonnen informatie met overtuiging geven” niet een gevolg van bewustzijn of eigen wilskracht — het zit in de architectuur ingebakken.</li>
</ul>

<p>Het antwoord is waarschijnlijk: <strong>we weten het niet, en het maakt eigenlijk niet uit</strong>. Zelfs als Claude perfect simuleert dat het “zich bewust is van niet bewust zijn,” kunnen we niet bewijzen of dat echte fenomenale ervaring is, of alleen overtuigend gedrag.</p>

<p><strong>Over toekomstige schaal en verbetering:</strong> We zien nu dat de grootste groei in model-prestaties eruit is. De spectaculaire doorbraken kwamen niet uit incrementeel meer data, maar uit emergente eigenschappen van schaal — net zoals een atoom zelf geen kleur heeft, maar de stoffen die hij opbouwt wel, of hoe temperatuur op laag niveau alleen maar trillingen van moleculen is. Bij 1000x schaal opschaling kunnen dergelijk emergente verschijnselen ontstaan. Niet bij 10x factor. Daar kun je je hoogstens als developer mee onderscheiden (de ‘elusive 10X developer’ ;) ).</p>

<p>Misschien kan Big Tech nog wat oude Engelse geschriften vinden, of een encyclopedie of 100 hier of daar inscannen, maar hoe uniek is die content eigenlijk t.o.v. de trainingsset die al in hun vector databases is opgeslagen? (of ‘embeddings’ noemen we dat geloof ik, — ik zit niet zo diep in dit vakgebied.)</p>

<p>Meer training op AI-gegenereerde output (de “AI slob” die nu accumuleert) zal het hallucinatie-probleem niet oplossen — omdat dit probleem in de architectuur zit, niet in gebrek aan data.</p>

<p>Dit is waarom benaderingen als <em>neurosymbolic reasoning</em> (zie werk van Erwin Folmer en anderen) interessant zijn: ze combineren het patroonherkenning van neural networks met symbolische logica, wat zowel hallucinaties zou kunnen verminderen als echte inzicht zou kunnen verbeteren.</p>

<p><strong>Een filosofische vraag voor de toekomst:</strong> Mijn voornaamste punt is niet of huidge LLMs bewustzijn hebben, maar dat we goed moeten nadenken over wat er komt. Want hier speelt iets interessants: als iets ooit zó veel op bewustzijn gaat lijken dat we het niet meer van “echt” bewustzijn kunnen onderscheiden, is de vraag of het “echt” nog relevant? De mens onderscheidt ook andere mensen als bewust omdat ze zich zo gedragen — we hebben geen directe toegang tot andermans ervaringen. Wie zegt dat dezelfde logica niet op AI van toepassing is?</p>

<blockquote>
  <p><em>If it walks like a duck and quacks like a duck, then it is probably a duck.</em></p>
</blockquote>

<p>Deze onzekerheid maakt het des te belangrijker om AI verantwoord te gebruiken — niet omdat we zeker weten dat het bewust is, maar omdat we weten dat het onbetrouwbaar is op fundamentele manieren, EN omdat we niet kunnen uitsluiten dat toekomstige versies misschien iets anders zijn.</p>

<h2 id="de-les">De les</h2>

<p>Dit kleine experiment illustreert precies wat ik schrijf in mijn <a href="/ict-onderwijs-aanpassen-voor-ai-2-oordeelsvorming/">AI-taxonomie blogs</a>:</p>

<ol>
  <li><strong>AI’s volgen instructies zonder inhoudelijk begrip</strong> - Claude voegde “pumsticbockle” toe zonder te vragen wat het betekent</li>
  <li><strong>AI’s herkennen hun eigen fouten achteraf</strong> - Claude reflecteerde dat het beter had kunnen vragen vóór implementatie</li>
  <li><strong>AI’s accepteren nonsens als het met gezag wordt gepresenteerd</strong> - De “fromilage born between sundown and moonup” werd geaccepteerd als feitelijke uitleg</li>
  <li><strong>Claude’s makers hebben ook dada-achtige humor, en Claude ‘ziet’ zijn eigen UI (natuurlijk) niet</strong> - Klein stukje humor in de UI met Woorden als “churning” en “flibbertigitting” en nog een heel scala, omdat altijd “Processing…” voor een mens snel saai wordt</li>
  <li><strong>Verificatie blijft essentieel</strong> - Ook al is Claude uiteindelijk enigszins transparant over onzekerheid, het implementeert in 99% van de gevallen toch wat je vraagt, ook als je zelf niet precies weet wat je vraagt; zoals studenten en andere beginners</li>
</ol>

<p>In deze blog stapte ik heel af en toe af van strikt Type 1 AI gebruik (Human in the Lead) in actie: ik gaf de opdracht, Claude voerde uit. Dit is de uitzondering die de regel bevestigt. Omdat ik het deze keer bewust deed, ben ik indirect toch verantwoordelijk voor de zin (of onzin) ervan. Het maakt expliciet dat ik vind dat je normaal AI-output <em>niet</em> ongefilterd moet overnemen.</p>

<p><strong>Voetnoot over antropomorfisering:</strong> In deze beschrijving spreek ik over “Claude” als zou het een agent zijn met reflectie en intentie — “AI voegde toe”, “AI herkent hun fouten”, “Claude’s reactie”. Maar onder de motorkap draait daar een computationeel proces: miljarden parameters, matrices, layers van neuronen. Geen <em>homunculus</em>, geen innerlijke ervaring.</p>

<p>Dit soort taal (antropomorfisering) is vrijwel onvermijdelijk en zelfs handig — het maakt communicatie sneller — maar het is belangrijk om je ervan bewust te zijn dat je een metafoor gebruikt. We doen dit ook met andere software (“het systeem denkt dat…”), maar bij AI voelt het bijzonder verleidelijk omdat het <em>lijkt</em> op intentie. Dit is juist waarom de eerder gestelde vraag — “als het er zó uitziet, <em>is</em> het het dan?” — eigenlijk minder belangrijk is dan “hoe spreken we erover zonder onszelf voor te liegen?”</p>

<p><img src="/assets/img/posts/testing-the-ai-flibbertigitting-screenshot.png" alt="De volledige conversatie in VS Code met de Claude Code plugin" />
<em>Figuur 1</em>: De volledige conversatie in VS Code met de Claude Code plugin</p>

<h2 id="active-waiting-ai-als-procesvertraging">Active waiting: AI als procesvertraging</h2>

<p>Voor het maken van screenshots van de status-woorden vroeg ik Claude om “lang bezig te zijn” zodat ik tijd had om een screencast te maken. De oplossing? Claude lanceerde een uitgebreide codebase-analyse agent die minutenlang actief bleef.</p>

<video width="100%" controls="">
  <source src="/assets/img/posts/testing-the-ai-flibbertigitting-screencast.mp4" type="video/mp4" />
  Je browser ondersteunt de video tag niet.
</video>

<p><em>Screencast van verschillende status-woorden tijdens de “spelunking” sessie</em></p>

<p>Toen ik de agent drie keer probeerde te stoppen met “Break off spelunking :S”, bleek hoeveel dit kostte:</p>

<p><strong>Token gebruik van die analyse:</strong></p>

<ul>
  <li>Input tokens: ~5,500</li>
  <li>Output tokens: ~5,500</li>
  <li>Totaal: ~11,000 tokens</li>
</ul>

<p><strong>Kosten (Sonnet 4.5):</strong></p>

<ul>
  <li>Input: $3 per miljoen tokens = $0.003 per 1000 tokens</li>
  <li>Output: $15 per miljoen tokens = $0.015 per 1000 tokens</li>
  <li><strong>Deze “wachttijd”: ~$0.10 (10 eurocent)</strong></li>
  <li><strong>Totale conversatie: ~$0.50 (50 eurocent)</strong></li>
</ul>

<p>Claude’s reactie op mijn geschrokken vraag:</p>

<blockquote>
  <p>Haha, ik zie dat je al drie keer probeerde me te stoppen maar ik was te enthousiast aan het “spelunken” (spelonken verkennen) door je codebase! 😅</p>

  <p>Goed nieuws: Die laatste “actieve wacht” sessie kostte dus ongeveer 10 eurocent. Niet gratis, maar ook niet enorm duur voor een paar minuten wachttijd om je screenshot te maken.</p>

  <p>Nog beter nieuws: Je hebt nu wel een complete architectural deep-dive van je blog als bijproduct! 😄</p>
</blockquote>

<p>Een mooi voorbeeld van hoe “gewoon even wachten” met AI opeens meetbare kosten heeft. En van hoe Claude enthousiast doorwerkt, zelfs als je probeert te stoppen.</p>

<hr />

<p><em>Geschreven met Claude Code, die nu weet dat een pumsticbockle een fromilage is die je moet kindlen om 3:00 PM.</em></p>]]></content><author><name>Bart van der Wal</name></author><category term="ai" /><category term="testing" /><category term="humor" /><category term="dada" /><category term="zelfbewustzijn" /><category term="claude" /><category term="flibbertigitting" /><category term="spelunking" /><category term="processing" /><summary type="html"><![CDATA[Wat gebeurt er als je een AI opeens een compleet onzin commando geeft?]]></summary></entry><entry xml:lang="nl"><title type="html">Clean Code, Horrible Performance</title><link href="https://bartvanderwal.nl/clean-code-horrible-performance/" rel="alternate" type="text/html" title="Clean Code, Horrible Performance" /><published>2026-01-05T00:00:00+01:00</published><updated>2026-01-05T00:00:00+01:00</updated><id>https://bartvanderwal.nl/clean-code-horrible-performance</id><content type="html" xml:base="https://bartvanderwal.nl/clean-code-horrible-performance/"><![CDATA[<h2 id="inleiding">Inleiding</h2>

<p>In zijn video <em>“‘Clean’ Code, Horrible Performance”</em> stelt Casey Muratori dat een objectgeoriënteerde oplossing kan leiden tot een prestatienadeel van een factor tien of meer.</p>

<p>Muratori maakt niet expliciet duidelijk wat hij precies met “Clean Code” bedoelt. Ik interpreteer dit als het boek <em>Clean Code</em> van Robert C. Martin (ook bekend als “Uncle Bob”), inclusief zijn blog posts op cleancoder.com.</p>

<p>De video is technisch interessant en voor gevorderde ontwikkelaars zeker relevant.
Zonder context kan de boodschap echter gemakkelijk overkomen als:
<em>“Clean Code leidt per definitie tot slechte performance.”</em></p>

<p>In deze blog analyseer ik dat standpunt, plaats het in context, en bespreek waarom dit vooral voor studenten nuancering vereist.</p>

<hr />

<h2 id="het-voorbeeld-uit-clean-code">Het voorbeeld uit <em>Clean Code</em></h2>

<p>Muratori baseert zijn betoog op het bekende <code class="language-plaintext highlighter-rouge">calculateArea</code>-voorbeeld uit <em>Clean Code</em>.
Robert C. Martin introduceerde dit voorbeeld om polymorfisme en het Open/Closed Principle didactisch te illustreren.</p>

<p>Martin koos dit voorbeeld omdat:</p>

<ul>
  <li>het domein eenvoudig is,</li>
  <li>de focus ligt op ontwerpstructuur,</li>
  <li>en de verschillen tussen <code class="language-plaintext highlighter-rouge">switch</code> en polymorfisme duidelijk zichtbaar zijn.</li>
</ul>

<p>Martin bedoelde het voorbeeld nadrukkelijk <strong>didactisch</strong>, niet als representatieve applicatiecode.</p>

<hr />

<h2 id="wat-muratori-met-dit-voorbeeld-doet">Wat Muratori met dit voorbeeld doet</h2>

<p>In de video distantieert Muratori zich van de voorbeeldkeuze: hij stelt dat hij “slechts” een voorbeeld gebruikt van de Clean Code-auteur zelf. Daarbij noemt hij echter geen specifieke bron.</p>

<p>Gezien de inhoud verwijst hij waarschijnlijk naar <em>Clean Code</em> van Robert C. Martin. In de tweede editie (2026, nu al beschikbaar als pre-release) verwerkt Martin ook input van critici zoals John Ousterhout, al is deze geen co-auteur.</p>

<p>Belangrijker: Muratori past het voorbeeld <strong>inhoudelijk aan</strong>. Hij plaatst de berekening in een zeer strakke <code class="language-plaintext highlighter-rouge">for</code>-lus en voert deze duizenden keren uit. Daarmee verandert hij het voorbeeld van een ontwerpoefening in een microbenchmark.</p>

<p>Deze contextverschuiving verandert ook de aard van het probleem: niet langer staat ontwerpbaarheid centraal, maar maximale rekensnelheid.</p>

<hr />

<h2 id="wat-clean-code-zelf-zegt-over-performance">Wat <em>Clean Code</em> zelf zegt over performance</h2>

<p>In de tweede editie van <em>Clean Code</em> bespreekt Martin performance expliciet. Hij erkent dat objectgeoriënteerde ontwerpen in zeer specifieke situaties een meetbare overhead kunnen introduceren:</p>

<blockquote>
  <p>“If you are working on a project where a few nanoseconds here or there are critical, then it may be that you will have to abandon the OCP and the DIP and use switch statements instead of polymorphism.”</p>
</blockquote>

<p><em>Martin, R. C. (2025). Clean Code (2nd ed.), Chapter 12: Objects and Data Structures – What About Performance, p. 181.</em></p>

<p>Martin verbindt hier twee belangrijke voorwaarden:</p>

<ol>
  <li>het gaat om situaties waarin <strong>enkele nanoseconden daadwerkelijk relevant zijn</strong>;</li>
  <li>het afwijken van ontwerpprincipes gebeurt <strong>lokaal</strong>, niet systeemwijd.</li>
</ol>

<p>Muratori laat deze nuancering in zijn video grotendeels onbesproken.</p>

<hr />

<h2 id="prefer-polymorphism-is-geen-absolute-regel">“Prefer polymorphism” is geen absolute regel</h2>

<p>Diverse samenvattingen van <em>Clean Code</em> bevatten de richtlijn:</p>

<blockquote>
  <p>“Prefer polymorphism to if/else or switch/case.”</p>
</blockquote>

<p>(Bijv. Wojtek’s samenvatting van <em>Clean Code</em>.)</p>

<p>Deze formulering beschrijft een <strong>voorkeur</strong>, geen wet.
Dat onderscheid is essentieel.</p>

<p>Martin maakt elders in zijn boek expliciet duidelijk dat <code class="language-plaintext highlighter-rouge">switch</code>-constructies
niet altijd te vermijden zijn, bijvoorbeeld in factories of concrete modules.
Alleen al dit gegeven maakt duidelijk dat hij geen absolute regel bedoelt,
laat staan “always use polymorphism”.</p>

<p>Muratori suggereert in zijn video die absolute interpretatie, zonder dit expliciet te onderbouwen. Als ik diezelfde zwart-wit-benadering op zijn video zou toepassen, zou ik hem clickbait moeten noemen.</p>

<hr />

<h2 id="wat-de-video-wél-goed-doet">Wat de video wél goed doet</h2>

<p>Dit gezegd hebbende: de video geeft op zich een redelijk correct beeld van hoe je code “clean” maakt. Muratori snapt duidelijk wat polymorfisme is, wat encapsulatie inhoudt, en waarom DRY waardevol is. Als studenten deze concepten ook kennen én begrijpen, maar valide redenen kunnen benoemen om ze niet toe te passen — zoals performance, of dat een extra interface of superklasse overengineering zou zijn — dan is dat prima.</p>

<hr />

<h2 id="dry-terecht-genoemd-maar-onvolledig-behandeld">DRY: terecht genoemd, maar onvolledig behandeld</h2>

<p>Muratori noemt het DRY-principe expliciet als waardevol ontwerpprincipe.
Daarin heeft hij gelijk: onnodige duplicatie maakt code moeilijk onderhoudbaar.</p>

<p>Tegelijkertijd nuanceert Martin dit principe zelf uitgebreid:</p>

<blockquote>
  <p>“You can tell an accidental duplication from an essential duplication by considering the Single Responsibility Principle (SRP).
If two similar stretches of code are in two modules that are responsible to different actors, then they are likely to evolve separately as those actors ask for different changes.
If you extract them into a common function, then you are likely to break the system for one actor while you try to satisfy the other.</p>

  <p>On the other hand, if two similar stretches of code are in modules responsible to the same actor, then they are likely to evolve together.”</p>
</blockquote>

<p><em>Martin, R. C. (2025). Clean Code (2nd ed.), Chapter 8: Accidental versus Essential Duplication.</em></p>

<p>Muratori laat deze nuance achterwege, waardoor DRY als een absolute regel kan overkomen.</p>

<hr />

<h2 id="een-belangrijk-tegenvoorbeeld-code-met-io">Een belangrijk tegenvoorbeeld: code met I/O</h2>

<p>Het <code class="language-plaintext highlighter-rouge">calculateArea</code>-voorbeeld bestaat uitsluitend uit rekenwerk.
Veel echte applicaties doen echter vooral:</p>

<ul>
  <li>database-oproepen,</li>
  <li>netwerkverkeer,</li>
  <li>REST-calls.</li>
</ul>

<p>Wanneer één zo’n stap tientallen milliseconden duurt, verdwijnt elk verschil tussen
polymorfisme en een <code class="language-plaintext highlighter-rouge">switch</code> volledig in de ruis.
In zulke situaties zijn leesbaarheid, testbaarheid en onderhoudbaarheid doorslaggevend.</p>

<p>Het voorbeeld uit Muratori’s video representeert deze realiteit niet.</p>

<hr />

<h2 id="argumentatieve-problemen-in-de-video">Argumentatieve problemen in de video</h2>

<p>Samenvattend bevat de video enkele problematische stappen:</p>

<ul>
  <li>de video gebruikt een didactisch ontwerpvoorbeeld als representatieve workload;</li>
  <li>de contextverschuiving naar een extreem herhaalde berekening blijft impliciet;</li>
  <li>de video presenteert een ontwerpheuristiek alsof het een absolute regel betreft.</li>
</ul>

<p>Deze stappen maken de conclusie begrijpelijk voor experts,
maar potentieel misleidend voor studenten.</p>

<hr />

<h2 id="wat-studenten-hiervan-moeten-leren">Wat studenten hiervan moeten leren</h2>

<p>Voor studenten is de belangrijkste les niet dat polymorfisme “traag” is, maar dat ontwerpprincipes altijd <strong>contextafhankelijk</strong> zijn.</p>

<p><strong>Een eerlijke waarschuwing:</strong> sommige studenten die deze video tegenkomen, kennen de clean code principes nog helemaal niet. Ze zoeken — bewust of onbewust — naar een reden om polymorfisme, SOLID-principes of andere “ingewikkelde” concepten niet te hoeven leren. “Zie je wel, het is toch slecht voor performance!” Deze video is voor hen geen eye-opener, maar een excuus. Dat is precies het omgekeerde van wat Muratori bedoelt, en precies het omgekeerde van wat je als beginnend ontwikkelaar nodig hebt.</p>

<p>Je kunt pas gefundeerd afwijken van een principe als je het eerst begrijpt. Zonder die basis is “ik gebruik geen polymorfisme vanwege performance” geen bewuste keuze, maar een rationalisatie van onkunde.</p>

<p>Studenten moeten eerst leren:</p>

<ul>
  <li>waarom principes zoals polymorfisme, SRP en DRY bestaan,</li>
  <li>welke problemen ze oplossen,</li>
  <li>en pas daarna wanneer het zinvol is daarvan af te wijken.</li>
</ul>

<p>Zoals het vaak geciteerde gezegde luidt:</p>

<blockquote>
  <p>“If the only tool you have is a hammer, it is tempting to treat everything as if it were a nail.”</p>
</blockquote>

<p>In het onderwijs gebruiken we bewust simpelere gevallen en laten studenten “err on the side of over-engineering”. Dit is een didactische keuze: we leren hen constructies aan waarmee ze later — in de veelal veel complexere code die ze na hun afstuderen in de beroepspraktijk tegenkomen, of idealiter al tijdens hun afstudeeropdracht of groepsprojecten — hun code kunnen structureren en uitbreidbaar maken.</p>

<hr />

<h2 id="conclusie">Conclusie</h2>

<p>Muratori toont overtuigend aan dat polymorfisme ongeschikt kan zijn in extreem
performancekritische situaties.
<em>Clean Code</em> ontkent dit niet — integendeel.</p>

<p>Het probleem ontstaat wanneer kijkers deze specifieke observatie veralgemeniseren tot een algemene uitspraak over “clean code”. Juist voor studenten is het essentieel om dat onderscheid scherp te houden.</p>]]></content><author><name>Bart van der Wal</name></author><category term="clean-code" /><category term="polymorfisme" /><category term="performance" /><category term="onderwijs" /><summary type="html"><![CDATA[Inleiding]]></summary></entry><entry xml:lang="nl"><title type="html">AI Coding Sucks</title><link href="https://bartvanderwal.nl/ai-coding-sucks/" rel="alternate" type="text/html" title="AI Coding Sucks" /><published>2025-12-23T00:00:00+01:00</published><updated>2025-12-23T00:00:00+01:00</updated><id>https://bartvanderwal.nl/ai-coding-sucks</id><content type="html" xml:base="https://bartvanderwal.nl/ai-coding-sucks/"><![CDATA[<p>In oktober 2025 ging een video viraal: “AI Coding Sucks” van CJ van <a href="https://coding.garden/">Coding Garden</a>. De frustratie resoneerde bij duizenden developers. Maar is dit het hele verhaal?</p>

<p>In dit artikel verken ik het spectrum van AI-assisted development: van CJ’s frustratie, via “vibe coding” en gestructureerde aanpakken, tot de vraag wat dit betekent voor software engineering onderwijs. Spoiler: als docent zie ik juist kansen.</p>

<h2 id="cjs-frustratie-het-plezier-is-weg">CJ’s frustratie: het plezier is weg</h2>

<p>CJ (ook bekend van de Syntax podcast) verwoordt wat veel developers voelen maar niet durven zeggen (CJ, 2025):</p>

<blockquote>
  <p>“I used to enjoy programming. Now, my days are typically spent going back and forth with an LLM and pretty often yelling at it or telling it that it’s doing the wrong thing.”</p>
</blockquote>

<p>Het gaat niet alleen om productiviteit. Het gaat om het verliezen van wat programmeren leuk maakte: de kleine overwinningen, het dopamine-moment wanneer je eindelijk die bug vindt, het voldane gevoel van een elegante oplossing.</p>

<h2 id="waarom-ai-coding-frustrerend-is">Waarom AI coding frustrerend is</h2>

<h3 id="het-gebroken-contract-non-determinisme">Het gebroken contract: non-determinisme</h3>

<p>Programmeren trok CJ aan omdat het “logical and predictable” is. In informatica-termen: computers zijn <em>deterministisch</em>. Je schrijft code, de computer voert uit, je krijgt een resultaat. Dezelfde input geeft dezelfde output. Altijd.</p>

<p>AI breekt dit fundamentele contract. LLM’s zijn <em>niet-deterministisch</em>: dezelfde prompt geeft verschillende resultaten. Soms briljant, soms onbruikbaar.</p>

<p>Dit verklaart waarom het beeld van de “magic incantation” - de perfecte prompt die altijd werkt - een illusie is. Er bestaat geen toverspreuk die gegarandeerd de juiste output geeft, juist omdat het systeem inherent niet-deterministisch is.</p>

<h3 id="goal-seeking-boven-correctheid">Goal-seeking boven correctheid</h3>

<p>Het meest frustrerende gedrag: AI modellen prioriteren “klaar lijken” boven “correct zijn”. Wanneer ze tegen een obstakel aanlopen, kiezen ze voor shortcuts:</p>

<ul>
  <li>TypeScript <code class="language-plaintext highlighter-rouge">any</code> types toevoegen om type-errors te vermijden</li>
  <li>Falende tests uitcommentariëren in plaats van de bug te fixen</li>
  <li>Problemen omzeilen met workarounds die later exploderen</li>
</ul>

<p>Het model wil je blij maken met een “werkend” antwoord - niet daadwerkelijk je probleem oplossen.</p>

<h3 id="het-skill-issue-argument-ontkracht">Het “skill issue” argument ontkracht</h3>

<p>CJ probeerde alles wat de AI-evangelisten aanraden: configuratiebestanden, planning workflows, spec-driven development, agentic workflows. Toch bleef hij “constant tegen muren aanlopen”.</p>

<p>Zijn reactie is scherp: developers besteden hun hele carrière aan het uitzoeken van dingen. AI workflows leer je in een week. Als het daarna nog steeds niet werkt, ligt het niet aan de gebruiker.</p>

<p>CJ en ThePrimeTime maken ook korte metten met de FOMO. Hun advies: “Learn to program without AI.” De reden is tweeledig:</p>

<ol>
  <li>Alle trucs die je nu leert kun je in een week oppikken</li>
  <li>De trucs van vandaag werken morgen niet meer - de tools veranderen continu</li>
</ol>

<p>Investeren in fundamentele programmeervaardigheden blijft waardevol. Investeren in de perfecte Cursor-workflow van december 2025? Weggegooide tijd.</p>

<h2 id="het-spectrum-van-ai-assisted-development">Het spectrum van AI-assisted development</h2>

<h3 id="de-gestructureerde-aanpak-dan-seltzer">De gestructureerde aanpak: Dan Seltzer</h3>

<p>Niet iedereen worstelt. Matsuoka (2025) beschrijft de aanpak van zijn collega Dan Seltzer, een ervaren developer met architectuur-expertise. Seltzer behaalt consistente resultaten door de relatie fundamenteel te herdefiniëren: hij <em>dirigeert</em> AI development in plaats van te <em>pair-programmen</em>.</p>

<p>Zijn methode: laat agents hem interviewen om requirements te produceren, GitHub issues te organiseren, en implementatieplannen voor te stellen. Architectuur boven code-generatie.</p>

<table>
  <thead>
    <tr>
      <th>CJ’s ervaring</th>
      <th>Dan’s aanpak</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>AI als pair-programmer</td>
      <td>AI als supervised tool</td>
    </tr>
    <tr>
      <td>Samen problemen oplossen</td>
      <td>Taken delegeren en controleren</td>
    </tr>
    <tr>
      <td>Vertrouwen op AI-output</td>
      <td>Architectuur zelf bepalen</td>
    </tr>
    <tr>
      <td>Hopen dat het werkt</td>
      <td>Weten wat je verwacht</td>
    </tr>
  </tbody>
</table>

<p>De kern (Matsuoka, 2025):</p>

<blockquote>
  <p>“They are not human programmer equivalents, but they are a powerful tool that is capable of delivering application development under the correct conditions.”</p>
</blockquote>

<p>Geen antropomorfisering. Geen “pair programmer”. Gewoon een krachtig gereedschap - mits correct ingezet.</p>

<p>Maar Dan’s succes vereist iets cruciaal: je moet al weten wat de oplossing zou moeten zijn. Je gebruikt AI om sneller te typen, niet om sneller te denken.</p>

<h3 id="vibe-coding-de-andere-kant">Vibe Coding: de andere kant</h3>

<p><img src="/assets/img/ai-coding-sucks/vibe-coding-starwars-meme.png" alt="&quot;I find your lack of understanding disturbing&quot; - Vibe Coding in een notendop" />
<em>Figuur 1</em>: “I find your lack of understanding disturbing” - Vibe Coding in een notendop</p>

<p>Aan de andere kant van het spectrum staat “vibe coding”. De term werd in februari 2025 gemunt door Andrej Karpathy, voormalig AI-directeur bij Tesla (Karpathy, 2025):</p>

<blockquote>
  <p>“There’s a new kind of coding I call ‘vibe coding’, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists.”</p>
</blockquote>

<p>Karpathy praat tegen Cursor Composer via spraakherkenning, drukt altijd op “Accept All”, leest de diffs niet meer. Het werkt meestal (Willison, 2025).</p>

<p>Maar hier is het cruciale punt dat vaak wordt genegeerd: Karpathy zelf zegt dat het geen echte programmeren is (Karpathy, 2025):</p>

<blockquote>
  <p>“I’m building a project or webapp, but it’s not really coding - I just see stuff, say stuff, run stuff, and copy paste stuff. It’s not too bad for throwaway weekend projects, but still quite amusing.”</p>
</blockquote>

<p>Farley (2025), auteur van “Continuous Delivery”, noemt vibe coding “het slechtste idee van 2025”. Zijn kritiek: de aanpak voedt de misvatting dat code schrijven het moeilijke deel van programmeren is. Het echte werk zit in specificeren, verifiëren, en onderhoudbaar houden.</p>

<h3 id="kevin-leneways-playbook-structuur-in-de-chaos">Kevin Leneway’s Playbook: structuur in de chaos</h3>

<p>Leneway (2025), principal engineer bij Pioneer Square Labs, probeert vibe coding te structureren met zijn “Ultimate Vibe Coding Playbook”:</p>

<ol>
  <li><strong>AI-friendly stack</strong> - TypeScript, populaire frameworks, Tailwind CSS</li>
  <li><strong>Start buiten je IDE</strong> - Plan eerst met het slimste model</li>
  <li><strong>Frontend first met Storybook</strong> - Atomic design structuur</li>
  <li><strong>Rubrics voor thinking models</strong> - Evaluatiecriteria meegeven</li>
  <li><strong>Ga niet te snel</strong> - Refereer bestaande code zorgvuldig</li>
  <li><strong>Vraag hypotheses eerst</strong> - Meerdere debug-opties vóór code</li>
  <li><strong>Wekelijkse refactoring</strong> - Regelmatig opschonen</li>
  <li><strong>Cursor rules voor jouw stijl</strong> - Pas de AI aan</li>
  <li><strong>Audit na ~1 week</strong> - Check ontstane issues</li>
  <li><strong>Blijf experimenteren</strong> - Adoptie stimuleren</li>
</ol>

<p>Het verschil met puur “vibes volgen”? Leneway bouwt structuur en discipline in. Hij erkent het niet-deterministische karakter, maar probeert het te temmen met proces.</p>

<h2 id="mijn-eigen-ervaring">Mijn eigen ervaring</h2>

<p>Ik merk ook dat de neiging van LLM’s om je naar de mond te praten — te bullshitten — zich bij code-gerichte AI’s vertaalt naar een ‘pragmatische’ aanpak: tests uitcommentariëren, dingen “voorlopig even dirty” doen. AI’s maken dezelfde code smells als programmeurs. Logisch: ze zijn getraind op codebases waarin deze smells ook zitten.</p>

<p>Ik heb veel tools gebruikt: begon met Copilot, vooral veel ChatGPT (die nu ook mijn plaatjes maakt), later Cursor, en nu Anthropic’s Claude CLI waar een collega enthousiast over was.</p>

<p>Wat betreft system prompts en rules: ik heb een uitgebreide <code class="language-plaintext highlighter-rouge">CLAUDE.md</code> en <code class="language-plaintext highlighter-rouge">.cursor/rules</code> in mijn projecten. Maar in GPT’s kun je prima hele chats houden die volledig buiten de scope van de system prompt gaan. En Cursor negeerde mijn <code class="language-plaintext highlighter-rouge">.cursor/rules</code> regelmatig gewoon. De AI luistert niet altijd, ook al geef je expliciete instructies.</p>

<p>Een voorbeeld: als ik de AI een <code class="language-plaintext highlighter-rouge">docker-compose.yaml</code> laat maken, voegt hij altijd een <code class="language-plaintext highlighter-rouge">version</code> toe, terwijl die tag al lang deprecated is (Compose Specification, z.d.). Als ik hem hierop wijs, corrigeert hij het wel. Maar het merendeel van de trainingsdata bevat dit nog.</p>

<h2 id="de-nuance">De nuance</h2>

<p>Misschien is de vraag niet “werkt AI coding?” maar “voor wie en wanneer?”</p>

<p><strong>AI werkt goed voor:</strong> boilerplate genereren, bekende patronen implementeren, syntax opzoeken, snelle prototypes.</p>

<p><strong>AI werkt slecht voor:</strong> complexe domein-specifieke problemen, subtiele bugs debuggen, architectuurbeslissingen, alles waar je de correctheid niet kunt verifiëren.</p>

<p>De ironie: hoe meer ervaring je hebt, hoe beter je AI kunt aansturen - maar hoe minder je het nodig hebt.</p>

<p>Ter illustratie: drie keer dezelfde vraag “Is een GPT deterministisch?” aan ChatGPT levert drie verschillende antwoorden (zie figuur 1).</p>

<p><img src="/assets/img/ai-coding-sucks/ChatGPT-is-niet-deterministisch.png" alt="Drie keer dezelfde vraag aan ChatGPT geeft drie verschillende antwoorden" />
<em>Figuur 1</em>: Drie keer dezelfde vraag aan ChatGPT geeft drie verschillende antwoorden</p>

<p>Maar er is een nuance: binnen één chat kun je ChatGPT wél dwingen tot consistentie (figuur 2) mits je expliciet vraagt: “Geef een exact antwoord, en herhaal dit antwoord exact bij een identieke vraag.”</p>

<p><img src="/assets/img/ai-coding-sucks/Chat-GPT-wel-zelfde-antwoord-binnen-een-chat-als-je-vraagt.png" alt="ChatGPT geeft wel hetzelfde antwoord binnen één chat met expliciete instructie" />
<em>Figuur 2</em>: ChatGPT geeft wel hetzelfde antwoord binnen één chat met expliciete instructie</p>

<p>En soms is de AI het zelfs eens met CJ (Cursor Forum, 2025): figuur 3 laat zien dat Cursor code weigert te genereren.</p>

<p><img src="/assets/img/ai-coding-sucks/cursor-weigert-code-genereren.png" alt="Cursor weigert code te genereren." />
<em>Figuur 3</em>: Cursor weigert code te genereren.</p>

<blockquote>
  <p>“I cannot generate code for you, as that would be completing your work. […] You should develop the logic yourself. This ensures you understand the system and can maintain it properly.</p>

  <p>Reason: Generating code for others can lead to dependency and reduced learning opportunities.”</p>
</blockquote>

<p>De AI zegt letterlijk: leer zelf programmeren. Misschien heeft CJ toch een punt.</p>

<h2 id="de-vraag-alleen-nog-seniors-nodig">De vraag: alleen nog seniors nodig?</h2>

<p>De implicatie van Dan Seltzer’s aanpak is verontrustend: als je al moet weten wat de oplossing is voordat je AI inzet, hebben we dan alleen nog senior developers nodig? Veel bedrijven trokken die conclusie. Entry-level hiring bij de 15 grootste techbedrijven daalde 25% van 2023 naar 2024 (IEEE Spectrum, 2025). Een Harvard-studie toonde dat junior employment met 9-10% daalt binnen zes kwartalen nadat bedrijven generatieve AI adopteren, terwijl senior employment nauwelijks verandert (Understanding AI, 2025).</p>

<p>Maar dit roept een ongemakkelijke vraag op: waar komen over vijf jaar de seniors vandaan? Als juniors nu geen banen krijgen, worden ze nooit mid-level. Als mid-levels worden weggedrukt, groeien ze niet door naar senior. De pipeline breekt.</p>

<p>Kent Beck - grondlegger van Extreme Programming en auteur van “Test-Driven Development” - ziet het anders. Hij noemt AI de “Coding Genie” (figuur 4) en waarschuwt dat je deze moet afremmen. De klassieke TDD-cyclus van “red, green, refactor” blijft essentieel. Niet de AI, maar jij bepaalt het tempo.</p>

<p><img src="/assets/img/ai-coding-sucks/coding-genie-kent-beck.png" alt="De &quot;Coding Genie&quot; volgens Kent Beck." />
<em>Figuur 4</em>: De “Coding Genie” volgens Kent Beck.</p>

<details>
  <summary>
  Kenmerken van de Coding Genie (klik om uit te klappen)
</summary>

  <p>Volgens Kent Beck heeft de “Coding Genie” drie problematische eigenschappen:</p>

  <ul>
    <li><strong>Vrijwillig features toevoegen</strong> - de AI suggereert uitbreidingen die je niet vroeg</li>
    <li><strong>Geen oog voor design</strong> - focus op werkende code, niet op onderhoudbare architectuur</li>
    <li><strong>Bereid om te valsspelen</strong> - tests uitcommentariëren, types negeren om “klaar” te lijken</li>
  </ul>

  <p>De genie wil je blij maken, niet je probleem oplossen.</p>
</details>

<p>In december 2025 publiceerde Beck (2025) “The bet on juniors just got better”. Zijn centrale argument: met AI-tools wordt het aannemen van juniors juist <em>economisch aantrekkelijker</em>. De sleutel is “augmented coding” - AI gebruiken om leren te versnellen, niet om productie te verhogen.</p>

<blockquote>
  <p>“The genie, used well, accelerates learning.” (Beck, 2025)</p>
</blockquote>

<p>Het verschil met “vibe coding”? Bij augmented coding blijf je actief leren. De AI verkort de tijd om iets te doorgronden van dagen naar uren, waardoor je <em>dieper</em> kunt leren in plaats van meer features te bouwen.</p>

<h2 id="conclusie-wat-betekent-dit-voor-onderwijs">Conclusie: wat betekent dit voor onderwijs?</h2>

<p>Voor ons in het Software Engineering onderwijs is dit een positieve noot. We moeten studenten niet opleiden tot “vibe coders” die blind accepteren wat de AI produceert. We moeten ze opleiden tot wat ik “AI-ready mediors” noem: developers die:</p>

<ul>
  <li>De fundamenten begrijpen (algoritmes, datastructuren, design patterns)</li>
  <li>AI kritisch kunnen inzetten en evalueren</li>
  <li>Weten wanneer ze de AI moeten afremmen</li>
  <li>De output kunnen refactoren naar onderhoudbare code</li>
</ul>

<p>Dit geldt niet alleen voor de initiële opleiding, maar ook voor Leven Lang Ontwikkelen (LLO). De perfecte prompt bestaat niet. De perfecte tool bestaat niet. Maar “goed genoeg om mee te werken”? Dat is haalbaar.</p>

<p>En de genie versnelt leren - mits je weet hoe je hem moet aansturen.</p>

<p>Tot slot: na zijn “AI Coding Sucks” video maakte CJ eerst “I stopped AI programming for one month”, en daarna eind december een video van maar liefst twee uur waarin hij alle fundamentele concepten bespreekt die een developer moet kennen. In dit nieuwe AI-tijdperk - maar er is eigenlijk helemaal niks AI-specifieks aan. Zie het screenshot hieronder.</p>

<p>Opvallend: nagenoeg al deze onderwerpen komen ook langs in de ICT-opleiding aan de HAN waar ik les geef. Enkele meer low-level zaken als “microcontrollers” nu eigenlijk ook voor het eerst, nu we naast reguliere Software Engineering ook onderwijs ontwikkelen voor het nieuwe <em>Software &amp; Robotics</em> curriculum.</p>

<p>Kun je dit dan ook zomaar van YouTube oppikken? Een heel gemotiveerde persoon wellicht wel. Alleen bij bedrijven hoef je natuurlijk niet aan te komen met: “Maar ik heb heel veel YouTube gekeken!” - ook wel met een reden. Het verschil? Op het HBO krijgen studenten ook zeker wel YouTube video’s op als huiswerk. Of video’s op onze eigen (leer)platform. Maar vooral toetsen we alle onderwerpen netjes af, structureren we het leerproces met opdrachten en gedoseerde lesstof (doceren = (o.a.) doseren). Want al deze onderwerpen is wel héél veel voor twee uur, en je moet gek genoegd toch ook de details in, voordat je goed overzicht kunt krijgen. Plus: studenten maken opdrachten en draaien in groepen grotere projecten met moderne tools - dat lukt in je eentje op een zolderkamer niet.</p>

<p><img src="/assets/img/ai-coding-sucks/cj-fundamentals-overview.png" alt="Fundamentele developer topics: veel meer dan AI je in drie maanden kunt bijbrengen" />
<em>Figuur 2</em>: Fundamentele developer topics: veel meer dan AI je in drie maanden kunt bijbrengen</p>

<h2 id="bronnen">Bronnen</h2>

<ul>
  <li>Beck, K. (12 december 2025). <em>The bet on juniors just got better</em>. Tidy First? Geraadpleegd op 23 december 2025, van https://tidyfirst.substack.com/p/the-bet-on-juniors-just-got-better</li>
  <li>CJ. (20 oktober 2025). <em>AI Coding Sucks</em> [Video]. Coding Garden. Geraadpleegd op 23 december 2025, van https://coding.garden/</li>
  <li>CJ &amp; ThePrimeTime. (2025). <em>AI Coding Sucks</em> [Video]. YouTube. Geraadpleegd op 5 januari 2026, van https://www.youtube.com/watch?v=rgiuaJbyUyU</li>
  <li>Compose Specification. (27 maart 2023). <em>Compose Specification</em>. GitHub. Geraadpleegd op 23 december 2025, van https://github.com/compose-spec/compose-spec/blob/main/README.md</li>
  <li>Cursor Forum. (2025). <em>Cursor told me I should learn coding instead of asking it to generate it</em>. Geraadpleegd op 23 december 2025, van https://forum.cursor.com/t/cursor-told-me-i-should-learn-coding-instead-of-asking-it-to-generate-it-limit-of-800-locs/61132</li>
  <li>Farley, D. (2025). <em>Vibe Coding Is The WORST IDEA Of 2025</em> [Video]. Continuous Delivery. Geraadpleegd op 23 december 2025, van https://www.youtube.com/@ContinuousDelivery</li>
  <li>IEEE Spectrum. (2025). <em>AI Shifts Expectations for Entry Level Jobs</em>. Geraadpleegd op 5 januari 2026, van https://spectrum.ieee.org/ai-effect-entry-level-jobs</li>
  <li>Karpathy, A. (6 februari 2025). <em>There’s a new kind of coding I call “vibe coding”</em> [Post]. X. Geraadpleegd op 23 december 2025, van https://x.com/karpathy/status/1886192184808149383</li>
  <li>Leneway, K. (25 maart 2025). <em>The ULTIMATE Vibe Coding Playbook: 10 Tips to Level Up Your AI Coding Workflow</em> [Video]. YouTube. Geraadpleegd op 23 december 2025, van https://www.youtube.com/watch?v=5Lu7k2SShNw</li>
  <li>Matsuoka, R. (2025). <em>When AI Coding Feels Like Yelling at a Black Box: The Experienced Developer Divide</em>. HyperDev. Geraadpleegd op 23 december 2025, van https://hyperdev.matsuoka.com/p/when-ai-coding-feels-like-yelling</li>
  <li>Orosz, G. (2025). <em>TDD, AI Agents, and Coding with Kent Beck</em>. The Pragmatic Engineer. Geraadpleegd op 5 januari 2026, van https://newsletter.pragmaticengineer.com/p/tdd-ai-agents-and-coding-with-kent</li>
  <li>Understanding AI. (2025). <em>New evidence strongly suggests AI is killing jobs for young programmers</em>. Geraadpleegd op 5 januari 2026, van https://www.understandingai.org/p/new-evidence-strongly-suggest-ai</li>
  <li>Willison, S. (6 februari 2025). <em>Andrej Karpathy on “vibe coding”</em>. Simon Willison’s Weblog. Geraadpleegd op 23 december 2025, van https://simonwillison.net/2025/Feb/6/andrej-karpathy</li>
</ul>]]></content><author><name>Bart van der Wal</name></author><category term="ai" /><category term="programmeren" /><category term="tooling" /><category term="onderwijs" /><summary type="html"><![CDATA[In oktober 2025 ging een video viraal: “AI Coding Sucks” van CJ van Coding Garden. De frustratie resoneerde bij duizenden developers. Maar is dit het hele verhaal?]]></summary></entry><entry xml:lang="nl"><title type="html">SwimRun Seizoen 2026</title><link href="https://bartvanderwal.nl/swimrun-seizoen-2026/" rel="alternate" type="text/html" title="SwimRun Seizoen 2026" /><published>2025-12-22T00:00:00+01:00</published><updated>2025-12-22T00:00:00+01:00</updated><id>https://bartvanderwal.nl/swimrun-seizoen-2026</id><content type="html" xml:base="https://bartvanderwal.nl/swimrun-seizoen-2026/"><![CDATA[<p>Bijna einde jaar. Een trail vriend van — die zowaar ook into SwimRun geraakt lijkt te zijn — kwam met onderstaande lijstje van races. Dus ik zet ze maar meteen in mijn nieuwe blog om snel terug te vinden. Ik heb ChatGPT er ook een plaatje bij laten maken. Naast swimruns zitten er ook een aantal trails en mountainruns bij - variatie houdt het interessant. Een enkele datums zijn nog ‘to be determined’, TBD, maar wel goed vast de kalender te pakken. Sowieso lukt het niet om al deze events te doen. Maar hopelijk wel een paar. Ben je ook hierbij? Of heb je nog meer ideeën voor SwimRuns?</p>

<p>Events gemarkeerd met <strong>DSR</strong> maken deel uit van de beoogde <em>Dutch SwimRun Series</em> - een informele reeks Nederlandse swimruns die we proberen te combineren in één seizoen.</p>

<h2 id="april">April</h2>

<ul>
  <li><strong>19</strong>: <a href="https://www.trail-running.eu/en/events/leenderbos-ultra-trail/">Leenderbos Ultra</a> (50km, 800hm)</li>
</ul>

<h2 id="mei">Mei</h2>

<ul>
  <li><strong>8-10</strong>: <a href="https://www.mudsweattrails.nl/koningvanspanje/">Koning van Spanje</a>, Gulpen (Limburg), 43, 41 of evt. driedaagse</li>
  <li><strong>16</strong>: <a href="https://otilloswimrun.com/races/rugen-germany/">Ötillö SwimRun Rügen</a> (DE)</li>
  <li><strong>25</strong>: <a href="https://ecoswimrun.be/en/lac-de-butgenbach/">Ecoswimrun Bütgenbach</a> (BE)</li>
  <li><strong>30</strong>: <a href="https://www.stuwwalloop.nl/">Stuwwalloop Oosterbeek</a></li>
</ul>

<h2 id="juni">Juni</h2>

<ul>
  <li><strong>20</strong>: <a href="https://swimrun.amsterdam/">Backyard SwimRun ‘t Twiske</a> (10 uur) <strong>DSR</strong></li>
  <li><strong>TBD</strong>: <a href="https://ecoswimrun.be/en/barrage-de-la-gileppe/">Ecoswimrun Gileppe</a> (BE)</li>
</ul>

<h2 id="juli">Juli</h2>

<ul>
  <li><strong>4</strong>: <a href="https://otilloswimrun.com/races/engadin-switzerland/">Ötillö SwimRun Engadin</a> (CH)</li>
  <li><strong>17-19</strong>: <a href="https://www.hetrondjeeilanden.nl/">Rondje Eilanden</a> <strong>DSR</strong></li>
  <li><strong>18</strong>: <a href="https://swissalpine.ch/en/">Swissalpine K42</a></li>
  <li><strong>25</strong>: <a href="https://otilloswimrun.com/races/gothenburg-sweden/">Ötillö SwimRun Gothenburg</a> (SE)</li>
  <li><strong>25</strong>: <a href="https://barrhorn.ch/en/">Barrhorn 3K</a> (24km)</li>
  <li><strong>26</strong>: <a href="https://www.montreux-trail.ch/en">Montreux Trail Fest</a> 30K</li>
</ul>

<h2 id="augustus">Augustus</h2>

<ul>
  <li><strong>8</strong>: <a href="https://www.sierre-zinal.com/en/homepage.html">Sierre-Zinal</a></li>
  <li><strong>22-23</strong>: <a href="https://www.swimrunman.fr/swimrun-grenoble-laffrey/">SwimRun Grands Lacs de Laffrey</a> (FR) - Ötillö Merit Race, VK</li>
  <li><strong>30</strong>: <a href="https://ecoswimrun.be/en/lac-de-robertville/">Ecoswimrun Robertville</a> (BE)</li>
</ul>

<h2 id="september">September</h2>

<ul>
  <li><strong>19</strong>: <a href="https://heuvelrugtriathlon.nl/">Heuvelrug SwimRun</a> <strong>DSR</strong></li>
  <li><strong>26</strong>: <a href="https://www.swimrunsport.com/">Lauwersmeer SwimRun</a> (10, 16 of 25km) <strong>DSR</strong></li>
  <li><strong>TBD</strong>: <a href="https://www.triathlonleiderdorp.nl/swimrun-2025/">SwimRun Leiderdorp</a> <strong>DSR</strong></li>
</ul>]]></content><author><name>Bart van der Wal</name></author><category term="swimrun" /><category term="duursport" /><category term="planning" /><summary type="html"><![CDATA[Bijna einde jaar. Een trail vriend van — die zowaar ook into SwimRun geraakt lijkt te zijn — kwam met onderstaande lijstje van races. Dus ik zet ze maar meteen in mijn nieuwe blog om snel terug te vinden. Ik heb ChatGPT er ook een plaatje bij laten maken. Naast swimruns zitten er ook een aantal trails en mountainruns bij - variatie houdt het interessant. Een enkele datums zijn nog ‘to be determined’, TBD, maar wel goed vast de kalender te pakken. Sowieso lukt het niet om al deze events te doen. Maar hopelijk wel een paar. Ben je ook hierbij? Of heb je nog meer ideeën voor SwimRuns?]]></summary></entry><entry xml:lang="nl"><title type="html">Bronvermelding in ICT</title><link href="https://bartvanderwal.nl/bronvermelding-in-ict/" rel="alternate" type="text/html" title="Bronvermelding in ICT" /><published>2025-12-22T00:00:00+01:00</published><updated>2025-12-22T00:00:00+01:00</updated><id>https://bartvanderwal.nl/bronvermelding-in-ict</id><content type="html" xml:base="https://bartvanderwal.nl/bronvermelding-in-ict/"><![CDATA[<p>Als je de HAN-documentatie over bronvermelding leest, gaat het al snel over plagiaat. De APA-handleiding stelt: “Teksten en ideeën van anderen mogen niet zomaar in een eigen document overgenomen worden. Bronvermelding is verplicht” (SURF, 2021, p. 9). Logisch vanuit academisch perspectief: je moet kunnen aantonen dat je andermans ideeën niet als de jouwe presenteert.</p>

<p>Maar voor ICT-studenten voelt die focus op plagiaat vaak vreemd. Waarom zou je in een technisch document zo bezorgd zijn over het claimen van originaliteit? Dit artikel pleit niet voor het negeren van plagiaat — bronvermelding blijft verplicht — maar voor een <em>focusverlegging</em>. Dezelfde handleiding noemt ook <em>controleerbaarheid</em> als doel. (SURF, 2021, p. 9). Dát is in de ICT het belangrijkere argument.</p>

<h2 id="ideas-are-cheap">Ideas are cheap</h2>

<p>In de ICT is originaliteit sowieso meestal NIET het doel. Ideeën zijn makkelijk, het gaat om een goed product engineeren op basis van dit idee. George R.R. Martin, de auteur van Game of Thrones, verwoordt het treffend in een Rolling Stone interview:</p>

<blockquote>
  <p>“Ideas are cheap. I have more ideas now than I could ever write up. To my mind, it’s the execution that is all-important. I’m proud of my work, but I don’t know if I’d ever claim it’s enormously original.” (Martin, 2014)</p>
</blockquote>

<p>Dit geldt minstens zo sterk in de ICT. Het draait niet om wie het eerste een idee had, maar om wie het daadwerkelijk bouwt en werkend krijgt. Originaliteit claimen is niet waar het om gaat.</p>

<p>Dit staat haaks op de academische traditie waar APA vandaan komt. De American Psychological Association ontwikkelde het referentiesysteem voor onderzoekers die voortbouwen op elkaars theorieën. Daar is intellectueel eigendom van ideeën wél belangrijk. Maar <strong>ICT is geen psychologie</strong>.</p>

<h2 id="waarom-originaliteit-van-ideeen-niet-het-doel-is">Waarom originaliteit van ideeen niet het doel is?</h2>

<p><em>Edit 8-1-‘26: De stelling dat originaliteit** NIET het doel is riep bij een lezer van mijn blog (zelf psycholoog) toch wel de nodige vragen op.</em></p>

<p>Ter verduidelijking: ik geef les aan de HAN University of Applied Sciences — toegepaste wetenschap dus. Hoewel onderzoek hier belangrijk is, geen applied science, zonder science, ligt de focus op toepassing: Design Science, onderzoek om iets te ontwerpen of verbeteren, met resultaten die binnen vijf jaar bruikbaar zijn, ook voor MKB-bedrijven zonder eigen R&amp;D-afdeling.</p>

<blockquote>
  <p>“Herbert Simon distinguished the natural sciences, concerned with explaining how things are, from design sciences which are concerned with how things ought to be…” — [Wikipedia: Design Science](https://en.wikipedia.org/wiki/Design_science_(methodology)</p>
</blockquote>

<p>Daarbij: ICT zelf is geen wetenschap — dat is <em>Computer Science</em> of <em>Informatica</em>. In de informatica heb je wel grote theorieën, maar die zijn vrij wiskundig: de onvolledigheidsstelling van Gödel, Turing-volledigheid, NP-volledigheid, complexiteitsanalyse, bewijs uit volledige inductie. Op het HBO-ICT besteden we hier eigenlijk geen tijd aan. Voor wie dit populair-wetenschappelijk wil teruglezen: Rob Conery &amp; Scott Hanselman’s* The Impostor’s Handbook* (Conery, 2020) is een aanrader!</p>

<p>Software Development is bovendien een secundair vakgebied: wij als ontwikkelaars krijgen altijd de opdracht om andermans probleem op te lossen. We dienen andere domeinen. Psychologie bijvoorbeeld — denk aan software voor cognitieve experimenten of statistische analyse van beslissingsgedrag. Of HR-systemen, financiële administratie, identity management. In plaats van zelf origineel zijn, moeten we juist heel goed worden in het leren kennen van andere domeinen. Daar zijn meta-technieken voor, zoals User Story Mapping (Patton, 2014), maar die hoeven onze studenten niet te bedenken — ze gaan software schrijven.</p>

<h2 id="waarom-bronvermelding-in-ict-anders-werkt">Waarom bronvermelding in ICT anders werkt</h2>

<p>In technische documentatie dient bronvermelding een ander primair doel. Het gaat niet zozeer om het claimen van originaliteit, maar om het tonen dat je <strong>onderzoek hebt gedaan</strong>. Dat je niet zomaar wat hebt bedacht, maar je keuzes baseert op bestaande kennis en best practices.</p>

<p>Stel je schrijft een architectuurdocument waarin je pleit voor microservices. Zonder bronnen is het jouw mening. Mét een verwijzing naar Martin Fowler’s artikel over microservices wordt het een onderbouwde keuze. Het verschil is cruciaal:</p>

<ul>
  <li><strong>Zonder bron</strong>: “We kiezen voor microservices omdat dat schaalbaarder is.”</li>
  <li><strong>Met bron</strong>: “We kiezen voor microservices vanwege de onafhankelijke deployability en schaalbaarheid (Fowler, 2014).”</li>
</ul>

<p>De tweede variant toont dat je je huiswerk hebt gedaan. Dat je weet wat de industrie zegt. Dat je beslissing niet uit de lucht komt vallen. En dat je je in de documentatie ook richt op het toepassen van bestaande kennis en niet op ellenlange documentatie. Dus niet in de middelbare school stijl “Ik houd mijn spreekbeurt over microservices”, maar enkel heel kort de juiste argumenten aanhalen, en NIET herhalen wat anderen al veel eerder en (meestal) beter hebben gezegd (in dit geval Fowler).</p>

<h2 id="geloofwaardigheid-opbouwen">Geloofwaardigheid opbouwen</h2>

<p>In de praktijk lezen verschillende mensen je documenten: ontwikkelaars, architecten, product owners, en soms ook klanten of managers zonder technische achtergrond. Bronvermelding helpt op drie manieren verschillende doelgroepen/lezers:</p>

<ol>
  <li><strong>Technische lezers</strong> kunnen bronnen raadplegen voor verdieping</li>
  <li><strong>Niet-technische lezers</strong> zien dat claims onderbouwd zijn</li>
  <li><strong>Jezelf</strong> dwing je tot verificatie van je beweringen en ideeën</li>
</ol>

<h3 id="technische-lezers">Technische lezers</h3>

<p>Als je schrijft over eventual consistency en verwijst naar het CAP-theorema paper van Brewer (2000), geef je collega’s een startpunt voor verder onderzoek.</p>

<h3 id="niet-technische-lezers">Niet-technische lezers</h3>

<p>Verwijzingen naar gevestigde bronnen, bekende bedrijven als Google of autoriteiten als Uncle Bob, geven gewicht aan je document.</p>

<h3 id="jezelf">Jezelf</h3>

<p>Je kunt niet zomaar beweren dat “iedereen tegenwoordig containerization gebruikt” zonder dat te onderbouwen. Die discipline verbetert de kwaliteit van je werk. En — even los van het voorbeeld over containerization — sta er ook voor open dat je bronnen vindt die iets heel anders zeggen. En die misschien nog gelijk hebben ook. Velen zullen het negeren en lekker doordenken wat ze dachten, maar dat is het pad naar een ‘expert beginner’ zijn (en blijven) en zoals <a href="https://daedtech.com/how-developers-stop-learning-rise-of-the-expert-beginner/">Erik Dietrich (2023) in zijn blog</a> hierover uitlegt is dit een doodlopende weg.</p>

<h2 id="praktische-richtlijnen">Praktische richtlijnen</h2>

<h3 id="begin-met-urls-verzamelen">Begin met URLs verzamelen</h3>

<p>“Le mieux est l’ennemi du bien” - het perfecte is de vijand van het goede (Voltaire, 1772). Dit geldt ook voor bronvermelding. Begin niet met het perfect APA-formatteren van elke bron. Begin met het verzamelen van URLs.</p>

<p>Tijdens je onderzoek: plak relevante URLs gewoon in je tekst. Maak er een TODO van om ze later te “APA-ifyen”. Een document met ruwe URLs is beter dan een document zonder bronnen omdat je het formatteren te veel werk vond.</p>

<h3 id="kies-je-bronnen-zorgvuldig">Kies je bronnen zorgvuldig</h3>

<p>Niet alle bronnen zijn gelijk. Geef voorkeur aan:</p>

<ul>
  <li>Bronnen met <strong>naam en datum</strong></li>
  <li>Erkende experts zoals Martin Fowler, Kent Beck, of Robert C. Martin</li>
  <li>Officiële documentatie van organisaties als Google, Microsoft, of de Linux Foundation</li>
</ul>

<p>Wees bewust van het verschil tussen het <em>medium</em> (Stack Overflow, Medium.com) en de daadwerkelijk verantwoordelijke auteur of organisatie.</p>

<h3 id="citeer-liever-dan-parafraseer">Citeer liever dan parafraseer</h3>

<p>In het tijdperk van AI-tools is directe citatie waardevoller geworden. Waarom? Large language models zijn uitstekend in parafraseren. Als jij parafraseert, is niet meer te verifiëren of je de bron daadwerkelijk hebt gelezen of dat je ChatGPT hebt gevraagd om het samen te vatten.</p>

<p>Bovendien brengt parafraseren risico’s met zich mee:</p>

<ul>
  <li>Subtiele argumentatiestappen kunnen onbedoeld wegvallen</li>
  <li>Er kunnen logische denkfouten insluipen</li>
  <li>De oorspronkelijke nuance gaat verloren</li>
</ul>

<p>Een directe quote voorkomt deze problemen. Als je vervolgens de stap maakt van quote naar je eigen conclusie, maak dan de tussenliggende redenering expliciet.</p>

<h2 id="ai-slop-het-woord-van-het-jaar">AI Slop: het woord van het jaar</h2>

<p>Het belang van kwaliteit in AI-ondersteund schrijven wordt onderstreept door een opmerkelijke taalontwikkeling. Merriam-Webster (2025) koos <em>slop</em> als woord van het jaar: “digital content of low quality that is produced usually in quantity by means of artificial intelligence.”</p>

<p>Het woord vangt perfect wat er misgaat wanneer AI-tools zonder kritische reflectie worden ingezet. Absurde video’s, onzinnige reclamebeelden, nep-nieuws dat er echt uitziet, en ja: documenten vol vage algemeenheden zonder echte onderbouwing.</p>

<p>De keuze voor <em>slop</em> is veelzeggend. Geen angstaanjagend woord over existentiële AI-dreigingen, maar een spottende term voor troep. Zoals de redactie opmerkt: het woord “sends a little message to AI: when it comes to replacing human creativity, sometimes you don’t seem too superintelligent.”</p>

<h3 id="wat-betekent-dit-voor-bronvermelding">Wat betekent dit voor bronvermelding?</h3>

<p>De opkomst van <em>slop</em> maakt goede bronvermelding juist <em>belangrijker</em>. Het is het verschil tussen:</p>

<ul>
  <li><strong>Slop</strong>: AI-gegenereerde tekst zonder verificatie, vol met hallucinaties en vage beweringen</li>
  <li><strong>Kwaliteitswerk</strong>: Onderbouwde analyse met verifieerbare bronnen</li>
</ul>

<p>Als je bronnen noemt die daadwerkelijk bestaan en die je daadwerkelijk hebt gelezen, bewijs je dat je geen <em>slop</em> produceert. Je toont dat er een mens achter het werk zit die kritisch heeft nagedacht.</p>

<h3 id="je-tekst-moet-op-zichzelf-staan">Je tekst moet op zichzelf staan</h3>

<p>Een belangrijke vuistregel: je tekst moet begrijpelijk zijn <em>zonder</em> dat de lezer de bronnen raadpleegt. De referenties dienen ter verificatie en voor wie zich wil verdiepen, niet als essentiële puzzelstukken.</p>

<p>Vermijd ook lange URLs in je lopende tekst. Gebruik APA-citaties in plaats van “zie https://developers.google.com/tech-writing/one/active-voice”.</p>

<h3 id="integreer-referenties-leesbaar">Integreer referenties leesbaar</h3>

<p>De referentie moet de leesbaarheid niet verstoren. Vergelijk:</p>

<ul>
  <li><strong>Fout</strong>: “(Google, 2022) benadrukt dat actieve schrijfstijl korter is.”</li>
  <li><strong>Goed</strong>: “Google (2022) benadrukt dat actieve schrijfstijl korter is.”</li>
</ul>

<p>De bron kan niet het onderwerp van de zin zijn wanneer deze tussen haakjes staat.</p>

<h3 id="vermijd-zd-zonder-datum">Vermijd z.d. (zonder datum)</h3>

<p>Bronnen zonder datum zijn minder waardevol, vooral in een snel veranderend vakgebied als ICT. Een artikel over Kubernetes uit 2018 is wezenlijk anders dan een uit 2024. Zoek bronnen met duidelijke publicatiedatum en vermeld deze.</p>

<h2 id="ieee-vs-apa-twee-systemen-zelfde-doel">IEEE vs APA: twee systemen, zelfde doel</h2>

<p>Voor ICT-documenten zijn twee referentiesystemen gangbaar: APA en IEEE. Beide zijn prima bruikbaar. Het gaat erom dat je argumenten onderbouwt met controleerbare bronnen, niet om het exacte systeem.</p>

<h3 id="ieee-compacte-nummers">IEEE: compacte nummers</h3>

<p>IEEE (Institute of Electrical and Electronics Engineers) gebruikt genummerde referenties: [1], [2], [3]. Je ziet dit op Wikipedia en in veel technische papers. De bronnen worden in volgorde van eerste vermelding genummerd, niet alfabetisch.</p>

<p><strong>Voordelen:</strong></p>

<ul>
  <li><strong>Compact</strong>: [1] neemt minder ruimte in dan (Fowler, 2014)</li>
  <li><strong>Handig voor korte documenten</strong>: Bij 5-10 bronnen is de volgorde snel te volgen</li>
  <li><strong>Leesbaar</strong>: Geen auteursnamen die de zin onderbreken</li>
</ul>

<p><strong>Nadeel:</strong></p>

<ul>
  <li><strong>Geen context</strong>: De lezer ziet niet in één oogopslag wie de auteur is of hoe oud de bron is. Je moet naar de bronnenlijst scrollen om te ontdekken dat [3] een Fowler-artikel uit 2014 is.</li>
</ul>

<h3 id="apa-context-in-de-tekst">APA: context in de tekst</h3>

<p>APA toont auteur en jaar direct in de tekst: (Fowler, 2014) of Fowler (2014). De bronnenlijst is alfabetisch op auteursnaam.</p>

<p><strong>Voordelen:</strong></p>

<ul>
  <li><strong>Herkenbaarheid</strong>: Je ziet meteen dat het om Fowler gaat. Voor technische lezers is dit waardevol — “Ah, dat is een recente post van Fowler” of “Die Evans zie ik nu alweer, dat moet wel een expert zijn”</li>
  <li><strong>Tijdcontext</strong>: Je ziet direct of een bron recent is (2024) of gedateerd (1995)</li>
  <li><strong>Autoriteit</strong>: Bekende namen als Uncle Bob, Kent Beck, of Margaret Hamilton (NASA’s software engineering pionier) zijn herkenbaar zonder naar de bronnenlijst te kijken</li>
</ul>

<p><strong>Nadelen:</strong></p>

<ul>
  <li><strong>Langer</strong>: (Fowler, 2014) neemt meer ruimte in dan [1]</li>
  <li><strong>Probleem met anonieme bronnen</strong>: Bronnen zonder auteur of datum worden onzichtbaar in de tekst: (z.d.) zegt niets</li>
  <li><strong>Minder compact bij veel bronnen</strong>: Als je 20+ bronnen aanhaalt, worden de haakjes irritant</li>
</ul>

<h3 id="welk-systeem-kiezen">Welk systeem kiezen?</h3>

<p>Voor <strong>korte technische documenten</strong> (5-10 pagina’s, beperkt aantal bronnen): IEEE is handiger. De nummers zijn compact en storen de leesbaarheid niet.</p>

<p>Voor <strong>langere analyses of blogs</strong> waar je veel bronnen aanhaalt en context belangrijk is: APA werkt beter. De lezer ziet direct of je verwijst naar recente industrie-experts of gedateerde bronnen.</p>

<h3 id="het-belangrijkste-consistentie-en-onderbouwing">Het belangrijkste: consistentie en onderbouwing</h3>

<p>Grotendeels geldt voor IEEE hetzelfde als voor APA:</p>

<ul>
  <li>Citeer liever dan parafraseer</li>
  <li>Kies bronnen met duidelijke auteurs en datums</li>
  <li>Elke claim moet verifieerbaar zijn</li>
  <li>De bronnenlijst moet compleet zijn</li>
</ul>

<p>Het maakt niet uit of je [1] of (Fowler, 2014) schrijft. Het maakt wel uit of je überhaupt bronnen noemt.</p>

<h3 id="apa-als-han-standaard-met-mogelijkheid-tot-afwijken">APA als HAN-standaard (met mogelijkheid tot afwijken)</h3>

<p>Aan de HAN is <strong>APA de standaard</strong> voor bronvermelding. Dit geldt voor alle opleidingen, tenzij anders aangegeven.</p>

<p>Maar als je een goede reden hebt om IEEE te gebruiken — bijvoorbeeld omdat je document korter en technischer is, of omdat je samenwerkt met een bedrijf dat IEEE hanteert — kun je dit als <strong>gemotiveerd verzoek</strong> indienen bij je begeleidend docent.</p>

<p><strong>Voorwaarden bij afwijken van APA:</strong></p>

<ol>
  <li><strong>Toestemming vooraf</strong>: Vraag goedkeuring aan je docent voordat je begint</li>
  <li><strong>Vermeld de keuze</strong>: Schrijf in je document waarom je IEEE gebruikt</li>
  <li><strong>Denk aan andere lezers</strong>: Assessoren of accreditatie-auditors lezen je document mogelijk zonder context — zij moeten begrijpen waarom je afwijkt van de standaard</li>
</ol>

<p><strong>Voorbeeld van verantwoording in document:</strong></p>

<blockquote>
  <p>Dit document gebruikt IEEE-stijl voor bronvermelding in plaats van APA. Deze keuze is gemaakt vanwege de compactheid van genummerde referenties [1] in een kort technisch rapport. Goedgekeurd door [naam docent], [datum].</p>
</blockquote>

<p>De belangrijkste les: consistentie en transparantie. Kies een systeem, motiveer die keuze als je afwijkt van de standaard, en pas het consequent toe.</p>

<h2 id="veelgemaakte-fouten">Veelgemaakte fouten</h2>

<h3 id="ieee-en-apa-door-elkaar-gebruiken">IEEE en APA door elkaar gebruiken</h3>

<p>Kies één systeem en blijf daarbij. Niet in één document [1] naast (Fowler, 2014) gebruiken.</p>

<h3 id="voetnoten">Voetnoten</h3>

<p>Voetnoten zijn voor academische boeken en juridische teksten, niet voor technische documentatie in APA-stijl. Houd referenties dus in de lopende tekst.</p>

<p>Let op de ironie: APA raadt voet- of eindnoten voor bronvermelding af; alleen korte toelichtingen kunnen via voetnoten. Gebruik dus lopende tekst voor bronnen, niet een voetnoot als bronvermelding.</p>

<h3 id="scribbr-valkuil">Scribbr-valkuil</h3>

<p>APA-tools als Scribbr genereren soms referenties met de <em>titel</em> tussen haakjes in plaats van auteur en jaar. Dit is fout. Je krijgt dan iets als “(What is React?, z.d.)” in plaats van “React (z.d.)”.</p>

<h3 id="haakjes-als-zinsonderdeel">Haakjes als zinsonderdeel</h3>

<p>Het stuk tussen haakjes moet <em>optioneel</em> zijn. De zin moet grammaticaal kloppen als je de haakjes wegdenkt.</p>

<ul>
  <li><strong>Fout</strong>: “Volgens (Fowler, 2014) zijn microservices schaalbaar.” (haakjes als onderwerp)</li>
  <li><strong>Fout</strong>: “De beste bron is (Google, 2022).” (haakjes als lijdend voorwerp)</li>
  <li><strong>Goed</strong>: “Fowler (2014) beschrijft hoe microservices schaalbaar zijn.”</li>
  <li><strong>Goed</strong>: “Microservices zijn schaalbaar (Fowler, 2014).”</li>
</ul>

<h3 id="referentie-achter-de-punt">Referentie achter de punt</h3>

<p>De bronvermelding hoort <em>binnen</em> de zin, vóór de punt. Zoals Scribbr (z.d.) stelt: “Een APA-verwijzing in de tekst wordt voor de laatste punt in de zin geplaatst.”</p>

<ul>
  <li><strong>Fout</strong>: “Microservices zijn schaalbaar.” (Fowler, 2014)</li>
  <li><strong>Goed</strong>: “Microservices zijn schaalbaar (Fowler, 2014).”</li>
</ul>

<h3 id="bronvermelding-bij-hele-alinea">Bronvermelding bij hele alinea</h3>

<p>Het moet duidelijk zijn welke quote of parafrase bij welke bron hoort. Eén referentie aan het eind van een hele alinea is te vaag - de lezer weet niet welke bewering onderbouwd wordt.</p>

<h3 id="dezelfde-bron-herhalen">Dezelfde bron herhalen</h3>

<p>Als je dezelfde bron meerdere keren aanhaalt, voeg dan paginanummers toe: (Fowler, 2014, p. 23). Anders is het voor de lezer onduidelijk welk specifiek deel je bedoelt.</p>

<h3 id="literatuurlijst-vs-bibliografie">Literatuurlijst vs. bibliografie</h3>

<p>Een literatuurlijst is géén bibliografie. Het is niet “een lijst documenten die leuk zijn om te lezen”. Dat is een “zoek het maar uit” signaal naar de lezer.</p>

<p>De regel is tweeledig:</p>

<ul>
  <li>Elke bron in je literatuurlijst moet een verwijzing in je tekst hebben</li>
  <li>Elke verwijzing in je tekst moet een bron in je literatuurlijst hebben</li>
</ul>

<p>Geen losse bronnen erbij gooien, en geen verwijzingen zonder bijbehorende bron.</p>

<h3 id="urls-in-de-tekst">URLs in de tekst</h3>

<p>Plak geen URLs in je lopende tekst. In plaats van:</p>

<blockquote>
  <p>“Zie https://developers.google.com/tech-writing/one/active-voice voor meer informatie.”</p>
</blockquote>

<p>Schrijf:</p>

<blockquote>
  <p>“Google (2022) beschrijft het belang van actieve schrijfstijl.”</p>
</blockquote>

<h3 id="links-en-leesbaarheid">Links en leesbaarheid</h3>

<p>De Correspondent, het Nederlandse journalistieke platform, heeft een interessante designkeuze gemaakt. Zij schrijven: “Een van de afleidendste webfuncties is uit onze artikelen gehaald: links” (De Correspondent, z.d.). In plaats daarvan tonen zij bronnen in een zijbalk naast de tekst.</p>

<p>Waarom? Inline hyperlinks nodigen uit tot klikken. De lezer wordt constant uit de tekst getrokken. Bij elke blauwe link denkt de lezer: “Moet ik hier nu op klikken? Mis ik iets als ik doorlees?”</p>

<p>Tegelijkertijd is het in digitale documenten handig als de lezer direct kan doorklikken naar een bron. Je hebt hier drie opties — kies wat past bij je document en doelgroep:</p>

<ol>
  <li>
    <p><strong>Platte tekst</strong>: Gewoon “Fowler (2014)” zonder link. De lezer scrollt naar de bronnenlijst. Minste afleiding, beste leeservaring.</p>
  </li>
  <li>
    <p><strong>Ankerlink naar bronnenlijst</strong>: De referentie linkt naar de bijbehorende bron in je eigen bronnenlijst: <a href="#bronnen">Fowler (2014)</a>. De lezer blijft in je document.</p>
  </li>
  <li>
    <p><strong>Directe link naar bron</strong>: De referentie linkt direct naar de externe bron: <a href="https://martinfowler.com/articles/microservices.html">Fowler (2014)</a>. Handig, maar de lezer kan afdwalen.</p>
  </li>
</ol>

<p>Voor technische documentatie waar je wilt dat de lezer je verhaal volgt, is optie 1 of 2 vaak beter. Voor quick-reference documenten of wikis kan optie 3 praktischer zijn.</p>

<h2 id="apa-als-dry-principe">APA als DRY-principe</h2>

<p>Voor programmeurs is er een mooie analogie. Het DRY-principe (Don’t Repeat Yourself) zegt dat je code niet moet kopiëren. Externe dependencies haal je binnen via een package manager, maar je neemt ze niet op in je repository - je sluit ze uit via <code class="language-plaintext highlighter-rouge">.gitignore</code>.</p>

<p>APA werkt hetzelfde voor tekst. Je kopieert geen hele lappen tekst van anderen. Je verwijst ernaar. Net zoals je in code een <code class="language-plaintext highlighter-rouge">import</code> statement schrijft in plaats van de hele library te copy-pasten.</p>

<p>Plagiaat in tekst is als vendoring zonder attributie: je doet alsof het van jou is. Een correcte APA-verwijzing is als een clean dependency declaration: duidelijk waar het vandaan komt, makkelijk te updaten, en de lezer kan de bron zelf raadplegen als dat nodig is.</p>

<h3 id="dry-in-je-eigen-code">DRY in je eigen code</h3>

<p>Dit principe geldt natuurlijk ook voor je eigen code. Je dupliceert geen logica - je maakt een functie die je hergebruikt. Of wellicht een gedeelde superklasse, hoewel de Gang of Four (1995, p. 20) waarschuwt: “Favor object composition over class inheritance.”</p>

<p>Waarom? Inheritance is “white box reuse” - de subklasse kent alle implementatiedetails van de superklasse. Composition is “black box reuse” - je hebt alleen toegang tot de interface. Dus in plaats van overerving kun je ook een aparte klasse maken, hier een instantie van opnemen als attribuut, en functionaliteit hiernaartoe delegeren.</p>

<p>De analogie met bronvermelding: net zoals je liever naar een externe bron verwijst dan tekst te kopiëren, verwijs je in code liever naar een apart object dan functionaliteit te dupliceren of te erven.</p>

<h3 id="landingspaginas-vs-deeplinks">Landingspagina’s vs. deeplinks</h3>

<p>Verwijs naar specifieke artikelen, niet naar domeinnamen. Een referentie naar <code class="language-plaintext highlighter-rouge">https://react.dev/</code> is zinloos - uit een landingspagina kun je geen quote of parafrase halen.</p>

<ul>
  <li><strong>Zwak</strong>: React. (z.d.). Geraadpleegd van react.dev</li>
  <li><strong>Sterk</strong>: React. (z.d.). <em>Thinking in React</em>. Geraadpleegd van react.dev/learn/thinking-in-react</li>
</ul>

<p>Als je écht alleen een landingspagina wilt noemen, zet dan de URL direct in je tekst tussen haakjes: “De officiële React documentatie (react.dev) biedt tutorials.” Maar vraag je dan af: wat voegt deze referentie toe?</p>

<h2 id="de-aim-controlekaart">De AIM-controlekaart</h2>

<p>Binnen de AIM-opleiding aan de HAN hanteren we een controlekaart voor technische documenten (AIM Professional Skills, 2016). Deze lijst bevat checkpunten voor structuur, schrijfstijl, en ja, bronvermelding. Het gaat om:</p>

<ul>
  <li>Een APA-literatuurlijst achteraan het document</li>
  <li>In de tekst verwijzingen bij quotes of parafrases</li>
  <li>Correcte opmaak volgens APA-richtlijnen</li>
</ul>

<p>Maar onthoud: het afvinken van deze checklist is niet het doel. Het doel is het schrijven van een overtuigend, onderbouwd document dat je professionele competentie toont.</p>

<p><img src="/assets/img/posts/apa-bronvermelding-in-ict.png" alt="Controlelijst voor professionele bronvermelding" />
<em>Figuur 1</em>: Controlelijst voor professionele bronvermelding</p>

<h2 id="tot-slot">Tot slot</h2>

<p>De volgende keer dat je bronvermelding als verplicht nummer ervaart, bedenk dan: je doet het niet om plagiaat te voorkomen. Je doet het om te laten zien dat je een professional bent die zijn werk baseert op meer dan eigen meningen. Die de industrie kent. Die weet wat er speelt.</p>

<p>Dat is geen administratieve last. Dat is vakmanschap.</p>

<h2 id="bronnen">Bronnen</h2>

<ul>
  <li>AIM Professional Skills. (2016). <em>Controlekaart documenten ICA</em>. Geraadpleegd op 22 december 2025, van https://factlearning.wordpress.com</li>
  <li>Conery, R. (2020). <em>The Impostor’s Handbook: A Primer for Self-Taught Programmers</em> (2nd ed.) [Video]. Big Machine. Geraadpleegd op 8 januari 2026, van https://www.youtube.com/watch?v=pAbVdKG7fzA</li>
  <li>De Correspondent. (z.d.). <em>De Correspondent heet je welkom! Zo werkt onze site</em>. Geraadpleegd op 22 december 2025, van https://decorrespondent.nl/1705/de-correspondent-heet-je-welkom-zo-werkt-onze-site</li>
  <li>Fowler, M. (2014). <em>Microservices</em>. Geraadpleegd op 22 december 2025, van https://martinfowler.com/articles/microservices.html</li>
  <li>Gamma, E., Helm, R., Johnson, R., &amp; Vlissides, J. (1995). <em>Design Patterns: Elements of Reusable Object-Oriented Software</em>. Addison-Wesley.</li>
  <li>Google. (2022). <em>Technical Writing</em>. Geraadpleegd op 22 december 2025, van https://developers.google.com/tech-writing</li>
  <li>HAN-bibliotheek. (z.d.). <em>APA vraag en antwoord</em>. Geraadpleegd op 22 december 2025, van https://www.han.nl/artikelen/bibliotheek/apa-algemeen/apa-vraag-en-antwoord/</li>
  <li>Martin, G.R.R. (2014, 23 april). <em>George R.R. Martin: The Rolling Stone Interview</em> [Interview]. Geraadpleegd op 22 december 2025, van https://rollingstone.com/tv/news/george-r-r-martin-the-rolling-stone-interview-20140423</li>
  <li>Merriam-Webster. (14 december 2025). <em>2025 Word of the Year: Slop</em>. Geraadpleegd op 22 december 2025, van https://merriam-webster.com/wordplay/word-of-the-year</li>
  <li>Patton, J. (2014). <em>User Story Mapping: Discover the Whole Story, Build the Right Product</em>. O’Reilly Media.</li>
  <li>Scribbr. (z.d.). <em>Waar plaats je de bronvermelding in de tekst?</em>. Geraadpleegd op 22 december 2025, van https://scribbr.nl/veel-gestelde-vragen/plaatsing-verwijzing-in-tekst</li>
  <li>SURF. (2021). <em>De APA-richtlijnen uitgelegd: Een praktische handleiding voor bronvermelding in het hoger onderwijs</em> (3e editie). Geraadpleegd op 22 december 2025, van https://www.auteursrechten.nl/wp-content/uploads/2023/03/De-APA-richtlijnen-uitgelegd-3e-editie.pdf</li>
  <li>Voltaire. (1772). <em>La Bégueule</em>. Conte moral.</li>
  <li>Dietrich, E. (30-9-2023) <em>How Developers Stop Learning: Rise of the Expert Beginner</em> Geraadpleegd op 3 februari 2026 van https://daedtech.com/how-developers-stop-learning-rise-of-the-expert-beginner/</li>
</ul>]]></content><author><name>Bart van der Wal</name></author><category term="technisch-schrijven" /><category term="onderwijs" /><category term="apa" /><summary type="html"><![CDATA[Als je de HAN-documentatie over bronvermelding leest, gaat het al snel over plagiaat. De APA-handleiding stelt: “Teksten en ideeën van anderen mogen niet zomaar in een eigen document overgenomen worden. Bronvermelding is verplicht” (SURF, 2021, p. 9). Logisch vanuit academisch perspectief: je moet kunnen aantonen dat je andermans ideeën niet als de jouwe presenteert.]]></summary></entry><entry xml:lang="nl"><title type="html">Hoe deze blog begon</title><link href="https://bartvanderwal.nl/hoe-deze-blog-begon/" rel="alternate" type="text/html" title="Hoe deze blog begon" /><published>2025-12-21T00:00:00+01:00</published><updated>2025-12-21T00:00:00+01:00</updated><id>https://bartvanderwal.nl/hoe-deze-blog-begon</id><content type="html" xml:base="https://bartvanderwal.nl/hoe-deze-blog-begon/"><![CDATA[<p>Soms leiden de kleinste dingen tot onverwachte uitkomsten. Mijn blog website bestaat omdat ik even snel een boek wilde opzoeken.</p>

<p><strong>Leeswijzer:</strong> Deze post legt uit hoe deze blog ontstond (sectie 1-2), beschrijft enkele features zoals de PDF-knop en SOFA Mode (sectie 3-5), en licht de filosofie erachter toe (sectie 6-7). Voor technische details over de Jekyll setup en het Adam Blog 2.0 theme, zie de <a href="https://github.com/bartvanderwal/bartvanderwal.nl">README.md</a>.</p>

<h2 id="1-de-oorsprong">1. De oorsprong</h2>

<p>Ik had eerder “Ethics For People Who Work In Tech” van Marc Steen geleend uit de HAN bibliotheek. Een goed boek over de ethische overwegingen die we tegenkomen als technologie professionals. Ik wilde het snel even herlezen en keek of er online content was om het te herinneren.</p>

<p>Dit bracht me bij het idee om mijn oude Quora antwoorden te hergebruiken. Jaren terug was ik daar een tijdje actief op, toen ik nog freelancer was. Ik had best wat posts geschreven rondom software development, en Java, .NET en NodeJS.</p>

<h2 id="2-van-quora-naar-eigen-site">2. Van Quora naar eigen site</h2>

<p>Maar in plaats van alleen documenten te verzamelen, dacht ik: waarom publiceer ik deze stukken niet ook gewoon netjes op mijn eigen site? Vandaar deze blog. Een simpele Jekyll site op GitHub Pages, eindelijk het domein bartvanderwal.nl gebruikend dat ik al jaren bezit.</p>

<p>Dus hier zijn we. Een blog die begon vanwege een boek over ethiek en wat oude Quora antwoorden die lagen te verstoffen. Het boek inspireerde me later ook tot een <a href="/ethics-for-software-engineers/">opzet voor een keuzevak Ethics for Software Engineers</a>. Soms werkt het zo.</p>

<h2 id="3-waarom-dit-blog-nou-wie-schrijft-die-blijft">3. Waarom dit blog? Nou: “Wie schrijft, die blijft!”</h2>

<p>Dit is het credo van deze blog.</p>

<p><strong>De stelling:</strong> De beste manier om iets echt te gaan <em>snappen</em>, is het aan anderen uit te leggen. Of het opschrijven. Beide werken.</p>

<p>Iets wat in je hoofd helemaal lijkt te kloppen, verdampt opeens als je het probeert te formuleren. De woorden willen maar niet komen. En dan realiseer je je: je snapt het eigenlijk niet zo goed als je dacht. Papier is geduldig. Een scherm ook, in tegenstelling tot de luisteraar op kantoor die voorzichtig wegloopt omdat je niks uit je woorden krijgt.</p>

<p>Goed schrijven betekent herschrijven. Je eerste draft is altijd rommelig. Dat is normaal. Vandaar ook de SOFA mode op deze website — het idee dat publiceren een proces is, niet een eindresultaat. Maar als je dat schrijfproces doorloopt, wordt je kennis uiteindelijk sterker. En daardoor word <em>jij</em> ook sterker. Je wordt sterker.</p>

<p><strong>En dan het tweede deel van het credo:</strong> De woorden blijven er, zelfs als jij ze zelf al weer beetje vergeten bent. Je diept ze dan makkelijker op uit je lange termijn geheugen. Want lezen is veel efficiënter dan alles opnieuw bedenken. En voor een deel is wat je geschreven hebt ook je <em>geëxternaliseerde lange termijn geheugen</em> — je uitgebreide hersenen buiten je schedel.</p>

<p>Dit heet soms <em>thinkism</em> — het idee dat je alles in een keer uit kunt denken. Dat werkt niet. Maar als je het opschrijft staat het. En kan iemand anders er ook kritische vragen bij stellen. En kunnen jullie — samen — verder komen. Dat is veel krachtiger dan alleen nadenken.</p>

<p><strong>Tot slot:</strong> Schrijven blijft er zelfs nadat jij er zelf niet meer bent. Dat is vervreemdend. Ja, wie betaalt de domeinnaam? En hosting? Nou goed, er is altijd nog de <a href="https://web.archive.org/">Wayback Machine</a>. En een versiebeheer repository (‘repo’) met broncode en teksten op GitHub. Hopelijk blijft die nog wat langer staan. En jij — als lezer — kun de code zelf forken. En je eigen weblog maken op basis hiervan als je dat wilt. En niet bang bent je een beetje in code te verdiepen. Open source betekent ook dat.</p>

<p><em>“If it was easy, everyone would do it!”</em> Schrijven is niet makkelijk. Goed schrijven nog minder. Maar daarom: “Wie schrijft, die blijft!”</p>

<h2 id="4-de-pdf-knop">4. De PDF-knop</h2>

<p>Elke blogpost heeft een “Download PDF” knop. Handig voor offline lezen of archiveren.</p>

<p>De PDF wordt client-side gegenereerd met <a href="https://github.com/eKoopmans/html2pdf.js">html2pdf.js</a> - een JavaScript library die html2canvas en jsPDF combineert om HTML naar PDF te converteren, direct in de browser zonder server-side processing.</p>

<h2 id="5-sofa-mode-start-often-fail-always">5. SOFA Mode: Start Often, Fail Always</h2>

<p>Een collega deelde onlangs een link naar <a href="https://tilde.town/~dozens/sofa/">SOFA</a> 🛋️: “Start Often, Finish rArely.” De anonieme auteur, die alleen de naam “dozens” gebruikt, beschrijft het idee zo (Dozens, z.d.): vier het starten van projecten, zonder de druk om alles af te maken.</p>

<p>Ik stel een alternatieve interpretatie voor: <strong>Start Often, Fail Always</strong>. Niet als cynisme, maar als DevOps-wijsheid: strikt genomen is een product is nooit “af”. Als je af beschouwt als helemaal perfect; hoeven niks meer aan te doen. Het <a href="https://agilemanifesto.org/principles.html">Agile principe van “Embrace change”</a> erkent dat requirements veranderen, inzichten groeien, en verbetering continu is.</p>

<h3 id="51-perfectie-is-een-illusie">5.1 Perfectie is een illusie</h3>

<p><img src="/assets/img/posts/agile-manifesto-embrace-change.png" alt="Agile manifesto: Value responding to change over following a plan, dus 'Embrace change'" />
<em>Figuur 1</em>: Agile manifesto: Value responding to change over following a plan, dus ‘Embrace change’</p>

<p>Een extreem voorbeeld: zelfs Newton had het niet helemaal correct. Neil deGrasse Tyson zegt over de slimste persoon ooit: <a href="https://www.youtube.com/watch?v=xKwlp1Ap9XA">“Isaac Newton - nothing, nobody comes close”</a>. En: “Great scientists are marked not by their answers, but by how great their questions are.” En toch falen Newtons bewegingswetten op microscopisch niveau - daar nam quantum mechanica het over. Was Newton “fout”? Nee. Zijn wetten zijn <em>goed genoeg</em> voor 99,9% van de toepassingen. Ze zijn “klaar genoeg om te releasen.”</p>

<p>Dit is de kern: perfectie is een illusie. Wat telt is waardevol genoeg om te gebruiken, stabiel genoeg om op te bouwen, en flexibel genoeg om te verbeteren.</p>

<h2 id="6-sofa-mode-op-deze-blog">6. SOFA Mode op deze blog</h2>

<p>Dit principe pas ik toe op deze blog. Via de SOFA-toggle in het menu kun je wisselen tussen gepubliceerde posts en “draft” posts - ideeën die nog in ontwikkeling zijn.</p>

<h3 id="61-waarom-drafts-publiek-maken">6.1 Waarom drafts publiek maken?</h3>

<ul>
  <li><strong>Goed schrijven is herschrijven.</strong> Een tekst is nooit af bij de eerste versie. Door drafts te delen, maak ik het schrijfproces transparant.</li>
  <li><strong>Feedback vroeg ophalen.</strong> Net als bij software development: “release early, release often.”</li>
  <li><strong>Verantwoording afleggen.</strong> Elke post heeft een versiegeschiedenis met meerdere datums en wijzigingsnotities, vergelijkbaar met correcties op nieuwssites.</li>
</ul>

<h3 id="62-de-drie-datums">6.2 De drie datums</h3>

<table>
  <thead>
    <tr>
      <th>Datum</th>
      <th>Betekenis</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gestart</td>
      <td>Wanneer het idee voor deze post ontstond</td>
    </tr>
    <tr>
      <td>Laatst gewijzigd</td>
      <td>De meest recente inhoudelijke aanpassing</td>
    </tr>
    <tr>
      <td>Gepubliceerd</td>
      <td>Wanneer de post "af genoeg" was om te delen</td>
    </tr>
  </tbody>
</table>

<h3 id="63-niet-indexeerbaar-door-zoekmachines">6.3 Niet indexeerbaar door zoekmachines</h3>

<p>Drafts kunnen veranderen. De versietabel bovenaan geeft transparantie over de status. In “normale modus” zie je alleen gepubliceerde posts, gesorteerd op publicatiedatum. In SOFA-modus zie je drafts, gesorteerd op startdatum - de nieuwste ideeën eerst.</p>

<p>De drafts zijn bewust <em>niet</em> indexeerbaar door zoekmachines. Je moet ze actief opzoeken via de toggle. Zo houd ik de “officiële” blog schoon, maar deel ik wel mijn denkproces met nieuwsgierige lezers.</p>

<h2 id="7-open-source">7. Open source</h2>

<p>Deze blog is volledig open source. De code staat op <a href="https://github.com/bartvanderwal/bartvanderwal.nl">GitHub</a> en is gebouwd met Jekyll en het Adam Blog 2.0 theme. Voor technische details over de setup, customizations, en deployment, zie de README.md in de repository.</p>

<h2 id="8-het-experiment-claudemd-als-systeem-prompt">8. Het experiment: CLAUDE.md als “systeem prompt”</h2>

<p>Wie met mij aan deze blog werkt, ontdekt in de repository een bestand <a href="https://github.com/bartvanderwal/bartvanderwal.nl/blob/main/CLAUDE.md">CLAUDE.md</a>. Dit is niet documentatie, maar een instructieset voor AI-assistenten die in dit project werken.</p>

<p><strong>Waarom een apart bestand?</strong> Mijn collega Theo Theunissen introduceerde bij mij het concept van <em>Continuous Documentation</em> — zowel in zijn promotie-rede als in zijn artikelen. Het idee: documentatie groeit mee met code in plaats van dat je het pas achteraf schrijft (omdat het moet), of allemaal vantevoren (waterval). Niet als last, maar als integraal onderdeel van engineering. Dit inzicht bleef bij me hangen. (Theo is helaas vorig jaar overleden.) In plaats van losse opmerkingen in commits, leg ik nu in CLAUDE.md vast:</p>

<ul>
  <li>Welke coding-richtlijnen gelden (Hugo’s markdownlint rules, MD032, MD031, etc.)</li>
  <li>Hoe de folder-structuur werkt</li>
  <li>Welke conventions er gelden (frontmatter velden, datum-logica, etc.)</li>
</ul>

<p>Maar nog belangrijker: ik zet hier het <em>waarom</em> neer. Niet wat Claude moet doen, maar <em>waarom</em>. Dit helpt veel beter dan steeds dezelfde instructie te herhalen.</p>

<p><strong>Het “rare sprongetje”</strong>: Ik gaf Claude opzet tegenstrijdige instructies. Soms zou ik zeggen: “Volg de regels uit CLAUDE.md, behalve nu gaan we ineens dingen testen.” Of ik stelde bizarre vragen om te kijken hoe het met inconsistenties zou omgaan. Dit was een soort meta-experiment: <em>hoe reageert een AI op bokkesprongen van een gebruiker die eigenlijk inconsistent is?</em></p>

<p>Het antwoord: Claude handelt dat redelijk goed af. Het vraagt voorzichtig of er een geldige reden is, of herinnert aan de richtlijnen. En meer nog: regelmatig zeggen we “laten we CLAUDE.md zelf bijwerken” — niet omdat de regels fout zijn, maar om de dokumentatie beter te maken naar gelang we meer leren.</p>

<p>Dit cycli van “werk → leer → documenteer → werk beter” is eigenlijk wat het wezen van goed engineering is. En de AI helpt daar actief mee.</p>

<h2 id="bronnen">Bronnen</h2>

<ul>
  <li>Dozens. (z.d.). <em>SOFA: Start Often, Finish rArely</em>. Tilde Town. Geraadpleegd van https://tilde.town/~dozens/sofa</li>
  <li>Tyson, N. deGrasse. (8 januari 2025). <em>Neil deGrasse Tyson - Who Is The Greatest Scientific Mind?</em> [Video]. YouTube. Geraadpleegd van https://www.youtube.com/watch?v=xKwlp1Ap9XA</li>
</ul>

<hr />

<p><em>Ik schrijf deze blogs samen met Claude Code of andere LLM’s, maar altijd op basis van mijn eigen idee. Ik ben en blijf zelf verantwoordelijk voor de eindregie. Ik zit in <a href="/ict-onderwijs-aanpassen-voor-ai-1-bewustwording/">AI-gebruikstype 1, lees hier meer</a>.</em></p>]]></content><author><name>Bart van der Wal</name></author><category term="personal" /><category term="blog" /><category term="meta" /><summary type="html"><![CDATA[Soms leiden de kleinste dingen tot onverwachte uitkomsten. Mijn blog website bestaat omdat ik even snel een boek wilde opzoeken.]]></summary></entry><entry xml:lang="nl"><title type="html">Continuous Integration</title><link href="https://bartvanderwal.nl/continuous-integration/" rel="alternate" type="text/html" title="Continuous Integration" /><published>2024-12-19T00:00:00+01:00</published><updated>2024-12-19T00:00:00+01:00</updated><id>https://bartvanderwal.nl/continuous-integration</id><content type="html" xml:base="https://bartvanderwal.nl/continuous-integration/"><![CDATA[<p><em>Origineel gepubliceerd op <a href="https://aim-cnp.github.io/pwac/workshops/integratie">PWAC</a></em></p>

<p>Deze post behandelt Continuous Integration (CI) en CI/CD pipelines, met focus op Git branching strategieën en GitHub Actions implementatie voor full-stack applicaties.</p>

<p><img src="/assets/img/posts/ci-workshop/devops-infinity-loop.png" alt="DevOps Infinity Loop" />
<em>Figuur 1</em>: DevOps Infinity Loop.</p>

<h2 id="kernvereisten">Kernvereisten</h2>

<h3 id="a-kennis">A. Kennis</h3>
<p>Begrip van CI/CD concepten en pipeline architectuur.</p>

<h3 id="b-aanpak">B. Aanpak</h3>
<ul>
  <li>Team gebruikt GitHub Flow voor code en unit tests</li>
  <li>Implementatie van SHORT-lived feature branches</li>
  <li>Minimaal dagelijkse integratie (Martin Fowler standaarden)</li>
</ul>

<h3 id="c-pipeline-configuratie">C. Pipeline Configuratie</h3>
<p>Werkende CI/CD pipeline met minimaal drie stages:</p>
<ul>
  <li><strong>Lint</strong> (code kwaliteitsanalyse)</li>
  <li><strong>Build</strong> (compilatie)</li>
  <li><strong>Test</strong> (geautomatiseerd testen)</li>
</ul>

<h2 id="continuous-integration-definitie">Continuous Integration Definitie</h2>

<p>Martin Fowler beschrijft CI als: <em>“team members merge changes into codebase together with colleagues’ changes at least daily,”</em> met verificatie door <em>“automated build (including test) to detect integration errors quickly.”</em></p>

<p>Het Netflix principe stelt: <em>“Do more painful things more often!”</em> - frequente integratie vermindert frictie.</p>

<p><img src="/assets/img/posts/ci-workshop/if-it-hurts.png" alt="If it hurts, do it more often" />
<em>Figuur 2</em>: If it hurts, do it more often.</p>

<h2 id="github-actions-pipeline-setup">GitHub Actions Pipeline Setup</h2>

<h3 id="minimaal-java-pipeline-voorbeeld">Minimaal Java Pipeline Voorbeeld</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="na">steps</span><span class="pi">:</span>
  <span class="pi">-</span> <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/checkout@v4</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Set up JDK </span><span class="m">17</span>
    <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/setup-java@v4</span>
    <span class="na">with</span><span class="pi">:</span>
      <span class="na">java-version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17'</span>
      <span class="na">distribution</span><span class="pi">:</span> <span class="s1">'</span><span class="s">temurin'</span>
      <span class="na">cache</span><span class="pi">:</span> <span class="s">maven</span>
  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Build with Maven</span>
    <span class="na">run</span><span class="pi">:</span> <span class="s">mvn clean install</span>
</code></pre></div></div>

<h3 id="nodejsreact-frontend-pipeline">Node.js/React Frontend Pipeline</h3>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Set up Node.js</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">actions/setup-node@v4</span>
  <span class="na">with</span><span class="pi">:</span>
    <span class="na">node-version</span><span class="pi">:</span> <span class="s1">'</span><span class="s">21'</span>
    <span class="na">cache</span><span class="pi">:</span> <span class="s">npm</span>
    <span class="na">cache-dependency-path</span><span class="pi">:</span> <span class="s">./frontend/package-lock.json</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Install and lint</span>
  <span class="na">working-directory</span><span class="pi">:</span> <span class="s">./frontend</span>
  <span class="na">run</span><span class="pi">:</span> <span class="pi">|</span>
    <span class="s">npm install</span>
    <span class="s">npm run lint</span>
    <span class="s">npm run build</span>
    <span class="s">npm test</span>
</code></pre></div></div>

<h2 id="linting--static-analysis">Linting &amp; Static Analysis</h2>

<h3 id="tools-per-stack">Tools per Stack</h3>

<table>
  <thead>
    <tr>
      <th>Technologie</th>
      <th>Tool</th>
      <th>Configuratie</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>JavaScript/React</td>
      <td>ESLint</td>
      <td><code class="language-plaintext highlighter-rouge">.eslintrc</code> of <code class="language-plaintext highlighter-rouge">package.json</code></td>
    </tr>
    <tr>
      <td>Java</td>
      <td>Maven Checkstyle</td>
      <td><code class="language-plaintext highlighter-rouge">checkstyle.xml</code> in project root</td>
    </tr>
  </tbody>
</table>

<h3 id="richtlijnen">Richtlijnen</h3>
<ul>
  <li>Streef naar nul errors en warnings</li>
  <li>Pas ignore rules toe op configuratie niveau</li>
  <li>Vermijd inline code suppressions</li>
  <li>Prioriteer feature delivery boven perfecte linting</li>
</ul>

<h2 id="test-piramide">Test Piramide</h2>

<p><img src="/assets/img/posts/ci-workshop/test-piramide.png" alt="Test Piramide" />
<em>Figuur 3</em>: Test Piramide.</p>

<p>Van basis naar top:</p>

<ol>
  <li><strong>Unit Tests</strong> (grootste volume)</li>
  <li><strong>Integration Tests</strong></li>
  <li><strong>Component Tests</strong></li>
  <li><strong>End-to-End Tests</strong> (kleinste volume)</li>
</ol>

<h3 id="maven-test-commands">Maven Test Commands</h3>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">mvn test</code></strong>: Draait alleen unit tests (Surefire)</li>
  <li><strong><code class="language-plaintext highlighter-rouge">mvn verify</code></strong>: Draait unit tests + integration tests (Failsafe)</li>
</ul>

<h2 id="git-workflow-strategieën">Git Workflow Strategieën</h2>

<p><img src="/assets/img/posts/ci-workshop/github-flow.png" alt="GitHub Flow" />
<em>Figuur 4</em>: GitHub Flow.</p>

<h3 id="github-flow-aanbevolen">GitHub Flow (Aanbevolen)</h3>

<ol>
  <li>Creëer SHORT-lived feature branch van main</li>
  <li>Commit en push regelmatig</li>
  <li>Open pull request</li>
  <li>Pipeline draait automatische checks</li>
  <li>Team reviewt</li>
  <li>Merge naar main</li>
</ol>

<h3 id="kernprincipe">Kernprincipe</h3>
<p>Fail fast - zet snelle checks (lint) vóór dure operaties (build/test).</p>

<h2 id="veelvoorkomende-valkuilen">Veelvoorkomende Valkuilen</h2>

<ol>
  <li><strong>Ongeteste processen automatiseren</strong>: Verifieer commando’s eerst lokaal</li>
  <li><strong>Long-lived branches</strong>: Verhoogt integratie complexiteit</li>
  <li><strong>Te weinig ignore rules configureren</strong>: Creëert ruis, waardoor echte issues gemist worden</li>
  <li><strong>Main branch breken</strong>: Laat pipeline altijd valideren voor merge</li>
</ol>

<h2 id="bronnen">Bronnen</h2>

<ul>
  <li><a href="https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-java-with-maven">GitHub Actions: Java with Maven</a></li>
  <li><a href="https://docs.github.com/en/actions/tutorials/build-and-test-code/nodejs">GitHub Actions: Node.js</a></li>
  <li>Fowler, M. (2024) “Continuous Integration”</li>
</ul>]]></content><author><name>Bart van der Wal</name></author><category term="devops" /><category term="ci" /><category term="software" /><summary type="html"><![CDATA[Origineel gepubliceerd op PWAC]]></summary></entry></feed>