Kategoriarkiv: datalogiskt tänkande

Programmering är roligt, programmering är svårt

Originaltanken för detta inlägg var att skriva om vad som gör programmering svårt för nybörjaren. För även om mycket av det arbete som exempelvis code.org gör handlar om att sänka tröskeln så att fler provar på programmering, så kommer de flesta någon gång att tycka att det är svårt. Vilket väl gäller det flesta saker som man inte kan, som man lär sig, frågan är om det i större utsträckning gäller för programmering? Och i vilket fall som helst så kommer även den vane programmeraren fastna och ge uttryck för frustration (och sannolikt sitta aningen för länge och försöka lösa det, bara för att efter en paus ganska snart upptäckta vad problemet var – det händer inte varje gång, men ofta). Jag blev nyfiken på vad andra sökt på, så jag gick till Google:

google-autocomplete-programmingis

Någonstans så hänger detta med det svåra och det roliga ihop, att det är roligt delvis för att man hitter den rätta mixen av utmaning och hanterbart, till den grad att man kan prata om flow för programmerare eller ”coder’s high” . Därför blir dagens inlägg både om varför programmering är roligt och varför det är svårt.

Varför programmering är roligt

För min egen del är programmering roligt (engelskans fun funkar nog lite bättre än svenskans roligt, men vi kör på det) av flera skäl. Dels handlar det om själva byggandet, att det blir något, vare sig det är något som kommer till användning eller något som man gör för något estetiskt värde eller för att man är sugen på det i stunden. En annan del, som kanske är viktigast för min egen del, är själva problemlösandet, både i det stora (identifiera vad problemen egentligen är, skapa strukturer för att lösa dem) och i det lilla (varför kompilerar inte skiten). Och så kan man kontinuerligt lära sig och utveckla sig, både vad gäller det praktiska (som bättre sätt att hantera utvecklingsprojekt) och det teoretiska (som nya modeller eller algoritmer).

Det finns en känd bok om utveckling av programvara och projektledning av projekt som syftar till att utveckla programvara som heter Mythical Man Month: Essays on Software Engineering. (När jag först hörde talas om den trodde jag den hette Mythical Man Moth, vilket jag tycket var en underlig titel på en bok om utveckling av programvara.) Trots att den kom ut för första gången 1975 anser många att den fortfarande är relevant idag (några nya kapitel kom med på 90-talet). Förutom lärdomar som att det inte hjälper att lägga till fler programmerare till ett försenat projekt, så finns även en lista med de belöningar som finns i att programmera:

  • Glädjen i att bygga saker, som barnet i sandlådan
  • Nöjet i att bygga saker som kommer till användning för andra
  • Fascinationen i att sätta samman pussel-liknande objekt med delar som rör sig tillsammans enligt det sätt som det designades från början, som en flipperspel
  • Glädjen i att lära sig nya saker, både praktiska och teoretiska
  • Förtjusningen i att arbeta med ett material som på en och samma gång ligger nära tanken och drömmarna och ändå kan ge så konkreta resultat – något som får många att dra paralleller till magins värld

Min snabba översättning är inte originalet rättvisa, gå till länken ovan listan och läs själv på engelska.

En sak jag tycker saknas i Brooks lista (och som jag inte själv kom att tänka på när jag började spåna) är nöjet att skapa saker med andra.

Varför programmering är svårt

Många som börjar med programmering tycker att det är svårt. Det som gör det svårt har delvis att göra med de sakerna som gör det roligt (och som är roliga för att man vet att man bemästrat liknande problem tidigare, eller i alla fall har anledning att tro att man ska bemästra det problem som man just nu står för). Men det är också svårt för att det finns praktiska hinder, nya tankesätt, ny teminologi. Några exempel:

  • Programmering är förhållandevis oförlåtande för små misstag. Och de felmeddelanden som man får är inte alltid begripliga för nybörjare.
  • Dokumentationen är skriven på ett sätt som är svår för nybörjare att ta till sig. Inte sällan finns felaktigheter, vilket är svårt för en nybörjare att förstå.
  • Förhoppningsvis skyddas många nybörjare från det, men att bara sätta upp själva utvecklingsmiljön (programmet där man bygger programmet) kan vara icke-trivialt. Något som kan hindra mig från att påbörja nya projekt i nya språk.
  • Det ställer förhållandevis höga krav på arbetsminnet, att man kan hålla flera saker i huvudet, eller att man skaffar sig en vana att skriva ner saker om man inte har den förmågan.

Listan på vad som gör programmering svårt för nybörjaren kan göras längre. Därför så tror jag att det finns en risk med initiativ som vill få programmering att framstå som något lätt, och det är att många kommer att dels bli frustrerade, men också ännu värre tro att de är dumma när de sedan stöter på problem som de inte reder ut.

Man kan också argumentera bredare om/hur/varför programmering är svårt, det finns en tråd på Quora som tar upp flera intressanta perspektiv.

Det är intressant hur #blogg24 ger en en ursäkt att publicera något halvfärdigt. Jag är trött , mitt sjuka barn håller på att vakna, det är lillejuleafton, så det blir inget skrivande i kväll. Jag har inte alls skrivit så utförligt om varför programmering är svårt eller hur detta faktum kan/ska framställas för en nykomling, eller vad man kan göra för att hantera det. I vanliga fall hade jag sparat utkastet och återkommit en annan dag, idag publicerar jag det. Bra eller dåligt? I mitt fall, i denna stund, mest bra tror jag.

Illustrationer av datalogiskt tänkande

Att illustrera datalogiskt tänkande är inte helt lätt, men det kan göra mycket för att konkretisera koncepten. Blev därför glad när jag hittade Computational Thinking Illustrated. Siten har varit otillgänglig ganska länge, men nu har jag äntligen kommit åt den.

Illustrationerna av datalogiskt tänkande utgår från koncept från den nya datavetenskapskursen Computer Science Principles, som är på gång på high school-nivå i USA (aningen mer om detta senare) och tar upp:

  • Analyzing effects of computation (Computatinal thinking practices)
  • Producing computational artifacts (Computatinal thinking practices)
  • Using abstractions and models (Computatinal thinking practices)
  • Analyzing problems and artifacts (Computatinal thinking practices)
  • Communicating processes and results (Computatinal thinking practices)
  • Working effectively in teams (Computatinal thinking practices)
  • Decomposition (Exploring computational thinking)
  • Pattern recognition (Exploring computational thinking)
  • Pattern generalization and abstraction (Exploring computational thinking)
  • Algorithm design (Exploring computational thinking)

Det är alltså en uppdelning i ”computational thinking practices” och ”exploring computational thinking”, som delvis mappar mot det jag skrivit tidigare om datalogiskt tänkande.

Alla illustrationer med förklaringar finns att ladda ner som en PDF-fil om man inte vill bläddra runt en och en på deras site. Illustrationerna är Creative Commons Erkännande-DelaLika, så de är fria att använda så länge du erkänner källan och om den ändrats, samt att du själv använder samma licens när du sprider materialet vidare. Så nu har jag till slut lagt upp en CC-licens här på bloggen.

Två favoriter: Använda abstraktioner och modeller samt algoritmdesign

Jag gillar de flesta av illustrationerna (dock inte riktigt alla) – dessa två är jag extra förtjust i. Det handlar om hur de fångat koncepten, känslan i bilden och beskrivningarna av koncepten. Har även lyft in delar av dessa beskrivningar nedan.

Bild från ctillustrated.com – "Using abstractions and models"

Bild från ctillustrated.com – ”Using abstractions and models”

Från beskrivningen av illustrationen för att använda abstraktioner och modeller:

In a complex system, we might use many different models and make them work together. We might not even care if one part of the system was switched out for something else that can accomplish the same goal. We could say we’ve abstracted that part of the system. Carefully selecting the qualities we care about and ignoring the rest of the details is the key to abstraction. When we deliberately separate our system into parts that can be individually understood, tested, reused, and substituted, then we are creating new abstractions.

 

Bild från ctillustrated.com – Algorithm design

Bild från ctillustrated.com – ”Algorithm design”

Från beskrivningen av illustrationen för algoritmdesign:

Sometimes we think of algorithms as being written down like a computer program, but an algorithm is more like an idea. The same algorithm can be written in many different computer languages. It’s the steps in the process that make an algorithm what it is.

In order to design an algorithm, or a dance, you need to understand your goal. You also need to understand the constraints of the system. Humans only have two feet, so a dance designed for humans has to work with that limitation. Computational systems have different kinds of limitations, such as the speed of the processors or the size of the memory or the amount of electricity they consume. Designing an algorithm that accomplishes specific goal within the constraints of the system is like creating an elegant dance that everyone else wants to learn.

Bakgrund till Computational Thinking Illustrated

Många har nog läst ”Så funkar det”-böckerna eller liknande när de var små, så även jag. Det är denna typen av illustrationer som de som skapat bilderna är ute efter, enligt denna korta bakgrundsbeskrivning. Det man utgick från för illustrationerna var de principer som är centrala för den nya amerikanska Advanced Placement-kursen CS Principles (som alltså är på gymnasienivå och även om den är tänkt att bredda rekrytering till datavetenskap så är den inte en kurs som alla kommer att gå) . Denna kurs är börjar ges 2016-2017, efter att ha gått på försök utan slutprov (se översikt över kursinnehåll).

Projektet startades genom en Kickstarter-kampanj 2011.

För övrigt, en av de som startade Computational Thinking Illustrated, Ben Chun, startade även ilearnedtoprogram.com, som jag tidigare skrivit om.

Ett första inlägg om datalogiskt tänkande

Innan #blogg24 (dvs blogga varje dag 1 till 24 december) började, dvs precis innan jag startade denna blogg, gjorde jag en lista med möjliga blogginlägg, för att se att jag skulle ha en sportslig chans att faktiskt producera tillräckligt många inlägg. Nu har det visat sig att själva skrivandet i sig har gett upphov till en hel del nya idéer, och att jag haft mindre tid att skriva än jag tänkt, men jag har trots allt utgått en hel del från den listan.

En av de första sakerna som jag skrev ner var ”computational thinking”, vilket jag tycker bäst översätts till datalogiskt tänkande (även om jag tror att termen kan vara avskräckande). Denna term är också den jag oftast ser och ger en del google-träffar. Har nu tänkt ta mig tid att skriva detta inlägg – för jag tänker mig att det skulle ta mer tid än de andra inläggen – i nästan tre veckor. Det blir aldrig att jag har denna längre mängd tid som jag tänker mig att jag behöver. Så jag får börja med ett inlägg idag, och bygga vidare på senare.

Vad ingår i datalogiskt tänkande

Termen computational thinking fick ett bredare genomslag genom Jeanette Wings artikel med samma namn. Den argumenterar för att dessa förmågor är användbara utanför datavetenskapen och dels exemplifierar vad det är. Till exempel handlar det konceptuell förmåga, det är mer än att ”bara” programmera. Det kompletterar och kombinerar matematiska och ingenjörsmässiga kompetenser. Artikeln är från 2006 och sedan dess har det kommit en del förslag på vilka förmågor som ingår i begreppet.

Google har en del resurser kring datalogiskt tänkande, där de tar upp följande problemlösningsförmågor som delar av begreppet:

  • Att bryta ner ett problem i mindre delar (decomposition)
  • Mönsterigenkänning (pattern recognition)
  • Mönstergeneralisering och abstraktioner (Pattern Generalization and Abstraction)
  • Algoritmdesign

Jag tycker inte att de förmågor som Google tar upp täcker allt jag skulle vilja se som en del av begreppet. Den definition som jag gillar bäst hittills är från International Society for Technology in Education och Computer Science Teachers Association, som föreslår att datalogiskt tänkande är problemlösningsprocesser som utmärks av (men inte begränsas till):

  • Formulera problem som gör att datorer och andra verktyg kan hjälpa oss lösa dem
  • Logiskt organisera och analysera data
  • Representera data genom abstraktioner som modeller och simuleringar
  • Automatisera lösningar genom algoritmiskt tänkande
  • Identifiera, analysera och implementera möjliga lösningar med målet att få den mest effektiva kombinationen av steg och resurser
  • Generalisera och överföra dessa processer till en variation av problem

De kopplar även detta till ett antal attityder, vilket jag tycker är en viktig del:

  • Trygghet inför att hantera komplexitet
  • Uthållighet inför svåra problem
  • Tolerans för tvetydighet
  • Förmåga att hantera öppna problem
  • Förmågan att kommunicera och samarbeta för att uppnå gemensamma mål och lösningar

Till slut, två bilder över vad som ingår i datalogiskt tänkande, som överlappar med det som listats ovan, men också tillför och förenklar, från Barefoot Computing och Somerset.

Några fler lästips

Computer Science Teachers Association har en sida med resurser kring datalogiskt tänkande, bland annat denna PDF som kopplar de olika förmågorna till olika ämnen och årskurser. International Society for Technology in Education har också en sida med resurser.

Datalogiskt tänkande = Data + Logik + Tänkande av Fredrik Heintz, Linköpings universitet, som har ett intressant projekt om datalogiskt tänkande.

Presentation om datalogiskt tänkande och skaparkultur i skolan av Peter Parnes, Luleå tekniska universitet, som bland annat kört workshopserie om CS4HS i Luleå och som också har ett intressant projekt om datalogiskt tänkande och maker-kultur i skolan.

Det får vara allt för denna gång, men mer finns att hämta i min Evernote.

Att illustrera algoritmer med dans

Att delta i #blogg24, dvs skriva ett inlägg fram till julafton, har inte underlättats av det myckna VAB:andet de senaste två veckorna. Så när jag sitter och funderar på vad jag kan göra för lätt inlägg en trött fredagkväll som denna, så kommer jag att tänka på de fina filmerna som använder folkdans för att illustrera olika sorteringsalgoritmer.

Bubbelsortering som dans

Bubbelsortering är en av de enklare sorteringsalgoritmerna att förstå, men den är inte så effektiv. I den här ”dansillustrationen” finns det lite extra information för att kommunicera själva sorteringen: dels dansarnas nummer, som ska vara i rätt ordning när de är färdiga, dels vilken plats i en array (eller fält som man ibland säger på svenska) som dansaren representerar. Den här algoritmen funkar så att man gör parvisa jämförelser mellan (i detta fallet) dansarnas nummer – om dansaren till vänster har ett högre tal byter de plats. Om dansarnas nummer inte är i rätt ordning när man kommit till dansaren längst till höger börjar man om med parvisa jämförelser från vänster igen. Det tar nästan en minut innan dansarna kommer till själva sorteringen.

Algoritmiskt tänkande – en del av datalogiskt tänkande

Att automatisera lösningar genom att tänka algoritmiskt är en beståndsdel av datalogiskt tänkande (computational thinking). Detta vore ett bra tillfälle att skriva lite mer om algoritmer, men det får vänta till en annan gång.

Förutom att algoritmiskt tänkande är bra för problemlösning så är den även viktig för att förstå vår omvärld. En känd algoritm är Googles PageRank (även om denna numer bara är en av många faktorer som används för att avgöra vilka sökträffar som visas), ett annat är Facebooks EdgeRank och dess efterföljare – båda har en central roll i vilken information vi får ta del av.