Skip to content

Programmeren met AI

AI-assistenten zoals GitHub Copilot, ChatGPT en Claude kunnen je helpen bij het schrijven van code. Ze zijn krachtige tools, maar ze maken ook fouten. Dit hoofdstuk behandelt hoe je kritisch omgaat met AI-gegenereerde code.


AI als programmeerhulp

Wat AI-assistenten kunnen

Taak Voorbeeld
Code genereren Functie schrijven op basis van beschrijving
Code uitleggen Bestaande code analyseren en toelichten
Bugs vinden Fouten opsporen en oplossingen voorstellen
Refactoren Code verbeteren zonder functionaliteit te wijzigen
Documentatie Docstrings en comments genereren
Tests schrijven Unit tests genereren
Vertalen Code van de ene taal naar de andere

Wat AI-assistenten niet kunnen

Beperking Toelichting
Begrijpen van context Kent je volledige codebase niet
Garanderen van correctheid Kan zelfverzekerd foute code geven
Up-to-date zijn Trainingsdata heeft een afkapmoment
Jouw requirements kennen Weet niet wat je precies nodig hebt
Verantwoordelijkheid nemen Jij blijft verantwoordelijk voor de code

Kritisch omgaan met AI-code

De gouden regel

!!! warning "Vertrouw, maar verifieer" Behandel AI-gegenereerde code zoals je code van een junior developer zou behandelen: vaak bruikbaar, maar altijd controleren voordat je het accepteert.

Checklist voor AI-code

Voordat je AI-gegenereerde code overneemt, doorloop deze checklist:

Check Vraag
Begrijp je de code? Kun je uitleggen wat elke regel doet?
Doet het wat je vroeg? Lost het daadwerkelijk jouw probleem op?
Is het correct? Geen logische fouten, edge cases gemist?
Is het veilig? Geen security vulnerabilities?
Is het efficiënt? Geen onnodige complexiteit of performance issues?
Past het in je codebase? Volgt het de conventies en stijl?
Heb je het getest? Werkt het met jouw data en omgeving?

Veelvoorkomende problemen

1. Hallucinaties

AI kan functies, libraries of API's verzinnen die niet bestaan.

1
2
3
4
5
6
7
# AI suggereert:
from sklearn.magic import AutoSolver  # ❌ Bestaat niet!

# Altijd checken:
# - Bestaat deze import?
# - Is dit de juiste syntax voor deze library?
# - Klopt de versie?

Oplossing: Controleer imports in de officiële documentatie.

2. Verouderde code

AI kan code genereren gebaseerd op oude versies van libraries.

1
2
3
4
5
# AI suggereert (verouderd):
from sklearn.cross_validation import train_test_split  # ❌ Deprecated

# Correct (actueel):
from sklearn.model_selection import train_test_split  # ✅

Oplossing: Check de huidige documentatie van de library.

3. Security vulnerabilities

AI houdt niet altijd rekening met security best practices.

1
2
3
4
5
6
7
# AI suggereert:
query = f"SELECT * FROM users WHERE id = {user_input}"  # ❌ SQL injection!
cursor.execute(query)

# Correct:
query = "SELECT * FROM users WHERE id = ?"  # ✅ Parameterized
cursor.execute(query, (user_input,))

Oplossing: Ken de security risks van wat je bouwt.

4. Inefficiënte oplossingen

AI kiest niet altijd de meest efficiënte aanpak.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# AI suggereert:
result = []
for item in large_list:
    if item > 10:
        result.append(item * 2)

# Efficiënter:
result = [item * 2 for item in large_list if item > 10]

# Of met numpy voor grote datasets:
result = large_array[large_array > 10] * 2

Oplossing: Vraag jezelf af of er een betere manier is.

5. Verkeerde aannames

AI maakt aannames over je data of context die niet kloppen.

1
2
3
4
5
6
7
8
# AI neemt aan dat 'df' geen missing values heeft:
average = df['column'].mean()  # Kan NaN returnen

# Robuuster:
average = df['column'].dropna().mean()
# Of check eerst:
if df['column'].isnull().any():
    print("Let op: missing values aanwezig")

Oplossing: Test met je eigen data, inclusief edge cases.

6. Incomplete error handling

AI vergeet vaak error handling.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# AI suggereert:
data = pd.read_csv('data.csv')  # ❌ Wat als file niet bestaat?

# Robuuster:
try:
    data = pd.read_csv('data.csv')
except FileNotFoundError:
    print("Data file niet gevonden")
    raise
except pd.errors.EmptyDataError:
    print("Data file is leeg")
    raise

Oplossing: Denk na over wat er mis kan gaan.


Effectief prompts schrijven

Hoe beter je vraag, hoe beter het antwoord.

Goede prompts

Slecht Beter
"Maak een functie" "Schrijf een Python functie die een lijst met getallen sorteert van hoog naar laag"
"Fix deze bug" "Deze functie geeft een TypeError op regel 5 wanneer de input een lege lijst is. Hoe los ik dit op?"
"Maak dit sneller" "Deze loop over 1M items duurt 30 seconden. Hoe kan ik dit optimaliseren met numpy of vectorization?"

Prompt template

1
2
3
4
5
Context: [Wat is de situatie? Welke libraries gebruik je?]
Probleem: [Wat probeer je te bereiken?]
Constraints: [Welke beperkingen zijn er?]
Huidige code: [Relevante code snippets]
Vraag: [Wat wil je specifiek weten?]

Voorbeeld

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Context: Ik werk aan een ML-project met scikit-learn 1.3 en pandas 2.0.

Probleem: Ik wil missing values imputeren, maar alleen voor numerieke 
kolommen, niet voor categorische.

Constraint: De oplossing moet werken in een sklearn Pipeline.

Huidige code:
```python
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
# ...

Vraag: Hoe kan ik verschillende imputers toepassen op verschillende kolomtypes binnen één pipeline?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
---

## Code review proces

### Stap 1: Lees de code regel voor regel

Vraag bij elke regel:

- Wat doet dit?
- Waarom is dit nodig?
- Wat kan hier misgaan?

### Stap 2: Test de code

```python
# Test met normale input
assert functie([1, 2, 3]) == verwacht_resultaat

# Test met edge cases
assert functie([]) == []  # Lege input
assert functie([1]) == [1]  # Enkele waarde
assert functie(None) raises TypeError  # Ongeldige input

Stap 3: Vraag door

Als iets onduidelijk is, vraag de AI om uitleg:

  • "Waarom gebruik je deze aanpak in plaats van X?"
  • "Wat gebeurt er als de input leeg is?"
  • "Is dit de meest efficiënte manier?"

Stap 4: Aanpassen aan jouw stijl

AI-code volgt niet automatisch jouw conventies:

1
2
3
4
5
6
7
# AI stijl:
def calc(x,y): return x+y

# Jouw team stijl:
def calculate_sum(first_number: int, second_number: int) -> int:
    """Calculate the sum of two numbers."""
    return first_number + second_number

Wanneer wel/niet AI gebruiken

Goed voor

Use case Waarom
Boilerplate code Repetitief, lage risico
Documentatie AI is goed in helder schrijven (ironisch als je dit leest)
Regex patronen Complexe syntax, makkelijk te testen
Exploratie Snel ideeën uitproberen
Leren Nieuwe concepten begrijpen
Debugging hulp Tweede paar ogen

Voorzichtig mee

Use case Risico
Security-kritieke code AI mist vaak security issues
Complexe business logica AI kent je domein niet
Performance-kritieke code AI optimaliseert niet automatisch
Productie code Altijd reviewen en testen

Niet voor

Use case Reden
Code die je niet begrijpt Je bent verantwoordelijk
Blindelings copy-pasten Leidt tot bugs en technical debt
Vervanging voor leren Je moet zelf kunnen programmeren

Vaardigheden blijven ontwikkelen

AI is een hulpmiddel, geen vervanging voor programmeervaardigheden.

Balans vinden

Doe wel Doe niet
Gebruik AI om sneller te werken Laat AI al het denkwerk doen
Leer van AI-suggesties Kopieer zonder te begrijpen
Vraag AI om uitleg Accepteer code die je niet snapt
Combineer met eigen kennis Vertrouw blindelings

Blijf leren

  • Begrijp de fundamenten (algoritmen, datastructuren)
  • Ken je libraries en frameworks
  • Oefen zonder AI (soms)
  • Review AI-code kritisch — je leert van de fouten

!!! note "Jij bent de expert" AI is een krachtige assistent, maar jij bent de expert die beslist wat goed is. Je hoeft niet alles zelf te typen, maar je moet wel alles kunnen uitleggen en verdedigen.