Python en poëzie

Foto: Sagaru9535, CC BY-SA 4.0 , via Wikimedia Commons.

Een van de interessantste Nederlanders op dit moment is ongetwijfeld Guido van Rossum, de ontwerper van de programmeertaal Python. Het is niet overdreven om te zeggen dat dit inmiddels wereldwijd de populairste programmeertaal is – een taal die vrijwel iedere programmeur wel een beetje kent. Hij is bovendien iemand die over heel veel onderwerpen goed heeft nagedacht en zijn mening daarover eloquent kan verwoorden, zoals bijvoorbeeld blijkt uit het onderstaandre interview met Lex Fridman.

Dat soort interviews kom je in het Nederlands niet tegen. Ik vraag me af of Van Rossum ooit serieus in de Nederlandse media aan het woord is gekomen. Dat geldt zelfs niet voor podcasts of YouTube-kanalen of andere alternatieve kanalen. Wat zijn we toch ook een armoedige cultuur. Voor 99% procent van de Nederlanders bestaat Van Rossum helemaal niet.

(Even een rant. Het is in sommige kringen nog altijd sjiek om af te geven op de verengelsing: in zo’n vreemde taal kun je toch nooit een diepe gedachte uitdrukken? Wat die mensen nooit in de beschouwing betrekken is dat je in het Nederlands maar zelden een diepe gedachte hoort uitdrukken. Wie interessante hedendaagse intellectuele discussies wil horen, moet wel Engels leren. De verarming van het Nederlands komt niet door het Engels, maar door het gebrek aan intellectuele cultuur. Einde rant.)

Trager

Een van de onderwerpen die Fridman meteen aan de orde stelt is dat leesbaarheid een basisprincipe is van Python. Computerprogramma’s moeten niet alleen door computers worden gelezen, die de instructies moeten uitvoeren, maar ook door mensen. “Zelfs als je een tovenaar hebt die op zijn eigen kamer een heel programma van duizenden regels componeert”, zegt Van Rossum, “dan is die aan het eind van die duizend regels vergeten wat hij aan het begin bedoelde.” Toch is dat belangrijk: computerprogramma’s bevatten noodzakelijkerwijs altijd foutjes en om die op te kunnen sporen en repareren moet een mens een en ander kunnen lezen. Daarnaast kan het natuurlijk altijd gebeuren dat er een uitbreiding moet komen van het bestaande programma, of een verbetering. En tot slot worden échte programma’s niet geschreven door tovenaars maar door teams, die elkaars werk moeten kunnen lezen.

Enkele decennia geleden was efficiëntie voor de computer het belangrijkste criterium. Inmiddels zijn computers zo snel en de kosten van programmeurs zo hoog dat computerleesbaarheid er minder toe doet. Als een programmeur er uren over doet om een foutje te vinden, terwijl dat foutje de computer een milliseconde trager doet lopen, is dat geen goede afweging.

Visuele intelligentie

Intrigerend is nu dat de leesbaarheid vooral zit in het wit op de pagina en in de leestekens.

Wanneer je programmeert, krijg je regelmatig te maken met potentiële dubbelzinnigheden. Neem deze instructies voor een feestrobot:

als de leeftijd van het baasje groter dan acht is
zet een hoedje op
blaas op een toeter

Moet de robot nu sowieso op die toeter blazen, of alleen als het baasje oud genoeg is? Op de een of andere manier moet je weergeven of de laatste twee instructies bij elkaar horen. Nevenschikkende voegwoorden hebben programmeertalen meestal niet. Veel oudere programmeertalen lossen het op met haakjes. De nog altijd heel populaire taal C (vooral voor gevallen waar efficiëntie wel van belang is) bijvoorbeeld:

if (leeftijd > 8) { zet_hoedje_op(); blaas_toeter(); }

De {} plaatsen instructies bij elkaar. De punt_komma’s onderscheiden ze van elkaar. De ronde haakjes hebben andere functies. Wanneer elders in het programma leeftijd, zet_hoedje_op() en blaas_toeter() gedefinieerd worden, is dit geldig C. Zoals ook het volgende, dat de robot voortdurend laat toeteren:

if (leeftijd > 8) { zet_hoedje_op();} blaas_toeter();

Nu valt de toeterinstructie buiten de haakjes en daarmee buiten het bereik van de if-instructie.

In Python ziet de eerste versie er zo uit:

en de tweede zo:

De haakjes en de punt-komma’s zijn verdwenen, wat er moet worden uitgedrukt wordt uitgedrukt met ruimte op de pagina of het beeldscherm. (Overigens kun je in C ook werken met nieuwe-regels en spaties, maar je moet altijd ook al die haakjes en puntkomma’s toevoegen, en dat is toch net wat minder overzichtelijk) Je kunt met Python als lezer beter vertrouwen op je puur visuele intelligentie: je kunt in één oogopslag zien wat bij elkaar hoort, en je ziet weinig dingen die er voor de interpretatie niet toe doen (het is alleen, zou je kunnen, zeggen, jammer van de haakjes).

Wat Fridman en Van Rossum niet bespreken: dat dit de principes zijn waaraan je veel moderne poëzie kunt herkennen: het betekenisvolle wit, het gebrek aan leestekens. (In de voorbeelden die ik hierboven geef staan alleen kleine letters; hoofdletters zijn niet verboden in Python, maar net als in poëzie worden ze vaak vermeden of eigenzinnig gebruikt.)

Een andere overeenkomst is dat lyriek en programmacode over het algemeen niet gericht zijn tot de menselijke lezer. Een kenmerk van lyriek is de apostrofe – het aanroepen van een tweede persoon die niet de lezer is, ‘oh, oude eik!’ – terwijl de opdrachten die in een stukje computerprogramma staan, niet moeten worden uitgevoerd door de menselijke lezer.

Het zou interessant zijn om te onderzoeken of deze overeenkomsten echt toevallig zijn, of dat ze iets vertellen over de manier waarop de mens het best geconcentreerd kan lezen. Poëzie en computerprogramma’s zijn de twee genres die je heel geconcentreerd moet lezen. waar iedere letter telt. Het ligt voor de hand dat je dan zo min mogelijk afleiding nodig hebt. Tegelijkertijd heb je niet te maken met allerlei historische conventies: Python is geen Engels, net zo min als de taal van e.e. cummings dat is.

Reacties (6)

#1 Joost

Python mag dan wel een populaire programmeertaal zijn, het aantal daadwerkelijke projecten dat de taal gebruikt is vrij beperkt. Op het web is het bv maar een paar procent (vergelijk dat met PHP, waarop 70% van de sites draait).

Php gebruikt net als C accolades ( ‘{ }’ ) om stukken code bij elkaar te laten horen. Ik heb zelf wat problemen met whitespace omdat het de mogelijke ambiguïteit voor de lezer vergroot (gebruik je tabs? Hoe breed zijn die tabs? Gebruik je spaties? Hoeveel?). Ik heb zelf niet veel ervaring met Python, maar in PHP leidt het niet gebruiken van haakjes tot problemen.

if ($leeftijd > 8) 
    zet_hoedje_op();
    blaas_toeter();

Zal er ook toe leiden dat de toeter elke keer klinkt

if ($leeftijd > 8)  {
    zet_hoedje_op();
    blaas_toeter();
}

Lost dat op.

Qua leesbaarheid zie je overigens ook steeds meer dat dingen als ‘$leeftijd > 8’ worden vervangen. Want waarom staat die if er? Je zou er een comment bij kunnen zetten:

//Pas vanaf 8 jaar past het hoedje!
if ($leeftijd > 8)  {
    zet_hoedje_op();
}
blaas_toeter();

Maar het kan ook beter:

if (kind_past_hoedje($leeftijd)) {
    zet_hoedje_op();
}
blaas_toeter();

Dit klinkt triviaal, maar zeker met samengestelde ifs (and, or etc) helpt het enorm. Ik durf zelfs te stellen dat goede namen voor classes, methods/functies en variabelen bedenken een van de belangrijkste eigenschappen voor een programmeur is.

Qua deze code was het vroeger niet ongebruikelijk zoiets te zien:

if ($a > 252288000 ) {
    move_to_top();
}
increase_airflow();

Wat is $a (leeftijd in seconden), wat is move_to_top, wat is increase_airflow?

Iets anders waar ik steeds meer op let: lange zinnen. Hoe korter hoe beter. Mensen hebben problemen met interpretaties als er veel dingen op 1 regel staan:

if ($a = 1 && $b <25 && ($c > 25 || $c < 0)) {
    echo “woot”;
}

Is een stuk minder leesbaar dan

if (
    $a = 1
    && $b < 25
    && (
        $c < 25 
        || $c > 0
    )
) {
    echo “woot”;
}

Het wordt er niet mooier op, overigens, en daarom verzetten veel programmeurs zich er tegen :)

Maar beter:

if (
    correct_number_of_termometers($a)
    && outside_temperature_ok($b)
    && inside_temperature_within_margins($c)
) {
    echo “woot”;
}

Maar beter:

if (
    are_temperature_constraints_met($a, $b, $c);
) {
    echo “woot”;
}
function are_temperature_constraints_met(int $nr_of_termometers, int $outside_temp, int $inside_temp): bool 
{
    return $nr_of_termometers === 1
        && $outside_temp < 25
        && is_inside_temperature_within_margins($inside_temp);
}

function is_inside_temperature_within_margins(int $inside_temp): bool 
{
    return $inside_temp > 0
        && $inside_temp < 25;
}

Maar goed.

  • Volgende discussie
#2 Spam

10 INPUT “Hoe oud ben je?” ; L
20 IF L <= 8 GOTO 50
30 PRINT "hoedje"
40 BEEP
50 END

  • Volgende discussie
  • Vorige discussie
#2.1 AltJohan - Reactie op #2

@Spam: Kijk toch uit met bovenstaande code : https://homepages.cwi.nl/~storm/teaching/reader/Dijkstra68.pdf

  • Volgende reactie op #2
#2.2 Joost - Reactie op #2

Waarom niet goto 40?

En TFW je met een programma bezig was en je meer dan 9 regels tussen 2 regels wilde toevoegen…

  • Vorige reactie op #2
#2.3 Spam - Reactie op #2.2

Ook de toeter was alleen voor de oudere kinderen.

Als je regels moet tussenvoegen is er natuurlijk iets mis met je planning en structuur. En gelukkig was er altijd nog de RENUM.

#3 M&M

In mijn boekenkast bleek nog een tweetalige uitgave van 44 gedichten van e.e. cummings te staan: linkerpagina het origineel, rechterpagina de vertaling van Peter Verstegen. Dus ja, is dit Engels? Leuk is het wel.

r-p-o-p-h-e-s-s-a-g-r
E. E. Cummings – 1894-1962

r-p-o-p-h-e-s-s-a-g-r
who
  a)s w(e loo)k
  upnowgath
PPEGORHRASS
eringint(o-
  aThe):l
eA
!p:
S a
(r
  rIvInG .gRrEaPsPhOs)
to
  rea(be)rran(com)gi(e)ngly
  ,grasshopper;

  • Volgende discussie
  • Vorige discussie