Der kan man bare C

(Kort efter at jeg havde skrevet dette indlæg, opdagede jeg, at Dennis Ritchie, en af ophavsmændene til C (og til Unix), døde i denne uge. Det er selvfølgelig ikke min hensigt at klandre Ritchie for noget som helst. C har været et vigtigt programmeringssprog, men heller ikke C er hele sandheden.)

Som jeg afslørede for ikke så længe siden, er jeg en af underviserne i kurset “Programmeringsparadigmer”, der ligger på 5. semester af vores datalogiske uddannelser (i datalogi og software). Jeg afholder to kursusgange om programmering i Prolog, og til sidst vender jeg tilbage med en kursusgang om lambda-kalkylen.

En øvelse, der volder mange af de studerende overraskende store problemer, er at skrive et Prolog-prædikat, der konverterer et naturligt tal i sædvanlig notation til unær notation. Dvs. at oversætte 5 til succ(succ(succ(succ(succ(0))))).

Her er mit bud på en løsning.

tosucc(0,0).
tosucc(N,succ(X)) :- M is N-1, tosucc(M,X).

Lad mig understrege at det bestemt ikke er et specielt besværligt hold af studerende, jeg har med at gøre. De fleste ser ud til at gøre sig umage. Men dét, jeg observerer, er to problemer. Det første: Hvor får man serveret resultatet henne og hvordan? Det er svært for mange at opdage, at resultatet findes i anden parameter af prædikatet tosucc. Et typisk problem er, at man har svært ved at skelne mellem størrelserne N og M, der er sædvanlige tal, og X, der er et tal i unær notation. Det andet problem: Hvordan beregner man det unære udtryk? I Prolog handler det i høj grad om at programmere ved brug af rekursion, som løsningen ovenfor også kraftigt antyder.

Det kan der være to mulige forklaringer på. Den ene er, at Prolog ikke har noget typebegreb. Hvis Prolog var typet, ville man let kunne se forskel på N og M på den side og X på den anden. Den anden er, at de studerende i de første to år af deres studium har lært at programmere i C-lignende sprog. Først kom C, så kom C# og nogle har også muntret sig med C++. Jeg skal retfærdigvis sige, at C# er designet af folk, der bestemt kender til applikative sprog som Prolog og Haskell, men man kan sagtens som C#-programmør helt undgå at finde ud af det. Man kan også nemt undgå at møde rekursive definitioner, for slet ikke at tale om prædikater, hvis man programmerer i et C-lignende sprog. Måske er det mest bekymrende i virkeligheden, at de studerende starter med at møde C, der ikke er et typesikkert sprog og hvor man sagtens kan undgå at blive nødt til at bruge rekursion.

Jeg skal passe på med at lyde alt for kritisk, for jeg var trods alt med til at skrive de nye studieordninger for uddannelserne i datalogi og software. Jeg vil heller ikke klandre dem, der underviser i introducerende programmering, for jeg ved, at de gør det rigtig godt. Men dels var jeg ikke ene om at skrive studieordningen, dels er det muligt at reflektere over den faktiske studieordning på baggrund af praksis.

Det sædvanlige argument for at man skal lære C-agtige sprog tidligt i sit studium er, at “det får de studerende brug får, når de engang bliver færdige og skal arbejde med at udvikle programmer”. Det er formodentlig rigtigt, men hertil vil jeg indvende følgende.

  1. De fleste andre læringsmål, som de studerende bliver præsenteret for tidligt i deres studium, er begrundet i en progression i studiet, ikke i fremtidig erhvervskompetence. Sagt mindre knudret: Vi siger som regel: “Dette får I også brug for at vide på et senere semester”, ikke “Dette får I brug for at vide, når I engang får et arbejde”.
  2. Det kan være, at man skriver bedre C-programmer, hvis man har set et helt anderledes sprog først. Der var faktisk en kort periode på 3 år, hvor de studerende på første studieår mødte SML som deres første sprog. Og de lærte at programmere i C-agtige sprog alligevel.
  3. Måske er der i et vist omfang en selvopfyldende profeti indbygget i at fokusere så meget på C-agtige sprog. Kandidater i datalogiske fag lærer at C-agtige sprog er de vigtigste og fører uvilkårligt denne tradition videre, når de får arbejde og måske ender som ledere af softwareudviklingsprojekter.

Jeg kan ikke lade være med at tænke på analogien med at lære fremmedsprog. Alle får at vide, at det er vigtigt at lære engelsk. Og ja, engelsk er vigtigt at kunne, men ikke fordi engelsk er det bedste sprog – kun fordi mange taler det og fordi der er skrevet en hel masse på engelsk. Problemet kommer, når man glemmer at engelsk er ét blandt mange sprog, det er værd at kende.

(Visited 21 times, 1 visits today)
Loading Facebook Comments ...

Skriv et svar