Didattica della programmazione
←
→
Trascrizione del contenuto della pagina
Se il tuo browser non visualizza correttamente la pagina, ti preghiamo di leggere il contenuto della pagina quaggiù
Didattica della programmazione Michael Lodi, Renzo Davoli 14, 20, 21 Aprile 2020 DISI - UniBO da Casa...lecchio / Sperabilmente in E1
Imparare a programmare è difficile
Difficoltà • I corsi di introduzione all’informatica (CS1) di tutto il mondo registrano molte bocciture, molti dropout e risultati inferiori ad altri corsi • Alcuni sostengono che esista il cosiddetto geek gene, mostrando che le distribuzioni dei voti sarebbero bimodali. Non dimostrato e molto dibattuto dagli esperti. • Gli obiettivi tipici di un corso di programmazione (“scrivere un programma che...”) si trovano in alto nelle tassonomie, richiedendo quindi obiettivi cognitivi elevati (applicazione, analisi, sintesi, valutazione) • “Learning edge momentum” [Robins, 2010] o “interesse composto”: gli argomenti di programmazione sono estremamente legati tra loro: conoscere quelli prima facilita molto l’apprendimento, non conoscerli lo rende sempre più difficile. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Tre tipi di conoscenza [McGill and Volet, 1997] • Conoscenza sintattica - conoscenza delle strutture linguistiche di un linguaggio di programmazione • Conoscenza concettuale - conoscenza della “dinamica” del programma in esecuzione, cioè la conoscenza di come i costrutti funzionano e determinano l’esecuzione del codice (spesso si parla di “notional machine”) • Conoscenza strategica - abilità di applicare la conoscenza sintattica e concettuale per risolvere nuovi problemi o raggiungere i propri obiettivi © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Problemi • La sintassi è un problema solo iniziale, eppure la maggior parte dei libri di testo si concentrano solo (o quasi soltanto) sulla conoscenza sintattica • Non sempre agli studenti viene insegnato “cosa succede a runtime” • Quasi mai viene insegnato agli studenti “come” affrontare un problema di programmazione © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Un viaggio nel magico mondo del cognitivismo [Lodi, 2014, sez. 2.1.2, 2.2.2]
Magazzini di Memoria Formulato originariamente da [Atkinson and Shiffrin, 1968] Tale modello prevede tre “magazzini” attraverso cui transitano gli stimoli sensoriali. Figura 1: Magazzini di memoria, secondo Atkinson e Shiffrin © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Magazzini di Memoria • Registro sensoriale: collegato con l’organo di senso corrispondente (informazione resta frazioni di secondo) • Memoria a breve termine o memoria di lavoro: una capienza limitata in spazio (4±1? 7±2?) e tempo (≈ 10s, aumentabile con la ripetizione). Transito bidirezionale tra ambiente e memoria a lungo termine. Qui avviene la manipolazione attiva (e cosciente) dell’informazione • Memoria a lungo termine: capacità potenzialmente illimitate, memorizza grandi quantità di informazione per tempi molto lunghi. Non siamo coscienti di queste memorie: per utilizzarle dobbiamo recuperarle portandole nella memoria di lavoro. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Magazzini di Memoria Com’è possibile che l’uomo riesca a svolgere attività mentali complesse con una memoria di lavoro tanto limitata? Usando il raggruppamento (chunking) e l’automatizzazione. Imparare qualcosa significa quindi conservarlo nella memoria a lungo termine. Per accedervi, però, dobbiamo passare dal “collo di bottiglia” della memoria di lavoro: per farlo, si deve diventare bravi a elaborare le informazioni in grandi gruppi e in modo automatico. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Schemi • Struttura mentale che contiene una conoscenza concettuale generica • Es. cos’è una casa; azioni che servono per mangiare al ristorante / prendere un aereo; trovare a in un’equazione del tipo a/b = c, con a, b 6= 0, c qualsiasi • Per non essere sopraffatti dai dettagli • Infatti uno schema occupa un singolo chunk • Esperto: non tanto (non solo) intelligenza o talento o memoria di lavoro, ma ampissima batteria di schemi gerarchizzati, collegati tra loro, astratti • Gli esperti passano più tempo ad analizzare il problema in profondità, per usare gli schemi giusti © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Carico cognitivo • Si apprende al meglio quando la memoria di lavoro non è né troppo piena né troppo vuota, e la maggior parte di essa è usata per la formazione di schemi • Carico cognitivo è legato alla quantità di memoria di lavoro utilizzata • Diverse tipologie: • Intrinseco: quello imposto dallo specifico compito • Pertinente: non indispensabile per la soluzione del compito, ma usata per creare o modificare schemi, riflettendo su ciò che si sta imparando • Estraneo: non essenziale al compito e non necessario per imparare (es. dati non necessari, chiacchiericcio di sottofondo, ecc.) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Carico cognitivo • Per l’apprendimento: carico cognitivo pertinente elevato • Se quello intrinseco è troppo alto, non ci sarà spazio per l’apprendimento • Se invece è troppo basso, può subentrare noia o mancanza di motivazione • Ridurre il carico cognitivo di compiti molto difficili (es. scrivere un programma) - vedremo alcune tecniche legate alla didattica della programmazione © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Oggi piove... Scrivete un programma (nel linguaggio che vi viene più spontaneo) che chiede in input all’utente interi (supponiamo il tipo sia corretto, senza controllare) non negativi, che rappresentano misurazioni della quantità giornaliera di pioggia. Quando l’utente inserisce il valore 99999, il programma stampa la media dei numeri ricevuti prima di tale valore e termina. Se l’utente inserisce numeri negativi, questi vengono ignorati. Non utilizzare strutture dati complesse (es. liste, array...) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Oggi piove... Scrivete un programma (nel linguaggio che vi viene più spontaneo) che chiede in input all’utente interi (supponiamo il tipo sia corretto, senza controllare) non negativi, che rappresentano misurazioni della quantità giornaliera di pioggia. Quando l’utente inserisce il valore 99999, il programma stampa la media dei numeri ricevuti prima di tale valore e termina. Se l’utente inserisce numeri negativi, questi vengono ignorati. Non utilizzare strutture dati complesse (es. liste, array...) Rainfall problem - Sviluppato nel 1986 da Elliot Soloway © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Proposta 1 #i n c l u d e < stdio .h > 2 i n t main () 3 { 4 i n t s = 0; 5 i n t n = 0; 6 i n t i = -1; // trick 7 do { 8 i f ( i >= 0) { s += i ; n ++;} 9 printf ( " Pioggia caduta : " ) ; 10 scanf ( " % d " , & i ) ; 11 } w h i l e ( i != 99999) ; 12 i f (n >0) 13 printf ( " Media : % f \ n " ,( f l o a t ) s / n ) ; 14 else 15 printf ( " Nessun dato \ n " ) ; 16 r e t u r n 0; 17 } © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Proposta 1 totale = 0 2 misure = 0 3 pioggia = i n t ( i n p u t ( " Pioggia caduta : " ) ) 4 w h i l e pioggia != 99999: 5 i f pioggia >= 0: 6 totale = totale + pioggia 7 misure = misure + 1 8 # la condizione cambia 9 pioggia = i n t ( i n p u t ( " Pioggia caduta : " ) ) 10 11 i f misure > 0: 12 p r i n t ( " Media pioggia caduta : " , totale / misure ) 13 else : 14 p r i n t ( " Nessun dato " ) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Schemi e carico cognitivo • Un novizio ha bisogno di molti schemi (inizializzare un accumulatore per la somma, inizializzare un contatore, calcolare la media (controllando che il denominatore non sia 0), aggiornare il valore di input (in Python: 2 volte, cast a intero), in C: importare la libreria per l’i/o, tipizzare le variabili, fare il casting a float, ecc ecc.) • Un esperto potrebbe avere un chunk del tipo “calcolare la media di valori presi in input” • “Expert blind spot”: non riusciamo più a “scindere” in schemi più semplici, non ci rendiamo quindi conto del carico cognitivo elevato © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Modelli mentali • Strutture mentali che rappresentano alcuni aspetti dell’ambiente di una persona • “Cose” specifiche: me stesso, la mia ragazza, l’ambiente di editing con cui sto componendo le slide, più che oggetti generici • Spiegarsi come un “oggetto” funzioni in situazioni diverse, fare previsioni • Sono “fallibili” • Sono eseguibili: posso svolgere una simulazione mentale, in diversi contesti e con variabili diverse • La simulazione impiega la memoria di lavoro (non posso coinvolgere troppi stati o variabili) • Vedremo più avanti il “modello mentale” della macchina che esegue un certo programma © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Misconcezioni [Lodi, 2014, sez. 2.2.3, Appen. A]
Misconcezioni Slide di seguito tradotte e sintetizzate da [Sorva, 2018], ci occupiamo principalmente di programmazione procedurale imperativa (accenni ad oggetti). • Credere di conoscere (come funziona) qualcosa, ma in realtà lo si è “compreso male”, cioè se ne ha un’interpretazione dannosa o non desiderabile • Il computer non “negozia” sintassi e semantica • Gli studenti produrranno codice che non funziona • Gli insegnanti devono identificiare le misconcezioni • Misconczioni presenti anche nei linguaggi a blocchi • Vediamone alcune, elencate per categorie. Per “menù” più completi, vedere [Qian and Lehman, 2017, Sorva, 2013, Sorva, 2018, Lodi, 2014] © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Analogie e metafore La metafora della variabile come scatola può causare alcune misconcezioni, ad esempio: • Una variabile può contenere più di un valore, in particolare la “storia” dei valori ad essa assegnati • Assegnamenti del tipo a = b spostano il valore da una variabile all’altra. La variabile sorgente è svuotata • Le variabili sono inizialmente contenitori vuoti e non necessitano di essere inizializzati © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Assegnamento i L’uso del simbolo = per l’assegnamento causa molte misconcezioni • Una variabile è semplicemente l’accoppiamento di un simbolo con un valore. Non è memorizzato da nessuna parte • a = b + 1 memorizza un’equazione in memoria, o memorizza l’espressione b + 1 non valutata nella variabile a • Un programma, specialmente se è una sequenza di assegnamenti, è visto come un insieme (non ordinato) di equazioni • Molte righe di codice (non concorrente) possono essere attive simultaneamente durante l’esecuzione • Assegnamenti come a = b funzionano in entrambe le direzioni, e scambiano i valori © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Assegnamento ii • L’assegnamento a = a + 1 è errato poiché è un’equazione impossibile • Una variabile deve essere di una singola lettera, nomi più lunghi sono comandi © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Assegnamento iii Esempi documentati sono la difficoltà di comprendere lo scambio di variabili con variabile temporanea, o studenti che chiedono i dati in input dopo che li hanno usati per calcolare un risultato, o cercano di risolvere per sostituzione gli assegnamenti. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Terminologia i L’uso di parole del linguaggio naturale può causare misconcezioni • La condizione di un ciclo while viene valutata costantemente, e si esce dal ciclo nel momento esatto in cui diviene falsa Bisogna quindi mostrare esempi specifici [Sorva in [Grover, 2020, p. 145]] n = 1 n = 1 w h i l e n < 10: w h i l e n < 10: p r i n t (n) n += 4 n += 4 p r i n t (n) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Terminologia ii • Il comando if viene eseguito non appena la sua condizione diventa vera • La parola chiave then suggerisce qualcosa che viene eseguita dopo un’altra © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Scopo vs. struttura • L’incremento di una variabile è visto come una operazione indivisibile Dire che a = a + 1 incrementa il valore di a descrive lo scopo dell’istruzione, non il suo funzionamento. Andrebbe specificato • Valuto la parte destra • Assegno il valore che trovo a destra al nome a sinistra © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Presenza di un’intelligenza interpretativa L’analogia “programmare col computer è come conversare con esso” può portare ad attribuire intenzionalità al computer [Pea, 1986]: • Programmare è come parlare in linguaggio naturale. Il computer o l’ambiente di sviluppo ha un’intelligenza nascosta che comprende le intenzioni del programmatore e lo aiuta a raggiungere il suo scopo (“superbug”), per esempio completando con “ovvie” informazioni mancanti • Il computer impedisce operazioni che sono inutili, non ragionevoli, sbagliate • Il computer ha una visione generale, conosce cosa accadrà alle linee di codice che non sta eseguendo in quel momento. • I nomi assegnati alle variabili influenzano il loro comportamento e funzionamento (es. “massimo” conterrà sempre valori “più grandi”) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Differenza tra codice statico e codice in esecuzione • Non si possono usare nomi uguali per i parametri formali e quelli attuali • Il passaggio dei parametri crea sempre un legame diretto tra parametri formali e attuali • L’assegnamento copia le proprietà di una struttura dati ad un’altra • Due oggetti con lo stato identico sono lo stesso oggetto © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Visione limitata di esempi Gli studenti inferiscono regole dagli esempi che vedono. • Gli attributi degli oggetti possono essere solo numeri o comunque tipi primitivi • Gli argomenti delle chiamate di funzioni possono essere solo valori, non variabili • Gli operatori di confronto/booleani possono comporarire solo nella guardia di if o cicli e non, ad esempio, in espressioni dentro un return • Le procedure sono eseguite nell’ordine in cui sono definite • (La chiamata ricorsiva avviene sempre e solo nel return) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Macchina Concettuale [Lodi, 2014, sez. 2.2.4 ]
Notional Machine [Sorva, 2013] (Macchina “concettuale”) • Rappresenta le proprietà generali della macchina che si sta imparando a controllare. • Computer idealizzato, le cui proprietà sono implicate dai costrutti del linguaggio di programmazione impiegato, ma che possono essere esplicitate durante l’insegnamento • Creata con lo scopo di spiegare l’esecuzione dei programmi. • Si tratta di una nozione più specifica, perché con scopi didattici, della nozione classica e generale di macchina astratta. • Una caratterizzazione del computer nel suo ruolo di esecutore di programmi (in un particolare linguaggio), racchiude le capacità e i comportamenti hardware e software che siano sufficientemente astratti, ma precisi, per spiegare come i programmi sono eseguiti © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Notional Machine (Macchina “concettuale”) [Sorva, 2013] • Legata a un preciso linguaggio di programmazione • Non deve (necessariamente) essere un modello del computer fisico (o “fedele” a quel che succede realmente dietro le quinte) • Possono esistere più macchine, a livelli di astrazione diversi, per uno stesso linguaggio (es. macchina per Java che definisce il computer come capace di maneggiare oggetti che si scambiano messaggi, una a più basso livello che vede i vari costrutti maneggiare aree di memoria, stack delle chiamate e heap, una ancora più a basso livello che descrive Java in termini di bytecode) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Macchina concettuale e misconcezioni • Modello mentale dell’esecutore • Simulazione di tale modello: tracing • I linguaggi ad alto livello nascondono molti dettagli • Il modello si forma in ogni caso, che venga esplicitata o meno • I novizi possono formarsi modelli che non sono adeguati → misconcezioni • Secondo alcuni, forma una “realtà oggettiva”... scacco matto costruttivisti estremi ;) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Visualizzare la macchina concettuale • Facendo disegni e annotando alla lavagna lo stato interno durante l’esecuzione • NB. Studenti pensano sia solo un modo dei docenti per spiegare, vanno spinti a farlo essi stessi • Con strumenti di visualizzazione, es. http://pythontutor.com/visualize.html#mode=edit • Esempio. • Fibonacci • Thonny (https://thonny.org/) (scaricatelo e “giocateci” ;)) • Funzioni analoghe in BlueJ per Java/Stride • Alcune funzioni analoghe nei linguaggi a blocchi, es: • Sctatch (e figli): visualizzare il valore delle variabili • Snap! (e Scratch 1.4): esecuzione step by step con blocchi “illuminati” © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Consigli per gli acquisti Un libro “al livello giusto” per gli insegnanti https://www.shuchigrover.com/atozk12cs/about/ © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Lettura e comprensione di codice
Leggere per imparare a scrivere Questo libro non insegna a scrivere. Non s’impara a scrive- re leggendo un libro sulla scrittura, cosı̀ come non s’impa- ra a sciare leggendo un libro sullo sci. Bisogna esercitarsi: cioè leggere tanto (romanzi, saggi, giornali decenti), parla- re con gente più colta e intelligente di noi e naturalmente scrivere, se è possibile facendosi correggere da chi sa già scrivere meglio di noi. Claudio Giunta. Come non scrivere: Consigli ed esempi da seguire, trappole e scemenze da evitare quando si scrive in italiano. UTET. Premessa. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Scaffolding • Ridurre il carico cognitivo • Aiutare la formazione di modelli mentali viable e sviluppare una conoscenza concettuale • Favorire lo sviluppo di una conoscenza strategica • Piano piano, bisogna togliere l’impalcatura: Un insegnante è uno che si rende progressivamente inutile. Thomas Carruthers © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Esempi risolti Esempi risolti (o parzialmente risolti) e commentati da esperti • Problema/goal • Proposta di soluzione (o, meglio, diverse soluzioni) • Spiegazione di come si è ottenuta la soluzione Si sono dimostrati particolarmente efficaci quando gli studenti fanno pratica risolvendo in prima persona un problema simile subito dopo aver studiato l’esempio. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Etichettatura dei sottoobiettivi Commenti nel codice che identificano i sotto-schemi che stiamo applicando, o i passi nel processo di soluzione, per aiutare il “chunking”. Possono essere forniti (come in questo esempio) o lasciati agli studenti da scrivere come compito. # Inizializzo le variabili s = 0 n = 0 # Leggo il primo valore in input i = i n t ( i n p u t ( " Pioggia caduta : " ) ) # Determino la condizione di terminazione w h i l e i != 99999: # elaboro il valore i f i >= 0: s += i n += 1 # leggo in input il valore successivo i = i n t ( i n p u t ( " Pioggia caduta : " ) ) # determino output a seconda del numero di valori letti i f n >0: p r i n t ( " Media di pioggia cauduta : " , s / n ) e l s e : p r i n t ( " Nessun dato " ) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Parsons problems • Parsons Problem: https://js-parsons.github.io/ • Problem generator: http://acos.cs.hut.fi/jsparsons-generator • Provate a riordinare questo programma (link nella home del wiki) affinché calcoli il numero di cifre pari in x. Poi pensare a dei nomi più significativi per le variabili © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Parsons problems • Parsons Problem: https://js-parsons.github.io/ • Problem generator: http://acos.cs.hut.fi/jsparsons-generator • Provate a riordinare questo programma (link nella home del wiki) affinché calcoli il numero di cifre pari in x. Poi pensare a dei nomi più significativi per le variabili 1 d e f cifrepari_brutto ( n ) : 2 conta_pari = 0 3 w h i l e n > 0: 4 cifra = n % 10 5 i f cifra % 2 == 0: 6 conta_pari += 1 7 n = n // 10 8 r e t u r n conta_pari © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Altri esempi • Cosa fanno questi programmi? http://aptiva.v2.cs. unibo.it/wiki/index.php?title=Esercizi_di_lettura • Esempi di uso di Python nella didattica: http://aptiva.v2.cs.unibo.it/wiki/index.php? title=Esempi_in_Python_per_la_didattica o - un po’ più complicati - http://aptiva.v2.cs.unibo.it/wiki/ index.php?title=Codice_visto_a_lezione © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Diverse attività di Program Comprehension (Block Model) • Si possono creare attività di program comprehension per tutti e tre i livelli (conoscenza sintattica, concettuale, strategica) (asse x nello schema seguente) • E andando da specifiche istruzioni al codice nella sua interezza (asse y nello schema seguente) • Il Block Model: http://lonati.di.unimi.it/didainfo_ 2019-20/progComp/2-BM-table.pdf © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Lavoro a coppie In classe: mantenedo distanza (sedersi nei posti assegnati), mascherina, senza toccare oggetti condivisi. Distribuitevi per tutta la lunghezza dell’aula, fino in fondo. A casa: • Su Teams, andate nel calendario, e create un meeting/riunione (circa tra le 14 e le 16 di oggi) • Nel titolo, scrivete “Didattica della programmazione Nome1 Nome2” (anche qui, circa) • Aggiungete, oltre a voi stessi, anche il Prof. Davoli e me tra i partecipanti obbligatori, cosı̀ che possiamo “girare virtualmente tra i banchi” e vedere cosa state facendo • Alterniamo esercizi e spiegazione, quindi tenete d’occhio la chat della stanza principale © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Un (meta)esercizio • Lavoro a coppie, ma ognuno sul suo pc • Assegnare a ciascuno dei seguenti esempi esercizi di program comprehension (per lo più sono già risolti; tutti basati sullo stesso programma) la corrispondente casella del block model http://lonati.di.unimi.it/didainfo_2019-20/ progComp/2-BM-table.pdf • Valutazione FORMATIVA: niente voti, niente ansia ;) © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Diverse attività di Program Comprehension (Block Model) • Possibile soluzione: http://lonati.di.unimi.it/ didainfo_2019-20/progComp/3-BM-tasks.pdf • Esempi di (tipologie di) esercizi per ciascuna delle “caselle” dello schema di cui sopra: http://lonati.di.unimi.it/ didainfo_2019-20/progComp/4-progCompTasks.pdf (Sezione 5). • L’articolo completo: https: //dl.acm.org/doi/abs/10.1145/3344429.3372501 © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Pattern Elementari
Pattern elementari Per stimolare la conoscenza strategica. NON sono dei “contenuti” da insegnare separatamente, sono strumenti da far riconoscere, nominare, usare durante l’insegnamento/apprendimento. • Ruoli delle variabili https: //csed-unibo.github.io/#!pages/ruoli_variabili.md • Schemi legati alla scansione di sequenze https: //csed-unibo.github.io/#!pages/pattern_cicli.md © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Ruoli delle variabili Riprendiamo il lavoro sui ruoli delle variabili (a livello di “atom” nel block model). https: //csed-unibo.github.io/#!pages/ruoli_variabili.md © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Schemi/pattern legati alla scansione di sequenze A livello (circa) di “block” nel block model. https://csed-unibo.github.io/#!pages/pattern_cicli.md • Lavoro individuale • Consegna per mercoledı̀ 28 aprile alle 13 su Virtuale • Il vostro lavoro verrà poi commentato (“valutato”) da un collega • Esperimento di “peer-evaluation” © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Bibliografia
Bibliografia i Atkinson, R. and Shiffrin, R. (1968). Human memory: A proposed system and its control processes. volume 2 of Psychology of Learning and Motivation, pages 89 – 195. Academic Press. Grover, S. (2020). Computer Science in K-12: An A-To-Z Handbook on Teaching Programming. Edfinity. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Bibliografia ii Lodi, M. (2014). Imparare il pensiero computazionale, imparare a programmare. Master’s thesis, Alma Mater Studiorum - Università di Bologna. http://amslaurea.unibo.it/6730/. McGill, T. J. and Volet, S. E. (1997). A conceptual framework for analyzing students’ knowledge of programming. Journal of Research on Computing in Education, 29(3):276–297. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Bibliografia iii Pea, R. (1986). Language-independent conceptual “bugs” in novice programming. Journal of Educational Computing Research, 2:25–36. Qian, Y. and Lehman, J. (2017). Students’ misconceptions and other difficulties in introductory programming: A literature review. ACM Transactions on Computing Education, 18(1):1:1–1:24. Robins, A. (2010). Learning edge momentum: a new account of outcomes in CS1. Computer Science Education, 20(1):37–71. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Bibliografia iv Sorva, J. (2013). Notional machines and introductory programming education. Trans. Comput. Educ., 13(2):8:1–8:31. http://doi.acm.org/10.1145/2483710.2483713. Sorva, J. (2018). Misconceptions and the beginner programmer. In Computer science education: Perspectives on teaching and learning in school. Bloomsbury Publishing. © 2021 - Copyleft - CC BY-SA, Michael Lodi, Renzo Davoli
Puoi anche leggere