PROGRAMMEREN
Volledige Samenvatting — Alle 9 Lessen
Prof. dr. Tom Haegemans
Part-time professor SO&P2 | Lead Architect
Over dit document
Dit document is een uitgebreide samenvatting van alle 9 lessen Software Ontwerp &
Programmeren.
Het doel is om elk concept zo intuïtief mogelijk uit te leggen — ook voor iemand die de
lessen niet gevolgd heeft.
De rode draad doorheen het vak: hoe bouw je goede software — met mensen én met AI?
,Les 1 — Inleiding & Fundamentele Concepten
Waarom dit vak?
Software wordt steeds meer gebouwd door AI-modellen (LLMs) in plaats van enkel door
mensen. Maar om de output van een AI te kunnen beoordelen, én om zelf goede
softwarearchitectuur te kunnen ontwerpen, heb je fundamentele kennis nodig. Dat is precies
wat dit vak je bijbrengt.
💡 De analogie van de prof: een ingenieursmanger geeft niet stap-voor-stap uitleg hoe
iets moet werken — hij/zij geeft een spec (specificatie). Hetzelfde doe je met AI: je
beschrijft wat je wilt, niet hoe het technisch moet werken.
Programmeertalen als Abstractie
Een computer begrijpt enkel 0'en en 1'en (binaire machinetaal). Programmeertalen zijn een
tussenschakel die het voor mensen mogelijk maakt om instructies te geven. Hoe 'hoger' de
programmeertaal, hoe verder weg van de hardware en hoe dichter bij menselijke taal.
Voorbeeld: hoe schrijf je '42 opslaan' in drie talen?
Assembly (laag niveau): mov eax, 42 → Sla getal 42 op in CPU-register 'eax'
C++ (systeemtaal): int number = 42; → Reserveer geheugen voor een geheel getal,
noem het 'number', geef waarde 42
Python (hoog niveau): number = 42 → De taal zoekt zelf uit wat voor soort getal het is
Programmeertaal Eigenschappen
Assembly Zeer snel, volledige controle, maar moeilijk
leesbaar. Niet overdraagbaar naar andere
CPU's.
C / C++ Goede balans snelheid vs leesbaarheid. Je
beheert zelf het geheugen. Portabel
(hercompileerbaar voor andere CPU's).
Python / JavaScript Gemakkelijkst voor mensen. Geheugen
wordt automatisch beheerd. Trager maar
uitstekend voor de meeste toepassingen.
Compilers vs. Interpreters
Programmeertalen moeten omgezet worden naar machinetaal voordat de computer ze kan
uitvoeren. Dit kan op twee manieren:
Eigenschap Compiler / Interpreter
, Wanneer vertaald? Vóór uitvoering (compiler)
Output .exe of uitvoerbaar bestand
Snelheid Sneller (al vertaald)
Foutdetectie Vóór én tijdens uitvoering
Overdraagbaarheid Moet hergecompileerd worden per platform
Voorbeelden C, C++, Go, Rust
💡 Java is een bijzonder geval: het wordt gecompileerd naar 'bytecode' die daarna door
de Java Virtual Machine (JVM) wordt geïnterpreteerd. Zo is Java portabel én relatief
snel.
Types: Hoe omgaan met Data?
Een 'type' zegt de computer hoe hij data moet interpreteren. Is '11' een getal (11) of tekst
('11')? Dat maakt een groot verschil! Er zijn twee belangrijke onderscheidingen:
Concept Uitleg
Statische typering Types worden bepaald bij het schrijven van
de code (compile time). Eenmaal int, altijd int.
→ Veiliger, fouten worden vroeg gevonden.
Bv: Java, C++
Dynamische typering Types worden bepaald tijdens de uitvoering
(runtime). Een variabele kan van type
wisselen. → Flexibeler, maar meer kans op
runtime errors. Bv: Python, JavaScript
Sterke typering (strong) Strikte regels. 1 + '2' geeft een foutmelding.
→ Python
Zwakke typering (weak) Impliciete type-omzettingen. 1 + '2' wordt
automatisch '12'. → JavaScript
💡 Voor code die door LLMs gegenereerd wordt, raden experts statisch én sterk
getypeerde talen aan. Zo worden fouten sneller gevonden.
Coding Paradigma's: Denkkaders voor Software
Een paradigma is een manier van denken over hoe je software structureert. Geen
technologie, maar een filosofie. Programmeertalen ondersteunen vaak meerdere
paradigma's tegelijk.
Paradigma Beschrijving
Imperatief / Procedureel Stap-voor-stap beschrijven wat de computer
moet doen — zoals een recept volgen. De
computer weet wat hij stap voor stap moet
, uitvoeren. Bv: C, Assembly.
Functioneel / Declaratief Beschrijf het gewenste resultaat, niet hoe je
er komt. Functies zijn de bouwblokken.
Minder fouten door deterministisch
(voorspelbaar) gedrag. Bv: SQL, Haskell,
Elixir.
Object-Georiënteerd (OO) Structureer code rond 'objecten' die data (wat
ze onthouden) en gedrag (wat ze kunnen
doen) combineren. Ideaal voor grote teams
en complexe systemen. Bv: Java, Python, C+
+.