Didattica della programmazione

Pagina creata da Filippo Mazzola
 
CONTINUA A LEGGERE
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