<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Perceval Hasselman</title>
    <description>The latest articles on DEV Community by Perceval Hasselman (@percevalhasselman).</description>
    <link>https://dev.to/percevalhasselman</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4031026%2F19a233b0-f6f8-43af-9044-9055daaa7e6f.JPG</url>
      <title>DEV Community: Perceval Hasselman</title>
      <link>https://dev.to/percevalhasselman</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/percevalhasselman"/>
    <language>en</language>
    <item>
      <title>Voorbij het taalmodel: de architectuur van betrouwbare AI-agents</title>
      <dc:creator>Perceval Hasselman</dc:creator>
      <pubDate>Thu, 27 Aug 2026 08:22:05 +0000</pubDate>
      <link>https://dev.to/percevalhasselman/voorbij-het-taalmodel-de-architectuur-van-betrouwbare-ai-agents-1cb</link>
      <guid>https://dev.to/percevalhasselman/voorbij-het-taalmodel-de-architectuur-van-betrouwbare-ai-agents-1cb</guid>
      <description>&lt;p&gt;&lt;strong&gt;Door Perceval Hasselman&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kunstmatige intelligentie wordt steeds vaker beschreven alsof het fundamentele probleem inmiddels is opgelost.&lt;/p&gt;

&lt;p&gt;We beschikken over grote taalmodellen die software kunnen schrijven, documenten kunnen analyseren, afbeeldingen kunnen genereren, complexe instructies kunnen interpreteren en externe hulpmiddelen kunnen aanroepen. Daardoor ontstaat gemakkelijk het idee dat de volgende stap eenvoudig is: maak de modellen groter, sneller en autonomer.&lt;/p&gt;

&lt;p&gt;Die conclusie is misleidend.&lt;/p&gt;

&lt;p&gt;Een Large Language Model (LLM) is geen autonome intelligentie in de traditionele betekenis van software-engineering. Een taalmodel is in essentie een probabilistisch inferentiesysteem dat patronen in een enorme hoeveelheid data heeft geleerd en op basis daarvan nieuwe tokens voorspelt.&lt;/p&gt;

&lt;p&gt;Zodra we zo'n model echte taken laten uitvoeren, externe systemen laten benaderen, informatie laten ophalen, beslissingen laten voorbereiden of meerdere stappen achter elkaar laten uitvoeren, bouwen we niet langer alleen een model.&lt;/p&gt;

&lt;p&gt;We bouwen een &lt;strong&gt;systeem rondom dat model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Daarmee verschuift het belangrijkste engineeringprobleem.&lt;/p&gt;

&lt;p&gt;De vraag is niet langer uitsluitend:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hoe maken we een taalmodel dat betere antwoorden genereert?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De belangrijkere vraag wordt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hoe bouwen we een systeem waarin een probabilistisch model betrouwbaar genoeg kan functioneren binnen een gecontroleerde softwareomgeving?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dat is geen puur AI-probleem.&lt;/p&gt;

&lt;p&gt;Het is een architectuurprobleem.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Een LLM is geen AI-agent
&lt;/h2&gt;

&lt;p&gt;Een veelvoorkomende misvatting is dat een AI-agent simpelweg een taalmodel is waaraan enkele API's zijn gekoppeld.&lt;/p&gt;

&lt;p&gt;Een productieklare agentische architectuur ziet er eerder als volgt uit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌───────────────────┐
                    │    Gebruikersdoel │
                    └─────────┬─────────┘
                              │
                              ▼
                    ┌───────────────────┐
                    │   Orchestrator   │
                    └─────────┬─────────┘
                              │
             ┌────────────────┼────────────────┐
             │                │                │
             ▼                ▼                ▼
       ┌───────────┐    ┌────────────┐   ┌─────────────┐
       │    LLM    │    │   Geheugen │   │  Retrieval  │
       └─────┬─────┘    └────────────┘   └─────────────┘
             │
             ▼
       ┌─────────────┐
       │ Tool-laag   │
       └──────┬──────┘
              │
       ┌──────┴──────────────┐
       ▼                     ▼
   Externe API's         Databases
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Het taalmodel vormt slechts één component.&lt;/p&gt;

&lt;p&gt;De rest van de architectuur zorgt voor eigenschappen die een taalmodel niet automatisch bezit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;permanente toestand;&lt;/li&gt;
&lt;li&gt;autorisatie;&lt;/li&gt;
&lt;li&gt;externe kennis;&lt;/li&gt;
&lt;li&gt;geheugen;&lt;/li&gt;
&lt;li&gt;tool-uitvoering;&lt;/li&gt;
&lt;li&gt;validatie;&lt;/li&gt;
&lt;li&gt;foutafhandeling;&lt;/li&gt;
&lt;li&gt;logging;&lt;/li&gt;
&lt;li&gt;monitoring;&lt;/li&gt;
&lt;li&gt;beveiliging;&lt;/li&gt;
&lt;li&gt;beleidsregels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dat onderscheid is fundamenteel.&lt;/p&gt;

&lt;p&gt;In plaats van het model als de volledige applicatie te beschouwen, moeten we het model zien als &lt;strong&gt;één probabilistische component binnen een groter softwaresysteem&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Probabilistische AI tegenover deterministische software
&lt;/h1&gt;

&lt;p&gt;Traditionele software werkt voornamelijk met expliciete regels.&lt;/p&gt;

&lt;p&gt;Neem bijvoorbeeld:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;resultaat&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prijs&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;aantal&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wanneer &lt;code&gt;prijs&lt;/code&gt; en &lt;code&gt;aantal&lt;/code&gt; hetzelfde blijven, blijft het resultaat hetzelfde.&lt;/p&gt;

&lt;p&gt;Een taalmodel werkt fundamenteel anders.&lt;/p&gt;

&lt;p&gt;Het model berekent waarschijnlijkheden over mogelijke vervolgtokens op basis van de beschikbare context. Zelfs wanneer een gebruiker het resultaat als een concreet antwoord ervaart, blijft het onderliggende proces probabilistisch.&lt;/p&gt;

&lt;p&gt;Hier ontstaat een interessante spanning.&lt;/p&gt;

&lt;p&gt;Software-engineers denken vaak in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Input → Functie → Output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generatieve AI werkt eerder volgens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Context → Waarschijnlijkheidsverdeling → Gegenereerde output
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;De tweede benadering maakt AI buitengewoon flexibel, maar introduceert tegelijkertijd onzekerheid.&lt;/p&gt;

&lt;p&gt;Daarom hebben betrouwbare AI-systemen &lt;strong&gt;deterministische grenzen rondom probabilistische componenten&lt;/strong&gt; nodig.&lt;/p&gt;

&lt;p&gt;Stel dat een taalmodel concludeert:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Deze klant lijkt recht te hebben op een terugbetaling."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dat betekent niet dat het taalmodel vervolgens zelfstandig een terugbetaling zou moeten uitvoeren.&lt;/p&gt;

&lt;p&gt;Een robuuster systeem werkt bijvoorbeeld als volgt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;LLM
 ↓
Voorgestelde beslissing
 ↓
Validatie
 ↓
Autorisatie
 ↓
Bedrijfsregels
 ↓
API-aanroep
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Het model kan een actie voorstellen.&lt;/p&gt;

&lt;p&gt;De software bepaalt vervolgens of die actie daadwerkelijk toegestaan is.&lt;/p&gt;

&lt;p&gt;Dit leidt tot een belangrijk architectuurprincipe:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Het model kan bepalen wat het wil doen; het systeem bepaalt wat het mag doen.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  3. RAG is een kennissysteem, geen menselijk geheugen
&lt;/h1&gt;

&lt;p&gt;Retrieval-Augmented Generation, beter bekend als RAG, is inmiddels een van de belangrijkste architectuurpatronen binnen moderne AI-systemen.&lt;/p&gt;

&lt;p&gt;De basis is relatief eenvoudig:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gebruikersvraag
      ↓
Embedding
      ↓
Vectorzoekopdracht
      ↓
Relevante documenten
      ↓
Context
      ↓
LLM
      ↓
Antwoord
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In plaats van uitsluitend te vertrouwen op informatie die tijdens de training in de parameters van het model terechtkwam, wordt relevante externe informatie opgehaald en aan het model aangeboden.&lt;/p&gt;

&lt;p&gt;Dit kan zeer krachtig zijn.&lt;/p&gt;

&lt;p&gt;Maar RAG wordt regelmatig verkeerd geïnterpreteerd.&lt;/p&gt;

&lt;p&gt;Een vector database is geen equivalent van menselijk geheugen.&lt;/p&gt;

&lt;p&gt;Een vectorzoekmachine probeert voornamelijk de vraag te beantwoorden:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Welke opgeslagen informatie lijkt semantisch het meest relevant voor deze vraag?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dat betekent niet automatisch dat de gevonden informatie:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;correct is;&lt;/li&gt;
&lt;li&gt;volledig is;&lt;/li&gt;
&lt;li&gt;actueel is;&lt;/li&gt;
&lt;li&gt;juridisch geldig is;&lt;/li&gt;
&lt;li&gt;afkomstig is van een betrouwbare bron;&lt;/li&gt;
&lt;li&gt;voldoende is om een beslissing te nemen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stel dat een organisatie honderdduizenden documenten bezit.&lt;/p&gt;

&lt;p&gt;Een gebruiker vraagt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Mag deze klant volgens het huidige beleid zijn abonnement kosteloos beëindigen?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Een klassieke RAG-implementatie kan enkele documenten ophalen die semantisch overeenkomen met de vraag.&lt;/p&gt;

&lt;p&gt;Maar misschien heeft het systeem meer informatie nodig:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;de actuele algemene voorwaarden;&lt;/li&gt;
&lt;li&gt;het specifieke klantcontract;&lt;/li&gt;
&lt;li&gt;de abonnementsdatum;&lt;/li&gt;
&lt;li&gt;regionale regelgeving;&lt;/li&gt;
&lt;li&gt;eventuele uitzonderingsregels.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Daarom wordt &lt;strong&gt;agentische retrieval&lt;/strong&gt; interessant.&lt;/p&gt;

&lt;p&gt;In plaats van:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vraag → Retrieval → Antwoord
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;kan een systeem werken met:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Vraag
 ↓
Plan
 ↓
Informatie ophalen
 ↓
Bewijs beoordelen
 ↓
Is er voldoende informatie?
 ├── Nee → Nieuwe zoekactie
 └── Ja
       ↓
    Antwoord
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieval wordt daarmee onderdeel van het redeneerproces.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Context engineering wordt belangrijker dan prompt engineering
&lt;/h1&gt;

&lt;p&gt;De AI-industrie heeft de afgelopen jaren veel aandacht besteed aan prompt engineering.&lt;/p&gt;

&lt;p&gt;Dat is begrijpelijk.&lt;/p&gt;

&lt;p&gt;Een goede instructie kan het gedrag van een taalmodel aanzienlijk beïnvloeden.&lt;/p&gt;

&lt;p&gt;Maar in complexe systemen ontstaat een ander probleem: &lt;strong&gt;context engineering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Een model ontvangt namelijk niet alleen een prompt.&lt;/p&gt;

&lt;p&gt;Het ontvangt een context die kan bestaan uit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;systeeminstructies;&lt;/li&gt;
&lt;li&gt;gebruikersberichten;&lt;/li&gt;
&lt;li&gt;documenten;&lt;/li&gt;
&lt;li&gt;toolresultaten;&lt;/li&gt;
&lt;li&gt;eerdere acties;&lt;/li&gt;
&lt;li&gt;geheugen;&lt;/li&gt;
&lt;li&gt;metadata;&lt;/li&gt;
&lt;li&gt;gestructureerde toestand;&lt;/li&gt;
&lt;li&gt;externe informatie.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;De kwaliteit van die context bepaalt mede wat het model vervolgens kan doen.&lt;/p&gt;

&lt;p&gt;Meer context betekent bovendien niet automatisch betere resultaten.&lt;/p&gt;

&lt;p&gt;Een model dat honderden documenten tegelijk ontvangt, kan te maken krijgen met:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;irrelevante informatie;&lt;/li&gt;
&lt;li&gt;tegenstrijdige informatie;&lt;/li&gt;
&lt;li&gt;verouderde informatie;&lt;/li&gt;
&lt;li&gt;duplicaten;&lt;/li&gt;
&lt;li&gt;hogere kosten;&lt;/li&gt;
&lt;li&gt;langere verwerkingstijden;&lt;/li&gt;
&lt;li&gt;verlies van aandacht voor belangrijke informatie.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Een goed ontworpen systeem probeert daarom een &lt;strong&gt;minimale maar voldoende context&lt;/strong&gt; samen te stellen.&lt;/p&gt;

&lt;p&gt;Het doel is niet:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Geef het model alle beschikbare informatie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Het doel is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Geef het model precies de informatie die nodig is voor de volgende beslissing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dat verschil lijkt klein, maar heeft grote gevolgen voor de architectuur van AI-systemen.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Tool calling verandert de betekenis van een AI-applicatie
&lt;/h1&gt;

&lt;p&gt;Een chatbot produceert voornamelijk informatie.&lt;/p&gt;

&lt;p&gt;Een agent kan &lt;strong&gt;consequenties veroorzaken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dat verschil is enorm.&lt;/p&gt;

&lt;p&gt;Stel dat een AI-systeem toegang heeft tot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zoek_klant()
maak_factuur()
annuleer_abonnement()
verstuur_email()
verwerk_betaling()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Het model is dan niet langer alleen een interface voor tekst.&lt;/p&gt;

&lt;p&gt;Het is onderdeel geworden van een systeem dat daadwerkelijk acties kan uitvoeren.&lt;/p&gt;

&lt;p&gt;Daarmee verandert ook het beveiligingsprobleem.&lt;/p&gt;

&lt;p&gt;We hoeven niet meer uitsluitend te vragen:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kan het model schadelijke tekst genereren?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De belangrijkere vraag wordt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Kan het model een ongeautoriseerde verandering in de echte wereld veroorzaken?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Daarom moeten tools strikt worden afgebakend.&lt;/p&gt;

&lt;p&gt;Een tool kan bijvoorbeeld een contract definiëren:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"maak_factuur"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"klant_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bedrag"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"number"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"valuta"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vervolgens moet de applicatie controleren:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bestaat de klant?
Is het bedrag toegestaan?
Is de valuta geldig?
Heeft deze gebruiker voldoende rechten?
Is menselijke goedkeuring noodzakelijk?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deze regels mogen niet uitsluitend aan het taalmodel worden overgelaten.&lt;/p&gt;

&lt;p&gt;Het model kan immers een overtuigend antwoord genereren zonder dat het antwoord noodzakelijkerwijs correct is.&lt;/p&gt;

&lt;p&gt;Daarom geldt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Een taalmodel moet geen autorisatiesysteem worden.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  6. Geheugen is ingewikkelder dan chatgeschiedenis
&lt;/h1&gt;

&lt;p&gt;Ook het begrip "AI-geheugen" wordt vaak te eenvoudig voorgesteld.&lt;/p&gt;

&lt;p&gt;Een agentisch systeem kan verschillende soorten geheugen nodig hebben.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kortetermijngeheugen
&lt;/h3&gt;

&lt;p&gt;De toestand van de huidige taak:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gebruikersvraag
→ tussenbeslissingen
→ toolresultaten
→ huidige status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Episodisch geheugen
&lt;/h3&gt;

&lt;p&gt;Gebeurtenissen uit eerdere interacties:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;De gebruiker heeft eerder actie X uitgevoerd.
Het systeem heeft daarna actie Y uitgevoerd.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Semantisch geheugen
&lt;/h3&gt;

&lt;p&gt;Geabstraheerde kennis die uit eerdere interacties is afgeleid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Deze organisatie gebruikt technologie X.
Deze klant heeft voorkeur Y.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Procedureel geheugen
&lt;/h3&gt;

&lt;p&gt;Informatie over hoe een taak moet worden uitgevoerd:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Identiteit controleren
2. Beleid ophalen
3. Controle uitvoeren
4. Goedkeuring vragen
5. Actie uitvoeren
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deze vormen van geheugen hoeven niet in dezelfde database te worden opgeslagen.&lt;/p&gt;

&lt;p&gt;Ook hoeven ze niet op dezelfde manier te worden opgehaald.&lt;/p&gt;

&lt;p&gt;Een geavanceerde AI-agent heeft daarom niet simpelweg "een geheugen".&lt;/p&gt;

&lt;p&gt;Hij heeft een &lt;strong&gt;geheugenarchitectuur&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. Multi-agent-systemen zijn niet automatisch beter
&lt;/h1&gt;

&lt;p&gt;Multi-agent-systemen zijn momenteel bijzonder interessant.&lt;/p&gt;

&lt;p&gt;Een architectuur kan bijvoorbeeld bestaan uit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  Supervisor
                 /     |      \
                /      |       \
           Onderzoek  Code     Review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Een agent onderzoekt informatie.&lt;/p&gt;

&lt;p&gt;Een andere schrijft software.&lt;/p&gt;

&lt;p&gt;Een derde controleert het resultaat.&lt;/p&gt;

&lt;p&gt;Op papier lijkt dit sterk op een organisatie waarin gespecialiseerde medewerkers samenwerken.&lt;/p&gt;

&lt;p&gt;Maar iedere extra agent introduceert ook nieuwe complexiteit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;extra communicatie;&lt;/li&gt;
&lt;li&gt;meer tokens;&lt;/li&gt;
&lt;li&gt;hogere latency;&lt;/li&gt;
&lt;li&gt;synchronisatieproblemen;&lt;/li&gt;
&lt;li&gt;extra foutmogelijkheden;&lt;/li&gt;
&lt;li&gt;moeilijkere debugging;&lt;/li&gt;
&lt;li&gt;onduidelijke verantwoordelijkheid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Een enkele goed ontworpen agent met drie betrouwbare tools kan daarom beter functioneren dan tien slecht gedefinieerde agents.&lt;/p&gt;

&lt;p&gt;De relevante vraag is niet:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hoeveel agents moeten we gebruiken?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maar:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Op welke punten vermindert decompositie de complexiteit?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Multi-agent-architecturen worden vooral interessant wanneer verschillende taken daadwerkelijk verschillende bevoegdheden, kennisgebieden of uitvoeringsomgevingen vereisen.&lt;/p&gt;

&lt;p&gt;Anders bestaat het risico dat we gedistribueerde systeemcomplexiteit simpelweg vermommen als intelligentie.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Betrouwbaarheid vereist evaluatie
&lt;/h1&gt;

&lt;p&gt;Traditionele software kan vaak worden getest met exacte verwachte uitkomsten.&lt;/p&gt;

&lt;p&gt;AI is anders.&lt;/p&gt;

&lt;p&gt;Er kunnen meerdere correcte antwoorden bestaan.&lt;/p&gt;

&lt;p&gt;Stel dat het gewenste antwoord is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;De aanvraag is goedgekeurd.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dan kunnen ook deze antwoorden correct zijn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Uw aanvraag is goedgekeurd.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;We hebben uw aanvraag goedgekeurd.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Een evaluatiesysteem kan daarom niet uitsluitend kijken naar exacte tekstovereenkomst.&lt;/p&gt;

&lt;p&gt;Moderne AI-evaluatie kan onder andere kijken naar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;feitelijke juistheid;&lt;/li&gt;
&lt;li&gt;retrieval precision;&lt;/li&gt;
&lt;li&gt;retrieval recall;&lt;/li&gt;
&lt;li&gt;correcte toolselectie;&lt;/li&gt;
&lt;li&gt;correcte toolparameters;&lt;/li&gt;
&lt;li&gt;naleving van beleidsregels;&lt;/li&gt;
&lt;li&gt;hallucinatieratio;&lt;/li&gt;
&lt;li&gt;latency;&lt;/li&gt;
&lt;li&gt;kosten;&lt;/li&gt;
&lt;li&gt;taakvoltooiing;&lt;/li&gt;
&lt;li&gt;aantal menselijke escalaties.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Een mogelijke evaluatiepipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Testdataset
    ↓
AI-systeem
    ↓
Trace
    ↓
Evaluator
    ↓
Metrics
    ↓
Regression test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dit is essentieel.&lt;/p&gt;

&lt;p&gt;Zonder evaluaties wordt AI-ontwikkeling snel gebaseerd op intuïtie.&lt;/p&gt;

&lt;p&gt;Een ontwikkelaar verandert een prompt, ziet één beter antwoord en concludeert dat het systeem verbeterd is.&lt;/p&gt;

&lt;p&gt;Het kan tegelijkertijd op tientallen andere scenario's slechter zijn geworden.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Observability wordt onderdeel van de AI-architectuur
&lt;/h1&gt;

&lt;p&gt;In traditionele software kan een logregel als deze al nuttig zijn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /api/payment → 200 OK
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bij een agentisch systeem is dat onvoldoende.&lt;/p&gt;

&lt;p&gt;We moeten kunnen reconstrueren hoe een bepaalde actie tot stand kwam.&lt;/p&gt;

&lt;p&gt;Bijvoorbeeld:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Gebruikersvraag
 ↓
Versie van systeeminstructie
 ↓
Geselecteerde documenten
 ↓
Modelaanroep
 ↓
Geselecteerde tool
 ↓
Toolparameters
 ↓
Toolresultaat
 ↓
Validatie
 ↓
Eindantwoord
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dit noemen we vaak een &lt;strong&gt;AI trace&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Een dergelijke trace maakt het mogelijk om vragen te beantwoorden als:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Waarom werd deze tool gekozen?&lt;/li&gt;
&lt;li&gt;Welke informatie beïnvloedde de beslissing?&lt;/li&gt;
&lt;li&gt;Welke documenten werden opgehaald?&lt;/li&gt;
&lt;li&gt;Was de retrieval succesvol?&lt;/li&gt;
&lt;li&gt;Heeft het model relevante informatie genegeerd?&lt;/li&gt;
&lt;li&gt;Was het toolresultaat incorrect?&lt;/li&gt;
&lt;li&gt;Is het systeem in een lus terechtgekomen?&lt;/li&gt;
&lt;li&gt;Welke promptversie veroorzaakte het probleem?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zonder dergelijke observability wordt het debuggen van autonome AI-systemen bijzonder moeilijk.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Het grootste probleem is niet altijd het taalmodel
&lt;/h1&gt;

&lt;p&gt;Een logische veronderstelling is dat een beter model automatisch een betere applicatie oplevert.&lt;/p&gt;

&lt;p&gt;Dat is slechts gedeeltelijk waar.&lt;/p&gt;

&lt;p&gt;Stel dat een systeem ongeveer deze eigenschappen heeft:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Modelkwaliteit:        90%
Retrievalkwaliteit:    60%
Toolbetrouwbaarheid:   70%
Contextkwaliteit:      65%
Evaluatiekwaliteit:    40%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Het vervangen van het taalmodel kan de eerste waarde verbeteren.&lt;/p&gt;

&lt;p&gt;Maar wanneer retrieval slecht blijft functioneren, zal de totale systeemprestatie mogelijk nauwelijks veranderen.&lt;/p&gt;

&lt;p&gt;De kwaliteit van een AI-pipeline is namelijk afhankelijk van meerdere componenten.&lt;/p&gt;

&lt;p&gt;Wanneer we een sterk vereenvoudigd model gebruiken:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;P(succes) =
P(retrieval)
× P(reasoning)
× P(tool execution)
× P(validation)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;zien we hoe snel een systeem kan degraderen.&lt;/p&gt;

&lt;p&gt;Bijvoorbeeld:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0,90 × 0,90 × 0,80 × 0,95 = 0,6156
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Een systeem kan dus een uitstekend taalmodel bevatten en toch slechts een middelmatige end-to-end-betrouwbaarheid hebben.&lt;/p&gt;

&lt;p&gt;Daarom begint AI-engineering steeds meer op klassieke systems engineering te lijken.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. De nieuwe AI-stack
&lt;/h1&gt;

&lt;p&gt;Een volwassen AI-applicatie kan worden opgebouwd uit verschillende lagen:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────┐
│       Gebruikersinterface    │
├──────────────────────────────┤
│      Agent / Orchestratie    │
├──────────────────────────────┤
│        Model / Inference     │
├──────────────────────────────┤
│     Context &amp;amp; Memory Layer   │
├──────────────────────────────┤
│         Retrieval / RAG      │
├──────────────────────────────┤
│          Tool Gateway        │
├──────────────────────────────┤
│     API's / Databases        │
├──────────────────────────────┤
│ Security / Policy / Audit    │
└──────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hierin zien we een belangrijke ontwikkeling.&lt;/p&gt;

&lt;p&gt;Het taalmodel is niet langer noodzakelijkerwijs het volledige middelpunt van de applicatie.&lt;/p&gt;

&lt;p&gt;Het is één laag binnen een groter systeem.&lt;/p&gt;

&lt;p&gt;Dat is een fundamentele verschuiving in softwarearchitectuur.&lt;/p&gt;

&lt;p&gt;AI-applicaties zijn niet simpelweg traditionele applicaties met een chatbotinterface.&lt;/p&gt;

&lt;p&gt;Ze zijn steeds vaker &lt;strong&gt;probabilistische softwaresystemen die functioneren binnen een grotendeels deterministische infrastructuur&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Het fundamentele probleem: autonomie zonder onbeperkte macht
&lt;/h1&gt;

&lt;p&gt;Dit wordt waarschijnlijk een van de belangrijkste architectuurvraagstukken van agentische AI.&lt;/p&gt;

&lt;p&gt;Een bruikbare agent moet voldoende autonomie hebben.&lt;/p&gt;

&lt;p&gt;Te weinig autonomie en het systeem is uiteindelijk slechts een dure chatbot.&lt;/p&gt;

&lt;p&gt;Te veel autonomie en het systeem wordt moeilijk beheersbaar.&lt;/p&gt;

&lt;p&gt;Daarom is &lt;strong&gt;graduele autonomie&lt;/strong&gt; interessant.&lt;/p&gt;

&lt;h3&gt;
  
  
  Niveau 0 — Adviseren
&lt;/h3&gt;

&lt;p&gt;De AI stelt een actie voor.&lt;/p&gt;

&lt;p&gt;Een mens voert de actie uit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Niveau 1 — Voorbereiden
&lt;/h3&gt;

&lt;p&gt;De AI bereidt de actie volledig voor.&lt;/p&gt;

&lt;p&gt;Een mens geeft toestemming.&lt;/p&gt;

&lt;h3&gt;
  
  
  Niveau 2 — Uitvoeren binnen grenzen
&lt;/h3&gt;

&lt;p&gt;De AI mag vooraf gedefinieerde acties uitvoeren zolang bepaalde limieten niet worden overschreden.&lt;/p&gt;

&lt;h3&gt;
  
  
  Niveau 3 — Autonome uitvoering
&lt;/h3&gt;

&lt;p&gt;De AI voert volledige workflows uit zonder directe menselijke interventie.&lt;/p&gt;

&lt;p&gt;De juiste mate van autonomie zou vervolgens afhankelijk moeten zijn van het risico.&lt;/p&gt;

&lt;p&gt;Een agenda-uitnodiging versturen is niet hetzelfde als een financiële transactie uitvoeren.&lt;/p&gt;

&lt;p&gt;Een robuust systeem kan daarom werken volgens:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Risico
 ↓
Verificatie
 ↓
Autorisatie
 ↓
Toegestane autonomie
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dat is veel betrouwbaarder dan simpelweg tegen een taalmodel zeggen dat het "voorzichtig" moet zijn.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusie: AI-engineering wordt systems engineering
&lt;/h1&gt;

&lt;p&gt;De meest interessante AI-systemen van de komende jaren zullen waarschijnlijk niet uitsluitend worden bepaald door de omvang van hun taalmodel.&lt;/p&gt;

&lt;p&gt;Ze zullen worden bepaald door de architectuur rondom dat model.&lt;/p&gt;

&lt;p&gt;De onderscheidende factor wordt steeds vaker het vermogen om verschillende technologieën betrouwbaar te combineren:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;krachtige inferentiemodellen;&lt;/li&gt;
&lt;li&gt;hoogwaardige retrieval;&lt;/li&gt;
&lt;li&gt;zorgvuldig ontworpen context;&lt;/li&gt;
&lt;li&gt;persistent geheugen;&lt;/li&gt;
&lt;li&gt;betrouwbare tools;&lt;/li&gt;
&lt;li&gt;deterministische bedrijfslogica;&lt;/li&gt;
&lt;li&gt;observability;&lt;/li&gt;
&lt;li&gt;evaluaties;&lt;/li&gt;
&lt;li&gt;beveiliging;&lt;/li&gt;
&lt;li&gt;gecontroleerde autonomie.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Een LLM is krachtig omdat het kan omgaan met ambiguïteit.&lt;/p&gt;

&lt;p&gt;Traditionele software is krachtig omdat het expliciete regels kan afdwingen.&lt;/p&gt;

&lt;p&gt;De toekomst van betrouwbare AI ligt in het combineren van beide.&lt;/p&gt;

&lt;p&gt;Het doel is daarom niet om een machine te bouwen die zonder grenzen autonoom opereert.&lt;/p&gt;

&lt;p&gt;Het doel is om een systeem te bouwen dat kan bepalen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;wanneer het moet redeneren, wanneer het informatie moet ophalen, wanneer het mag handelen, wanneer het moet verifiëren en wanneer het moet stoppen.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dat is een aanzienlijk moeilijker probleem dan het bouwen van een chatbot.&lt;/p&gt;

&lt;p&gt;En juist dat probleem kan de volgende generatie AI-systemen gaan definiëren.&lt;/p&gt;




&lt;h2&gt;
  
  
  Over de auteur
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Perceval Hasselman&lt;/strong&gt; schrijft over kunstmatige intelligentie, softwarearchitectuur, automatisering en opkomende technologie. Zijn interesse ligt met name bij de ontwikkeling van autonome systemen, AI-agents en de architectuur die nodig is om probabilistische AI betrouwbaar te integreren met traditionele software.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>architecture</category>
      <category>llm</category>
    </item>
    <item>
      <title>Python Coding: Why I Choose Python for Modern Software Development</title>
      <dc:creator>Perceval Hasselman</dc:creator>
      <pubDate>Mon, 03 Aug 2026 07:15:36 +0000</pubDate>
      <link>https://dev.to/percevalhasselman/python-coding-why-i-choose-python-for-modern-software-development-25m9</link>
      <guid>https://dev.to/percevalhasselman/python-coding-why-i-choose-python-for-modern-software-development-25m9</guid>
      <description>&lt;h1&gt;
  
  
  Python Coding: Why I Choose Python for Modern Software Development
&lt;/h1&gt;

&lt;p&gt;My name is &lt;strong&gt;Perceval Hasselman&lt;/strong&gt;, and one of the things I appreciate most about Python is how quickly an idea can become working software.&lt;/p&gt;

&lt;p&gt;Python is readable, versatile and supported by an enormous developer community. You can use it to build small automation scripts, websites, data-analysis tools and advanced artificial-intelligence applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is Python so popular?
&lt;/h2&gt;

&lt;p&gt;Python uses a clean and understandable syntax. A simple program can be written in just one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, DEV Community!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare that with languages that require additional declarations, brackets or configuration. Python allows developers to concentrate on solving the problem instead of writing unnecessary boilerplate code.&lt;/p&gt;

&lt;p&gt;This makes Python suitable for beginners, while its extensive ecosystem also makes it powerful enough for professional software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Variables and basic calculations
&lt;/h2&gt;

&lt;p&gt;Variables let us store and process information:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;developer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Perceval Hasselman&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;language&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;years_of_experience&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;developer&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; has been coding with &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;years_of_experience&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; years.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Python automatically determines the type of each variable. This keeps the code concise and easy to read.&lt;/p&gt;

&lt;p&gt;We can also perform calculations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;hours_per_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;days_per_week&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;

&lt;span class="n"&gt;weekly_hours&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hours_per_day&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;days_per_week&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Weekly coding time: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;weekly_hours&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; hours&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Working with functions
&lt;/h2&gt;

&lt;p&gt;Functions make code reusable and easier to maintain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate_project_cost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hourly_rate&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;hours&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;hourly_rate&lt;/span&gt;


&lt;span class="n"&gt;total_cost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;calculate_project_cost&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Estimated project cost: €&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;total_cost&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of repeating the same calculation throughout an application, we define it once and call the function whenever necessary.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical Python project
&lt;/h2&gt;

&lt;p&gt;A useful beginner project is a simple task manager. The following example lets us store tasks and display their status:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;complete_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;show_tasks&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Open&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;. &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nf"&gt;add_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Learn Python functions&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;add_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Build a small Python project&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;add_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Publish an article on DEV&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;complete_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;show_tasks&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Learn Python functions — Completed
2. Build a small Python project — Open
3. Publish an article on DEV — Open
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although this program is small, it already demonstrates several important Python concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lists&lt;/li&gt;
&lt;li&gt;Dictionaries&lt;/li&gt;
&lt;li&gt;Functions&lt;/li&gt;
&lt;li&gt;Conditions&lt;/li&gt;
&lt;li&gt;Loops&lt;/li&gt;
&lt;li&gt;Boolean values&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These building blocks can later be used to create a graphical application, web service or database-driven task manager.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where is Python used?
&lt;/h2&gt;

&lt;p&gt;Python can be found in many areas of technology:&lt;/p&gt;

&lt;h3&gt;
  
  
  Web development
&lt;/h3&gt;

&lt;p&gt;Frameworks such as Django, Flask and FastAPI help developers create websites, APIs and backend systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Artificial intelligence
&lt;/h3&gt;

&lt;p&gt;Python is widely used for machine learning, natural-language processing and computer vision. Libraries such as PyTorch, TensorFlow and scikit-learn give developers access to powerful AI tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data analysis
&lt;/h3&gt;

&lt;p&gt;With pandas, NumPy and Matplotlib, Python can process information, identify patterns and create visualisations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automation
&lt;/h3&gt;

&lt;p&gt;Repetitive tasks can often be automated with a short Python script. Examples include renaming files, processing spreadsheets, collecting data and generating reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cybersecurity
&lt;/h3&gt;

&lt;p&gt;Security professionals use Python to analyse networks, inspect files and build testing tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to become a better Python developer
&lt;/h2&gt;

&lt;p&gt;Reading tutorials is helpful, but programming is a practical skill. The fastest way to improve is to build projects.&lt;/p&gt;

&lt;p&gt;Start with something small:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a calculator.&lt;/li&gt;
&lt;li&gt;Build a password generator.&lt;/li&gt;
&lt;li&gt;Make a task manager.&lt;/li&gt;
&lt;li&gt;Analyse a CSV file.&lt;/li&gt;
&lt;li&gt;Connect your application to an API.&lt;/li&gt;
&lt;li&gt;Build a complete web application.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You will encounter errors along the way. That is not a sign that you are failing. Debugging is an essential part of programming, and every solved error improves your understanding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clean code matters
&lt;/h2&gt;

&lt;p&gt;Working code is only the beginning. Good code should also be understandable to other developers—and to your future self.&lt;/p&gt;

&lt;p&gt;Use descriptive names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Unclear
&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.21&lt;/span&gt;
&lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;

&lt;span class="c1"&gt;# Clear
&lt;/span&gt;&lt;span class="n"&gt;product_price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;
&lt;span class="n"&gt;tax_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.21&lt;/span&gt;
&lt;span class="n"&gt;tax_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;product_price&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;tax_rate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second version immediately communicates what the calculation represents. Clear naming becomes increasingly important as a project grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Python combines simplicity with serious technical power. It offers beginners an accessible introduction to programming while giving experienced developers the tools to build advanced applications.&lt;/p&gt;

&lt;p&gt;For me, Python coding is not only about writing instructions for a computer. It is about breaking complex problems into smaller parts and transforming ideas into practical solutions.&lt;/p&gt;

&lt;p&gt;The best way to learn is simple: choose a project, start coding and improve it step by step.&lt;/p&gt;

&lt;p&gt;Written by Perceval Hasselman&lt;/p&gt;

&lt;p&gt;If you found this article useful, feel free to leave a comment and share what you are currently building with Python.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>python</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Building a Complex WordPress Platform from Scratch</title>
      <dc:creator>Perceval Hasselman</dc:creator>
      <pubDate>Wed, 15 Jul 2026 20:42:11 +0000</pubDate>
      <link>https://dev.to/percevalhasselman/building-a-complex-wordpress-platform-from-scratch-25nf</link>
      <guid>https://dev.to/percevalhasselman/building-a-complex-wordpress-platform-from-scratch-25nf</guid>
      <description>&lt;p&gt;Hi my name is Perceval Hasselman and I'm and Building a simple WordPress website is one thing.&lt;/p&gt;

&lt;p&gt;Building a scalable platform with user accounts, custom dashboards, search functionality, premium memberships, and custom workflows is a completely different challenge.&lt;/p&gt;

&lt;p&gt;Over the last few weeks I’ve been planning a large WordPress project that combines multiple technologies into one platform.&lt;/p&gt;

&lt;p&gt;Some of the components include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom user registration and authentication&lt;/li&gt;
&lt;li&gt;Multiple user roles&lt;/li&gt;
&lt;li&gt;Dynamic property listings&lt;/li&gt;
&lt;li&gt;Advanced filtering and search&lt;/li&gt;
&lt;li&gt;Custom dashboards&lt;/li&gt;
&lt;li&gt;Secure contact forms&lt;/li&gt;
&lt;li&gt;SEO optimization&lt;/li&gt;
&lt;li&gt;Performance optimization&lt;/li&gt;
&lt;li&gt;Mobile-first design&lt;/li&gt;
&lt;li&gt;Custom PHP development&lt;/li&gt;
&lt;li&gt;WordPress hooks and filters&lt;/li&gt;
&lt;li&gt;Database optimization&lt;/li&gt;
&lt;li&gt;API integrations&lt;/li&gt;
&lt;li&gt;Payment gateway integration&lt;/li&gt;
&lt;li&gt;Security hardening&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the biggest lessons I’ve learned is that planning the architecture is often more important than writing code.&lt;/p&gt;

&lt;p&gt;A well-designed database structure, reusable components, and a clear development roadmap can save dozens of hours later in the project.&lt;/p&gt;

&lt;p&gt;Instead of trying to build everything at once, I’m breaking the platform into small milestones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build the core website&lt;/li&gt;
&lt;li&gt;Create user authentication&lt;/li&gt;
&lt;li&gt;Develop the listing system&lt;/li&gt;
&lt;li&gt;Implement search&lt;/li&gt;
&lt;li&gt;Add premium functionality&lt;/li&gt;
&lt;li&gt;Optimize performance&lt;/li&gt;
&lt;li&gt;Improve SEO&lt;/li&gt;
&lt;li&gt;Continue iterating based on feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Large WordPress projects are not just about themes and plugins.&lt;/p&gt;

&lt;p&gt;They’re about software architecture, maintainability, user experience, and continuous improvement.&lt;/p&gt;

&lt;p&gt;I’m looking forward to sharing more development updates as the project progresses.&lt;/p&gt;

&lt;h1&gt;
  
  
  WordPress #PHP #WebDev #SEO #AI
&lt;/h1&gt;

</description>
      <category>architecture</category>
      <category>php</category>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
