Hvorfor skal man lære at programmere?

Engang for snart mange år siden havde Aalborg Universitet en basisuddannelse, hvor alting var fælles. De studerende var under et fælles optag, så man kom til at tilbringe de første to semestre sammen med studerende, der enten ville studere et helt andet fag eller var i tvivl. På dén konto fik jeg lavet projekter om henholdsvis bølgeenergi og vindmøller placeret på skibe. Jeg smuglede selv nogle formler ind, og fordi jeg var den eneste, der havde lyst til at programmere – i Pascal – fik jeg æren af dét, da vi skulle undersøge vores snedige fluiddynamiske model for vindmøller på skibe. Vi havde fælles kurser i mekanisk fysik, funktioner af flere variabler, differentialligninger/lineær algebra og programmering – i Pascal!

Efterhånden blev mange meget trætte af denne fælles indgang, og efterhånden var det kun kurserne, der var fælles. Reelt var der nu mange forskellige projektforløb. Da var det, at jeg 16 år efter at jeg selv gik der, fik æren af at undervise i programmering – i Pascal. Ud over at vi måtte slås med en allerede da forældet udgave af Borlands Turbo Pascal, som de studerende ikke selv kunne anskaffe sig og kun kørte under Windows NT, var det en blandet oplevelse; mange studerende våndede sig helt enormt over at skulle lære at programmere, og især hvis man fik kemi/bioteknologi-holdet, kunne det være en kamp op ad bakke. Igen og igen fik jeg spørgsmålet om hvorfor man dog skulle lære at programmere. Det var legitimationsproblemet, som man kender fra fagdidaktik (og især fra matematikkens didaktik, hvor det altid truer), der stak sit ækle hoved frem. Selv ikke et vue ud over de mange computere og tale om computeren som en programmerbar maskine hjalp. Hvorfor skal man dog lære noget så meningsløst?

Og hvad værre var: der var allerede dengang tre slags studerende:

  • dem, der allerede kunne programmere og programmerede godt; de var et bittelille mindretal, og der var
  • dem, der allerede troede, de kunne programmere og programmerede elendigt; dem var der en hel del af, og så var der
  • dem, der aldrig havde programmeret før, og de var flertallet.

Den første gruppe er aldrig kritisk, den sidste var der faktisk håb for, mens dem i midten…

Efter nogle år fik jeg omsider lov at lave kurset om, og jeg bestemte sammen med en kollega, at alle skulle lære – ML. Ikke OCaml, men gode gamle Standard ML. Tanken var dels at lave en stor `nulstilling’ ved at vælge et sprog, som ingen kendte, dels at undervise i et sprog, der havde en ordentlig matematisk teori i ryggen. Ikke, at vi skulle lære de studerende typet lambda-kalkyle, men at vi kunne give en systematisk forklaring af meningen med galskaben i stedet for at pege tilbage på alle hoc-beslutningerne bag Pascal.

Det fik jeg lov til i et år med blandede erfaringer – den første gruppe ovenfor blev udfordret, og den tredje gruppe var tilsyneladende nemmere at fange. Den midterste gruppe troede, de kunne fortsætte med at Basic-programmere, bare i SML nu. De fik et chok, når programmerne ingen ting lavede! På den måde skete der også omsider noget nyt for (nogle af) dem. Nogle blev bare forargede, andre blev nysgerrige. Og alle blev undervist i typer, typer, typer og polymorfi og mere polymorfi. De fleste studerende fandt ud af, at der er en voldsom forskel på tekststrengen "hest" og listen [ "hest" ]. Den første har typen string, den anden har typen string list. De fleste studerende fandt også ud af, at en funktion har en argumenttype og en resultattype.

Og stadig blev jeg spurgt af mange studerende, hvorfor man dog skulle lære at programmere.

Så besluttede nogen, at kurserne på basisuddannelsen også skulle være forskellige, og hermed døde det fælles programmeringskursus. På kemi/bioteknologi åndede de lettet op og begyndte at drømme henført om den dag, hvor den sidste computer ville blive smidt i havnen eller kun ville være i stand til at køre Microsoft Word.

I dag er det kun bestemte studieretninger, der har programmeringskurset, mens alle skal lære matematik (og det har jeg selvfølgelig ikke det fjerneste imod). Nu vil jeg tillade mig at stille det provokerende modspørgsmål: Hvorfor skal man ikke lære at programmere? Hvorfor skal man især ikke lære at programmere i et stærkt typet sprog?

Jeg kunne selvfølgelig i faglig stolthed godt hævde, at den erkendelse som Turing m.fl. gjorde af, at man kan konstruere en generelt programmerbar maskine er en af de helt store naturvidenskabelige erkendelser fra de seneste 100 år – men nogle ville så indvende, at det samme kan siges om opdagelsen af DNA-molekylets struktur, og det betyder vel ikke, at alle skal undervises i dét?

Jeg kunne også tale om glæden ved at kunne se matematiske objekter realiseret; det var sådan, jeg selv opdagede at programmering er interessant. Men der er også Maple og Matlab og Mathematica og selv om det selvfølgelig også indebærer en form for specialiseret programmering, er det heller ikke her, nogen bliver overbevist.

Der må være et bedre argument, og det tror jeg, der er. Nogle af de store problemer i matematikundervisningen kan føres tilbage til problemer, som man direkte må gøre noget ved, når man skal lære at programmere:

  • Mange studerende ikke kan kende forskel på elementet a og mængden \{ a \}. Matematik har sit eget typebegreb, men ingen taler om det. Professionelle matematikere og dataloger med matematisk baggrund ved at dette typebegreb findes, men der er ikke noget godt sprog at tale om denne fundamentale skelnen i.
  • Mange studerende har ikke noget klart begreb om hvad en funktion er, og at en funktion f : A \rightarrow B har definitionsmængde A og værdimængde B. Dette er typebegrebet igen – de kan godt hævde, at f(7) = 8, men at f(42) = sand. (Og nej, det er ikke fordi de har opdaget sumtyper.)
  • Mange studerende skriver matematiske udtryk, hvor der dukker ukendte størrelser op, og de opdager det aldrig selv.  Så spørger man dem, hvor z kommer fra, og de melder pas. I moderne programmeringssprog skal alle størrelser erklæres, før de kan bruges, og man får pænt at vide, hvis det ikke er blevet gjort.
  • Rigtig mange studerende kan ikke læse en definition, fordi de ikke kan skelne mellem hvordan en definition angiver betingelser som det definerede objekt skal overholde (det, man i datalogi kalder en specifikation), og hvordan objektet rent faktisk skal bringes til at eksistere (det, man i datalogi kalder en implementation).

Omvendt er der mange studerende, der gerne vil programmere, men ikke ved, at det, de programmerer, egentlig realiserer et (ofte meget lille og måske noget knudret) matematisk univers.

Så igen: hvorfor er det, man ikke skal lære at programmere, når vi ved, at det er vigtigt at lære matematik?

Indlysende/trivielt (?)


Timothy Gowers, der er matematiker i Cambridge, har en side med `matematiske diskussioner’, der er en liste med overvejelser om en lang række helt fundamentale (og ofteste elementære) spørgsmål. Et interessant spørgsmål på listen er det tilsyneladende banale: Hvorfor er multiplikation af naturlige tal egentlig en kommutativ operation? Mere præcist, hvorfor er formlen

\forall x \in {\mathbb{N}}.\forall y. \in {\mathbb{N}}. x \cdot y = y \cdot x

sand? Gowers har to bud:

  • Et bevis, der udnytter at mængden af felter i et m \times n-gitter har samme kardinalitet som et n \times m-gitter
  • Et bevis, der gør brug af `tælledefinitionen’, at m \cdot n = \underbrace{n + \ldots + n}_{m \mbox{ gange }} og foretager induktion i m

Men vil vi generalisere til de hele tal, dvs. bevise at

\forall x \in {\mathbb{Z}}.\forall y. \in {\mathbb{Z}}. x \cdot y = y \cdot x

er sand. Her bliver man i beviset nødt til først at vise det lille lemma, at ethvert negativt tal er på formen -n, hvor n \in \mathbb{N}, og så er vi tilbage ved overvejelser om konstruktionen af de ikke-positive tal som den mindste udvidelse af \mathbb{N}, der giver os en gruppe.

Nogle læsere synes formodentlig, at her er tale om trivialiteternes overdrev, og at der rettes et batteri af kanoner mod en stakkels gråspurv. (Det gælder ikke kun `lægfolk’, også de fleste ingeniører vil sikkert udstøde suk. I en ikke så fjern fortid husker jeg ingeniørstuderende, der våndede sig over `alle de mange beviser’ i min undervisning. Det var nu sjældent, fordi de syntes, de var trivielle.)

Men for mig illustrerer Gowers’ overvejelser dels den vigtige forskel mellem det indlysende og det trivielle. Det er nemlig indlysende, at multiplikation af hele tal er kommutativ, og også indlysende at ethvert negativt tal er på formen -n, men et trivielt faktum, det er det ikke. Hvis det var, ville der ikke være noget at lære for skolebørn, vel? (Der har været udfordringer netop her, kan jeg som fader godt røbe.)

Denne overskrift er selvrefererende

I går aftes snublede jeg over en samtale på Sverige 2 med den svenske kognitionsforsker Peter Gärdenfors, som er professor på universitetet i Lund. Det første, der faldt mig ind, var at jeg tilbage i 1995 mødte Gärdenfors til et symposium i Georgien om logik, sprog og beregning. Jeg havde en artikel med om det, der senere er blevet min yndlingskæphest, nemlig \pi-kalkylen. Det jeg kan huske, er at jeg sad ved siden af Gärdenfors i et gammelt folkevognsrugbrød under konferenceudflugten mellem Kaukasus’ bjerge. Vi snakkede om vejr og vind; vel egentlig en lidt dårlig brug af en sådan kapacitet. Der var ikke mange andre fra de nordiske lande, kun Morten Heine Sørensen fra Københavns Universitet, Peter Gärdenfors  og så undertegnede.

Efter at jeg havde genkaldt mig dagene i Georgien, gav jeg mig til at lytte ordentligt efter. TV-programmet var vel nærmest det, nogen har kaldt for filmet radio – skiftevis halvtotaler og nærbilleder af to mennesker, der sidder på hver sin side af et bord og taler sammen. Men alligevel fascinerende, for Gärdenfors er interessant at høre på.

Mange af spørgsmålene var variationer over temaet “Hvad ved mennesker om sig selv?”, og her slog det mig, at netop henvisningen til sig selv er et helt central element i de mange forskellige studier af den menneskelige tankes muligheder, en række discipliner, der mødes netop i den såkaldte kognitive videnskab. I matematik er det selvreferencen, der komplicerer f.eks. mængdelæren med Russells diagonalmængde \{ x \mid x \not \in x \} og dermed afføder typeteorien, og det er selvreferencen, der skaber grundlaget for Gödels berømte (og meget misforståede) resultat om grænserne for fuldstændig aksiomatisering af interessante fragmenter af matematik.

I datalogi dukker selvreferencen op som rekursion, og det er muligheden for selvreference, der er grundlaget for Turings første resultater om uafgørbarhed. I didaktikken er det refleksionen over egen læring – hvad ved jeg, at jeg ved? hvad ved jeg, at jeg har lært? osv. – der er central. Og i filosofi er mange paradokser intimt forbundet med selvreference. Paradokser kunne jeg skrive meget om; jeg har et bogmanuskript til en populær bog liggende. Mon ikke der kommer noget mere her på bloggen en gang ved lejlighed?

Men lad mig standse her, og nævne, at I kan se hele afsnittet af Vad är en människa, hvor Gärdenfors er i samtale med Frederik Lindström på Sveriges TVs websted. Hvis I ikke er gode til svensk, inden I sætter jer til at kigge med, er I det forhåbentlig bagefter!

Bevisets stilling

Jeg har siddet og rettet ca. 30 eksamenssæt fra kurset “Syntaks og semantik”, som jeg har holdt i dette forårssemester. Det er en blandet fornøjelse; mange har heldigvis svaret godt, men der er nogle misforståelser, der går igen og igen. Af og til spekulerer jeg på, om hvorfor det mon er tilfældet. Er der mon nogle fredagsbar-seancer, hvor man aftaler den slags? (“Er vi så enige om, at hvis vi får en opgave om det her, så skriver vi ikke det rigtige, men at…”)

Tankegangen bag matematiske beviser falder en del studerende meget svært, og meget af problemet kan føres tilbage til problemer med at forstå kvantorer fra førsteordenslogik og konnektiver fra udsagnslogik. Et sted, hvor man ser dette meget tydeligt, er i anvendelserne af de to Pumping Lemmaer fra formel sprogteori. Det er matematiske sætninger, der er på formen:

Hvis L er et regulært (eller kontekstfrit) sprog, så findes der en konstant p, så at der for enhver streng s \in L af længde mindst p findes en opsplitning som opfylder…

Disse sætninger har form af en implikation (hvis…så). Det eneste, man kan bruge disse sætninger til, er derfor at vise at et sprog ikke er regulært, hhvs. kontekstfrit – netop fordi der ikke er tale om en biimplikation. Bevisteknikken er kontraposition; vi viser, at konklusionen ikke kan være sand for L. Men dette har en del studerende problemer med; enten tror de, en implikation og en biimplikation er det samme eller også vender de implikationen forkert.

Et andet problem – og det er her, man skulle tro, misforståelserne var aftalt, for jeg har kunnet finde et stort mindretal blandt de 30, der går ind får det – er i beviset for at konklusionen er falsk for et givet L. Konklusionen har en eksistenskvantor (“der findes et p…”) yderst, og for at modbevise den, skal vi vælge en streng s \in L og vise, at intet valg af p giver en gyldig opsplitning af s, dvs. vi skal undersøge alle opsplitninger for et vilkårligt p. Men en udbredt fejl er nu denne:

Vi sætter p=2, vælger en streng af længde 2 og en opsplitning af denne. Men denne opsplitning er ugyldig, og beviset er nu færdigt.

Med andre ord er der mange, der tror på et aksiom på formen

(\exists p. \exists s. \neg P(p,s)) \Rightarrow (\forall p.\forall s \neg P(p,s))

Jeg har aldrig rigtig kunnet finde ud af, hvor dette udbredte fejl-ræsonnement kommer fra. Det kan næppe stamme fra dagligsproget; når jeg fortæller de studerende, at jeg ikke kan konkludere, at min kuglepen ikke er på universitetets område, bare fordi den ikke er på mit kontor, kan de sagtens se det fejlagtige i ræsonnementet.

Når det er så svært at lære studerende matematiske ræsonnementer, skyldes det formodentlig netop, at der for dem ikke fremstår nogen simpel forbindelse mellem dagligsprogets logik og tilsvarende ræsonnementsformer i matematik. Det er, som om matematikkens sprog og dagligsproget ofte kommer til at rejse i hver sin kupé. For nogle studerendes vedkommende er de ikke engang placeret i samme tog.

Det er ikke blevet lettere med årene, for indholdet af matematiske ræsonnementer i ungdomsuddannelsernes matematikundervisning er nedtonet en hel del efterhånden. (Og moderne datalogistuderende har ikke matematik som deres andet fag; næ, da far var dreng…) Men også da jeg gik i gymnasiet, var der en splittethed i undervisningen. Jeg kunne nemt anvende teknikkerne og f.eks. beregne bestemte integraler med brug af stamfunktion, og jeg vidste, at et integral er det tal, der skiller oversummer fra undersummer og jeg så også beviset for Fundamentalsætningen. Men hvor godt forstod jeg sammenhængen? Det var som om regneteknikker og ræsonnementer levede i hver deres verden.

Og når vi i dagligsproget rask væk benytter os af usunde slutningsregler, gør vi livet endnu vanskeligere for os selv. Dagligsprogets “argumentation” er fuld af fejlslutninger i logisk forstand; hvis nogen er i tvivl om dette, skal de bare se tv-avis!

De underlige talmennesker

Med meget ujævne mellemrum dukker der fiktion op, der handler om de matematiske fag. De eneste film, jeg kan komme i tanke om, er faktisk begge fra nyere tid, nemlig

  • Et smukt sind om John Nash, der fik Nobelprisen i økonomi for sit arbejde om spilteori og Nash-ligevægte, men også var paranoid-skizofren (hans psykiske sygdom er filmens fokus) og
  • Good Will Hunting om den fiktive Will Hunting fra M.I.T. Han er vist grafteoretiker, men er også (undskyld ordspillet) en irrationel rod, der græder ud ved Robin Williams’ skulder.

I begge disse dramaer er matematikeren et martret geni, der slås mod misforståelser og for at holde kærligheden til en kvinde i live. Heldigvis for det kvindelige publikum er hovedrolleindehaveren en mand, der ser godt ud (henholdsvis Russell Crowe og Matt Damon). Så er der også It’s My Turn helt tilbage fra 1980. Den har jeg så desværre ikke set, thi den er ikke nem at opdrive, men i den film er matematikeren en kvinde, Jill Clayburgh (der ser godt ud), og filmen er vist i den mere muntre ende. Det mest matematiske øjeblik i filmen – ja, måske i hele Hollywoods historie – optræder så vidt jeg ved i filmens start og kan ses herover.

Det drejer sig om slangelemmaet fra homologisk algebra (som mindst én af denne blogs læsere vil kunne forklare bedre, end jeg tør prøve), komplet med et bevis ved diagram chasing. Det er altid hyggeligt at starte en romantisk komedie med kommutative diagrammer og en lille snak om entydighed af morfier.

Jeg tror ikke, der har været nogen film om forskere fra datalogi – et om muligt endnu mere misforstået fag end matematik. Der er også kommutative diagrammer i teoretisk datalogi, men de vil næppe blive filmatiseret foreløbig. Til gengæld har der været masser af computere.

Faktisk er jeg ret overbevist om at man kunne lave en god film om Alan Turing. Der er i hvert fald tale om en historie med kostskoleliv, krig, matematik, maskiner og en martret mand, der slås med og for sin seksualitet og ender med at begå selvmord. Men måske har Hollywood lige så svært ved denne kombination af en decideret unhappy ending og en helt, der er bøsse, som briterne havde ved at anerkende Turings store indsats?

Uendelighedens navne

Jeg blev for nylig færdig med at læse Naming Infinity, en spændende bog af Loren Graham (amerikansk matematikhistoriker) og Jean-Michel Kantor (fransk matematiker). Naming Infinity fortæller historien om en uventet forbindelse mellem matematik og religiøs mysticisme. En russisk-ortodoks sekt af såkaldte “navnetilbedere”, der var aktiv i årene op til den russiske revolution og blev fordømt som kættere, talte også en matematik-uddannet munk ved navn Pavel Florensky (som man ser ovenfor; også efter revolutionen var “navnetilbederne” forfulgt, nu ikke af den ortodokse kirke, men af kommunisterne). Florensky var ven med Nikolai Luzin (kendt fra Luzins sætning i målteori) og havde igennem ham også påvirkning på “Moskvaskolen”, den meget aktive kreds af matematikere omkring Egorov. Og via Egorov var der forbindelse til den franske skole med Lebesgue, Baire og Borel.

Bogens tese er, at “navnetilbedernes” tro på at man ved at gentage en kort bøn med guds navn igen og igen kunne komme nærmere til sin gud afspejles i bl.a. mængdelærens behandling af transfinitte ordinaler. Ved at navngive et matematisk objekt via dets egenskaber gøres det virkeligt – en slags “omvendt nominalisme”.

Sjovt nok er mit eget forskningsområde inden for teoretisk datalogi nominelle proceskalkyler, notationer for parallelle beregninger. Robin Milner (der selv havde studeret matematik og filosofi – det var før datalogien fik et navn og dermed blev virkelig) var med til at skabe dette område via pi-kalkylen, og her er ideen om at kende en beregningsresurse ved at kende navnet på dens reference-kanal central.

Naming Infinity er hermed anbefalet, hvis man vil vide noget om en interessant periode i matematikkens historie og (endnu engang) få udfordret en forestilling om at den tilsyneladende mest rationelle aktivitet vi kender, kun har rationel oprindelse. Det er også interessant at læse om menneskene Lebesgue, Borel, Luzin og andre og derigennem få sat ansigt og livshistorie på navne, jeg ellers kun har kendt i forbindelse med sætninger i et kursus fra for længe siden.

Og hvor blev jeg så opmærksom på bogen? Såmænd via en anmeldelse af bogen i dagbladet Information af Annegrethe Rasmussen, der så vidt jeg ved aldrig har studeret matematik. Nu spekulerer jeg så på, hvad hun fik ud af bogen og hvorfor hun kunne lide den.

Hvad er matematik?

Engang var jeg en vred ung matematikstuderende; i dag er jeg en vranten midaldrende universitetslærer på Institut for datalogi. Sic transit gloria mundi. Dengang i 1983-84 stykker var jeg sammen med en række andre vrede unge matematikstuderende om at lave Mat 3-projekt under problemformuleringen Hvad er matematik?

Selvfølgelig fandt vi aldrig svaret; spørgsmålet var alt for bredt og naivt, og vi blev da også belønnet på passende vis med en for nogle af os uvant middelmådig karakter. I en del år brugte jeg mest “Hvad er matematik?” som en slags selvhånende kommentar i samtaler med gamle studiekammerater. Men efterhånden dukkede spørgsmålet op hos mig som et ærligt spørgsmål, efterhånden som jeg begyndte at interessere mig for matematisk logik i forbindelse med mit virke i teoretisk datalogi.

Sidste år fik jeg omsider læst Andrew Hodges’ monumentale biografi af Alan Turing, Alan Turing: The Enigma, og her kan man allerede i forordet læse om hvordan en af Turings studerende, Audrey Bates, blev inspireret til at programmere Manchester-maskinen til at finde normalformer i lambda-kalkyle.

Lambda-kalkylen skyldes Alonzo Church og er en lille notation for beregnbare funktioner, og notationen er forsynet med få og enkle reduktionsregler. Ovenfor kan man se beta-reduktionsreglen, som intuitivt set blot forklarer, at en funktion anvendes på en værdi ved at indsubstituere værdien på argumentets plads overalt i forskriften. Et lambda-udtryk er på normalform, hvis ingen reduktionsregel kan anvendes på det.

På Turings tid var Audrey Bates’ arbejde lidt underligt, syntes man – for var det overhovedet matematik? Alonzo Church’s arbejde om beregnbare funktioner havde ikke rigtig noget med tal at gøre, og matematik er da videnskaben om tal, ikke? Og computere kan kun bruges til store beregninger på tal, ikke?

Også i dag kan man møde denne holdning: at matematik først og fremmest er videnskaben om tal. Nogle matematikere synes, at matematisk analyse er “den rigtige matematik”, andre holder på algebraen som “den rigtige matematik” – og mange er enige om at f.eks. teoretisk datalogi i hvert fald ikke er rigtig matematik.

Jeg ved ikke, om jeg er matematiker i dag. Det vildeste resultat fra analyse, jeg har brugt i min forskning, er Banachs fikspunktssætning for kontraktioner, og det er meget tamt. Nogle matematikere har kaldt mig matematik som en form for erkendelse af et fællesskab, nogle dataloger har kaldt mig det i en slags forsøg på at definere mig som forskellig fra dem. Men hvis matematik ikke defineres ud fra et genstandsområde men snarere som en metode, der anvender præcist definerede begreber og opstiller sætninger, der skal bevises ved brug af alment gyldige, tilstræbt objektive inferenser, da er vel også jeg matematiker i 2011. Jeg har aldrig lavet forskning uden denne metode, og jeg kommer formodentlig aldrig til det.