Codeprompts: een kant-en-klare taak voor elke taal
Zestien opdrachten voor wie code wil laten genereren zonder eerst de helft uit te leggen. In elke staat al welke taal en versie bedoeld zijn, of er een framework bij komt kijken en hoe grondig fouten afgehandeld moeten worden — vervang je eigen veldnamen en lees de code.
Functies en hulpjes
De kleine dingen die je in elk project opnieuw schrijft: een hulpfunctie schrijven in Python, een slug uit de kop, een bedrag in euro's formatteren, een formulierveld valideren en werkdagen tussen twee datums berekenen.
URL-slug uit de kop
Maakt van een artikelkop een nette webadres: kleine letters, streepjes, niets om te escapen.
Schrijf een JavaScript-functie die een artikelkop omzet naar een URL-slug: kleine letters, spaties worden streepjes, accenten en de ij blijven leesbaar, leestekens vallen weg en er staat nooit een streepje aan het begin of eind. Zonder afhankelijkheden.
export function slugify(title) { // de normalisatie haalt de letter en het accent uit elkaar, het accent gaat weg — in een URL bleef daar alleen %C3-rommel van over const base = title.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").toLowerCase() return base.replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "")}
Een bedrag opmaken
Duizendtalscheiding, twee decimalen en de valuta — afgerond voordat er wordt opgemaakt, niet erna.
Schrijf een Python-functie die een Decimal als bedrag in Nederlandse opmaak toont: 1234.5 wordt 1.234,50 EUR. Rond eerst af op centen en nooit op een float, en laat een andere valutacode doorgeven.
def format_money(amount: Decimal, currency: str = "EUR") -> str: # eerst naar centen afronden, daarna pas opmaken: op een float verdwijnt de laatste cent value = amount.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP) return locale.format_string("%.2f", value, grouping=True) + " " + currency
Een formulierveld controleren
Een reguliere expressie voor e-mail en telefoon, plus de controle van één regel die hem gebruikt.
Schrijf reguliere expressies die een e-mailadres en een Nederlands telefoonnummer in het registratieformulier controleren, elk met een korte controlefunctie. Leg uit wat elk deel van het patroon doet, zodat ik het kan aanpassen.
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[a-z]+$/i// in de browser controleren we alleen de vorm — of het adres bestaat, bewijst de bevestigingsmailexport const isEmail = (value) => EMAIL_RE.test(value.trim().toLowerCase())
Werkdagen tussen twee datums
Weekenden en feestdagen eraf, en een uitzondering als de datums omgedraaid binnenkomen.
Schrijf een PHP 8.3-functie die werkdagen tussen twee datums telt: sla zaterdagen, zondagen en elke datum uit een feestdagen-array over. Gooi een uitzondering als de einddatum voor de begindatum ligt.
function workingDays(DateTimeImmutable $from, DateTimeImmutable $to, array $holidays = []): int{ $period = new DatePeriod($from, new DateInterval("P1D"), $to); $isWork = fn (DateTimeImmutable $d) => (int) $d->format("N") < 6 && !in_array($d->format("Y-m-d"), $holidays, true); return count(array_filter(iterator_to_array($period), $isWork));}
Data en APIs
Het gesprek met andermans dienst en je eigen database: een API aanroepen in code met retries, een CSV-bestand importeren met rommelige data, een SQL-rapportquery laten schrijven en een lijst met paginering.
API-aanroep met herhalingen
Een timeout, een herhaling bij 5xx en een harde stop: één trage dienst mag het hele verzoek niet ophangen.
Schrijf een TypeScript-functie die een HTTP-API aanroept met vier seconden timeout en maximaal drie pogingen. Herhaal alleen bij 5xx en netwerkfouten, nooit bij 4xx, wacht tussen de pogingen en gooi een getypeerde fout zodra ze op zijn.
export async function fetchWithRetry(url: string, tries = 3): Promise<Response> { const res = await fetch(url, { signal: AbortSignal.timeout(4000) }) if (res.ok || res.status < 500 || tries === 1) return res await new Promise((r) => setTimeout(r, 400)) return fetchWithRetry(url, tries - 1)}
Een scheve CSV importeren
Leest de prijslijst van een leverancier en zet kapotte regels in een eigen bestand in plaats van te stoppen.
Schrijf een Python-script met pandas dat de prijslijst van een leverancier uit een CSV importeert: puntkomma als scheidingsteken, komma als decimaalteken, prijzen komen als tekst binnen en ontbreken soms helemaal. Zet de foute regels in rejected.csv en haal dubbelen op order_id eruit.
orders = pd.read_csv("orders.csv", sep=";", decimal=",", on_bad_lines="warn")orders["total"] = pd.to_numeric(orders["total"], errors="coerce")bad = orders["total"].isna()orders.loc[bad].to_csv("rejected.csv", index=False)clean = orders.loc[~bad].drop_duplicates(subset="order_id")
Een rapportquery
Omzet per klant en per maand, geschreven op het schema dat je in het datavenster plakt.
Schrijf een PostgreSQL-query voor het schema hierboven: omzet per klant en per maand over het afgelopen jaar, van groot naar klein, zonder de klanten die nooit iets bestelden.
SELECT c.name, date_trunc('month', o.created_at) AS month, sum(o.total) AS revenueFROM orders oJOIN customers c ON c.id = o.customer_idWHERE o.created_at >= now() - interval '1 year'GROUP BY 1, 2ORDER BY revenue DESC
Een gepagineerde lijst
Cursorpaginatie: de variant die geen regels dubbel toont als er tijdens het scrollen nieuwe bij komen.
Schrijf een TypeScript-functie met Prisma die een pagina gepubliceerde posts teruggeeft met cursorpaginatie: twintig per keer, de nieuwste bovenaan, plus een nextCursor die de client terugstuurt voor de volgende pagina.
const page = await prisma.post.findMany({ where: { published: true }, orderBy: { createdAt: "desc" }, cursor: cursorId ? { id: cursorId } : undefined, take: 20,})
Interface
De stukken scherm die eigenlijk code zijn: een React-component schrijven, een eigen hook voor het ophalen van data, een responsive kaartenraster met CSS grid en een lijstscherm in een app.
Een React-hook
Houdt de invoer in het zoekveld tegen, zodat de lijst niet bij elke toetsaanslag opnieuw wordt opgehaald.
Schrijf een getypeerde React-hook die een waarde 300 ms vertraagt en zijn timer opruimt bij unmount, plus twee regels die laten zien hoe een zoekveld hem gebruikt.
export function useDebounced(value: string, delay = 300) { const [out, setOut] = useState(value) useEffect(() => { const id = setTimeout(() => setOut(value), delay) return () => clearTimeout(id) }, [value, delay]) return out}
Een meebewegend kaartenraster
Catalogus-kaarten gaan van vier kolommen naar één, zonder ook maar één media query.
Schrijf de CSS voor een kaartenraster in de catalogus: kaarten minstens 260px breed, de rij helemaal gevuld, 16px ruimte, geen media queries. Klassenamen volgens BEM.
.catalog__grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 16px;}
Een lijstscherm
Een scrollende bestellijst in Jetpack Compose, met een tik op de regel en een lege staat.
Schrijf een Jetpack Compose-scherm met een scrollbare bestellijst: elke regel toont nummer, datum en bedrag, een tik opent de bestelling en bij een lege lijst verschijnt een melding.
@Composablefun OrderList(orders: List<Order>) { LazyColumn { items(orders) { order -> OrderRow(order, onClick = { openOrder(order.id) }) } }}
Scripts en automatisering
Code die zonder jou draait: een bash-script schrijven, een script voor de nachtelijke back-up van de database en een cronjob instellen voor een terugkerende taak die vanzelf wakker wordt.
Nachtelijke back-up van de database
Maakt de dump, noemt het bestand naar de datum en wist alles wat ouder is dan een maand.
Schrijf een Bash-script dat een PostgreSQL-database dumpt naar /backup met de datum in de bestandsnaam, dumps ouder dan 30 dagen verwijdert en bij de eerste fout stopt. Zonder ShellCheck-waarschuwingen.
#!/usr/bin/env bashset -euo pipefailstamp=$(date +%F)pg_dump --format=custom "$DATABASE_URL" > "/backup/db-$stamp.dump"find /backup -name "db-*.dump" -mtime +30 -delete
Een hulpmiddel voor de opdrachtregel
Een eenmalig gereedschap: loopt door een map en hernoemt de bestanden volgens een regel.
Schrijf een Go-opdrachtregelprogramma dat door een map loopt en fotos hernoemt naar de datum waarop ze zijn gemaakt. De map komt binnen als flag, zonder --apply toon je alleen wat er zou veranderen, en gebruik alleen de standaardbibliotheek.
func main() { dir := flag.String("dir", ".", "map met de fotos") flag.Parse() if err := filepath.WalkDir(*dir, renameByShootDate); err != nil { log.Fatal(err) }}
Een taak op een schema
Wordt om zeven uur op werkdagen wakker, haalt de cijfers van gisteren op en mailt ze door.
Schrijf een Node.js-taak die op werkdagen om 07:00 de omzet van gisteren uit PostgreSQL haalt, er een HTML-tabel van maakt en die naar het verkoopteam mailt. Log fouten en laat het proces nooit omvallen.
// zeven uur op werkdagen: de cijfers moeten er zijn voordat de dagstart begintcron.schedule("0 7 * * 1-5", async () => { const rows = await db.query(DAILY_SALES_SQL) await mailer.send({ to: "verkoop@winkel.nl", subject: "Omzet van gisteren", html: render(rows) })})
Tests
Unittests schrijven voor code die er al staat: tests voor een losse functie, tests voor een API-endpoint en precies die randgevallen afdekken die je met de hand stilletjes overslaat.
Tests voor een functie
pytest met geparametriseerde gevallen: nul, een negatief bedrag en None.
Schrijf pytest-tests voor een functie format_money(amount, currency): nul, een groot bedrag, een negatief bedrag, twee decimalen en een TypeError als er None binnenkomt. Met parametrize.
@pytest.mark.parametrize("amount,expected", [("0", "0,00"), ("1234.5", "1.234,50")])def test_format_money(amount, expected): assert format_money(Decimal(amount)) == expecteddef test_format_money_rejects_none(): with pytest.raises(TypeError): format_money(None)
Tests voor een endpoint
JUnit-tests op GET en POST, inclusief de 404 en de validatiefout.
Schrijf JUnit 5-tests voor het REST-endpoint /api/orders: 200 met body voor een bestaande bestelling, 404 bij een onbekende id, 400 bij een kapotte payload. Controleer de JSON-velden, niet alleen de status.
@Testvoid returnsNotFoundForUnknownOrder() throws Exception { mockMvc.perform(get("/api/orders/0")) .andExpect(status().isNotFound()) .andExpect(jsonPath("$.error").value("order_not_found"));}