• No results found

Att underlätta förståelsen för minneshantering, programmeringsspråket Q

N/A
N/A
Protected

Academic year: 2021

Share "Att underlätta förståelsen för minneshantering, programmeringsspråket Q"

Copied!
51
0
0

Loading.... (view fulltext now)

Full text

(1)

Teknik och samhälle Datavetenskap Examensarbete 15 högskolepoäng, grundnivå

Att underlätta förståelsen för

minneshantering

To facilitate the understanding of memory management

Examen: Kandidatexamen 180 HP Huvudämne: datavetenskap Program: Systemutvecklare

Datum för slutseminarium: 2017–05–30

Handledare: Jeanette Eriksson Examinator: Åse Jevinger

Programmeringsspråket Q

(2)

Sammanfattning

Andelen avhopp från de datavetenskapliga utbildningarna är högre i jämförelse med genomsnittet, detta är problematiskt då efterfrågan på personal med datavetenskaplig utbildning ökar i takt med digitaliseringen av samhället. Det har bedrivits mycket forskning om varför studenter väljer att lämna de datavetenskapliga programmen, samt vilka hinder de upplever som störst under utbildningen, av forskning framgår att studenter upplever att den investerade tiden inte motsvarar den förväntade mängden inhämtad kunskap och att utbildningarna är för svåra. Forskare fastslår att första året på utbildningen är den mest kritiska perioden och att det är i denna period extra resurser behöver investeras. Vidare beskriver de förståelsen för pekare, array, referenser, funktionsargument m.m. som de primära svårigheterna. Problemet med forskningen är att den inte specificerar problemen på en nivå där det är möjligt att åtgärda dem, därför är syftet med detta examensarbete att försöka fastställa problemen på en nivå där det är möjligt att åtgärda dem och sedan försöka skapa förslag på åtgärder. Detta uppnås genom att med hjälp av en litteraturstudie fastställa de övergripande problemområdena , vilka sedan specificeras och undersöks genom intervjuer. Informationen ifrån litteraturstudien samt intervjuerna analyseras och används vid skapandet av ett programmeringsspråk (programmeringsspråket Q). Programmeringsspråket Q innehåller en uppsättning med förslag på åtgärder, men det är viktigt att betona att det finns fler sätt att komma till rätta med problemen. Programmeringsspråkets pedagogiska ansats utvärderas sedan via en pilotstudie som indikerar att programmeringsspråkets design och den pedagogiska ansatsen ökar användarnas förståelse för minneshantering.

Uppsatsen ger lärare en inblick i studenternas svårigheter med minneshantering och ger förslag på hur specifika problem kan förklaras för att det ska bli enklare för studenterna att förstå dem. Programmeringsspråket Q är inte ett programmeringsspråk som sk a konkurrera med programmeringsspråk så som C, C++, C# och Java m.m. Ändamålet med Q är att det ska användas i undervisningssyfte och då användas av lärare som ett diskussionsunderlag eller av studenter för att praktiskt testa samt undersöka minneshantering. Genom möjligheten till att praktiskt använda Q kan studenter testa sin förståelse för minneshantering och få visuell återkoppling.

Uppsatsen betonar behovet av att fokusera på minneshantering vid undervisning då detta utgör ett stort problem som hindrar studenterna från att tillgodogöra sig utbildningsmaterialet. Därför bör minneshantering utgöra en stor del av grundutbildningen och inte som i tidigare föreslagna lösningar där minneshanteringen endast har varit en bieffekt av åtgärderna mot andra svårigheter.

Nyckelord: programmeringsspråk, design, förtydliga minneshantering, transparant minneshantering, pedagogik, programmeringsspråket Q

(3)

Abstract

The percentage of dropouts from the computer science courses is higher in comparison to the average, this is problematic as demand for staff with computer science education is increasing as the digitization of society. There has been much research into why students choose to leave the computer science programs and the barriers they percei ve as the greatest in education. Research shows that students feel that the time invested does not correspond to the expected acquired knowledge and the training courses are too difficult. Researchers state that the first year of training is the most critical period and that it is in this period, additional resources n eed to be invested. Furthermore is the understanding of pointers, arrays, refere nces, function arguments etc. the primary problems. The problem with the current research is that it does not specify the problems at a level where it is possible to fix them, therefore is the purpose of this essay to try to specify the problems at a level where it is possible to fix them and then create suggestions. This is accomplished by establishing, through a literature study, the overall problem areas, which are then specified and examined through interviews. The information from the literature study and the interviews is analysed and used in the creation of a programming language (programming language Q). It is important to emphasize that the programming language Q contains a set of suggested actions, but there are more ways to fix the problems. The educational language of the programming language is then evaluated via a pilot study that indicates that the programming language and the educational approach increase users' understanding of memory management.

The paper gives teachers an insight into students' difficulties with memory management, and gives suggestions on how specific problems can be explained to make it easier for students to understand them. The purpose of Q is not to compete with programming languages such as C, C ++ and Java, etc. The purpose of Q is to be used in education as a basis for discussion at teaching and to be used by students to practical test and examine memory. Further can students use Q to test their understanding of memory and get visual feedback.

The paper stresses the need to focus on memory management in education, as this is a major problem that prevents students from assimilating the training material. Therefore should memory management constitute a large portion in the basic education and not as in the previously proposed solutions where memory management only has been a side effect of the measures on other difficulties.

Keywords: programming language, design, clarifying memory management, transparency

(4)

Förord

Denna uppsats är mitt examensarbete på Systemutvecklingsprogrammet vid Malmö högskola. Arbetet har genomförts av Johan Fredriksson, under vårterminenen 2017. Examensarbetet ger 15 högskolepoäng.

Tack till

Under arbetets gång har jag haft mycket stöd från Olle Lindeberg och Jeanette Eriksson. Jag vill tacka dem för alla intressanta diskussioner, deras stora tålamod och all hjälp jag har fått under processen.

(5)

Innehållsförteckning

1 Inledning ... 1

1.1 Bakgrund ... 1

1.2 Syfte och målgrupp ... 2

1.3 Avgränsningar ... 2 1.4 Forskningsfrågor ... 3 RQ 1 ... 3 RQ 2: ... 3 2 Metod ... 3 2.1 Litteraturstudie ... 4 2.2 Frågeformulär ... 4 2.3 Intervjuer... 4 2.4 Design av programmeringsspråket Q ... 6 2.5 Pilotstudie ... 6 3 Resultat ... 7 3.1 Litteraturstudie ... 7 3.2 Frågeformulär ... 10 3.3 Intervjuer... 13 3.3.1 Utfall ... 13 3.3.2 Sammanfattning... 16 3.4 Design av programmeringsspråket Q ... 18 3.4.1 Språkets uppbyggnad ... 19 3.4.2 Design resonemang ... 21 3.5 Pilotstudie ... 24 3.5.1 Minnessektioner ... 25 3.5.2 Alias ... 26 3.5.3 Datatyper ... 26 3.5.4 Funktioner ... 26 3.5.5 Struct ... 26 3.5.6 Iterationer ... 27 3.5.7 Rekursion ... 27 3.5.8 Pekare ... 28

4 Sammanfattning och avslutande diskussion... 28

(6)

6 Slutsats ... 32

7 Framtida arbete ... 33

8 Källförteckning... 34

Bilaga 1 Frågeformulär intervju ... 36

Bilaga 2 Manual programmeringsspråket Q ... 39

2.1 Nyckelord ... 39 2.2 Main ... 39 2.3 Allokera minne ... 39 2.4 Global ... 39 2.5 Stack ... 40 2.6 Inkludera fil... 40 2.7 Kommentarer ... 40 2.8 Alias... 41 2.9 Operatorer ... 41 2.9.1 Jämförelser ... 41 2.9.2 Logisk ... 42 2.9.3 Minnes adress ... 42 2.9.4 Tilldelning ... 42 2.10 Skriva ut till skärm ... 42

2.11 Åtkomst till det Globala minnet ... 43

2.12 Exempel Jämförelser ... 43 2.13 Loopar ... 43 2.14 Struct ... 43 2.15 Subroutine ... 44 2.16 Begränsningar... 44 2.17 Kom patibilitet... 44 2.18 Övrigt... 44

(7)

Tabellförteckning

Tabell 1, Designimplikationer……… 15

Figurförteckning

Figur 1, Arbetsprocess……… 3 Figur 2, Minneslayout………. 24

(8)

1

1 Inledning

Kapitlet beskriver bakgrunden till uppsatsen och vad den ämnar undersöka.

1.1 Bakgrund

Övergången till det digitala samhället har medfört en ökad efterfrågan på personer med datavetenskaplig kompetens, till exempel i USA arbetar över hälften av alla ingenjörer med IT verksamhet [15]. Den stora efterfrågan på personer med datavetenskaplig kompetens har medfört att antalet platser på högskoleprogram med datavetenskaplig inriktning har ökat [15]. En Norsk studie gjord av Giannakos med kollegor [16] visar att 30 – 40 % av studenterna på de datavetenskapliga programmen slutar under de två första åren . I Sverige på Malmö högskola är 38% (referens Olle Lindeberg vice prefekt på Malmö Högskola) av de antagna kvar till sista terminen, det är en betydligt lägre andel i jämförelse med andra inriktningar.

År 2016 genomförde Giannakos med kollegor [16] en studie med 241 studenter som undersökte varför många studenter avbröt sina datavetenskapliga studier. Forskarna kom fram till att studenterna upple vde att den investerade tiden inte motsvarade den förväntade mängden inhämtad kunskap, vidare var kunskapskraven för den första terminen höga och skapade stor arbetsbelastning. De menar att eftersom andelen avhopp är högst i början på de datavetenskapliga utbildningarna hade ökade resurser och fokus på grundläggande kunskaper minskat mängden avhopp avsevärt. Vidare beskriver de vikten av att investerad tid behöver motsvara den förväntade mängden inhämtad kunskap, och att detta kan uppnås genom mindre enklare övningar som är relaterade till grundläggande programmeringskoncept, vilka ska resultera i bättre självförtroende, ökat intresse för datavetenskap och öka möjligheten att studenterna slutför den datavetenskapliga utbildningen. Olika forskare anser att studenternas begränsade programmeringskunskaper utgör ett hinder för att kunna tillgodogöra sig de teoretiska kunskaperna. De anser att huvuddelen av resurserna bör fokuseras på att förbättra grundläggande programmeringskunskaper tidigt i utbildningen och att det är avgörande för om studenterna kommer avsluta utbildningen eller lämna den. Forskarna anser att det är fördelaktigt om studenterna kan studera teorierna först och sedan testa sin förståelse för dem med hjälp av programmering. I de fall de har missförstått något kan de upprepa processen, på detta viset får de sin förståelse för teorin bekräftad [16 - 20].

Lahtinen med kollegor [2] publicerade år 2005 en internationell studie som syftade till att fastställa svårigheterna för nybörjare inom programmering. I studien medverkade 559 studenter och 34 lärare, fördelningen av deltagarnas primära språk var följande: 73.4% C++, 17.3% Java, 9.3%, Pascal 2.9% samt 4.8% övriga språk. Deltagarna fick svara på en enkät om vilka olika koncept de anser vara svåra, över 90% av deltagarna angav att de hade svårigheter med att förstå pekare, array, referenser, klasser, struct och funktionsparametrar. Studien fastställde att minneshantering är ett problem för nybörjare inom programmering och får stöd av flera andra forskare som likt Lahtinen och hans kollegor framhåller minneshanteringen som det främsta problemet för nybörjare inom programmering. Precis som Lahtinen och hans kollegor betonar flera andra forskare förståelsen för pekare, arrays, referenser, funktionsargument och minnesrelaterade abstraktioner som de primära svårigheterna [1 - 9].

Samtliga tidigare nämnda koncept inkluderas i kategorin grundläggande förståelse för programmering och uteblivna kunskaper medför att det blir svårt att förstå programmering och att tillämpa det. I flera av de moderna programmeringsspråken är det inte nödvändigt för användaren att vara medveten om minneshanteringen eller minnesstrukturerna eftersom samtliga beslut utförs i underliggande strukturer. Detta leder till minskad benägenhet att avsätta

(9)

2 tid till att försöka förstå minneshantering, vilket i förlängningen innebär minskad förståelse för programmering.

Ingen av studierna specificerar problemen på en nivå där det är möjligt att avhjälpa dem. Uppsatsen avser att närmare undersöka problemen med att förstå minneshantering och avser att specificera problemen på en nivå där det är möjligt att åtgärda dem. I ett försök att uppnå detta ska en litteraturstudie genomföras, följt av intervjuer med nybörjare inom programmering. Materialet ska sedan analyseras och användas vid designen av ett programmeringsspråk som avser att underlätta förståelsen för minneshantering [1 - 9]. Det egendesignade programmeringsspråket ska sedan utvärderas med hjälp av en pilotstudie som avser att undersöka om det egendesignade programmeringsspråket underlättar förståelsen för minneshantering.

1.2 Syfte och målgrupp

Examensarbetet undersöker och analyserar varför nybörjare inom programmering har svårigheter med att förstå minneshantering. Undersökningen baseras på de problemområden inom minneshantering som tidigare forskning har framhållit som de primära, till exempel: array, pekare, referenser och funktionsargument [1 - 9]. För att underlätta för nybörjare inom programmering som har svårigheter med att förstå minneshanteringen ska ett programmeringsspråk designas, vilket är tänkt att användas i pedagogiskt syfte. Det har som mål att förtydliga specifika koncept för användarna och beskriva koncepten på en nivå där de t är möjligt att förstå dem. Vidare är målet att det egendesignade programmeringsspråket ska komma att användas som ett diskussionsunderlag i undervisning för att hjälpa till med att öka förståelsen för minneshantering. Förhoppningen är att en ökad förståelse för minneshantering ska generera en stabil och bred kunskapsgrund inom datavetenskapen som gör att det blir enklare för nybörjare att lära sig att programmera. Detta kommer förhoppningsvis underlätta för studenterna och i förlängningen kommer det förhoppningsvis minska andelen avhopp från de datavetenskapliga utbildningarna.

Den refererade forskningen har ett tidsintervall mellan åren 1989 och 2015, i samtlig forskning är minneshanteringen beskriven som ett problem. Detta tyder på att det är ett problem som har existerat under en längre tid och som inte har en entydig lösning [1 - 9].

1.3 Avgränsningar

Eftersom minneshantering är det främsta problemet för nybörjare inom programmering kommer examensarbetet fokusera på minnesrelaterade koncept. Vidare kommer e xamensarbetet undersöka nybörjares uppfattning av olika koncept inom minneshantering, till exempel: referenser, pekare, array, Stack, pass by value och pass by reference m.m. Förståelse för hårdvara, olika processor arkitekturer samt samspelet mellan hårddisk, cachminne och RAM-minne är utanför uppsatsens omfattning.

Uppsatsen är begränsad till att använda undersökningsmetoder som vägleder språkdesignen för att komma fram till den pedagogiska ansatsen. Det kommer genomföras en kvalitativ pilotstudie för att utvärdera om den pedagogiska ansatsen underlättar förståelsen för minneshantering. Vidare ska resultatet ifrån pilotstudien beskriva om det är meningsfullt att bedriva vidare forskning baserat på innehållet i uppsatsen. Pilotstudien kommer även reflektera över programmeringsspråket Q användningsområden samt hur det bör användas för att vara effektivt. Detta inkluderar vidare rekommendationer om hur språket och den pedagogiska ansatsen bör testas för att resultera i givande information. Informationen kan sedan användas för att förbättra språket samt den pedagogiska ansatsen. Pilotstudien kommer inte vara tillräcklig för att fastställa om programmeringsspråket Q och dess pedagogiska ansats

(10)

3 underlättar förståelsen för minneshantering, men studien kommer beskriva om det är meningsfullt att genomföra ytterligare testning.

1.4 Forskningsfrågor

RQ 1: Vilka svårigheter har studenter och nybörjare inom programmering med att förstå

minneshantering?

RQ 2:

Hur kan ett programmeringsspråk som underlättar förståelsen för minnesha ntering designas?

2 Metod

Kapitlet beskriver vilka metoder som ligger till grund för informationsinsamlingen och motiverar varför dessa metoder är fördelaktiga. Nedan visas ett diagram som beskriver arbetsprocessen.

(11)

4

2.1 Litteraturstudie

Litteraturstudien utgör grunden för examensarbetet och är den grundläggande kunskapskällan. Genom litteraturstudien undersöks om minneshantering är ett problem för nybörjare inom programmering, samt avgränsar vilka områden som uppsatsen avhandlar. Examensarbetets frågeställning är baserad på tidigare forskning som har undersökts i litteraturstudien. Med hjälp av litteraturstudien har hinder identifierats och detta har legat till grund för utformningen av frågeformuläret som användes under intervjuerna. Det är viktigt att påpeka att behovet av att komplettera litteraturstudien med intervjuer är enbart på grund av att tidigare forskning inte ansågs tillräcklig för att besvara forskningsfrågorna (se kapitel 1.4). Intervjuerna användes för att kunna utföra en djupare analys av de problemområden som påvisades i litteraturstudien och därigenom möjliggöra ett besvarande av forskningsfrågorna (se kapitel 1.4).

För att hitta litteratur till studien har Malmö Högskolas databas Libsearch använts samt google scholar. Genom Libsearch har artiklar, tidskrifter, avhandlingar m.m. från ACM och I EEE hämtats. Exempel på sökord som har använts vid sökning i databaserna är följande: teaching, Garbage collection, memory, learning, pedagogy, programming, education, psycological, stress, dropout, studies, computer science, Rubber ducking, novice, C, C++, Assembly, Java, CSharp, Php, Javascript, Lisp, NASM, MASM, objective.

2.2 Frågeformulär

Frågorna i frågeformuläret är baserade på informationen ifrån litteraturstudien (kapitel 2.1). För att försöka skapa sig en uppfattning om vad skillnaden är mellan programmeringskoncept som deltagarna anser är enkla respektive svåra att förstå, ingår det i intervjun (se Bilaga 1, fråga 3a) att deltagarna förklarar och beskriver skillnaderna mellan programmeringskoncept som de anser är enkla respektive svåra. Det är viktigt att försöka förstå skillnaden mellan de programmeringskoncept som uppfattas som enkla och de som uppfattas som svåra, eftersom detta inverkar på designprocessen av ett nytt språk. För att kunna skapa ett språk som underlättar förståelsen för minneshantering, är det viktigt att fastställa vad det är som gör koncept enkla att förstå och vad det är som gör dem svåra att förstå.

Enligt flera olika forskare tenderar studenter till att överskatta sin egen kunskapsnivå, vilket sänker deras motivation till att inhämta ny kunskap och medverkar till att de har svårigheter med att tillgodogöra sig kunskaperna i utbildningarna [1 - 3]. Därför anses det viktigt att utvärdera om deltagarnas faktiska kunskaper motsvarar den egna uppfattningen.

Eftersom flera olika forskare [1 - 9] anser att nybörjare inom programmering har svårigheter med att förstå pekare, arrays, referenser samt funktionsargument, ingick dessa koncept i nästan samtliga frågor i frågeformuläret (se Bilaga 1). Flera olika forskare [1 - 3] anser att det är skillnad mellan förståelse för teori och att praktiskt använda teorin, därför ombads testdeltagarna beskriva koncepten i teorin och därefter förklara kodexempel där tidigare beskrivna teorier användes. För att det ska vara möjligt att designa ett programmeringsspråk som hjälper användarna att förstå minneshantering är det vi ktigt att försöka förstå testdeltagarnas resonemang för de minnesrelaterade koncepten. Därför är det till exempel intressant att fråga dem vilken deras syn är på pekare och referenser samt vad de anser är skillnaden mellan dem. Genom att lyssna på testdeltagaras resonemang är det möjligt att förstå deras åsikter och bakomliggande motiveringar.

2.3 Intervjuer

I litteraturstudien (se kapitel 2.1) framgick det att tidigare forskning inte är tillräcklig för att kunna besvara forskningsfråga RQ1 i frågeställningen (se kapitel 1.4, RQ1), därför ansågs det nödvändigt att utöka med fler undersökningsmetoder. Valet att använda intervjuer framför andra

(12)

5 undersökningsmetoder är baserat på att intervjuerna ger möjligheten till att diskutera svårigheterna ifrån flera olika infallsvinklar, vilket ofta saknades i tidigare studier som valde enkät som undersökningsmetod, förhoppningen var att detta skulle underlätta arbetet med att specificera problemen på en nivå där det blev möjligt att försöka åtgärda dem. Syftet med att inkludera intervjuer som undersökningsmetod var för att inhämta information som kunde användas vid designen av programmeringsspråket Q och dess pedagogiska ansats.

Olika forskare beskriver den stora kunskapsskillnaden mellan olika studenter på samma utbildning som ett problem vid utvärderingen av den insamlade informationen. Genom att intervjua nybörjare inom programmering enskilt är det möjligt att anpassa komplexiteten av frågorna efter individens kunskaper inom ett specifikt område. Detta gör att det blir lättare att utvärdera specifika fall och ökar mängden användbar insamlad information. Ett exempel är om någon av deltagarna i intervjun inte vet skillnaden mellan pekare och referenser, eftersom det är en intervju blir det möjligt att omformulera frågorna och i stället diskutera deras syn på att lagra samt hämta information i minnet. Hade undersökningsmetoden varit enkät hade det inte varit möjligt att omformulera frågorna efter deltagarnas kunskapsnivå, vilket troligtvis hade resulterat i väldigt lite användbar information som dessutom hade behövt tolkas [2, 4, 8].

Utformningen av frågeformuläret (se Bilaga 1) som användes under intervjuerna baserades på de problemområden som identifierades under litteraturstudien (se kapitel 2.1). Frågorna syftade till att undersöka specifika svårigheter och utvärdera vilka svårigheter studenter och nybörjare inom programmering har med att förstå minneshantering (se kapitel 1.4, RQ 1).

För att kvalificera sig till att delta i intervjuerna, krävdes att personerna inte hade djupgående kunskaper inom minneshantering och att de var ytligt bekanta med C eller C++. De skulle vara bekanta med följande konce pt i C eller C++ pekare, array, referenser, pass by value, pass by reference och klass/struct. I intervjuerna deltog åtta personer som var i åldrarna 20 till 26 år, en av personerna var kvinna och resterande sju var män. Gemensamt för samtliga deltagare i intervjuerna var att de studerade andra året på Spelutvecklingsprogrammet på Malmö högskola . Genom studier hade de cirka ett års erfarenhet av programmering i C# och några veckors erfarenhet av programmering i C++, samt hade de en begränsad erfarenhet ifrån programmeringsspråk med manuell minneshantering. Intervjuerna utfördes enskilt och inledes med att deltagarna informerades om intervjun, bland annat att intervjun inte var tidsbegränsad men beräknad tid vad cirka trettio minuter, att samtliga deltagare är anonyma, att deras resultat inte kommer påverka deras skolbetyg, att en sammanställning av intervjuerna kommer publiceras publikt, att de inte får diskutera frågorna och möjliga svar med andra personer eftersom det kan förvränga resultatet, att syftet med intervjun är att de ska förklara sin personliga syn på minneshantering. Därefter diskuterades frågorna ifrån frågeformuläret (Bilaga 1) med deltagarna i intervjun. Intervjuerna var semi strukturerade , eftersom det var nödvändigt att diskutera problemen och att anpassa intervjuerna efter deltagarnas personliga kunskapsnivå. De första två frågorna var av biografisk karaktär och resterande frågor utvärderade deltagarnas förståelse . Diskussionerna under intervjuerna noterades via ett textdokument för respektive deltagare.

Enligt Nilsen [21] rekommendationer finns det få fördelar med en större testgrupp än fem personer. Enligt Nilsen kommer en testgrupp om fem personer påvisa 85% av problemen, han förnekar inte att fler testdeltagare ökar mängden påkomna användbarhetsproblem, men hävdar att det inte är effektivt att inkludera fler än fem personer i en testgrupp. Kunskaperna i undersökningens testgrupp varierade kraftigt vilket ledde till att det var svårt att fastställa individernas uppfattningar om olika minnesrelaterade koncept. För att tydligare kunna tolka svarsresultaten och fastställa mönster utökades testgruppen till åtta personer. Vidare hävdar Nilsen [21] att det är bättre att använda en mindre testgrupp och sedan genomföra flera olika

(13)

6 tester på samma testgrupp. Därför bestod Intervjun av teoretiska frågor samt praktisk tillämpning i form av färdiga kodexempel som deltagarna skulle förklara.

2.4 Design av programmeringsspråket Q

Litteraturstudien (se kapitel 2.1) fastställde de övergripande problemen, vilka sedan specificerades i detalj med hjälp av intervjuerna (se kapitel 2.3). Genom att använda resultaten ifrån litteraturstudien och intervjuerna kunde ett programmeringsspråk designas (se kapitel 1.4, RQ 2), vilket är det programmeringsspråk som i uppsatsen benämnas som programmeringsspråket Q.

Utformningen av designen för programmeringsspråket Q bestämdes av de problem som hade framkommit under intervjuerna (se kapitel 2.3). Det undersöktes hur de uppdagade problemen kunde åtgärdas genom att anpassa designen. För att identifiera möjliga lösningar på problemen jämfördes hur olika programmeringsspråk hade valt att hantera de programmeringskoncept som användarna hade svårigheter med att förstå. Detta gjordes genom att studera och jämföra manualer för olika programmeringsspråk samt genom diskussioner med Olle Lindeberg (lärare i C++ på Malmö Högskola). Att förstå designen av andra programmeringsspråk ansågs som en viktig del då det blev möjligt att erhålla lärdom av deras designbeslut, kunskaperna kunde sedan användas för att fastställa lämpliga tillvägagångsätt för att försöka åtgärda de uppvisade problemen ifrån intervjuerna. Programmeringsspråket Q design är uppbyggd på en pedagogisk ansats, vilken skapades tillsammans med designen av Q och är inkluderad i programmeringsspråket Q. Skillnaden mellan programmeringsspråket Q och dess pedagogiska ansats är dess tillämpningsområde, språket är ämnat att användas för att utföra praktiska experiment och den pedagogiska ansatsen är ämnad att användas som ett diskussionsunderlag i undervisningssyfte. I praktiken innebär detta att lärare kan studera språket för att kunna återge den pedagogiska ansatsen för eleverna, eller att eleverna på egen hand utvecklar sin förståelse för minneshantering genom praktisk användning av programmeringsspråket Q. Det är viktigt att påpeka att det ena alternativet inte utesluter det andra, utan de kan med fördel kombineras.

2.5 Pilotstudie

Syftet med pilotstudien var att utvärdera programmeringsspråket Q pedagogiska ansats. Det är viktigt att påpeka att studien inte fastställer om programmeringsspråket Q pedagogiska ansats underlättar förståelse för minneshantering utan den är endast en indi kation om så är fallet. Resultatet ifrån studien ämnar avgöra om det är meningsfullt att bedriva vidare forskning baserat på innehållet i uppsatsen. Resultatet kommer även beskriva programmeringsspråket Q användningsområden samt hur språket och den pedagogiska ansatsen bör användas för att vara effektivt. Studien kommer även analysera programmeringsspråket Q användningsområden, samt hur språket bör användas för att vara effektivt. Detta inkluderar vidare rekommendationer om hur språket och den pedagogiska ansatsen bör testas av framtida forskning för att resultera i givande information. Informationen kan sedan användas för att förbättra språket samt den pedagogiska ansatsen.

Pilotstudien var kvalitativ och omfattade totalt fem personer, den pågick under cirka tre månader. Tre av personerna har varit aktiva under hela pilotstudien och två av deltagarna har varit aktiva under cirka två månader. Deltagarna i studien har inte utgjort en homogen grupp, utan det har varit stor skillnad mellan deltagarna. Skillnade rna utgörs bland annat av att deltagarna studerar på tre olika skolor i Sverige, två av dem studerar på samma utbildning samt har en av deltagarna nyligen avslutat sina studier på en fjärde skola. Samtliga deltagare är män, deras ålder varierar mellan 23 och 30 år. Gemensamt för samtliga deltagare är att de studerar eller har studerat på en universitetsutbildning med inriktning datavetenskap. Deltagarnas

(14)

7 investerade tid i programmering varierar kraftigt, likaså deltagarnas intresse för programmering. Anledningen till att fyra av deltagarna deltar vid privatundervisningen är för att de har svårigheter med de datavetenskapliga delarna av utbildningen. Den person som nyligen har avslutat sina studier anser att utbildningen inte bidrog med tillräckliga färdigheter för att kunna söka de jobb som han är intresserad av.

Pilotstudien har varit en del av privatundervisning inom programmering och undervisningen har varit individ anpassad. Eftersom minnehantering utgör en viktig del inom programmering har det inneburit att minnesrelaterade koncept har varit ett återkommande fenomen i studien och därigenom har det funnit ett behov av att använda programmeringsspråket Q pedagogiska ansats. Det är viktigt att framhålla att när koncept och problem har förklarats har infalls vinkeln varit ifrån ett minnesperspektiv, vilket har möjliggjort utvärderingen av programmeringsspråket Q som ett diskussionsunderlag vid undervisning.

Deltagarna i pilotstudien har varit personer som läser kurser inom programmering på olika universitet. Personerna har deltagit i undervisningen, eftersom de behöver hjälp med att lära sig programmering. Deras bakgrund har skilt sig, utbildningsnivåerna har varit olika samt har det funnits stora variation mellan vilka programmeringsspråk som de har haft erfarenhet ifrån. Deltagarnas svårigheter med de datavetenskapliga delarna i utbildningarna resulterade i att de befann sig under stor press. På grund av detta fanns det inte tillräckligt med utrymme för att introducera ytterligare ett programmeringsspråk för dem. Detta var den bakomliggande orsaken till valet av att använda programmeringsspråket Q som ett diskussionsunderlag i undervisningen. Genom att använda språket som ett diskussionsunderlag blev det enklare att anpassa undervisningsmaterialet efter de rådande förhållande na, och därigenom var förhoppningen att processen skulle effektiviseras.

Pilotstudien är en kvalitativ studie, där observationer och diskussioner har anpassats efter deltagarnas behov. Detta har inneburit att olika delar av diskussionsunderlaget har genomgått omfattande verifiering och andra delar har genomgått en mindre omfattande utvärdering. När lärare ska utarbeta ny undervisningsmetodik är det viktigt att de analyserar hur Q kan användas, det vill säga att de utarbetar metoder med hjälp av hur Q bemöter problemen samt att de fokuserar på de problem som Q framhåller som de primära. Efter samma principer tillämpades diskussionsunderlaget i pilotstudien. Skillnaden var att tillämpningen kunde individanpassas eftersom undervisningen var individuell, detta hade troligtvis inte varit möjligt på ett universitet. Målsättningen att försöka förklara de problematiska koncepten på en nivå där det var möjligt för deltagarna att förstå dem var fortfarande densamma.

Vidare kommer delar av den pedagogiska ansatsen finnas med i utbildningsmaterialet för introduktion till programmering under höstterm inen 2017 på Malmö högskola. Utbildningsmaterialet berör en större mängd studenter vilket kommer medföra möjligheter till att i genomföra en kvantitativ studie.

3 Resultat

3.1 Litteraturstudie

År 2015 genomförde Lahtinen med kollegor [2] en internationell studie som syftade till att fastställa svårigheterna för nybörjare inom programmering. I studien medverkade 559 studenter och 34 lärare, 73.4% av deltagarna hade C++ som sitt primära språk, 17.3% av deltagarna hade Java som sitt primära språk och övriga deltagare hade andra språk som sina primära. Deltagarna fick svara på en enkät om vilka olika koncept de ansåg var svåra, över 90% av deltagare angav

(15)

8 att de hade svårigheter med att förstå: pekare, array, referenser, klasser, struct och funktionsparametrar. Vidare innehöll enkäten frågor om olika tillvägagångsätt för att inhämta kunskap samt vilket läromaterial som underlättar inlärningen. Lärarna ansåg att programmeringsrelaterade koncept var ett större problem än vad studenterna ansåg. I Lahtinens studie framgick att studenterna föredrog att lära sig programmering genom att programmera på egna projekt, till skillnad mot lärarna som förespråkade skolrelaterade uppgifter för att förbättra programmeringskunskaperna. Vad detta beror på fastställs inte i Lahtinens studie, men det kan innebära flera saker, till exempel att kursmaterialet inte fokuserar på studenternas upplevda svårigheter, vilket skulle kunna bero på att studenterna inte förstår det fullständiga syftet med övningarna och därav är de inte motiverade att genomföra dem.

Lahtinen m.fl. [2] studie visar att minneshantering och bibliotek är svåra att förstå men att den största svårigheten för studenterna är att lära sig att applicera kunskape rna praktiskt. Studenterna och lärarna i studien var överens om att det bästa sättet att lära sig att programmera är genom praktisk tillämpning. Detta får stöd av Robins m.fl. [4] som menar att lärare ska fokusera mer på att kombinera teori med praktik för att förbättra inlärningsförmågan. Lahtinen med kollegor [2] beskriver att elever ofta överskattar sin egen förmåga och att de i nte inser problematiken, detta leder till att de nöjer sig med sin nuvarande kunskapsnivå i stället för att försöka inhämta mer kunskap i ämnet. Resultatet får stöd av Robins med kollegor [4] som har undersökt varför studenter har svårigheter med att tillämpa teoretiska kunskaper vid implementation. Deras slutsats är att när studenter genomför teoretiska prov visar resultaten på att de har god förståelse för minneshantering, men när studenterna ska praktisera den teoretiska kunskapen uppstår komplikationer. Robins och hans kollegor kan inte bevisa vad detta beror på, men deras hypotes är att resultaten från de teoretiska proven bevisar för studenterna att de har förstått teorin. När de sedan ska applicera kunskapen uppstår komplikationer, eftersom de bevisligen har förstått teorin förstår de inte varför problemen uppstår vid praktisk användning. Detta leder till bristande självförtroende, minskad motivation och att studenterna avbryter sina datavetenskapliga studier.

I Lahtinen och hans kollegors [2] studie fastställdes att det var svårast att förstå arrays, pekare, referenser samt parametrar i programmeringsspråket C++. Vidare beskrev de att det var svårast att förstå ett programs struktur i Java, men att förstå och använda bibliotek var enklast i Java. Att jämföra om minnesrelaterade koncept är enklare att förstå i Java till skillnad mot i C++ kan ses som tveksamt meningsfullt. I Java är pekare referenser och kan inte manipuleras på samma sätt som i C++ och de har inget tecken som förtydligar att de är pekare. När ett objekt i Java används som funktionsargument, görs detta alltid via en referens. Det är inte möjligt att avreferera objektet som det är i C++, men den bakomliggande minneshanteringen är alltid medveten om objektets minnesadress. I Java är Pekare till objekt immutable (kan inte ändras efter att de har blivit skapade), vilket innebär att när pekaren ska sättas till en ny position kommer ett nytt objekt skapas och det gamla objektet lämnas oförändrat. Detta innebär att det till exempel inte är möjligt att flytta pekaren till tredje elementet i en array som det är i C++. Till skillnad mot C++ körs Java genom en virtuell maskin, vilket har medfört att det har varit möjligt att anpassa minnessystemet för att vara effektivt vid användandet av den objektorienterade paradigmen. Detta reflekteras mot användaren som till exempel inte behöver bry sig om att det är långsammare att anropa virtuella funktioner (polymorfism) i jämförelse med ”vanliga” funktioner som det är i C++. Java har till skillnad mot C++ Garbage collection vilken bland annat frigör minnet för att undvika minnesläckage [14, 25, 26].

Författaren till den här uppsatsen anser att det i C++ krävs grundläggande kunskaper inom minneshantering för att kunna utföra grundläggande programmering, tillskilland mot i Java där kunskaper inom minneshantering endast krävs i få situationer vilka ofta är av mer avancerad

(16)

9 karaktär och kräver djupgående kunskaper. Detta innebär att svarsresultateten ifrån Lahtinen och hans kollegors [2] studie kan ifrågasättas, då flertalet av deltagarna hade låga förkunskaper om programmering, vilket troligviss innebar att de inte var medvetna om minneshanteringen och inte var kvalificerade att utvärdera sin egen faktiska kunskapsnivå inom minneshantering. Detta stödjer Lahtinen m.fl. och Robins m.fl. [4] slutsats om att studenternas egna uppfattning om sin kunskapsnivå oftast är högre i jämförelse med den faktiska kunskapsnivån. För att Lahtinen och hans kollegor ska kunna fastställa om det är enklare att förstå minneshanteringen i C++ i jämförelse med Java hade de behövt utvärdera respektive individs förståelse för minneshanteringen i C++ och i Java. Utvärderingen hade behövt vara baserad på intervjuer eller liknande där det är möjligt att fastställa den enskilda individens kunskaper om minneshantering i detalj.

I en studie gjord av Winslow [6] analyserades de psykologiska skillnaderna mellan nybörjare och erfarna programmerare. Studien betonade att oerfarna programmerare fokuserar på syntax och semantik vid problemlösning, till skillnad mot erfarna programmerare som relaterar till algoritmer. Det beskrivs att programmerare behöver ett utgångsspråk där de förstår de grundläggande strukturerna samt där de är bekväma med att tillämpa algoritmer och designmönster. De kan sedan relatera till detta språk när de ska lösa problem i andra programmeringsspråk. Tillgången till ett utgångsspråk är en avgörande faktor för inlärningstiden samt studenternas kognitiva utveckling. Winslow beskriver att det tar cirka tio år att bli en erfaren programmerare och att de t är den kognitiva utvecklingen som hindrar männi skor från att utvecklas snabbare.

Winslow [6] beskriver problemlösning som de n största svårigheten vid programmering och att det är avgörande för den individuella utvecklingen. Winslow delar upp problemlösning i fyra olika delar: förstå problemet, hitta e n lösning på problemet, översätt lösningen till ett programmeringsspråk (implementation) och testa lösningen. Winslow menar att nybörjare inom programmering ofta har svårigheter med problemlösningen eftersom de inte förstår problemet, vilket ofta leder till att de chansar på en lösning för att sedan testa om lösningen var korrekt, i de fall lösningen inte var korrekt upprepar de processen. På lång sikt har detta en negativ inverkan eftersom studenterna inte lär sig att analysera problemen och de vänjer sig vid att använda en felaktig modell när de angriper problemen. Detta leder till att deras problemlösningsförmåga och teoretiska kunskaper inom det datavetenskapliga ämnet minskar. Att inte lära sig att förstå problemen förlänger tidsperioden mellan att vara novis och erfaren programmerare. Winslow rekommenderar bland annat att nybörjare inom programmering ska: lära sig att skilja mellan relevant och icke relevant information, förstå vilken kunskap som krävs för att kunna lösa problemen och förbättra sin förmåga att dela upp problemen i flera mindre delproblem.

Linn och Dalbey [22] förespråkar att det bästa sättet att lära sig att programmera är genom att fokusera på ett programmeringsspråk och lära sig förstå detta. När användarna förstår ett programmeringsspråk kan de fortsätta och lära sig nästa programmeringsspråk . För varje språk ska användarna fokusera på språkets semantik och utgå från problem som kan lösas med befintlig kunskap. Svårighetsgraden på problemen ska ökas successivt för att utveckla individens problemlösningsförmåga. Linn och Dalbey rekommenderar att upptrappningen av svårighetsgraden på problemen inte är för stor, eftersom det kan resultera i en negativ utveckling för individen. Flera olika forskare beskriver vikten av att individen måste uppleva att de utvecklas när de investerar tid i programmeringen, annars kan det resultera i sämre självförtroende, minskat intresse för datavetenskap och minskade chanser att studenten slutför utbildningen [17 - 20].

(17)

10 Garagad med kollegor [7] beskriver att studenter har svårigheter med att förstå array, pekare, referenser, rekursion, flöde, funktionsargument, strukturer, syntax och att organisera koden i programmet. Författarna är lärare och beskriver sin syn på studenters svårigheter vid programmering. Deras erfarenhet är att det är lättare för studenter att förstå koncept relaterade till minneshantering i lågnivåspråk, som till exempel programmeringsspråket C. Vidare beskriver de att med minskade mängder abstraktioner blir det enklare för studenterna att förstå enskilda koncept och att högnivå bibliotek har en negativ inverkan på studenternas utveckling.

Garagad och hans kollegor [7] belyser att det är viktigt att svårighetsgraden ökas succesivt samt att problemen återkopplar till tidigare inlärda kunskaper. De beskriver den första tiden på utbildningen som den mest kritiska och de anser att det är viktigt att studenterna snabbt lär sig de grundläggande koncepten samt att bemöta grundläggande problem. Garagad med kollegor anser att detta uppnås genom att undervisa studenterna i hur de kan dela upp problemen i flera mindre delproblem, var de hittar informationen samt att lära dem att skilja på viktig och mindre viktig information. I de fall studenterna inte tillgodogör sig de grundläggande kunskaperna tidigt i utbildningen, eller inte lär sig att lösa problem på eget bevåg, kommer detta resultera i svårigheter längre fram i utbildningen. De beskriver att nya koncept byggs upp på gamla koncept, vilket kommer innebära att om brister finns i den grundläggande förståelse n kommer dessa resultera i stora svårigheter längre fram under studierna.

Garagad och hans kollegor [7] beskriver att det är viktigt att programmeringen är problembaserad eftersom många av studenterna misslyckas med de praktiska övningarna, då de inte förstår problemen och därav förstår de inte vad de förväntas utföra. Genom att basera uppgifterna på problem blir det tydligare och enklare för studenterna att förstå innebörden med uppgifterna.

Garagad och hans kollegor [7] baserar sin studie på en sammanställning av en aktivitetsbaserad undervisning för 1400 studenter. De anser att den aktivitetsbaserade undervisningen har förbättrar studenternas inlärningsförmåga och förståelse för de grundläggande koncepten. Vidare stimulerade den aktivitetsbaserade undervisningen studenternas kreativitet, analytiska förmåga och förmågan att angripa problem. I förlängningen har det inneburit att examinerade studenter har varit av högre kvalitet. Deras aktivitetsbaserade undervisning fokuserar på enskilda delmoment inom programmering och beskriver dem för användaren. Eftersom momenten inom programmering delas upp i fle ra delmoment blir det enklare för studenterna att tillgodogöra sig dem, till exempel är en av aktiviteterna att lära sig att felsöka sitt program och att förstå felmeddelandena. Garagad och hans kollegor föreslår en lösning där de inte beskriver hur deras lösning skall bidra till att minska eller eliminera problemen med dåligt förståelse för minneshantering, vilket gör att det blir svårt som läsare att analysera deras lösning. De beskriver minneshanteringen som ett stort problem för nybörjare inom programmering, men de beskriver inte konkret hur de ska försöka åtgärda problemen, till exempel i aktiviteten Debugging kan en förklaring av Stackoverflow (därigenom en förklaring av Stacken) ingå, men de beskriver aldrig att detta kommer utföras eller någon annan åtgärd som fokuserar på minneshantering. Vidare beskriver de att aktiviteten code optimization fokuserar på packning av information, effektivitet och minska storleken på programmet, detta kan involvera minneshantering (minnesrepresentation för Klass/struct), men problemet är att de aldrig ger några konkreta exempel på åtgärder för att minska studenternas svårigheter med att förstå minneshanteringen. Detta medför att det blir svårt att verifiera deras resultat.

3.2 Frågeformulär

Kapitlet beskriver och motiverar det frågeformulär (Bilaga 1) som användes under intervjuerna.

(18)

11

3.2.1 Stack

I programmeringsspråk som C [24] och C++ [14] skapas Stacken på Heapen och är en viktig minnessektion som används för att lagra funktioners retur värden, funktionsparametrar, lokala variabler i funktioner, objekt skapade på Stacken. Detta innebär att mycket information lagras på Stacken och om användarna saknar förståelse för Stacken uppstår komplikationer då de inte kan förstå var informationen lagras [10].

I moderna programmeringsspråk behöver inte användarna lägga till eller ta bort värden på Stacken manuellt utan detta görs av kompilatorn och runtime systemet, till exempel för funktionsargument [10].

Eftersom minneshanteringen för Stacken inte är transparant i programmeringsspråk som C [24] och C++ [14], innebär det att användarna inte kan se operationerna för Stacken. Enligt Deitel [10] kan detta medföra komplikationer då användare kan uppleva svårigheter med att förstå vilka operationer som utförs, när de utförs samt vilka minnesplatser som berörs.

För att utvärdera nybörjare inom programmerings förståelse för Stacken ska de i fråga fem (Bilaga 1, fråga 5) förklara innebörden av stackoverflow.

I fråga tio och elva (Bilaga 1, fråga 10 och 11) ska deltagarna ge en djupare förklaring av Stacken genom att förklara innebörden av funktionsargument, retur värde, lokala variabler samt innebörden med scope.

3.2.2 Funktionsargument

I fråga tio (Bilaga 1, fråga 10) ska testdeltagarna förklara funktionsargument (pass by value och pass by reference). Frågan undersöker testdeltagarnas förståelse för pekare, referenser, Stack och samspelet mellan dem. Det intressanta med fråga tio är deras förklaring av pekare som funktionsargument, eftersom de ingår i kategorin pass by value, vilket betyder att värdet inte kan ändras inne i funktionen. Pass by value innebär att en kopia av värdet lagras på Stacken, ändringar av värdet på Stacken har ingen inverkan på det värde som används som argument. Det som skiljer pekare mot referenser är att en adress lagras på Stacken och adressen refererar i sin tur till en minnesplats, som kan avrefereras för att möjliggöra ändringar på det lagrade värdet. Om man däremot använder pass by referens med ett argument så kommer detta argument bli alias för variabeln som angavs som aktuell parameter, även då kan man använda den lokala variabeln för att ändra på värdet utanför funktionen. I C++ använder sig kompilatorn och runtime systemet av en pekare för att implementera en referens. Denna likhet gör att användarna lätt blandar ihop hur pekare och pass by reference fungerar. Eftersom pass by value lagrar en kopia av värdet på Stacken och pass by reference lagrar en adress på Stacken till värdet på Heapen eller Stacken, är en rimlig hypotes för användare att pekare som funktionsargument är pass by reference [14].

Fråga tio (Bilaga 1, fråga 10) används för att kunna jämföra testdeltagarens förklaring av pekare och referenser med förklaringen av pekare samt referenser som funktionsargument ifrån fråga fyra (Bilaga 1, fråga 4). Eftersom funktionsargument kombinerar två koncept är det möjligt att detta skapar osäkerhet och förvirring. Det är möjligt att deras förklaringar av pekare och referenser är olika i de två fallen.

En av anledningarna till att det kan vara svårt att förstå skillnaden mellan variabler, pekare och referenser i C/C++ är att i den bakomliggande strukturen omvandlas referenser till pekare, skillnaden mellan dem är syntaxen. I de fall testdeltagarna inte är införstådda med den bakomliggande teorin kan det bli svårt att praktiskt tillämpa minneshanteringen [11, 14].

(19)

12

3.2.3 Minnesrepresentationer

Testdeltagarna ska försöka förklara minnesrepresentationen för en klass (Bilaga 1, fråga 6). För att kunna förstå var information lagras behövde deltagarna förstå vilken som kommer bli första minnesadressen, storleken på varje element samt storleken av en minnesplats. Syftet är att initiera en diskussion om vad som är skillnaden mellan pekare, arrays och variabler samt utvärdera om deltagarna har förstått att pekare är variabler, men att deras värde är en adress. Resultatet kommer vara avgörande vid designe n av det egna programmeringsspråket, då det kommer avgöra nivån på transparensen i minnet som krävs för att användarna ska kunna förstå koncept och flöde.

3.2.4 Automatisk respektive dynamisk minnesallokering

För att utvärdera förståelsen för automatisk respektive dynamisk minnesallokering ska testdeltagarna förklara skillnaden mellan dem samt när respektive bör tillämpas (Bilaga 1, fråga 8). Frågan ämnar utvärdera förståelsen för vad som lagras i de olika minnessektionerna. Detta inkluderar förståelsen för flera olika koncept, till exempel: const, static, new, delete mm, som avgör var informationen lagras, när minne allokeras och frigörs. Tillsammans med informationen ifrån fråga sex (Bilaga 1, fråga 6) skapas en förståelse för deras syn på vilken information som lagras i respektive minnessektion. Den insamlade informationen kan sedan användas vid designen av minnessektionerna och minnesrepresentationen i det egendesignade språket.

3.2.5 Flöde

Under den sista delen av intervjun ska testdeltagarna försöka förklara ett praktiskt kodexempel (Bilaga 1, fråga 11), syftet med frågan är att praktiskt använda minneshantering samt att kombinera flera koncept. Till skillnad mot tidigare frågor som utvärderade deltagarnas kunskaper för ett specifikt område utvärderade frågan deltagarnas förmåga att kombinera koncepten, detta inkluderade bland annat: iteration (do while loop), const, funktionsanrop, return, inkrementell och användandet av ’\0’ tecknet. Deltagarna hade tidigare beskrivit Stacken och funktionsparametrar men de hade inte kombinerat dem.

I kodexemplet (Bilaga 1 Frågeformulär intervju, fråga 11) har samtliga funktionsparametrar samma datatyp men en av dem är deklarerad som const. Att använda nyckelordet const innebär att värdet inte kommer ändras. I kodexemplet förflyttas en pekare som har blivit deklarerad med const, vilket kan uppfattas som missvisande då användarna kan tolka det som om värdet har ändrats, vilket är felaktigt.

I programmering kan nyckelordet const användas för att göra det tydligare för programmeraren att en variabel inte kan ändra sitt värde. Genom att använda const i kodexemplet blev det möjligt att utvärdera om testdeltagarna tyckte minneshanteringen blev tydligare när const användes. I kodexemplet (Bilaga 1 Frågeformulär intervju, fråga 11) används postfix inkrementering tillsammans med pekare, detta utvärderar testdeltagarnas förståelse för traversering över minnet, storleken av en minnesplats samt skillnaden mellan postfix och prefix. Stop villkoret i loopen är ett ’\0’ tecken som anger sista adressen, genom att de förklarar var stop tecknet är lagrat samt innebörden blir det enklare att förstå testdeltagarnas syn på hur och var informationen lagras i minnet. I slutet av funktionen returneras en inkrementerad pekare som pekar på sista minnesplatsen i en textsträng, genom att testdeltagarna förklarar var pekaren pekar på i relation till tidigare använt minne blir det enklare att förstå vad de anser utförs i minnet.

(20)

13

3.3 Intervjuer

Under intervjuerna framgick det att sex av de totalt åtta testdeltagarna hade stora svårigheter med att förstå minneshanteringen och att samtliga deltagares kunskapsnivå var av sådan karaktär att det skulle innebära svårigheter med att förstå minneshanteringen vid praktisk tillämpning. Det var stor skillnad i resultat mellan de testdeltagare som programmerade på fritiden och de som inte programmerade utanför skolan (Bilaga 1, fråga 2b och fråga 2c). Två av testdeltagarna hade privata programmeringsprojekt och det var de som hade bättre förståelse för minneshantering.

3.3.1 Utfall

3.3.1.1 Minnessektioner

Deltagarna saknade kunskaper om hur Stacken fungerar och när den används, detta bidrog i stor utsträckning till att de hade svårigheter med att förstå grundläggande funktionalitet, till exempel funktioner, Klasser (samtliga koncept som använder scope). Problemet med avsaknad kunskap om Stacken var återkommande under intervjuerna, likaså testdeltagarnas svårigheter med att dela upp uttrycken i flera mindre delar.

Under intervjuerna framgick att de t största hindret för att testdeltagarnas skulle kunna förstå minneshanteringen var svårigheterna med att dela upp uttryck i flera mindre sektioner, samt förståelsen för hur Stacken fungerar. Förmågan att dela upp uttryck i mindre sektioner har inget att göra med minneshanteringen, men då det hindrar testdeltagarna från att kunna läsa koden korrekt blir det svårt för dem att tillämpa sina kunskaper. Detta blir påtagligt i språk som C++, där Stacken är elementär och när deltagarna saknar förståelse hindrar det dem från att kunna förstå språkets uppbyggnad.

Testdeltagarna hade svårigheter med att avgöra vad som lagrades på Stacken och vad som lagrades på Heapen, de förknippade Heapen med nyckelordet new, i övrigt var de inte medvetna om skillnaden mellan Heap och Stack. Testdeltagarna var inte heller medvetna om att valet av minnessektion för innehållet i e tt objekt är beroende av i vilken minnessektion objektet skapades.

3.3.1.2 Pekare, Arrays och referenser

Samtliga testdeltagare tyckte det var enklare och tydligare att använda pekare samt referenser i C++ i jämförelse med C# (Bilaga 1, fråga 3). När kombinationen av C# och pekare samt referenser nämndes, förknippades de ofta med ord som förvirring och kaos. Deltagarna hade svårt att motivera varför det var enklare att förstå pekare och referenser i C++, men de nämnde att det var tydligare eftersom & operatorn användes för referenser och * operatorn användes för pekare. Vidare beskriver de minnesläckage i C++ som svåra att förstå och de framhåller att felmeddelandena från kompilatorn är svåra att tolka och förstå. Eftersom testdeltagarna inte förstod var eller varför minnesläckagen uppstod hade de stora svårigheter med att åtgärda dem, vilket skapade en uppgivenhet och påverkade testdeltagarnas motivation negativt.

Hälften av deltagarna använde ordet alias när de skulle förklara referenser och de var orubbliga i sin övertygelse om att referenser var alias. Testdeltagare som förklarade referenser med orde t alias hade en bättre förståelse för referenser.

Av testdeltagarna hade sex av åtta svårigheter med att beskriva skillnaden mellan pekare och referenser. I C [11] och C++ [14] existerar endast pekare som skillnader i syntaxen, i den bakomliggande strukturen omvandlas de till referenser. Testdeltagarna var inte medvetna om detta, vilket kan vara anledningen till det höga antalet som hade svårigheter med att förklara skillnaden mellan pekare och referenser samt när de bör tillämpas. Samtliga deltagare förklarade

(21)

14 pekare med hjälp av hur de tror arrays hanteras av kompilatorn , vilket är felaktigt då arrays i programmeringsspråket C++ kan liknas vid pekare [14]. I de fall testdeltagarna inte har kommit till insikten att arrays är pekare blir det inte heller möjligt för dem att analysera arrays i andra programmeringsspråk som till exempel C# och Java. I programmeringsspråket C [11] omvandlas arr[n] av kompilatorn till *(arr + n), [] operatorn representerar två steg, det första är (arr + n) och det andra är *arr. När testdeltagarna skulle förklara uttrycket arr[n] var en majoritet av dem av åsikten att arr är en samling med minne som är separerat från resten av minnet. Vidare förklarade de att + n innebär att de förflyttar sig n steg framåt i minnet. På frågan hur många steg detta hade varit om arr var av datatypen int eller char och i representerade siffran fem var det endast två deltagare som kunde förklara förflyttningen i mängden bytes. Ingen av testdeltagarna nämnde att [] operatorn även avrefererar pekaren. I en tidigare fråga ombads testdeltagarna att ge sin syn på vad det innebär att avreferera en pekare (Bilaga 1, fråga 9a), hälften av testdeltagarna kunde förklara vad det innebar, resterande hade inga hypoteser om vad det kunde innebära. Eftersom testdeltagarna förklarade pekare med hjälp av arrays blir det svårt för dem att förstå innebörden i de bakomliggande koncepten som tillsammans används med pekare och arrays.

3.3.1.3 Funktioner

Testdeltagarna hade svårigheter med att förstå de grundläggande begreppen pekare, referenser och Stacken, när begreppen sedan kombinerades uppstod problem. Brister i den grundläggande förståelsen medför svårigheter med att förstå flera av de grundläggande delarna i ett programmeringsspråk. Deltagarna var införstådda med att variabler som deklarerades inne i en funktionskropp var lokala och existerande endast i nuti funktionskroppen (scope). De var dock inte medvetna om att variablerna placerades på Stacken, samt vilka Stackoperationer som utfördes men de förstod att variablerna raderas från minnet vid slutet av funktionen. De ansåg att returvärdet inte var ett lokalt värde men de kunde inte förklara vad som hände med returvärdet när funktionen avslutades. Eftersom de i nte förstod innebörden av Stacken blev det svårt att förstå att funktionsargument placeras på Stacken.

3.3.1.3.1 Funktionsargument

Vid pass by value och pass by reference kombineras koncepten pekare, referenser och Stack . I de fall användarna inte förstår de enskilda koncepten kommer de inte kunna förstå en kombination av dessa, vilket gör det svårt för dem att förstå innebörden av funktionsargument. Sex av åtta deltagare kunde inte förklara funktionsargument (pass by value samt pass by reference). Resterande deltagare kunde förklara innebörden av begreppen pass by value samt pass by reference. De antog att pekare som funktionsargument var pass by reference, men när de skulle motivera sitt svar insåg de att beskrivningen inte matchade varken pass by value eller pass by referense.

3.3.1.4 Minnesrepresentationer

Under intervjun ombads testdeltagarna att förklara minnesrepresentationen för en Klass (Bilaga 1, fråga 6). En av deltagarna kunde förklara ordningen som medlemsvariablerna lagrades i, resterande deltagare kunde inte redogöra för ordningen. Vidare hade de ingen hypotes om vad det är som avgör i vilken ordning medlemsvariablerna lagras. Två av testdeltagarna kunde ange storleken på

int

variabeln

, int

pekaren och

int array.

De associerade pekare med nyckelordet new vilket i sin tur associerades med allokering av minne på Heapen, detta gjorde att de blev osäkra på var pekaren lagrades då den saknade new anrop.

I fråga sex (Bilaga 1, fråga 6) kunde hälften av deltagarna ange antalet statiskt allokerade element för arrayn, resterande blev osäkra på antalet element, detta berodde troligtvis på att de t blev för mycket obestämd information att processa. En av testdeltagarna hade en teori om att informationen kanske lagrades i följd antingen uppifrån och ner eller tvärtom. Sex av åtta

(22)

15 deltagare försökte förklara minnesrepresentationen genom att relatera till syntaxen för åtkomsten av medlemsvariabler i klasser. Ingen av testdeltagarna kunde förklara att minnesplatsen objektet refererade till är samma minnesplats som den första variabeln i klassen. Deltagaren som kunde ange ordningen för medlemsvariablerna var medveten om i vilken minnessektion objektet lagrades i. Deltagaren förstod att om ett objekt skapas i en funktion utan new operatorn lagras det på Stacken samt om det skapas med hjälp av new operatorn lagras det på Heapen. Deltagaren utgick ifrån att pekaren till objektet lagrades tillsammans med objektet på Heapen och inte att pekaren lagrades på Stacken och sedan refererade ti ll en minnesplats på Heapen. Varför deltagaren antog detta efter en korrekt förklaring av vad som lagras på Stacken respektive Heapen är oklart, det är möjligt att mängden information blev för stor eller att ett temporärt tankefel inträffade. Resterande de ltagare verkade inte vara medvetna om att valet av minnessektion som objektet skapades i, var avgörande för i vilken minnessektion innehållet för objektet lagrades. Resultatet beror troligtvis på att de inte hade funderat på detta tidigare , vilket bidrog till att de blev osäkra och mindre motiverade att försöka förklara. Flera av delarna i frågan hade deltagarna redogjort för tidigare men när de nu diskuterade koncepten på nytt verkade det som om kunskape rna var bortglömda. Hypotesen är att mängden information blev för stor för att testdeltagarna skulle kunna processera och utvärdera den. Precis som i flera andra exempel verkade testdeltagarna inte dela upp probleme n i flera mindre delproblem utan de försök te lösa samtliga delproblem samtidigt, vilket blev för mycket och orsakade att problemen upplevdes som svåra att lösa.

3.3.1.5 Datatyper

Under intervjuerna framgick det att testdeltagarna inte var medvetna om storleken på olika datatyper, vilket gjorde dem osäkra på mängden minne de ockuperade. Deltagarna hade svårigheter med abstraktioner samt när de skulle kombinera koncept uppstod problem. Vidare ansåg de att det inte fanns någon mening med att veta storleken för datatyperna eftersom det är upp till kompilatorn att fastställa dem.

3.3.1.6 Operatorer

Testdeltagarna förstår i teorin innebörden av * operatorn men tyckte det var svårt att tillämpa den. Testdeltagarna förstod hur de skulle använda [] operatorn men de förstod inte innebörden av den. När de försökte förklara innebörden av operatorn utgick de inte ifrån minnet vilket medförde att de hade svårigheter med att förklara hur den fungerade. De var inte medvetna om att startpunkten var den adress som pekaren refererade till och att antalet minnesplatser som traverseras är n * bytes. När testdeltagarna förklarade innebörden av n steg var detta baserat på antalet steg i en array, att pekaren representerade en plats i minnet och att det var storleken av datatypen i bytes multiplicerat med antalet element som angav längden var det ingen som nämnde. Testdeltagarna var inte medvetna om att [] operatorn avrefererade pekaren efter traverseringen, de verkade inte förstå varför en pekare behöver avrefereras.

För resterande operatorer hade testdeltagarna tillräcklig förståelse för att det inte skulle utgöra ett hinder när de tolkade uttrycken. De hade svårigheter med att dela upp uttrycken i flera delsektioner vilket medförde att de hade svårigheter med att förstå kodexemplen.

Under intervjuerna visades följande kodexempel för testdeltagarna: *srcBuffer++ = *desBuffer++; (Bilaga 1, fråga 11), uttrycket är ett bra exempel på när deltagarna hade svårigheter med att dela upp ett uttryck i flera mindre sektioner. Stegen för att dela upp uttrycket i mindre sektioner är följande: avreferering av srcBuffer och de sBuffer, steg två: uppdatera srcBuffer minnesplats med värdet som är lagrat i desBuffer minnesplats, steg tre: förflytta pekarna för srcBuffer och desBuffer ett steg framåt i minnet. Komplexiteten i uttrycket medförde att de inte kunde redogöra för några av koncepten i uttrycket, även om de tidigare hade uppvisat förståelse för samtliga.

(23)

16 När uttrycket senare delades upp i flera enskilda delar uppvisade testdeltagarna avsevärt högre förståelse för de olika koncepten i uttrycket.

3.3.1.7 Övrigt

Flera forskare [11, 12] menar att när hjärnan utsetts för stress stänger den av flera viktiga delar för att skydda sig mot överbelastning, ett sådant scenario kan till exempel vara vid problemlösning med tidigare icke kända koncept. En gemensam nämnare för intervjuerna var att uttryck som innehåller flera koncept orsakade svårigheter för testdeltagarna. Detta framgick tydligt i sista frågan (Bilaga 1, fråga 11), där testdeltagarna ombads förklara ett kodexempel som använde pekararitmetik, även om testdeltagarna tidigare hade uppvisat förståelse för flera av koncepten hade de stora svårigheter när de kombinerades. När kodexempel delades upp i flera mindre delar blev det stor skillnad på resultatet, bland annat verkade det medföra en positiv psykologisk effekt som bidrog till att testdeltagarna snabbt blev mycket lugnare och självsäkrare . Dessutom resulterade det i att deltagarna kunde förklara fler koncept i jämförelse med tidigare. Fenomenet beskrivs av Brainard och hans kollegor [17] som menar att studenternas självförtroende är avgörande för deras prestation och förmåga att inhämta nya kunskaper. I undersökningen framgår det tydligt att testdeltagarnas teoretiska kunskaper är begränsade och är av sådan karaktär att det blir svårt att diskutera ämnet minneshantering. Ett återkommande scenario i intervjuerna var att testdeltagarna ordagrant återgav information från vad som troligtvis var kurslitteratur. När informationen sedan diskuterades blev det uppenbart att de aldrig hade reflekterat över informationen. Robins med kollegor [4] beskriver problemet med den här typen av inlärning och berättar att den är tillräcklig för att klara tentaminor, vilket i många fall bidrar till att skapa en falsk trygghetskänsla där individen uppfattar det som om de har förstått teorin, när de sedan ska tillämpa teorin praktiskt uppstår problem då det visar sig att de inte har förstått teorin och de kan inte förstå varför resultatet inte motsvarar det förväntade. Vidare beskrev testdeltagarna att det var enklare att förstå teorin i jämförelse med att tillämpa den praktiskt, detta får stöd av flera olika forskare [2 - 5, 9].

Deltagarna upplevde att med en högre mängd abstraktioner blev det svårare att förstå flödet. Resultatet får stöd från flera olika forskare som menar att abstraktioner utgör ett problem för nybörjare inom programmering [1 - 9].

Sju av åtta deltagare menade att när de började med C++ var deras programmeringskunskaper bättre vilket bidrog till att det blev enklare för dem att förstå specifika koncept till skillnad mot när de började med C#. På grund av detta hade de svårt att avgöra om det var deras erfarenhet som var orsaken eller det var skillnaden i språken som medförde att de tyckte det var enklare att förstå innebörden av koncepten i C++ (Bilaga 1, fråga 3). Vidare beskrev de att C# var rörigare eftersom mer utfördes av de bakomliggande strukturerna, vilket lede till att de hade svårt att förstå vad som utfördes av de bakomliggande strukturerna och därigenom blev det svårt att följa flödet i koden. De menade att den höga nivån av abstraktion i C# orsakade svårigheter vid inlärningen och hindrade deras utveckling. Vidare beskriver de att den minskade förståelsen orsakar ett minskat intresse för programmering, detta i sin tur orsakar ett minskat intresse för att programmera på fritiden.

3.3.2 Sammanfattning

Nedan är en sammanfattning på de problem som beskrivs i 3.2.1 Utfall.

3.3.2.1 Minnessektioner

Testdeltagarna saknar grundläggande förståelse för minnessektionerna, de är medvetna om att Stacken och Heapen existerar. Testdeltagarna är osäkra på när, var och hur informationen

Figure

Figur 1: Arbetsprocess.
Tabell 1 ger en översikt över vilka designimplikationer som utkristalliserats genom intervjuerna
Tabell 1: Design implikationer för Q
Figur 2: Minneslayout för programmeringsspråket C.

References

Outline

Related documents

Denna princip får anses utgöra just konstitutionell praxis och har respekterats av de invalda partierna i Sveriges riksdag. Åtminstone fram till 2018, då praxis

En bok kan även upplevas som realistisk om karaktärerna i den inte lever ett perfekt liv, menar Appleyard. Några av ungdomarna upplevde detta i sin läsning.. boken som realistiskt

Once more, Kalmar became the hub in a great union, this time uniting the Kingdom of Sweden and the Polish-Lithuanian Rzeczpospolita, Unfortunately, this brave experience

THE ADMINISTRATIVE BOARD OF KALMAR COUNTY'S ROLE AND EXPERIENCES CONCERNING CONTAMINATED SITES Jens Johannisson Administrative Board of Kalmar County, Sweden.. THE ROLE OF

Man fick soda (natriumkarbonat) från sodasjöar och bränd kalk (kalciumoxid) tillverkades genom bränning av kalksten (kalciumkarbonat). Natriumhydroxiden användes till

Internationalisation in teacher education: student teachers’ reflections on experiences from a field study in South Africa.. Getahun Yacob Abraham b and Kerstin von

Den kommunala förskolan anser att på grund av tidsbrist har de inte någon gemensam sittnig inför utvecklingssamtalet där barnen diskuteras, vilket skiljer sig från de två

ståelse för psykoanalysen, är han också särskilt sysselsatt med striden mellan ande och natur i människans väsen, dessa krafter, som med hans egna ord alltid