Sentire la Necessity
per imparare a programmare
Marco Sbaraglia, Michael Lodi, Simone Martini
Dipartimento di Informatica - Scienza e Ingegneria
Il paper
Marco SBARAGLIA, Michael LODI, Simone MARTINI
A Necessity-Driven Ride on the Abstraction Rollercoaster of CS1 Programming
Informatics in Education 20(2021), no. 4, 641-682,
DOI: 10.15388/infedu.2021.28
Open access: https://infedu.vu.lt/journal/INFEDU/article/721/info
Imparare a programmare è difficile
Gli scarsi risultati dei corsi introduttivi di programmazione
CS1, Computer Science 1, indica un primo corso di informatica (di una laurea informatica ma anche di altri corsi).
Gli studenti imparano
I corsi di introduzione all’informatica (CS1) di tutto il mondo registrano
⇒ non ci sono abbastanza informatici! �(né sul mercato del lavoro né in accademia)
Metodologie attive per introdurre la programmazione?
Le metodologie attive favoriscono l’apprendimento… → quando gli studenti esplorano e costruiscono attivamente
… MA l’informatica ha molti aspetti tecnici sin dall’inizio
⇒ i novizi devono imparare concetti specifici e tecnici …molto difficile impararli per scoperta (misconcezioni)
Perciò, ancora oggi, l’approccio a CS1 è spesso tradizionale
Risultati scarsi
Tipi di conoscenza nell’apprendimento della programmazione
Imparare a programmare richiede diversi tipi di conoscenza �[McGill and Volet, 1997]
A differenza che in altre discipline, spesso i voti di informatica non hanno una distribuzione normale ma bimodale (i risultati si polarizzano in molto negativi e molto positivi)
Spiegazione: ipotesi LEM (“Learning Edge Momentum”) [Robins, 2010]
(metafora del momento angolare o dell’interesse composto)
Nella programmazione: concetti estremamente legati tra loro
Perché è difficile programmare: l’ipotesi LEM
Problem solving �prima dell’insegnamento diretto
Per introdurre i nuovi concetti (secondo LEM,
l’intro è uno dei momenti più critici)
Si basa sugli approcci in cui il Problem-Solving precede l’Insegnamento diretto (PS - I) [Loibl et al., 2017] che favoriscono
in più noi vorremmo stimolare nello studente il sentimento di necessità del concetto che si vuole insegnare (concetto target)...
…PERCHÉ? �Molta ricerca dimostra che sperimentare difficoltà e anche fallire può stimolare la motivazione e, in generale, prepara ad apprendimenti significativi �(attivazione conoscenza pregressa, consapevolezza proprie lacune, riconoscimento caratteristiche del problema)
Tra i più famosi approcci PS-I c’è il Productive Failure (PF)
Proponiamo una metodologia didattica per affrontare questi problemi
Productive Failure [Kapur and Bielaczyc, 2012]
Pensato per la Matematica, si afferma nelle didattiche scientifiche
→ si basa sull’idea che fallire può essere una spinta all’apprendimento
È un approccio PS - I
Un esempio di problema
Un esempio di problema nel PF
Problema mal strutturato → dati sparsi in un testo narrativo lungo e con dialoghi
Nessuna indicazione su come risolverlo così da aprire a multipli RSM
Caso concreto: concetto target è velocità media in grade 7 (~12 anni)
Productive Failure vs. Direct Instruction
Posttest
Esempi di RSM degli studenti
Necessity Learning Design
Necessity: un meccanismo generale
Meccanismo di Necessity�Assegnare agli studenti un problema progettato in modo che sia
Meccanismo generale: adattabile per altre discipline e contesti
Necessity Learning Design
Sfruttiamo il meccanismo di Necessity per creare una metodologia didattica specifica per la programmazione CS1
Necessity learning design (NLD)
P!S - Problem Not Solved | I - Instruction | PS - Problem Solved |
Un es. di programmazione (apparentemente familiare) che lo studente non sa risolvere senza il concetto target | L’insegnante introduce il concetto target in generale e con semplici esempi (senza riferirsi all’esercizio) | Lo studente applica il concetto target per poter finalmente risolvere l’esercizio iniziale |
Necessity learning design (NLD)
P!S Problem not solved | I Instruction | PS Problem solved |
A (seemingly familiar) programming task that students cannot solve without the target concept | Teachers introduce the target concept in general and with simple examples (without referring to the assigned task) | Students apply the target concept to finally solve the assigned task |
Il meccanismo di Necessity
Lo studente sente la necessità di qualcosa che non conosce, ma di cui può intuire le caratteristiche | L’insegnante risponde a quella necessità illustrando il concetto target con semplici esempi (generici) | Lo studente soddisfa la necessità applicando il concetto target all’esercizio iniziale |
P!S - Problem Not Solved | I - Instruction | PS - Problem Solved |
Il meccanismo di Necessity
Students feel the necessity of something they do not know but whose characteristics they can intuitively grasp | Teachers respond to that necessity by illustrating the target concept with simple and generic examples | Students satisfy the necessity by applying the target concept to the assigned task |
P!S - Problem Not Solved | I - Instruction | PS - Problem Solved |
1: Fase P!S (Problem Not Solved)
Il “problema” qui è un semplice esercizio di programmazione
* anche se per problemi di programmazione esistono potenzialmente infinite soluzioni
Un es. di programmazione (apparentemente familiare) che lo studente non sa risolvere senza il concetto target | | Lo studente sente la necessità di qualcosa che non conosce, ma di cui può intuire le caratteristiche |
2: Fase I (Instruction)
Fase di insegnamento diretto: l’insegnante introduce il nuovo concetto di programmazione (target) in modo generale
L’insegnante introduce il concetto target in generale e con semplici esempi (senza riferirsi all’esercizio) | | L’insegnante risponde alla necessità degli studenti illustrando il concetto target |
3: Fase PS (Problem Solved)
Nel contesto di un esercizio già ampiamente esplorato, lo studente può giovarsi dei ragionamenti già fatti nel tentare di risolvere il problema (i suoi RSM della fase P!S) e quindi capire più facilmente:
Lo studente applica il concetto target per poter finalmente risolvere l’esercizio iniziale | | Lo studente soddisfa la necessità applicando il concetto target all’esercizio iniziale |
NLD specifico per la programmazione informatica
PF (in generale approcci PS-I) | | Necessity Learning Design |
Problemi complessi, ricchi di informazioni, mal strutturati, fatti �per generare molti RSM ⇒ la fase di Instruction si basa sul confronto degli RSM degli studenti | P!S | Esercizi tecnici e introduttivi: �“piccoli” e progettati per essere �simili a quelli già visti�⇒ evitare che lo studente sia sopraffatto da infinite possibilità o “diverga” troppo |
La fase di Instruction illustra la soluzione canonica confrontando e discutendo gli RSM degli studenti | I | Lo studente resta con un artefatto (oggetto manipolabile, astrazione eseguibile) frutto dei propri RSM; la fase di Instruction è semplice e generale per non sprecare �il potenziale di apprendimento |
– – | PS | Lo studente ora può soddisfare �la propria necessità in context �usando il target concept �nel contesto noto dei propri RSM |
NLD specifico per la programmazione informatica
PF (PS-I approaches in general) | | Necessity Learning Design |
Complex, information-rich, poorly structured problems made to generate many RSMs ⇒ Instruction phase based on �comparing students' RSMs | P!S | Technical and introductory tasks: �"small" and similar to those already experienced ⇒ prevent students from being overwhelmed by many possibilities or "diverging" too much |
Instruction phase illustrates �the canonical solution by comparing �and discussing students' RSMs | I | Students are left with an artifact (manipulable object, executable abstraction), result of their RSMs; Instruction is simple and general so as not to waste the potential for learning |
– – | PS | Students can now fulfil their necessity "in context" using the target concept in the known domain of their RSMs |
La sequenza di Necessity (P!S - I - PS) è stata concepita per
La nostra proposta:
Quando usare Necessity Learning Design
Necessity di un cambio di astrazione:�esempi di applicazione di NLD
In Informatica: astrazione concetto fondamentale in moltissimi contesti diversi (review recente: [Mirolo, Izu, Lonati, Scapin, 2021])
In generale (informatica): gerarchie di astrazione
Un linguaggio è un’astrazione (a un certo livello) della macchina fisica sottostante.
Meccanismi di astrazione interni a un linguaggio:
Quale astrazione?
Astrazione all’interno di un linguaggio: l’iterazione (stesso problema)
L = [2, 4, 1, 5, 7, 3, 8, 9999, 4, 1] #lista L di interi
# stampa gli interi di L
for n in L:
print(n)
# stampa gli interi di L
for i in range(len(L)):
print(L[i])
# stampa gli interi di L
i = 0
while i < len(L):
print(L[i])
i = i + 1
for-each�(più astratto - meno potente)
while / do..while�(meno astratto - più potente)
for con indici
Astrazione all’interno di un linguaggio: l’iterazione (problemi diversi)
L = [2, 4, 1, 5, 7, 3, 8, 9999, 4, 1] #lista L di interi
# stampa gli interi di L
for n in L:
print(n)
# conta il numero di coppie adiacenti di L non in ordine crescente
cnt = 0
for i in range(len(L)-1):
if L[i]>L[i+1]:
cnt += 1
# stampa tutti gli interi di L che precedono 9999
i = 0
while i < len(L) and L[i] != 9999:
print(L[i])
i = i + 1
for-each�(più astratto - meno potente)
for con indici
while / do..while�(meno astratto - più potente)
Conoscenza sintattica, concettuale, strategica
# stampa gli interi di L
for n in L:
print(n)
# conta il numero di coppie adiacenti di L non in ordine crescente
cnt = 0
for i in range(len(L)-1):
if L[i]>L[i+1]:
cnt += 1
# stampa gli interi prima di 9999
i = 0
while i < len(L) and L[i] != 9999:
print(L[i])
i = i + 1
Learning to program requires different kinds of knowledge
# prints the integers of L
for n in L:
print(n)
# counts the adjacent pairs of L �not in ascending order
cnt = 0
for i in range(len(L)-1):
if L[i]>L[i+1]:
cnt += 1
# print integers before 9999
i = 0
while i<len(L) and L[i]!=9999:
print(L[i])
i = i + 1
Syntactic knowledge
how to write for and while in Python
Conceptual
how many times the cycles are executed; when they stop
Strategic
use of index to access adjacent elements; use of while when the number of repetitions is not known in advance
Muoversi nell’astrazione verso l’alto e verso il basso… sempre difficile!
Per insegnare
… bisogna mettere gli studenti in una situazione in cui
In entrambi gli scenari l’obiettivo è stimolare la Necessity del costrutto (più o meno astratto) che si vuole introdurre
Sequenza Necessity (pre) Esercizi di avvicinamento alla fase P!S
Lanciare una MONETA. Scrivi un programma che effettua 10'000 di lanci di una moneta e stampa il numero finale di teste e croci ottenute
teste = 0
croci = 0
for k in range(10000):
moneta = randint(0,1)
if moneta == 0:
teste = teste + 1
else:
croci = croci + 1
print(teste, croci)
Sequenza Necessity (pre) Esercizi di avvicinamento alla fase P!S
faccia1 = faccia2 = faccia3 = faccia4 = faccia5 = faccia6 = 0
for k in range(10**6):
dado = randint(1,6)
if dado == 1:
faccia1 = faccia1 + 1
elif dado == 2:
faccia2 = faccia2 + 1
elif dado == 3:
faccia3 = faccia3 + 1
elif dado == 4:
faccia4 = faccia4 + 1
elif dado == 5:
faccia5 = faccia5 + 1
elif dado == 6:
faccia6 = faccia6 + 1
print(faccia1, faccia2, faccia3, faccia4, faccia5, faccia6)
Lanciare un DADO. Scrivi un programma che effettua 1 milione di lanci di un dado a 6 facce e stampa il numero finale di volte che è uscita ciascuna faccia
Sequenza Necessity (pre) Esercizi di avvicinamento alla fase P!S
Per stimolare la Necessity, gli studenti devono aver maturato padronanza �sugli esercizi di avvicinamento
Sequenza Necessity (P!S) Problem Not Solved
Estrazioni del LOTTO. Scrivi un programma che effettua 1 mln di estrazioni del lotto (num. da 0 a 89) e stampa il numero finale di volte che è uscito ciascun numero
estratto0 = estratto1 = estratto2 = ... = estratto88 = estratto89 = 0
for k in range(10**6):
numero = randint(0,89)
if numero == 0:
estratto0 = estratto0 + 1
elif numero == 1:
estratto1 = estratto1 + 1
...
...
elif numero == 89:
estratto89 = estratto89 + 1
print(estratto0, estratto1, esrtatto2,..., estratto89)
Sequenza Necessity (P!S) Soluzione sub-ottima
186 righe di codice
Sequenza Necessity (I) Fase di Instruction
Introduzione agli array semplice e generale
Sequenza di elementi dello stesso tipo.
Nome unico, elementi accessibili per indice
myArray = [7, 4, 12, 5, 1]��print(myArray[3])
>> 5
myArray[4] = 42
for i in range(len(myArray)):
print(myArray[i])
>> 7 4 12 5 42
7
4
12
5
1
Estrazioni del LOTTO. Scrivi un programma che effettua 1 mln di estrazioni del lotto (num. da 0 a 89) e stampa il numero finale di volte che è uscito ciascun numero
estratto = [0]*90
for k in range(10**6):
numero = randint(0,89)
estratto[numero] = estratto[numero]+1�
>> print(estratto)
>> [11108, 11193, 11144, 10964, 11277, 11158, 11127, 11132, 11231, 11108, 11184,
11133, 11131, 11041, 11119, 11093, 11066, 11345, 11184, 11208, 10786, 11125,
11030, 11182, 11088, 11170, 11143, 11345, 11080, 11056, 11140, 11163, 11162,
11045, 11180, 10971, 10947, 11081, 11162, 11115, 11267, 11106, 11002, 11104,
11019, 11040, 11318, 11141, 11152, 10883, 11095, 10997, 11043, 11192, 11038,
10990, 10988, 11112, 11010, 10899, 11194, 11000, 11165, 10992, 11071, 11081,
11371, 11196, 11038, 11065, 11214, 11188, 11135, 11066, 11096, 11146, 11123,
11227, 10945, 11270, 11236, 11215, 11158, 11175, 11149, 10888, 11195, 10985,
11028, 11075]
Sequenza Necessity (PS) Problem Solved
stesso esercizio della �fase P!S… ma ora con il target concept (gli array)
Come presentiamo una sequenza Necessity
Esempi di sequenze
Nel paper [Sbaraglia, Lodi, Martini, 2021] abbiamo presentato 4 esempi di sequenze progettate con NLD
Sperimentazione di una sequenza NLD
NLD per fare bootstrap degli array
2 TERZE del TECNICO tecnologico indirizzo INFORMATICA (Aldini Valeriani, BO)
Principali obiettivi (aperti ad osservare cose impreviste)
Sperimentazione a scuola: contesto e obiettivi
Sperimentazione a scuola: design
Costante comunicazione con l’insegnante per garantire
L’insegnante ha usato il materiale (esercizi, teoria, verifica) secondo le sue �modalità preferite e anche in relazione a risposta e interazione con gli studenti
Prime osservazioni
(Questionari e voti ancora da analizzare, ma…)
Limiti
Bibliografia
Kalish, S. (2009). Effects Of Instructor Immediacy And Student Need For Cognition On Student Motivation And Perceptions Of Learning. Electronic Theses and Dissertations. https://stars.library.ucf.edu/etd/4163
Kapur, M., & Bielaczyc, K. (2012). Designing for Productive Failure. Journal of the Learning Sciences, 21(1), 45–83. https://doi.org/10.1080/10508406.2011.591717
Loibl, K., Roll, I., & Rummel, N. (2017). Towards a Theory of When and How Problem Solving Followed by Instruction Supports Learning. Educational Psychology Review, 29(4), 693–715. https://doi.org/10.1007/s10648-016-9379-x
McGill, T. J., & Volet, S. E. (1997). A Conceptual Framework for Analyzing Students’ Knowledge of Programming. Journal of Research on Computing in Education, 29(3), 276–297. https://doi.org/10.1080/08886504.1997.10782199
Mirolo, C., Izu, C., Lonati, V., & Scapin, E. (2021). Abstraction in Computer Science Education: An Overview. Informatics in Education, 20(4), 615–639. https://doi.org/10.15388/infedu.2021.27 �
Robins, A. (2010). Learning edge momentum: a new account of outcomes in CS1. Computer Science Education, 20(1), 37–71. https://doi.org/10.1080/08993401003612167
Sbaraglia, M., Lodi, M., & Martini, S. (2021). A Necessity-Driven Ride on the Abstraction Rollercoaster of CS1 Programming. Informatics in Education, 20(4), 641–682. https://doi.org/10.15388/infedu.2021.28
Grazie
Dipartimento di Informatica - Scienza e Ingegneria
www.unibo.it
PRE-sperimentazione: State Motivation Scale [Kalish, 2009]
Per ciascuna delle coppie, scegli il numero che meglio descrive come ti senti rispetto alla materia Informatica.
(Riferito alla materia 'Informatica' di quest'anno, da settembre fino ad adesso.)
1 2 3 4 5 6 7 | |
Motivato | Non motivato |
Interessato | Non interessato |
Coinvolto | Non coinvolto |
Non stimolato | Stimolato |
Non voglio studiarla | Voglio studiarla |
Ispirato | Non ispirato |
Non messo alla prova | Messo alla prova |
Non energizzato | Energizzato |
Non entusiasta | Entusiasta |
Elettrizzato | Non elettrizzato |
Carico | Non carico |
Non affascinato | Affascinato |
PRE-sperimentazione [adapted from Kalish, 2009]
Efficacia dell’insegnamento fino alla sperimentazione
Auto-efficacia dello studente (baseline per l’efficacia dell’insegnamento)
Per analizzare stati d’animo e impressioni degli studenti sulle varie fasi/attività (QUAL.)
Questionario post-attività
POST-sperimentazione: State Motivation Scale [Kalish, 2009]
Per ciascuna delle coppie che trovi sotto, scegli il numero che meglio descrive come ti senti rispetto alla materia Informatica dopo l'introduzione agli array.
1 2 3 4 5 6 7 | |
Motivato | Non motivato |
Interessato | Non interessato |
Coinvolto | Non coinvolto |
Non stimolato | Stimolato |
Non voglio studiarla | Voglio studiarla |
Ispirato | Non ispirato |
Non messo alla prova | Messo alla prova |
Non energizzato | Energizzato |
Non entusiasta | Entusiasta |
Elettrizzato | Non elettrizzato |
Carico | Non carico |
Non affascinato | Affascinato |
POST-sperimentazione [adapted from Kalish, 2009]
Efficacia dell’ introduzione agli array
Auto-efficacia dello studente sull’ introduzione agli array (baseline)