Bör alla lära sig programkod? Synpunkter på en nivåförvirring

Låt mig kasta in några synpunkter på en diskussion som samtidigt förs på två olika nivåer – vilket jag tror är ett symptom på en mer djupgående nivåförvirring, vilket jag snart ska komma till.
Å ena sidan bedrivs en kampanj för att införa programmering som obligatoriskt ämne i grundskolan, där argumenten handlar om att stärka Sveriges framtida konkurrenskraft. Bakom denna kampanj står diverse IT-företag, bland andra Google.
Å andra sidan finns det en radikaldemokratisk tanke om att folket måste erövra kunskapen om hur datorerna fungerar. Tanken bottnar i en historisk parallell mellan boktryckarkonsten och internet, mellan skrivkunnighet och programmeringskunskap, som härom dagen formulerades av Jesper Larsson i en bloggpost.

Jesper Larsson har nu fått mothugg av Andreas Ekström i Sydsvenskan. Det är värt att fundera på hur de båda använder historien på olika sätt. Jag tolkar Jesper Larsson som att han tänker sig en historia av långa semiotiska utvecklingsvågor: tillkomsten av ett nytt språk leder först till ojämlika maktförhållanden, som sedan jämnas ut när den breda massan tar till sig det nya språket.
Andreas Ekström betonar däremot skillnaden mellan ett “då” och ett “nu”. Likt många sociologer tänker han sig att vårt moderna “nu” präglas av en högre hastighet än det förmoderna “då”:

Förr i tiden styrdes samhällsutvecklingen av hela samhället kollektivt: ingenjörer, tekniker och uppfinnare skapade något, varpå jurister och politiker och humanister och samhällsvetare kunde förhålla sig till det nya – är det bra eller dåligt, farligt eller ofarligt, lämpligt eller olämpligt, i behov av reglering eller redo att bara släppas fritt?
Det var en långsammare tid. Varje teknisk uppfinning behövde tillverkas och produceras, med råvaror och arbetskraft. Denna långsamhet skapade rådrum för samhället.
Vi har inget sådant rådrum längre.
Vad som händer nu är att ingenjörer, tekniker och uppfinnare skriver programkod på måndag och distribuerar den globalt på tisdag. Det finns alltså inte längre tid för ekonomer eller läkare eller forskare eller lärare att bidra med sina erfarenheter och insikter – alla ställs inför fullbordat faktum, medan de programmeringskunniga snabbt drar vidare till nästa projekt.
Detta innebär en historisk maktförskjutning, som inte lämpar sig för jämförelser med andra tekniska landvinningar, som låt säga boktryckarkonsten.

Visserligen finner jag det befängt att påstå att teknik- och samhällsutvecklingen “förr i tiden” skulle ha styrts “av hela samhället kollektivt”. Nu vet jag inte om detta “förr i tiden” syftar på folkhemmet eller på medeltiden, men jag kan leverera otaliga exempel på hur uppfinningar har tagits i bruk utan att de först blivit föremål för en demokratisk utvärdering. Särskilt inte när det gäller uppfinningar som har koppling till krig (vilket inbegriper de flesta medieteknologier som etablerades under 1900-talet).

Däremot håller jag med Andreas Ekström om att jämförelsen mellan tryckpressen och internet haltar. Det finns en fundamental skillnad mellan skriftspråk och programkod. Allmän alfabetisering (läs- och skrivkunnighet) går uppenbarligen att genomdriva inom ett visst territorium (jag säger genomdriva eftersom den historiska alfabetiseringen är oskiljbar från det blodiga skapandet av nationalstater, upprättandet av territoriella nationsgränser och bekämpandet av minoritetsspråk). Något liknande är svårt att tänka sig i fråga om programkod.

Alfabetiseringen byggde på principen att det för varje territorium fanns en stat och ett språk. Invånarna i ett visst territorium blev ålagda att lära sig skriva “sitt” standardspråk.
Men i datorsammanhang finns inte ett programspråk, utan många olika. Programspråken saknar inte bara territoriell koppling; det är inte heller givet hur länge de kommer att vara i bruk. Om tio år kommer helt nya programspråk att spela en viktig roll, medan vissa av dagens programspråk har blivit passé. Så var det aldrig med de tal- och skriftspråk som människor fått lära sig i familjen och i skolan.

Kampanjen för “programmering” som obligatoriskt skolämne bedrivs med flummiga hänvisningar till att programkod skulle vara “framtidens språk“. Som om koden var ett språk!

Det finns en glidande skala från maskinnära lågnivåspråk till de högnivåspråk som är anpassade för praktiska syften. Här finns en klar maktproblematik. Att lära sig lågnivåspråk som assembler är oerhört svårt, men ger definitivt en kunskap om hur datorer fungerar och hur datorsystem kan manipuleras. Ju högre upp i maskinens nivå ett programspråk opererar, desto lättare blir det att lära sig dess praktiska bruk. I de högre språknivåerna återfinns diverse scriptspråk (t.ex. bash för unixdatorer eller javascript och PHP för webben). Allra högst – närmast “ytan” – återfinns märkspråk som HTML, vilket jag skriver i just nu.

Ju högre upp mot ytan man kommer, desto lägre är manöverutrymmet, desto fler normer är inbyggda i språket. Ju lägre ner man tar sig, desto större möjligheter finns att rucka på dessa normer eller förstå hur andra kan göra det.

Vad menas då med “programkod” på skolschemat? Ska eleverna lära sig lite av varje, för att få en inblick i hur datorer fungerar, även om de inte kommer att kunna använda kunskapen till praktiska program? Eller ska de verkligen få lära sig att programmera ett visst kodspråk – och i så fall vilket, på vilken nivå?

Skillnaden mellan ett lågnivåspråk som assembler och ett högnivåspråk som javascript går nog att jämföra med skillnaden mellan fysik och företagsekonomi. Det är kort sagt två helt olika ämnen. Det är hög tid att kodlobbyn klargör vad de vill ha in på läroplanen (och vad de vill prioritera bort)!

27 kommentarer ↓

#1 Petter Ericson on 13 February 2015 at 3:45 pm

En cynisk gissning är att Google et. al. inte direkt vurmar för gemene mans förståelse av datorer, utan snarare vill ha en stor massa kodapor att välja ifrån, i syfte att hålla nere löner och uppe konkurrens.

Ett alternativt sätt att se på programmeringsundervisning är som en fördjupad teknikundervisning i syfte att minska mängden “magi” i folkmedvetandet. Information och kunskap är makt, och genom att folk i gemen har åtminstone en vag uppfattning om hur teknik fungerar så kan vissa makt-obalanser hållas tillbaka.

Jag skulle gärna se fördjupad ekonomiundervisning för gemene man också, egentligen, av samma anledning. Gärna lite marxistisk teori i folkhemsskolan :)

#2 Christopher Kullenberg on 13 February 2015 at 4:12 pm

Jag vill göra ett tillägg. Detta tema implicerar ibland att de som har kunskaper i programmering “har” makt (i kraft av sina kunskaper). En slags metodologisk individualism. I praktiken är det sällan så.

Det är inte programmeraren på Google eller Facebook som med sina kodrader “utövar makt” över konsumenterna av tjänsterna. Det är ju Google som sammansatt aktör som i kraft av sin kod + kapital + tjänster + innehåll + affärsmodeller… osv. som blir en maktfaktor i våra liv till näts.

Bara för att en massa individuella skolelever lär sig diverse programmeringsspråk betyder det inte att de därmed “får makt”. En oerhört skicklig programmerar kan vara helt maktlös om hen inte har förmågan att koppla sig samman med andra aktörer.

Det finns alltså inget magiskt piller med beteckningen C++ eller Python som ger oss mera manöverutrymme.

Det demokratiska problem som uppstår när det offentliga samtalet monopoliseras av ett fåtal stora multinationella bolag (FB, Google etc.) löser vi inte genom att lära oss att programmera. Sådan teknologisk determinism ger oss bara ytterligare problem.

Men, att kunna programmera en massa olika saker och språk tillsammans och i många olika sammanhang ger utökade möjligheter att skapa alternativ till “Skynet”. Att forma teknologin efter ett specifikt problem eller en lokal angelägenhet. Utan programmeringskunskaper framstår de samtida medieteknologierna bara som svarta oföränderliga lådor, som ger oss underhållning och tar ifrån oss våra liv.

Slutsats: Programmera mera. Men gör det inte för att utöka “konkurrenskraften i landet” utan för att avskaffa konkurrenskrafter och länder.

#3 Marcus on 13 February 2015 at 4:45 pm

Jag tänker på programmering som ett sätt att tänka, snarare än en kunskap om något som vi ur något perspektiv “borde” bli bättre på att bemästra – som nation, individ eller whatever. Tänka procedurer, protokoll, tänka information, tänka “hacktivism” för all del, etc. Ett sådant tänkande är en intressant konsekvens av att lära sig programmering, oavsett vilket språk som väljs, precis som att tänkandet har förändrats av tillgången till talspråk, skriftspråk etc. Det perspektivet vore intressant att utforska i den här diskussionen.

#4 Monki on 13 February 2015 at 4:52 pm

Några kommentarer:

Det är inte säkert att det är de som kan koda som har makt idag, utan snarare de som kan få folk att koda åt dem eller i stort påverka inriktningen för det som kan kodas (lönsamt). Mycket kodande idag är rätt monotont tillverkande av på förhand specificerade funktioner (som visserligen är ett arbetstillfälle om det istället är det som eftersöks).

Att möjliggöra för skolelever att bättre kunna navigera och aktivt delta i den digitala utvecklingen handlar inte nödvändigtvis om att koda och även koden behöver inte införas som ett separat ämne (för tankarna till mina gamla skrivmaskinskurser på mellanstadiet *gammal*). Att använda avancerad mjukvara för att redigera ljud/bild/film/3D, att lära sig värdera information och källor, att socialt navigera digitala miljöer, och att på ett mer övergripande plan förstå vad digital teknik gör och kan göra är minst lika värdefullt. Även att t.ex. bygga en hemsida handlar om mycket mer än att bara koda (innehåll, grafik, hur den sprids, interationsmöjligheter) Kod och kodande kan med fördel användas som ett pedagogiskt verktyg för att skapa förståelse här också, men det behöver inte vara huvudsakligt fokus på just detta.

För att bara ta exempel på sådant jag själv är inblandad i inom skolmiljöer så kan jag nämna kreativt skapande med digital teknik tillsammans med mer traditionellt hantverksmässiga och slöjdiga material eller skapandet av sensorer för mätning och visualisering av miljödata som en ingång till ekologi, urbanitet och kunskapsproduktion. Här stärker det (förhoppningsvis) traditionella ämnen snarare än att ta från dem och kod används men det är inte fokus på det utan på uttrycket och vad koden gör.

Sen ang. programmeringsspråk som olika språk så stämmer det och framförallt mellan programmeringsfamiljer som funktionella programmeringsspråk, objekt-prienterade osv. Men samtidigt finns det en grammatik som är rätt gemensam hos de flesta mellanspråk; att till exempel förstå if-satser, for-loopar, variabler eller reguljära uttryck gör att man ganska snabbt kan lära sig hur samma funktioner implementeras i olika programmeringsspråk. Pedagogiskt sett finns det rätt mycket “low-hanging fruit” där som skulle kunna täcka en slags allmänbildning inom programmering.

#5 Monki on 13 February 2015 at 4:58 pm

Ytterligare en tanke. Egentligen kanske fokus ska vara på lärarutbildningen och att blivande lärare lär sig bemästra digital teknik som pedagogiskt material och sen kan de (förutsatt att de får mer fritt spelrum) få själva kunna implementera detta i undervisningen med stöd av olika tillgängliga digitala miljöer.

#6 Elin on 13 February 2015 at 5:21 pm

“Tanken bottnar i en historisk parallell mellan boktryckarkonsten och internet, mellan skrivkunnighet och programmeringskunskap”

Detta kanske liknar det du också ville ha sagt, men skrivkunnighet är väl inte den tekniska grunden till boktryckarkonsten på samma sätt som programmering är den tekniska grunden till internet (däremot måste man kunna ju läsa/skriva för att utnyttja boktryckningsteknologin). Programmering svarar väl snarare mot kunskapen om hur själva boktryckningsapparaten funkar. För att ta kontroll över processen förr skulle ju folk både behöva lära sig läsa/skriva och dessutom lära sig att tillverka/använda en boktryckningsapparat och papper. Nuförtiden kan ju de flesta läsa/skriva (vilket krävs för att använda internet på liknande sätt som det krävs för att använda/tillverka en bok), det som saknas är kontroll över den tekniska biten.

Ett litet sidospår: jag tyckte teknik och ekonomi var så sjukt tråkigt när jag var yngre (då var jag mer inne på abstrakta, icke-tillämpade ämnen). Nu tycker jag det är jätteintressant. Jag undrar ibland om det faktiskt undervisades i skolan om sånt jag tycker är intressant nu. Kanske dagdrömde jag under de lektionerna? Eller också fanns det inte med, eller så kopplades det inte ihop på ett tankeväckande sätt. T ex: vilken teknologi vilar egentligen vår civilisation på? Konstgödsel till exempel, vilken otrolig skillnad det blev när folk kom på Haber-Bosch-processen. Undrar som sagt om bristen låg hos mig eller hos skolan.

Jag är väl lite inne på samma spår som första kommentaren om att minska mängden “magi” i teknologin och öka folks kontroll över tekniken. Men också att teknikundervisning kan vara ett led i att förstå samhällets grundvalar och gränser vad gäller t ex miljöproblem.

(Jag undrar också varför det är läskigt att kommentera, men nu gör jag det ändå.)

#7 Kjell on 13 February 2015 at 5:25 pm

…det finns ingen “skillnad” mellan förr och nu. Martin Luther
brydde sig inte om vem som “satt typerna” och pressade arket, möjligtvis Durer (ursäkta stavningen) ,för han hade estetiska “synpunkter”. De som använde boktryckrkonsten kom att bidra till den Rousseauianska transparensen som delvis präglar “internet”. Vem eller vilka som kan “kod”, är för mig ganska ointressant.

#8 Jonatan on 13 February 2015 at 6:26 pm

Rasmus liknelser haltar ganska mycket här tycker jag, både mellan programmerinsspråk-mänskligt språk och assembler kontra javascript som fysik kontra företagsekonomi.

“Alla” programmeringsspråk är Turing-kompletta (det finns några undantag, märkspråk t ex (jag hade aldrig sätt det svenska ordet förut…)). Det finns ingenting som går att programmera i Assembler som inte går att programmera i JavaScript och vice versa. Och allt som går att programmera i Assembler kan också programmeras i bash eller PHP..

All programmeringsspråk ger en förståelse av vad en dator kan och inte kan göra.

Vidare till liknelsen med mänskligt språk. När det gäller mänskligt språk så handlar det om ifall man ska lära sig 1, 2, 3 eller 4 språk i skolan, men för programmeringsspråk i grundskolan så handlar det om 0 eller 1. Att lära sig sitt första programmeringsspråk öppnar en mycket större ny värld än att lära sig sitt tredje eller fjärde mänskliga språk.

Sen överdrivs också svårigheten med programmering av den liknelsen. Mänskliga språk är oerhört mycket mer rika och komplexa än programmeringsspråk.

För att uppnå de stora demokratiska vinster som man skulle få av att lära ut programmering i skolan så menar jag att det inte spelar någon roll vilket Turing-komplett språk man väljer! Välj det som är stjäl minst fokus från själva programmeringen!

Jag har svårt att se hur man ska kunna lära ut grundläggande principer för ett demokratiskt internet om man inte åtminstone har fått testa att programmera någon gång. Jag tror att det är oerhört viktigt för demokratin att man får en förmåga att förstå nät-neutralitet, att vem som helst kan sätta upp en server och inte bara vara klient till företags servrar, skillnaden mellan att skicka ett (krypterat) e-post meddelande och ett facebook-meddelande, skillnaden på att kunna köra vilket program man vill eller bara de som godkänts i App Store etc.

Jag är inne på samma linje som Petter, Monki och Elin. Minska mängden magi.

#9 Niels Möller on 13 February 2015 at 7:38 pm

Jag håller helt med om att det är viktigt att få ett hum om hur datorer fungerar. Det finns alldeles för mycket “inlärd hjälplöshet” när det gäller datorer.

Vilket som är det första programmeringsspråket man lär sig är däremot inte särskilt viktigt; det får avgöras helt från pedagogiska erfarenheter. Att lära sig programmera är inte att lära sig ett språk, det är att lära sig ett sätt att tänka, ett annat förhållningssätt till problemlösning.

Och vad gäller makt, så ser jag en uppenbar koppling till fri programvara.

Kör man program som man inte har källkod till, så krävs det rätt avancerad reverseengineering och binärpatchande för att ändra, eller ens förstå, hur de beter sig (och än värre blir det förstås om man har nerlåst hårdvara som ipads och liknande). Har man källkod (och rätt att använda den), så öppnar sig helt andra möjligheter om man själv eller några av ens vänner kan programmera.

#10 Monki on 13 February 2015 at 7:40 pm

Bra poäng, Elin. Nån slags teknikhistoria skulle verkligen behövas. Större perspektiv än det senaste trendiga kodspråket eller teknikprylen.

#11 rasmus on 13 February 2015 at 8:03 pm

Enorm tack för alla kommentarer! Jag skrev inlägget i förvissning om att det många av er läsare har större kunskaper än mig, och i förhoppning om att få till just detta tankeutbyte.
Kanske får jag skriva ett uppföljande inlägg senare, för att zooma ut lite från “koden i sig” till någon typ av “allmän datakunskap”, vilket flera av er som kommenterat redan varit inne på. Utan att besitta någon expertis (varken inom det pedagogiska eller det datalogiska fältet) tänker jag mig att en sådan datakunskap borde stå på tre ben:
* Programmeringsspråk
* Databaser (hur data struktureras)
* Infrastruktur (hur nätverk organiseras)

I diverse (akademiska) sammanhang märks en ensidig fixering vid behovet av att bli bättre på att förstå koden, eller “algoritmerna”. Man glömmer lätt att dessa algoritmer opererar på databaser och i nätverk.

#12 avadeaux on 13 February 2015 at 8:32 pm

Det är ett misstag att dela upp programmeringskunskapen i olika språk som du gör här. Samma misstag som man ser i jobbannonserna som ropar efter ”C++-programmerare” eller ”Javaprogrammerare”. Samma misstag som mina studenter med samhällsvetarinrikting gjort (innan jag lärt mig i vilken ording man måste introducera programmeringsmomenten för att poängerna ska gå fram), när de klagat över att de inte har tillräckliga kunskaper om programmeringsspråket de ska använda för att kunna lösa uppgifterna jag ger dem. De kommer med uppfattningen att programmering handlar om att kunna språket man använder för att skriva instruktioner till datorn. Men det är en ganska marginell del av processen, jämfört med att tänka ut vilka instruktioner man ska ge för att lösa problemet. Har man en gång lärt sig det lär man sig ganska lätt ett nytt språk, eller (med lite större ansträngning) ett helt nytt programmeringsparadigm. Jag har funnit att det lättaste paradigmet att lära sig faktiskt verkar vara det som hör hemma på den lägsta nivån, alltså maskin-/assemblyspråk. Där är svårt att få något ordentligt gjort eftersom det behövs så fruktansvärt många instruktioner, men ganska lätt att greppa koncepten.

Då inkluderar jag förstås inte HTML bland programmeringsspråken. Det är inget riktigt programmerinsspråk eftersom det inte är universellt (Turingfullständigt), utan bara går att använda till mycket begränsade uppgifter. Att ”programmera” i HTML är närmare jämförbart med att programmera en videobandspelare till att spela in ett tv-program, än med att koda i t.ex. Javascript.

Om man borde lära sig programmera i skolan är en svår fråga. Det är inte säkert att det blir framgångsrikt. Problem nummer ett är att det vore svårt för existerande lärare att göra det på ett meningsfullt sätt.

Men vad jag skulle önska mig är att åtminstone de flesta bildade människor hade ett begrepp om vad ett program är för något: vad som går att göra med program, vad i de system som bygger upp IT-samhället som utgörs av programvara, vad som går att lösa, vad som är lätt, och vad som är principiellt omöjligt. Om beslutsfattare inom politik, juridik och näringsliv hade haft den grundläggande kunskapen, och inte satt i knät på ”experter” med egna agendor, då skulle vi ha sluppit en hel del dåliga beslut. Enligt min mening är det absolut bästa sättet att få den förståelsen att prova på programmering själv. Om det är maskinkod eller Javascript har mindre betydelse, det gäller att förstå de grundläggande mekanismerna för t.ex. villkor och upprepning, för att bli mottaglig för andra grundläggande kunskaper. Praktisk och ekonomisk såväl som sådan som handlar om beräkningsteori och artificiell intelligens, och som har bredare implikationer än vad de flesta är medvetna om.

Jag skrev förresten en kompletterande kommentar till Andreas Ekströms reaktion på mitt blogginlägg här.

#13 avadeaux on 13 February 2015 at 9:00 pm

Nu dök det upp en Rasmus-kommentar efter att jag börjat skriva. Snabb kommentar till ”de tre benen”, då:

* Programmeringsspråk: nja, man måste förstås lära sig lite om något programmeringsspråk för att förstå och själv prova exempel, men språken i sig är inte så grundläggande.
* Databaser: på grundläggande nivå väldigt lätt att förstå hur det fungerar. Tycker att vi i övrigt kan lämna det åt IT-yrkesmännen (som dock förvisso helst borde förstå det djupare än de gör, men det är en annan fråga), och inte behöver se det som ett av benen.
* Infrastruktur/nätverk: visst, det är bra att veta, men inte supergrundläggande. Påbyggnadskunskap i nivå med AI, beräkningsteori, och algoritmer som du nämner.

Mina två ben skulle istället vara:
* Vad ett datorprogram är och hur det skapas.
* Hur nyckeln till att förstå hur IT-system är kedjor av abstraktionsnivåer, vilka de vanligaste är, och hur de hänger ihop.

Ett par böcker jag gillar, och använder som kurslitteratur är Brian Kernighans D is for Digital och Charles Petzolds Code. Den förra borde alla läsa och förstå hela, förutom att prova programmering. Den senare går man vidare med några kapitel i för att förstå kopplingen elektronik–logik–maskin–program, vilket är mer grundläggande rent tekniskt, men mindre nödvändigt för att skaffa sig koll på programmens roll i samhället.

#14 Alaoglu on 13 February 2015 at 10:40 pm

De politiker som övertygats av någon lobbyist om det förträffliga med programmering i grundskolan kan väl förmodas själva ha synnerligen begränsade erfarenheter av programmering. Bristen på konkreta förslag är därmed inte särskilt förvånande. (Personer med verklig erfarenhet är i allmänhet långt mindre positiva, Linus Torvalds har exempelvis dömt ut idén.)

För den som menar att det vore en god idé att (försöka) lära alla högstadieelever använda en assemblerdebugger (borde vi inte ha obligatorisk kvantkromodynamik också?) kan ju reflektera en stund över de problem den svenska skolan av idag har att lära dem procenträkning…

Jag instämmer i mycket av den kritik mot jämförelsen med alfabetisering och boktryckeri som framförts av andra; om syftet är “radikaldemokratiskt”, att undvika datoranalfabetism och iPhoneförslavning (snarare än att producera program), är väl en bättre parallell att vi länge sett det som självklart att man i grundskolefysiken diskuterar hur en cylindermotor och säkringarna i ett proppskåp fungerar? (Att på egen hand “hacka” sitt proppskåp är dock olagligt…)

@rasmus: Att “ju högre upp i maskinens nivå ett programspråk opererar, desto lättare blir det att lära sig dess praktiska bruk” är kanske sant om man tänker på assembler och HTML, men på vilket sätt är Haskell (högnivå) lättare att lära sig än C (numera betraktat som ett lågnivåspråk) och på vilket sätt skulle Haskell ge lägre “manöverutrymme”?

Den massiva avsaknaden av konkreta förslag illustreras väl av förvirringen i detta kommentarsfält: Turingfullständighet är ett begrepp som möjligen hör hemma i en A-kurs i filosofi, men den som finner Jonatans tes att det är ingen skillnad mellan två turingfullständiga språk övertygande anbefalles att som övningsuppgift implementera (säg) en raytracer i TeX eller Minröj eller HTML (som alltså är turingfullständigt @avadeaux). [Konkret: Varför lägger svenska skolan idag massor av tid på att lära elever MS Word, men aldrig en enstaka timme på typsättning (inte generell programmering) i LaTeX?]

Om tio år kommer helt nya programspråk att spela en viktig roll, medan vissa av dagens programspråk har blivit passé.

Man kan ju hoppas, men C(++) är fortfarande programmeringens engelska, din internetbank troligen beroende av ett COBOLfossil vars mödosamma uttolkning numera kräver expertis i datapaleolingvistik och ditt närmsta kärnkraftverk kontrolleras av en formidabel klump FORTRAN, en annan rest från den digitala bronsåldern. Denna tröghet och de nära band de flesta populära språk har till C förklarar varför det är relativt enkelt att röra sig mellan dessa språk, men en inbiten C-programmare som tar en titt på Prolog får ungefär samma känsla som en amerikansk turist som irrat in på ett kampanjmöte med ETA.

#15 Magnus A on 13 February 2015 at 11:54 pm

Många har problem som de skulle kunna lösa genom att göra ett litet program, men eftersom de aldrig har programmerat har de ingen aning om att det går. Här är det lämpligt att börja, vid intresset av att förenkla för sig själv, vare sig det gäller något tråkigt som behöver automatiseras eller något kul man vill göra.

Det finns ett väldigt stort glapp mellan “ingen programmering alls” och “kunna programmera”, särskilt om man definierar “kunna programmera” som att man har gått en lång utbildning inriktat på enbart det.

Det är väl ingen som skulle komma på tanken att säga att de enda som kan prata engelska är de som gått en treårig högskoleutbildning i just engelska, och lika orimligt är det att se programmering på det sättet.

Av någon anledning förväntas man kunna byta lampor utan att vara elektriker, städa utan att vara städare och laga mat utan att vara kock. Programmering för husbehov är inte samma sak som att konstruera gigantiska datorsystem. Det senare är dessutom inte bara programmering.

#16 kjell on 14 February 2015 at 7:19 am

…jag måste fråga; skiljer man inte längre på programmerare och systemmän (systemhen) ?

#17 Christopher Kullenberg on 14 February 2015 at 8:39 am

Håller med om det som framförallt monki och elin skriver.

Däremot skulle jag vilja försvara rasmus “tre ben” mot avadeaux kritik, även om jag gillar kritiken. Här kommer alltså en kritik av kritiken :D

Men med rasmus tre ben kan man bygga Facebook, givet att man har en strid ström av hårdvara och användare som ansluter. Internet är inte så mycket svårare än så.

Avadeux har samtidigt rätt i att det är värdefull kunskap att förstå vad ett datorprogram “är” samt de olika “abstraktionsnivåerna”. Men, problemet med denna approach är att den är i huvudsak “teoretisk”.

Nu blev detta kanske en fråga om pedagogik istället för innehåll. Men problemet som jag ofta stöter på när jag föreläser om dessa saker är att teoretiska resonemang är intressanta men sällan kommer till användning.

Kanske menar jag egentligen distinktionen “förstå”/”förändra”. Som när Heidegger kritiserar Marx (översättning här). Här lutar jag hellre åt Marx än Heidegger, speciellt när “tekniken” är på tal.

#18 Jonatan on 14 February 2015 at 10:46 am

Alaoglu: Jag skrev inte att “det inte är någon skillnad på Turing-kompletta språk”. Jag skrev att det inte är någon skillnad på vad som _går_ att göra i Turing-kompletta språk. Givetvis är det olika praktiskt att göra olika program i olika språk, beroende på ens förkunskaper och hur väl det språkets abstraktioner passar för problemet som man vill lösa.

Poängen var att oavsett vilket språk man lär sig så lär man sig något allmängiltigt om programmering. Vilket språk man väljer att lära ut bör vara en pedagogisk fråga om vilket språk som stjäl minst fokus från det man hoppas lära ut. Inte en fråga om vilket språk som passar bäst för att skapa de program som eleven/marknaden/industrin efterfrågar.

#19 avadeaux on 14 February 2015 at 11:02 am

Christoffer Kullenberg: jag skulle fullständigt hålla med om din kritik av min kritik om jag menade att undervisningen skulle vara rent teoretisk. Det gör jag inte. Mina två ben är målen för vad man ska lära sig, men som sagt tycker jag att bästa sättet att ta sig dit bör inkludera att prova praktiskt. (Det går, åtminstone för vissa, att förstå det rent teoretiskt, men det kräver i så fall andra förkunskaper att kroka förståelsen i.) Min metod för närvarande är att få studenter att koda eller ”koda” i några olika delar av systemet: browser, server, logiska kretsar. Först därefter går det att knyta ihop säcken med abstraktionsnivåerna.

Jag slänger in ett citat jag använder som kompass, från en viss William Kent (i Data and Reality). Detta, menar jag, är nyckeln man behöver vrida om, och anledningen till mina två ben:

”People are awed by the sophistication and complexity of computers, and tend to assume that such things are beyond their comprehension. But that view us entirely backwards! The thing that makes computers so hard to deal with is not their complexity, but their utter simplicity. The first thing that ought to be explained to the general public is that a computer possesses incredibly little ordinary intelligence. The real mystique behind computers is how anybody can manage to get such elaborate behavior out of such a limited set of basic capabilities.”

#20 Alaoglu on 14 February 2015 at 12:40 pm

Jonatan: Är syftet att lära eleverna något “allmängiltigt” om programmering (vad skulle något sådant vara?) eller att de ska ha någon form av förståelse för hur de datorer de använder fungerar? Om målet enbart är något turingfullständigt språk har skolan sedan ganska länge lärt elever att räkna, vilket alltså skulle vara tillräckligt?

Eller är målet att lära dem programmering till “husbehov” som Magnus föreslog?

#21 Martin on 14 February 2015 at 2:12 pm

Håller med Magnus A mfl. – gillar byta-lampa-analogin. Folk i allmänhet har ju inte koll på t.ex. när det är lämpligt att distribuera dokument som .pdf snarare än .docx (gäller många som dagligen jobbar i ms office). Kanske inte direkt kopplar till programmeringskunskap, men lite allmän systemkunskap hjälper nog.

#22 jowe on 14 February 2015 at 2:17 pm

Jag tycker inte det ger så mycket att fundera över exakt vilka programmeringsspråk som kan vara aktuella att lära ut, eller om databasteori är nödvändigt. Om man ska vara realist tror jag det viktiga är att överhuvudtaget möjliggöra *någon form* av förståelse hur program-datorer-nätverk-internet fungerar. Mer som en allmänbildning som handlar både om teknik och samhällskunskap.
Om jag ska ge konkreta exempel så vet jag av egen erfarenhet att 8-9-10-åringar (ålder beroende på intresse) efter en kort introduktion själva kan börja göra enkla spel eller små filmer i gratis-programeringsmiljön Scratch, där programkoden byggs av grafiska block man sätter ihop. Det barn som suttit en tid och pillat ihop ett eget projekt och fått förklarat för sig att det är precis så de flesta “riktiga” program/appar är konstruerade (om än i mer avancerad programmeringsmiljöer), tror jag har fått en tillräcklig grundläggande kunskap om programmering. Det är därifrån enkelt att ta sig vidare till mer avancerad programmering, men med små steg och med roliga projekt. Exempelvis finns learntomod.com (inte gratis), där man skriver riktiga mod (alltså tillägg) till spelet Minecraft i en lite mer avancerad scratch/javascript-miljö.

På liknande, lekfulla, sätt tror jag man kan lära ut hur nätverk fungerar. Kankse låta barnen skapa egna hemsidor som blir tillgängliga bara på den dator de skapas. Få dem att förstå att för att alla ska kunna se deras hemsida måste den ligga på ett ställe där andra datorer kan hitta den. Det är inte särskilt konstiga koncept så länge man inte grottar ner sig i detaljerna.

På liknande sätt kan man gå vidare att göra mer avancerade saker som naturligt kommer att kräva mer avancerade lösningar. Ska den som tittar på hemsidan kunna skriva en kommentar som finns kvar nästa gång man tittar på sidan? Ja, då måste ju kommentaren sparas någonstans…

Bara lite tankar.

#23 COPYRIOT | Efter Flashback on 14 February 2015 at 4:05 pm

[…] Bör alla lära sig programkod? Synpunkter på en nivåförvirring […]

#24 Programmera eller bli programmerad - Kunskapsivriga experiment on 18 February 2015 at 11:09 am

[…] tycker jag att alla borde läsa Rasmus Fleischers text om nivåförvirringen när det gäller kod. Vilken kod, vilken nivå, för vem och av […]

#25 lokföraren on 18 February 2015 at 5:20 pm

Varför begränsa sig överhuvudtaget vad gäller språk, nivå eller innehåll? Det blir lite som att säga att man måste göra saker endast av granträ i träslöjden, eller att man måste sy en tygkasse i textilslöjden.

Känner f.ö. lite att slöjd passar ganska bra som utgångspunkt för en ev. programmeringskurs i grundskolan: Programmering är hantverk, och fokus kanske borde ligga i hur eleven förstår och lär in just de bitar och processer som används för att göra den uppgift hen (med stöd av läraren) bestämmer själv? Måste det spela roll om elev A och elev B har lite olika kunskaper i slutet av kursen, om de tydligt tagit till sig koncepten de använt och kanske nått lite inspiration till att koda vidare i någon form – vilken som helst?

#26 Pontus Näslund on 21 February 2015 at 1:37 pm

Begreppen programmering och att programmera gömmer flera saker.

På en nivå handlar det om datorns lingvistik, som i allt väsentligt är logik uttryckt med diverse symbolsystem som påminner om mänskligt språk. Alltså hur man kontrollerar dataflöden, algoritmiserar operationer på data, med mera. Ofta är det vad som avses med att ‘lära sig programmera’, och vad en del i tråden menar med att om man lär sig ett eller flera turingkompletta språk så får man en mer abstrakt kunskap än den direkta förmågan att lösa problem i ett enskilt programmeringsspråk.

Det mest basala i detta är logik och logisk teori, och påminner starkt om algebra. Ofta är den logisk-teoretiska grunden väl dold i populära högnivåspråk, de har en såpass inkonsekvent syntax och försöker vara så multiparadigmatiska att dessa karaktärsdrag blir mer framträdande. Mer esoteriska högnivåspråk drar ofta åt det andra hållet, som Haskell och LISP, där man uttryckligen rör sig med monader och liknande.

Detta kan skolan med fördel lära ut grunderna för, precis som man får lära sig algebra, geometri och grammatik.

Sedan finns andra nivåer, som är mera komplicerade. Någon som kan programmera kan också söka rätt på och välja bland programbibliotek på ett kompetent sätt (OpenGL eller SDL, Angular eller Backbone, osv.). Detta är i högre grad erfarenhetsbetingat än logisk teori, eller vad vi nu vill kalla den förstnämnda nivån. Här finns också förmågan att välja språk beroende på uppgift och kompetens.

Nära detta ligger också en förståelse för programmeringens idiomatik, programmerarkollektivens fackspråk. Om man inte vet att det kallas för refactoring att fräscha upp befintlig kodbas i ett projekt får man också svårt att söka rätt på bra information i ämnet. En del av språkbruket kan säkert läras ut i skolan utan att det väcker några kontroverser, men om skolan börjar undervisa i specifikt Microsofts eller Googles programmeringstekniska språkbruk börjar det likna branding med offentliga medel (precis som tillhandahållande av iPad på dagis är det).

Så här långt är jag positiv till införandet av den förstnämnda nivån i skolundervisning, av ungefär samma skäl som jag är positiv till undervisning i grammatik och algebra. När det gäller konkret pedagogisk implementation bör skolan förhålla sig neutral till varumärken och företag, så undervisningen bör inte baseras på språk med nära koppling till dylikt. I praktiken begränsar det mängden tänkbara språk kraftigt, till sådana som LISP, C++, assembler. Helst skulle jag se att LISP var ett skolämne men det kommer aldrig att hända utanför datavetenskapliga institutioner.

Om programmering blir allmänt skolämne kommer det att bli en maktkamp mellan olika intressen, där jag tror att avvägningen mellan arbetslinjen och kunskapslinjen blir central. Med tanke på samhällsklimatet och det politiska klimatet är det osannolikt att andra än industrins intressen kommer att bli tillgodosedda. Alltså, indoktrinering i specifika företagsanknutna språk snarare än utbildning i algoritmiskt och logiskt tänkande i förhållande till beräkningsmaskiner, syftande till att eleverna ska kunna konkurrera ned varandras löner och tidvis sälja arbetskraft.

#27 menu icon on 20 February 2018 at 10:29 am

[…] debatten om ”bästa nybörjarspråk” framställs det ofta som att det inte är viktigt vilket språk som väljs, eftersom det är logiken som ska tränas, inte syntax i sig. Mina elever […]

Kommentera