Leren programmeren is zinloos

October 23, 2017
8

Toen ik in de jaren tachtig informatica studeerde, vroegen vrienden of ik ook een computer had. Dat was toen nog helemaal niet vanzelfsprekend. Ik zei dan altijd dat ik er wel een had, maar dat ik voor de studie eigenlijk alleen maar een vel papier en een potlood nodig had. Dan keken die vrienden me altijd wat wazig aan... Ik legde ze dan uit dat je bij informatica natuurlijk ook leert programmeren, maar dat de essentie van informatica de theorie van het berekenen is. Iets wat nu wel ‘computational thinking’ of, in engere zin, algoritmiek wordt genoemd.

Vandaar dat ik altijd wat verbaasd ben als mensen roepen dat iedereen moet leren programmeren. Zoals onlangs Tim Cook, de ceo van Apple, die beweerde dat leren programmeren zelfs belangrijker is dan Engels als tweede taal leren! Ook in Nederland zijn er experts die vinden dat kinderen al vroeg op school moeten leren programmeren. Maar volgens mij legt leren programmeren de nadruk op de details, en raakt zo de essentie van hoe computers, software en netwerken werken buiten beeld.

Laten we eerlijk zijn. Programmeren is vervelend. Je leert een programmeertaal, met al zijn eigenaardigheden (die vaak volstrekt niet logisch zijn), en moet dan een simpel programma in die taal schrijven. Zonder één fout, anders begrijpt de computer het niet. Een komma vergeten is al fataal. Na heel veel moeite heb je dan een programma geschreven dat 'Hello World' op het scherm van je smartphone afbeeldt. Gefeliciteerd! Maar je hebt ondertussen niets geleerd over de gigantische complexiteit van hoe echte software in elkaar zit, en hoe die in de praktijk geschreven wordt.

Ook heb je zo wellicht het, misplaatste, gevoel gekregen dat door te programmeren je de volledige controle hebt gekregen over de computer.

Dat is natuurlijk niet waar: jouw programmeerkunst verandert niets aan hoe de software werkt die op jouw computer draait.

Veel belangrijker is volgens mij kinderen (en volwassenen) het bredere kader uit te leggen: hoe computers werken, hoe netwerken werken. Hoe om te gaan met asynchronie (het verschijnsel dat niet alle computers in een netwerk even snel zijn, en dat ook berichten die je over een netwerk verstuurt niet of zwaar vertraagd kunnen aankomen). Uitleggen wat de voor- en nadelen van centralistische oplossingen zijn, en hoe dat zit met gedistribueerde, peer-to-peer benaderingen. Laten zien hoe je een bepaald (maatschappelijk) probleem kunt proberen op te lossen door computers, door het probleem in kleinere delen op te splitsen. En duidelijk maken wat de beperkingen zijn van deze ‘computationele methode’.

De echte inzichten in de informatica zitten hierin verborgen. Bijvoorbeeld hoe slimme algoritmen en protocollen, soms door verrassende keuzes te maken, een bepaald complex probleem toch snel en efficiënt (in rekentijd, geheugengebruik of netwerkbelasting) weten op te lossen. Of hoe het ontwerp van een protocol extreem veel invloed kan hebben op de controle die individuele gebruikers op het systeem hebben. Zo is het internet in de basis zo ontworpen dat iedereen, zonder medewerking van derden, daar een eigen dienst bovenop kan bouwen. Dat komt door het ontbreken van een duidelijk centraal controlepunt. Aan de andere kant zijn commerciële diensten als Facebook en WhatsApp zo ontworpen dat andere diensten daar niet zomaar op aan kunnen sluiten: als je een andere berichtendienst dan WhatsApp gebruikt, kun je je vrienden op WhatsApp niet bereiken.

Juist dit soort inzichten zijn essentieel om aan zoveel mogelijk mensen duidelijk te maken. Vandaar dat ik vanaf dit studiejaar over deze onderwerpen college ga geven aan de rechtenstudenten van de Rijksuniversiteit Groningen. En niet om ze te leren hoe ze 'Hello World' op het scherm van hun smartphone kunnen toveren.

Deze column verscheen op 21 oktober 2017 in het Morgen katern van het FD.

In case you spot any errors on this page, please notify me!
Or, leave a comment.
Jan-Jaap Oerlemans
, 2017-10-23 08:07:18
(reply)

Hoi Jaap-Henk, wat leuk dat je dat gaat doen! Het lijkt mij ook een belangrijke boodschap in je column. Heb je misschien litereratuursuggesties (zonder paywall) over de onderwerpen die je aanstipt die je beschikbaar wilt stellen? Dan kunnen er nog meer juristen er mee aan de slag! :-)

Jaap-Henk
, 2017-10-25 21:06:41
(reply)

Ik zal in een volgende blogpost iets vertellen over de cursus die ik in Groningen aan het opzetten ben…

Joost van Schaik
, 2017-10-23 08:24:55
(reply)

“Programmeren is vervelend”. Presenteren van mening als feit. Ik vind hardlopen vervelend, miljoenen niet. Ik vind Heel Holland bakt vervelend, miljoenen kijken ernaar. Ik vind naar voetbalwedstrijden nog saaier dan slakken race kijken, get grootste deel van de wereld denkt daar duidelijkheid anders over.

Spreek voor jezelf. Met een toetsenbord en mijn fantasie los ik problemen op voor mijn werk en maak de mooiste dingen in mijn vrije tijd. De programmeertaal is de verf waarmee ik schilder, - in 3D -de computer mijn doek.

Ieder zijn ding.

Jaap-Henk
, 2017-10-25 21:05:54
(reply)

Helemaal eens. Ieder zijn ding. Maar verplicht dan niet om alle kinderen te leren programmeren. Dan nog liever iedereen verplicht leren taarten bakken ;-)

Wiebe-Marten Wijnja
, 2017-10-23 10:33:05
(reply)

Alhoewel dit artikel lekker leest, heb ik het gevoel dat het een overhaaste generalisatie presenteert:

Ik ben het volkomen eens dat er in de huidige mentaliteit een te grote nadruk ligt op het programmeren, en te weinig op mensen een vogelperspectief te bieden op de werking van computatie en networking.

Ook zie ik zeker een tendens bij mensen die ooit programmeren geleerd hebben, dat er heel snel naar een ‘oplossing’ wordt gesprongen zonder eerst het probleem concreet beschreven te hebben of te splitsen in subproblemen, met als resultaat dat er weliswaar ‘een’ oplossing gemaakt wordt, dit echter niet een oplossing is voor het probleem dat er eigenlijk was.

Ik denk deze mentaliteit aardig valt samen te vatten in deze gevleugelde woorden:

> The real danger is not that computers will begin to think like men, but that men will begin to think like computers. ~Sydney J. Harris

Op het moment dat we vanuit de computer, dus vanuit de details gaan denken, dan houden we onszelf gevangen in de beperkingen van de huidige systemen en zullen oplossingen hier altijd door beperkt zijn. Beter zou het zijn om keer op keer opnieuw te evalueren of de oude beperkingen nog steeds van pas zijn, of dat er ondertussen manieren zijn om deze beperkingen te ontkrachten.

Een goed voorbeeld hiervan is het fenomeen ‘paralellisatie’. Tegenwoordig is de enige manier waarop computers sneller kunnen berekenen het hebben van meer CPU-cores die tegelijkertijd werk doen. Vroeger bestond dit niet, en kon alles inherent alleen sequentieel uitgevoerd worden. Bij veel programmeurs zit de oude, sequentiele vorm van denken nu ingebakken: Moderne programmeertalen bevatten hulpmiddelen om de computer automatisch te laten kiezen wat de beste (snelste) manier is om over de dataset heen te lopen afhankelijk van de grootte van de data en de hoeveelheid cores van de computer waar het programma op wordt uitgevoerd. Maar toch zullen veel programmeurs in plaats van deze technieken te gebruiken ervoor kiezen om gewoon weer een oude sequentiële for-loop te schrijven, met significant tragere software als gevolg.

Het statement dat ik wil maken: Het zou veel beter zijn wanneer de denkstappen die de mens maakt verder verwijderd zitten van de implementatiedetais van de computer.

(Precies dit is trouwens waarom ik een groot fan ben van functionele programmeertalen zoals Haskell en declaratieve talen zoals Prolog. Interessant is dat mensen zonder voorkennis van andere (imperatieve, object-georienteerde) programmeertalen het vaak makkelijker vinden om ze te leren, omdat ze minder kennis hoeven te ‘vergeten’.)

Maar, aan de andere kant denk ik dat er een aantal abstractere denkpatronen en handelswijzes alleen (of in ieder geval veel eenvoudiger) te begrijpen zijn wanneer een bepaalde praktische basiskennis aanwezig is. Zonder deze kennis kun je van veel dingen wel uitleggen hoe iets zich gedraagt, maar niet waarom (voorbeeld: https://xkcd.com/1425/), en valt de geleerde kennis dus moelijk breder gebruikt te worden dan de gelimiteerde set van situaties die tijdens de lessen is behandeld.

En daarom vind dat ‘leren programmeren is zinloos’ het argument te ver doorvoert. Alhoewel deze titel mooi clickbaity is, is het ook ietwat kort door de bocht.

Jaap-Henk
, 2017-10-25 21:04:50
(reply)

Beste Wiebe-Marten. Volgens mij zijn we het gewoon 100% eens met elkaar. Het verschil zit hem in wat we bedoelen met ‘leren programmeren’. Voor mij is dat echt leren om een stukje software in een programmeertaal te schrijven, met alle nadruk op details die dat met zich meebrengt. Terwijl het mij juist gaat om mensen te leren inzien dat sommige dingen makkelijk zijn voor computers (zoals in de xkcd cartoon die je aanhaalt het bepalen of een bepaalde locatie een natuurgebied is of niet) en andere niet (bepalen of een vogel op een foto een beschermde soort is of niet). Daarvoor hoef je niets van programmeertalen te weten. Wél hoe je in abstracte zin problemen oplost.

Martijn Egberts
, 2017-10-26 08:49:23
(reply)

Best Jaap-Henk, wat mooi om te lezen dat al die moeite om op mijn oude dag te leren programmeren eigenlijk zinloos is :-). Blijft alleen wel heel leuk om te doen. Ik ben met je eens dat de boodschap veel breder zou moeten zijn en dat mensen eigenlijk vooral zouden moeten begrijpen welke problemen ze wellicht beter op welke manier zouden kunnen benaderen en hoe computers daarbij kunnen helpen.

Vanuit mijn eigen perspectief zou ik wel veel interesse hebben om zo’n benadering beter te leren en te begrijpen. Dus mag ik aansluiten bij verzoek van Jan-Jaap Oerlemans om meer te horen als je weet hoe je de cursus op gaat zetten? Vriendelijke Groet, Martijn

sander
, 2021-09-19
(reply)

Beste Jaap, Niet iedereen die leert of kan programmeren hoeft alles te weten over computers en netwerken. U vindt kennis hebben over al deze onderwerpen belangrijker dan er daadwerkelijk iets mee maken of doen. De programmeertaal/computer is een middel om een probleem mee op te lossen. Het probleem kan voor elke programmeur anders zijn en voor elk probleem is meestal andere kennis vereist. Deze kennis hoeft niet eens altijd te gaan over het schrijven van code. Op het moment dat je daadwerkelijk code schrijf voor een probleem dat je wilt oplossen loop je vanzelf tegen vraagstukken aan over hoe bepaalde dingen werken van een computer. Zelf ben ik ook op deze manier begonnen met programmeren in C#. Na mate ik meer software schreef voor onderwerpen die mijn aanspraken kreeg ik ook meer kennis van computers en wat er in de achtergrond gebeurd. Op het moment dat je wilt leren programmeren zonder een onderwerp of doel zal je niet veel verder komen dan een simpel “hello world” programma, maar het is wel hoe je begint met programmeren. Verder lees ik dat je programmeren vervelend vindt, omdat je zegt dat je geen enkele type fout mag maken. In de tijd dat u uw studie volgde was dit een veel groter probleem, tegenwoordig hebben anderen hiervoor software geschreven die precies aangeven waar deze typfouten zitten. Dit geld hetzelfde voor kinderen. Op het moment dat zij kunnen programmeren kunnen zij deze tools gebruiken voor het maken van: kunst, muziek, robots, websites. Wat en of zij er iets mee maken hangt af van hun interesses en creativiteit. Vaak zie je mensen die heel hoog opgeleid zijn, ze kunnen ze alle in en outs van een protocol, programmeertaal of type processor opnoemen, maar kunnen hun kennis niet toepassen voor een probleem waar nog geen oplossing of informatie over is.

Verzonden vanuit Mailhttps://go.microsoft.com/fwlink/?LinkId=550986 voor Windows