Nothing Special   »   [go: up one dir, main page]

Academia.eduAcademia.edu

Dal mestiere dell'informatico al pensiero computazionale

2017, Italian Journal of Educational Technology

Nel seguito viene proposta una breve analisi delle fasi in cui si articola lo sviluppo del software, dei metodi comunemente utilizzati dagli informatici in ciascuna di queste fasi e del possibile significato che queste modalità di pensiero possono assumere nei processi educativi. L'obiettivo è quello di offrire un quadro delle potenzialità educative del pensiero computazionale più ampio ed approfondito di quello che, in molti casi, è il modo di pensare corrente. Il pensiero computazionale si configura così come una abilità di portata generale che ha a che fare con l'astrazione, la rappresentazione, l'espressione e la comunicazione, e la capacità di indagine; e non viene confinato nella sola dimensione, importante ma restrittiva, della codifica in uno specifico linguaggio di programmazione.

Dal mestiere dell’informatico al pensiero computazionale From digital computing to computational thinking Giorgio Olimpo Istituto per le Tecnologie Didattiche, Consiglio Nazionale delle Ricerche, Genova, Italy, olimpo@itd.cnr.it HOW TO CITE: Olimpo, G. (2017). Dal mestiere dell’informatico al pensiero computazionale. Italian Journal of Educational Technology, 25(2), 15-26. doi:10.17471/2499-4324/918 SOMMARIO Nel seguito viene proposta una breve analisi delle fasi in cui si articola lo sviluppo del software, dei metodi comunemente utilizzati dagli informatici in ciascuna di queste fasi e del possibile signiicato che queste modalità di pensiero possono assumere nei processi educativi. L’obiettivo è quello di offrire un quadro delle potenzialità educative del pensiero computazionale più ampio ed approfondito di quello che, in molti casi, è il modo di pensare corrente. Il pensiero computazionale si conigura così come una abilità di portata generale che ha a che fare con l’astrazione, la rappresentazione, l’espressione e la comunicazione, e la capacità di indagine; e non viene coninato nella sola dimensione, importante ma restrittiva, della codiica in uno speciico linguaggio di programmazione. PAROLE CHIAVE Pensiero computazionale, Sviluppo del software, Abilità cognitive, Codiica. ABSTRACT This paper proposes a short analysis of the main phases of software development, the approaches and conceptual tools that professionals typically adopt to tackle the complexity of those phases, and the possible meanings that this way of thinking may assume in educational processes. The main purpose is to offer a point of view on the educational potential of computational thinking that is deeper and more comprehensive than the coding oriented attitude widely assumed by stakeholders. The perspective on computational thinking that is provided involves cognitive skills of general value such as abstraction, representation, expression and communication and inquiry, and is not conined to the important but restrictive area of coding. KEYWORDS Computational thinking, Software development, Cognitive skills, Coding. 1. INTRODUZIONE «Il pensiero computazionale rappresenta un atteggiamento ed un complesso di abilità che sono universalmente applicabili e che chiunque, non soltanto gli informatici, dovrebbe essere desideroso di apprendere e di utilizzare». Questa famosa affermazione di Wing (2006, p.33) è stata ripresa da molti ed è diventata uno dei pilastri motivazionali per l’introduzione del pensiero computazionale nell’educazione. La Wing è un’informatica di rango (all’epoca direttore del Dipartimento di Computer Science alla Carnagie Mellon University) che certamente ha ben interiorizzato il modo di pensare degli informatici. Proprio per questo la deinizione di pensiero computazionale da lei proposta non è strettamente focalizzata sulla programmazio15 Giorgio Olimpo ne dei computer. Particolarmente signiicative sono alcune sue affermazioni sul pensiero computazionale. • Si riferisce a concettualizzare e non a programmare. • Pensare come un informatico signiica molto più che esser capaci a programmare il computer e richiede soprattutto di saper pensare a livelli multipli di astrazione. • Si riferisce ad abilità fondamentali, non a capacità meccaniche di basso livello. • Non è un tentativo di fare in modo che gli uomini pensino come i computer; i computer sono inintelligenti e noiosi mentre gli uomini hanno intelligenza e fantasia. Nonostante queste posizioni di partenza, in una prima fase della ancor breve storia del pensiero computazionale, l’enfasi sulla programmazione intesa come capacità tecnica è diventata molto forte se non prevalente (Manilla, 2014). Signiicativa è anche la terminologia adottata: il termine coding, diventato così popolare, mette in modo deciso l’accento sulla fase inale del processo di sviluppo del software, la scrittura del codice in un dato linguaggio di programmazione. Oggi tuttavia sta sempre più maturando la consapevolezza che il pensiero computazionale «…coinvolge un ambito molto più ampio della sola programmazione. Per esempio i processi di analisi e di decomposizione dei problemi precedono l’attività di codiica vera e propria» (Bocconi, Chioccariello, Dettori, Ferrari, & Engelhardt, 2016, p.7). Alcuni autori poi sostengono come il pensiero computazionale includa l’esercizio di atteggiamenti e abilità cognitive molto lontane dalle tecnicalità del coding, per esempio la capacità di gestire la complessità o di affrontare problemi aperti o non ancora formalizzati (Barr, Harrison & Conery, 2011; Weintrop et al., 2015). Nel seguito di questa nota si cercherà di offrire una prospettiva di concretezza su alcune delle possibili componenti concettuali del pensiero computazionale descrivendo il percorso seguito dagli informatici impegnati nello sviluppo di software ed evidenziando gli approcci adottati, le abilità messe in gioco e gli atteggiamenti richiesti. Quando possibile, si cercherà di suggerire il signiicato che queste modalità di pensiero possono assumere nei processi educativi. Si parlerà sia di signiicati che sono già stati portati nella pratica educativa o che sono stati sperimentati in ambito di ricerca, sia di ipotesi plausibili, ma ancora da coniugare con i processi di apprendimento. Il punto di vista adottato è che l’educazione, per quanto riguarda il pensiero computazionale, non dovrebbe perseguire soltanto una inalità di preparazione all’esercizio di una professione come ancora oggi emerge in modo più o meno esplicito dalle dichiarazioni o dai documenti di natura politica. Per es. in (European Commission, 2015) si legge che «l’acquisizione di competenze digitali, incluso il coding, è considerata essenziale per sostenere lo sviluppo e la competitività». Analogamente in (European Commission, 2016) si mette il fuoco sulla necessità di sviluppare competenze digitali per il mercato del lavoro. L’educazione dovrebbe invece soffermarsi su capacità generali che hanno a che fare con l’analisi di situazioni problematiche, l’identiicazione e la rappresentazione dei problemi e delle relative soluzioni, la comunicazione e la condivisione in relazione al problema e ai suoi possibili processi risolutivi, tutte cose che sono certamente rilevanti nell’esercizio delle professioni, ma che hanno anche la dimensione culturale di strumenti per rapportarsi con una società in continua trasformazione, interpretarne i mutamenti, condividere le idee. 2. QUAL È IL PROBLEMA Solo raramente un informatico conosce a priori il problema che dovrà affrontare e che dovrà risolvere attraverso la costruzione di un programma. Quindi, all’inizio, il problema non c’è ancora, o meglio, c’è, ma non si sa ancora bene quale sia. Il primo passo richiede quindi di affrontare lo studio del contesto in cui il problema si manifesta e le speciiche esigenze dell’utente, o degli utenti, che cercano una soluzione a quel problema. Spesso l’utente percepisce le proprie esigenze, ma non è sempre in grado di tradurle in un problema ben formalizzato. Tocca all’informatico far emergere i requisiti del software da sviluppare – arrivare 16 Italian Journal of Educational Technology / Volume 25 / Issue 2 / 2017 cioè a una prima formalizzazione del problema – a partire da una situazione spesso complessa, in cui almeno una parte dei saperi e delle variabili di contesto rilevanti sono inizialmente impliciti. La comprensione e la deinizione del problema non è quindi per l’informatico il punto di partenza, ma un primo punto di arrivo. Questo percorso contrasta con una pratica del problem solving ancora fortemente presente nei nostri sistemi educativi. Spesso i problemi che sono proposti agli allievi sono già ben formalizzati, sterilizzati da tutte le complessità, i saperi impliciti e le ambiguità di un contesto che, di solito, non fa neppure parte dell’enunciato del problema. Si perde così una parte del problem solving molto preziosa e ricca dal punto di vista cognitivo: il percorso che porta da una situazione problematica all’identiicazione di uno speciico problema suficientemente formalizzato e tale da poter essere risolto. D’Amore e Fandiño Pinilla (2006) deiniscono «un vero e proprio problema scolastico» quello in cui «tutti gli ingredienti sono al posto giusto … dati numerici, situazione ittizia ma comprensibile ed immaginabile, un quasi - suggerimento semantico delle operazioni necessarie…» (p. 647). In questo caso il modo di pensare degli informatici può suggerire all’educazione un tipo di percorso in cui, quando è opportuno e possibile, si parte da una esigenza o da un obiettivo per arrivare, attraverso una fase di esplorazione e di analisi, ad un problema speciico a cui si deve trovare una soluzione. Ai docenti è richiesto un vero e proprio percorso di invenzione didattica che deve naturalmente tener conto dell’età, della capacità di astrazione raggiunta dagli allievi e dello speciico ambito contenutistico/disciplinare in cui ci si muove. È importante osservare che il modo di procedere che gli informatici utilizzano per “capire qual è il problema” è applicabile in una molteplicità di situazioni anche quando l’obiettivo inale non è la costruzione di un programma. In altri termini “capire qual è il problema” fa parte del modo di pensare dell’informatico, ma non implica necessariamente il rapporto con una attività di programmazione. 3. COSA DEVE FARE UN PROGRAMMA? Una volta capito qual è il problema, l’informatico deve descrivere il comportamento di un programma capace di risolverlo. Si parla di deinizione delle speciiche del programma (come il programma deve comportarsi) o anche della sua architettura funzionale, cioè il complesso di funzioni che il programma deve svolgere insieme con le loro reciproche interrelazioni. Mentre la fase precedente ha soprattutto a che fare con la domanda “perché si deve realizzare un certo programma”, questa seconda fase si riferisce alla domanda “cosa deve fare quel programma”. Come vedremo successivamente, la terza domanda a cui rispondere sarà “come si deve costruire il programma” perché svolga correttamente le funzioni previste dalle speciiche. Il perché prima del cosa e il cosa prima del come. Va detto chiaramente che non si tratta di una regola rigida e implacabile. Ci sono casi in cui, per deinire il comportamento di un programma (cosa) si deve tener conto per esempio degli ambienti software disponibili o di parti di software esistenti da riutilizzare, tutte cose che rientrano nell’ambito del come. Così come per deinire i bisogni dell’utente e i requisiti di un programma (perché) si dovrà, per esempio, tener conto di architetture già esistenti. Nonostante questi tre momenti non siano sempre del tutto indipendenti fra loro, è comunque importante disporre della capacità di distinguere chiaramente i tre livelli del perché, del cosa e del come. Importante per l’informatico impegnato nello sviluppo di software, ma anche importante in ambito educativo in quanto fattore strategico per leggere la realtà e per operare su di essa. L’informatico che deve progettare l’architettura funzionale di un programma sa bene che non esiste una sola soluzione, ce ne sono molte, di più o meno eficienti, di più o meno resistenti al cambiamento, di più o meno eleganti. Spesso si parte con un impianto iniziale e poi si torna indietro quando ci si imbatte in un ostacolo imprevisto o ci si rende contro che si può fare di meglio. È il cosiddetto bactracking (= tornare sui propri passi) molto praticato dagli informatici sia nel percorso proget17 Giorgio Olimpo tuale, che non è quasi mai del tutto lineare, sia come tecnica algoritmica all’interno dei loro programmi. Anche se qualcosa sta iniziando a cambiare, nei nostri sistemi educativi è ancora presente una visione secondo la quale i problemi vengono spesso proposti come qualcosa che ha una soluzione unica ed un unico percorso risolutivo. Già verso la metà del secolo scorso era stata evidenziata l’importanza educativa di adottare un atteggiamento differente. Polya (1945) afferma «…dovreste adottare un modo di pensare lessibile e chiedervi se c’è un altro modo più semplice di risolvere il problema. Di solito esiste più di un percorso risolutivo corretto». Uno dei valori impliciti nel prendere in considerazione soluzioni diverse per metodo e/o per risultato è quello di attivare nelle classi un processo di discussione-argomentazione sulla natura e sulle caratteristiche delle diverse soluzioni individuate favorendo così lo sviluppo del pensiero critico (Halpern, 2003).Tuttavia nella pratica didattica, questo non è sempre agevole da mettere in atto sia per vincoli temporali legati al curriculum, sia per le competenze di cui i docenti devono disporre. Integrare nel curriculum uno spazio dedicato al pensiero computazionale, come è avvenuto o sta avvenendo in molti paesi (Bocconi et al., 2016), può rappresentare una specie di cavallo di Troia per espugnare la visione unicistica della soluzione dei problemi, ed aprire di conseguenza l’educazione ad un processo di problem solving più vicino alla realtà, più motivante per gli allievi e più ricco di signiicati educativi. Per quanto riguarda le competenze docenti, D’Amore (2014) afferma «Ci vuole coraggio, ci vuole prontezza, ci vuole professionalità per accettare soluzioni inattese…Se tu hai già in mente una risposta, farai molta fatica a metterti nei panni altrui per capire quel che ha in mente l’altro. Ma è il confronto fra la tua soluzione e le proposte degli altri a creare sviluppo cognitivo vero, a creare professionalità, come avviene nella ricerca scientiica quando più scienziati si confrontano ...». Si tratta quindi di mettere in atto un percorso di formazione dei docenti non inalizzato alla semplice acquisizione di competenze teoriche. In Bocconi et al. (2016) si afferma: «esiste un ampio consenso fra gli esperti e gli operatori della formazione sul fatto che l’introduzione del pensiero computazionale nei curricula scolastici sta creando una forte domanda di sviluppo professionale in servizio su larga scala. Le attività di aggiornamento sono spesso progettate per essere hands-on in modo che gli insegnanti possano più facilmente trasferire le loro competenze nelle classi». 4. PROGETTARE LA STRUTTURA DI UN PROGRAMMA I programmi possono essere entità complesse e di grandi dimensioni e, normalmente vengono organizzati in moduli, ossia componenti che, interagendo fra loro, danno attuazione alle funzioni identiicate nelle speciiche. La suddivisione di un programma in moduli potrebbe apparire soprattutto come un’esigenza tecnica legata alla necessità di frammentare un programma di grandi dimensioni in componenti di dimensione e complessità contenuta. Ma esistono altre ragione per suddividere un programma in moduli. Una delle più importanti è l’esigenza di incapsulare quelle parti di programma prevedibilmente soggette a modiica, per esempio, a causa del cambiamento di fattori esterni di cui il programma deve tenere conto. Concentrando in un solo modulo tutti gli aspetti relativi a quei fattori, tutte le volte che ci sarà un cambiamento, sarà suficiente sostituire quel modulo lasciando tutto il resto del programma invariato. In realtà, da un punto di vista concettuale, la suddivisione in moduli è la controparte strutturale del processo di astrazione che l’informatico ha messo in atto nella costruzione delle speciiche. Un modulo altro non è che una entità concreta che ha il compito di attuare una funzione astratta prevista dalle speciiche. David Parnas (1972), uno dei padri dell’Ingegneria del Software, scrisse che il compito principale di un modulo è nascondere un segreto, o, in altri termini, un dettaglio che a un certo livello di astrazione non è opportuno conoscere o rendere visibile. Questo perché mescolare livelli di dettaglio differenti rende i programmi meno leggibili e favorisce gli errori. Nascondere un segreto ha anche un altro signiicato: introdurre, nella struttura del programma, una separazione netta fra il cosa e il come. Deinire un modulo signiica deinire con 18 Italian Journal of Educational Technology / Volume 25 / Issue 2 / 2017 precisione la sua interfaccia, ma non il suo contenuto (di cui ci si occuperà nella successiva fase di codiica). Mentre l’interfaccia e la funzione svolta da un modulo sono pubbliche, il suo contenuto è strettamente privato, ignoto a tutti gli altri moduli. L’architettura di un programma può così essere pensata, e anche già parzialmente realizzata, come una collezione di moduli molto spesso organizzati in forma gerarchica. Ciascun modulo svolge una speciica funzione più o meno complessa e la comunicazione fra i moduli avviene attraverso le loro interfacce. L’organizzazione di un programma in moduli può essere un processo ricco e signiicativo anche dal punto di vista dell’educazione al pensiero computazionale. Deinire quali sono i moduli di un programma implica l’analisi di vari fattori e quindi porsi domande che aiutino a rilettere prima di decidere. A titolo di esempio, citiamo alcune domande che rappresentano possibili direzioni di rilessione. Qual è la ripartizione in moduli che meglio evidenzia le funzioni svolte dal programma? Quali sono le variazioni del problema (e quindi del programma) a cui potremo dovere/volere fare fronte? E quale ripartizione in moduli faciliterà maggiormente le possibili evoluzioni del programma? Come deinire l’interfaccia di un modulo per dare evidenza alla logica del programma e favorirne la correttezza? Come utilizzate la ripartizione in moduli per favorire la collaborazione fra gruppi? E, non meno importante da un punto di vista concettuale, quale nome dare ai moduli per rendere evidente a colpo d’occhio la funzione svolta? 5. L’INFORMATICO: UN PARTICOLARE TIPO DI PROGETTISTA Molti degli approcci concettuali che sono stati messi in luce ino ad ora non si riferiscono in modo esclusivo al modo di pensare degli informatici. Analizzare a fondo il contesto e i bisogni dell’utente, deinire i requisiti di una soluzione, descrivere e comunicare la soluzione concettuale ideata, dare forma concreta alle componenti del progetto, distinguere chiaramente i tre momenti del perché, del cosa e del come sono tutti fattori che in larga misura caratterizzano qualunque tipo di attività progettuale. Quello che può cambiare sono i linguaggi di rappresentazione che i diversi progettisti applicano nelle diverse fasi della loro attività. Per esempio la progettazione in ambito meccanico richiederà strumenti concettuali e linguistici completamente diversi da quella in ambito elettronico o civile. Quindi, il modo di pensare degli informatici ha molto in comune con quello di molti altri progettisti. Vi è tuttavia una differenza signiicativa che non si riferisce soltanto alla natura dei sistemi progettati e ai linguaggi di progetto utilizzati. Mentre gli altri progettisti hanno un loro ambito di azione ben deinito – la meccanica o l’elettronica o le costruzioni civili, solo per citare qualche esempio - l’informatico non ha un proprio settore di azione speciico. La vocazione dell’informatica è proprio quella di dialogare con le situazioni problematiche più diverse per trovare soluzioni attraverso lo sviluppo di software. Questo non signiica che un informatico non possa o non debba avere un suo settore di specializzazione, ma signiica che l’informatica dispone di strumenti concettuali di valore generale applicabili a una molteplicità di situazioni. Forse è proprio questa una delle ragioni più importanti per l’introduzione del pensiero computazionale in ambito educativo: la sua potenziale declinabilità con una grande varietà di ambiti disciplinari e tematici. L’informatica mette a disposizione delle cosiddette fasi alte dello sviluppo del software – quelle fasi cioè in cui non si pensa ancora al codice, ma a modellare e rappresentare i problemi e le soluzioni – una varietà di strumenti concettuali, veri e propri linguaggi che non hanno natura algoritmica, ma sono strumenti di rappresentazione e di speciica (Olimpo, 2011). Essi potrebbero agevolmente essere utilizzati nell’educazione, eventualmente in forma sempliicata, con diverse inalità: rappresentare situazioni e problemi sostenendo il processo di comprensione e scoperta, rappresentare soluzioni garantendo la loro intrinseca consistenza, agevolare la collaborazione e aiutare la comunicazione. Senza voler entrare nel dettaglio, si possono citare alcuni esempi di linguaggi che, per la loro semplicità concettuale e per la loro natura graica facilmente interpretabile anche dai non esperti, si prestano natural19 Giorgio Olimpo mente ad una utilizzazione in ambito educativo: le Reti Semantiche, le Reti di Petri, gli schemi Entità Relazione, le Ontologie e, perché no, anche le mappe concettuali, ben note in ambito educativo e utilizzate con maggiore rigore e disciplina in ambito professionale, per esempio, per far emergere e rappresentare saperi impliciti. Questi linguaggi, ino ad oggi, hanno ricevuto scarsa attenzione in ambito educativo. Pochissime le eccezioni come p. es. Demo (2013) o Stroedter (2012). Probabilmente la ragione è che questi linguaggi si riferiscono ad aree dell’informatica meno note, ritenute astratte, complesse e scarsamente operative, che non offrono cioè un riscontro di concretezza paragonabile all’esecuzione di un programma. L’ipotesi che qui si suggerisce è che proporre in ambito educativo, sia pure in forma sempliicata, alcuni dei linguaggi/ strumenti di rappresentazione utilizzati dagli informatici sia non solo possibile, ma anche ricco di signiicati in relazione ai processi di costruzione del sapere. Va detto che si ratta di un percorso in gran parte da costruire. Secondo Wing (2017), «Ci sono delle interessanti domande di ricerca a cui gli informatici dovrebbero trovare una risposta in collaborazione con le comunità delle scienze cognitive e delle scienze dell’apprendimento. In primo luogo, quali concetti dell’informatica dovrebbero essere insegnati, a che livello scolare e con quale metodo». È necessario formulare ipotesi realistiche sui linguaggi e sulle forme di astrazione che si possono proporre ai diversi livelli scolari. È necessario far convergere competenze informatiche disciplinari, didattiche e cognitive per esplorare come i diversi linguaggi possono arricchire la didattica dei diversi ambiti disciplinari e tematici e, nello stesso tempo, contribuire a forgiare capacità di astrazione, collaborazione, comunicazione e costruzione del sapere. Ed è anche necessario disporre di adeguati strumenti software orientati al mondo dell’educazione. Oggi è disponibile una varietà di strumenti professionali per supportare le fasi alte dello sviluppo del software, ma non ne esistono di speciicamente orientati al mondo dell’educazione in termini di semplicità d’uso, qualità delle interfacce e funzionalità offerte. Solo per citare qualche esempio, fra i molti ambienti per il progetto di Reti di Petri, Woped1 è uno dei più semplici da utilizzare, ma la sua interfaccia è troppo povera, non suficientemente motivante e scarsamente adatta a dare evidenza agli aspetti semanticamente rilevanti di una Rete; esistono strumenti per tracciare schemi Entità-Relazione come SmartDraw2 che hanno una buona qualità graica, ma non vanno oltre al semplice tracciamento dello schema e non consentono di fare operazioni strutturali o semantiche su di esso. Inine, val la pena di accennare come, da poco più di un decennio, si stiano diffondendo sempre più metodologie di tipo agile (Fowler & Highsmith, 2001) che si contrappongono al tradizionale processo di sviluppo del software proponendo un approccio meno strutturato, basato sempre meno su documenti descrittivi e sempre più sulla realizzazione rapida di una successione di prototipi funzionanti che costituiscono approssimazioni via via migliori e più complete del sistema che si vuole realizzare. In questo modo la comunicazione avviene sempre meno attraverso documenti e sempre più attraverso prototipi funzionanti, anche solo parzialmente. Naturalmente anche con questo tipo di approcci, l’utilizzazione di linguaggi di rappresentazione e di speciica mantiene comunque un ruolo importante perché consente di disporre di una base concettuale di riferimento, sia pure in costante evoluzione, allo sviluppo dei prototipi. I successivi prototipi diventano così uno strumento agevole di comunicazione con chi non ha il tempo o la competenza per seguire un approccio più astratto e formalizzato e fanno convergere in modo rapido e sicuro verso il prodotto inale. Dal punto di vista educativo, la metodologia agile potrebbe essere interessante da esplorare. È infatti un approccio facilmente utilizzabile da chi e con chi non ha ancora suficienti capacità di astrazione per utilizzare linguaggi formali; e introduce una nuova modalità di comunicazione attraverso artefatti, che consente di trasferire agevolmente e concretamente un’idea complessa. 1 http://woped.dhbw-karlsruhe.de/woped/ 2 https://www.smartdraw.com/ 20 Italian Journal of Educational Technology / Volume 25 / Issue 2 / 2017 6. PARLIAMO DI CODING «Informatica non equivale a programmazione. I giornali inglesi hanno pubblicato molti articoli con titoli del tipo “Perché dobbiamo insegnare il coding ai nostri bambini?” o “Coding, il nuovo Latino”. Il pericolo è che insegnanti e politici, decidano di attivare, per esempio, dei corsi del linguaggio Java per i quattordicenni e dichiarino il problema risolto. Nella scienza c’è un’analogia che può essere di aiuto. La isica, senza il lavoro di laboratorio sarebbe soltanto un’ombra di sé stessa, proprio come l’informatica senza programmazione sarebbe quasi un ossimoro. Ma nessuno si sognerebbe di far frequentare agli studenti un laboratorio di isica senza insegare loro la isica» (Peyton Jones, Mitchell, & Humphreys, 2013). Un tempo la scrittura del codice che concludeva il percorso di progettazione del software, era considerata l’attività meno pregiata, lasciata ai cosiddetti programmatori, coloro che dovevano semplicemente scrivere parti di codice che si comportassero esattamente come qualcun altro aveva deciso. Semplici esecutori dunque. Questa concezione era nata soprattutto in connessione con lo sviluppo di applicazioni gestionali considerate all’epoca dagli informatici le più routinarie e meno complesse da un punto di vista concettuale. Col tempo, l’attività di codiica, non importa in quale linguaggio di programmazione, si è, per così dire, rivalutata. Dal punto di vista educativo, saper programmare è certamente un valore. Signiica aver capito cosa è un algoritmo e saper costruire algoritmi per risolvere problemi, non importa se in una dimensione reale o di gioco; signiica saper comunicare in modo rigoroso con il computer che non ammette forme di comunicazione ambigua o approssimativa; e implica un certo patrimonio di conoscenza tecnologica per interagire con un computer e con un ambiente di programmazione. Qui non ci occuperemo dei meccanismi concettuali più signiicativi che la programmazione mette in gioco dal momento che numerosi autori lo hanno già fatto, p.es. (Brennan & Resnick, 2012) e (Olimpo, 2015). Si ritiene, a ragione, che la prima proprietà che un programma o un modulo di programma deve possedere sia la correttezza. Questo signiica che il programma deve fornire risultati corretti per tutte le possibili combinazioni di dati di ingresso valide per quel tipo di programma. È un concetto semplice da capire, ma molto dificile da mettere in pratica per il fatto che spesso le combinazioni possibili di dati di ingresso sono in numero così elevato che non è pensabile veriicare il comportamento del programma in ogni possibile situazione. Non è suficiente far girare qualche volta un programma con successo per dichiararlo corretto. Particolarmente critici sono alcuni settori come la programmazione parallela in cui gli errori diventano, per così dire, sfuggenti: a parità di dati di ingresso possono manifestarsi o non manifestarsi in base a come il computer porta avanti l’esecuzione del programma. Senza entrare nei temi classici del testing, delle dimostrazioni formali di correttezza o della ricerca degli errori nella programmazione (Ammann & Offut, 2017), ci limitiamo a osservare che scrivere il codice di un programma o di un modulo di programma comporta affrontare il formidabile problema concettuale della sua correttezza. E questo vale per il programma nella sua interezza e per ogni singolo modulo del programma. Se ci riferiamo all’educazione il problema della correttezza richiede non soltanto una buona conoscenza del processo algoritmico e dei tecnicismi dei linguaggi di programmazione, ma richiede di penetrare il comportamento del programma a un certo livello di profondità sia sul piano tecnico che su quello concettuale. Rappresenta un ottimo addestramento della capacità di indagine, un po’ come capire chi è il colpevole di un crimine sulla base di indizi, o come capire il perché di un comportamento anomalo o inatteso in un esperimento scientiico. Già negli anni ottanta del secolo scorso Klahr e McCoy Carver (1988) avevano condotto interessanti esperimenti in ambito educativo sul tema della ricerca degli errori nei programmi. Questa ricerca era volta a identiicare quali abilità fossero trasferibili e in quali contesti lo fossero con l’obiettivo di strutturare le attività di insegnamento/apprendimento in modo tale da favorire il transfer. Tuttavia la correttezza /on è la sola proprietà interessante del codice. Programmare è un po’ come scrivere. Si può scrivere bene o male. Capire il signiicato di un testo può essere facile o dificile. Leggere un testo 21 Giorgio Olimpo può essere interessante o noioso. La stessa cosa avviene con i programmi. I buoni informatici sanno che nella programmazione possiamo trovare anche una dimensione estetica. Sanno che la chiarezza, la sinteticità e l’eleganza, oltre naturalmente alla correttezza, sono proprietà fondamentali dei programmi: «…considero la programmazione un atto creativo che necessariamente coinvolge l’estetica. Alcuni considerano l’estetica nemica del pragmatismo e sostengono che non si dovrebbe perder tempo a scrivere codice elegante quando invece si può usare il tempo per scrivere codice eficiente. Tuttavia ritengo che il senso estetico sia il miglior servitore del pragmatismo perché porta a programmi più concisi e di più facile manutenzione…» (Verborgh, 2013, p.1). Perché chiarezza ed eleganza sono proprietà importanti di un programma? La risposta è che produrre codice non è semplicemente una attività di comunicazione fra l’uomo e il computer, ma è anche, in egual misura, una attività di comunicazione fra persone. Un programma deve poter esser letto agevolmente da altri per una varietà di ragioni: collaborare a costruirlo, modiicarlo in un momento successivo, correggerlo agevolmente quando durante la vita del programma si manifestano errori, cercare soluzioni utili per la costruzione di un altro programma analogo, o anche soltanto capire come il programma funziona per imparare da un esempio di buona programmazione. Programmare in modo semplice, chiaro ed elegante richiede capacità logiche e, in particolare, una forte capacità di astrazione: “buona programmazione” (Olimpo, 2015), non signiica soltanto costruire buoni algoritmi, ma anche – o forse soprattutto - saper affrontare la complessità attraverso l’astrazione. Ciò che è complesso deve essere espresso in termini di entità più elementari, entità astratte perché ancora non esistono e che il programmatore deve saper inventare. Si tratta di un’invenzione che ha a che fare nello stesso tempo con la logica e con l’arte. Come nell’organizzazione di un discorso. È necessario trovare la struttura giusta, ogni frase deve avere un suo signiicato necessario, ogni parola il suo valore logico ed evocativo. Ne segue che quando si introduce il coding nell’educazione non ci si dovrebbe dare come unico obiettivo la comprensione di tutti gli elementi costitutivi del concetto di algoritmo e la capacità di scrittura di programmi corretti in questo o quel linguaggio di programmazione. Si dovrebbe anche puntare a una concezione dell’algoritmo come atto comunicativo interpersonale dotato di semplicità, eficacia ed eleganza. Non è un percorso semplice. Si possono forse trovare buoni esempi, ma regole da seguire per ottenere con certezza questi risultati non ce ne sono. In realtà, regole ce ne sono molte per esempio, la dimensione contenuta dei moduli, la scelta di nomi evocativi, l’esclusione di variabili di controllo nelle interfacce, ma da sole non sono suficienti. Bisogna esplorare strade alternative e, gradualmente, forgiare la propria capacità di scrittura avendo a disposizione una guida competente. A quanto ci risulta, non esistono ricerche che abbiano dimostrato le possibilità di transfer ad altri ambiti comunicativi. È tuttavia ragionevole ipotizzare che la capacità di costruire programmi eleganti e ben strutturati, in quanto attività concettuale che mette in gioco meccanismi di astrazione, di gestione della complessità e di organizzazione della comunicazione possa favorire la formazione di un atteggiamento comunque utile sia nella comunicazione sia nella costruzione del proprio sapere. 7. CONCLUSIONI Sono state tratteggiate le fasi in cui si articola l’attività dell’informatico impegnato nello sviluppo di software, e sono stati delineati, a grandi linee, i relativi strumenti e atteggiamenti di pensiero e alcuni loro possibili signiicati in ambito educativo. Nella maggior parte sono signiicati ancora da esplorare. Nella sua più recente deinizione, Wing (2017) dice che «il pensiero computazionale è il processo di pensiero messo in gioco nel formulare un problema e nell’esprimere le sue soluzioni in modo tale che un agente computazionale – uomo o macchina – possa eficacemente portare a termine il processo risolutivo». E ancora «Il termine esprimere signiica creare una rappresentazione linguistica con l’obiettivo di comunicare una 22 Italian Journal of Educational Technology / Volume 25 / Issue 2 / 2017 soluzione ad altre persone o a una macchina». Tuttavia, nella ricerca educativa e nella pratica didattica resta ancora da approfondire sia il processo di formulazione del problema, (quello che gli informatici affrontano nella prima fase dello sviluppo del software) sia l’aspetto della espressione delle soluzioni (quello che gli informatici affrontano nelle successive fasi di speciica funzionale, strutturazione e codiica del programma). Quelli che sono stati approfonditi in maniera privilegiata sono soprattutto i valori che il coding può portare all’educazione. E questo è avvenuto in modo particolare per i livelli scolari più bassi dove sarebbe stato dificile proporre altri aspetti del pensiero computazionale a causa dei limiti legati alle capacità di astrazione degli allievi. In questo ambito, i riferimenti non mancano, basti pensare, solo per citare gli esempi più famosi, al lavoro fondazionale di Papert (1980) e, in tempi più recenti, di altri ricercatori come Mitchel Resnik (Brennan & Resnick, 2012). Ma per i livelli scolari più elevati, anche il coding è stato scarsamente esplorato nelle sue dimensioni non strettamente tecniche, soprattutto in relazione alla dimensione di strumento per la comunicazione con altre persone. Con rare eccezioni, come Hazzan, Lapidot e Ragonis (2014), è molto dificile trovare riferimenti organici alla didattica dell’informatica per la fascia della scuola secondaria. Rimane quindi ancora un ampio spazio di ricerca per estendere la portata del pensiero computazionale in ambito educativo. La direzione è quella di arrivare ad abbracciare tutto l’arco scolastico cercando di declinare i diversi approcci di pensiero adottati dagli informatici a cui si è fatto cenno con i diversi livelli scolari e con i diversi ambiti disciplinari e tematici. Questo processo presenta dificoltà oggettive e passa necessariamente da una ricerca educativa i cui obiettivi generali indicati da Wing (2017) sono già stati menzionati. Non è solo una questione di curriculum. In alcune discipline come la Matematica e la Fisica, la ricerca educativa ha fatto molto lavoro sulla didattica disciplinare e in particolare sulla cosiddetta conoscenza pedagogico contenutistica (PCK) (Abell, 2008). Per quanto riguarda l’informatica, «la conoscenza pedagogico contenutistica dei docenti, le loro convinzioni e i loro orientamenti svolgono un ruolo di grande importanza ai ini di un insegnamento eficace. Fino ad ora, questo ambito di ricerca è stato affrontato soltanto in modo occasionale e non esiste un modello consistente delle competenze necessarie per l’insegnamento dell’informatica» (Bender et al., 2015). Il quadro si fa ulteriormente complesso se si tiene conto del fatto che gli aspetti relativi alla PCK non hanno una dimensione univoca ma sono fortemente dipendenti dalle scelte di sistema relative a come il pensiero computazionale viene integrato nel curriculum (materia a se stante e, se si, a partire da quale livello scolare, inserito all’interno di una disciplina scientiica, argomento cross-curricolare…). In tutti i casi esiste una forte esigenza di raccordo con e fra le discipline legata al fatto che il pensiero computazionale è per sua natura trasversale e non sussiste in astratto, ma si esercita nell’ambito di problematiche reali disciplinari o comunque tematiche come alcune deinizioni alternative a quella proposta da Janette Wing suggeriscono in modo esplicito: «Il pensiero computazionale è il processo di riconoscere aspetti di computazione nel mondo che ci circonda e di applicare strumenti e tecniche dell’Informatica per capire sistemi e processi sia naturali che artiiciali e ragionare su di essi» (The Royal Society, 2012, p.29). Oltre agli aspetti di ricerca, per portare nella scuola una visione allargata del pensiero computazionale che davvero riletta i valori concettuali presenti nel modo di pensare degli informatici, esistono formidabili problemi di formazione dei docenti a cui si è già fatto cenno che rendono comunque necessario un approccio graduale per l’introduzione del pensiero computazionale nella scuola. I problemi non riguardano soltanto il numero di docenti da formare, ma anche, o forse soprattutto, la natura della formazione richiesta. Per avvicinare i metodi degli informatici all’educazione bisogna avere una conoscenza suficientemente approfondita di quei metodi, conoscenza di cui gli insegnanti di solito non dispongono. I concetti della buona programmazione e più in generale del pensiero computazionale cui si è fatto cenno sono apparentemente facili da capire, ma dificili da praticare. Richiedono, in qualche misura, di ri-forgiare il proprio modo di 23 Giorgio Olimpo organizzare il pensiero, di affrontare i problemi, di rappresentare le soluzioni e di strutturare la comunicazione. È un compito che richiede tempo, impegno personale, guida e orientamento. Non è semplice e non coincide, se non in piccola parte, con l’apprendimento di un linguaggio di programmazione. Secondo The Royal Society (2012), «c’è bisogno di migliorare la comprensione della natura e delle implicazioni dell’introduzione del pensiero computazionale nella scuola». L’esistenza di domande ancora aperte non signiica che si debba aspettare di avere tutte le risposte. In molti paesi, in modo più o meno pragmatico, è stato introdotto o si sta introducendo, con differenti modalità, il pensiero computazionale nei curricula ai diversi livelli scolari. Si tratta di un processo «molto promettente che può aiutare a preparare i bambini alle side future di una società sempre più digitalizzata…Ma, nelle prossime decadi, saranno i risultati che dovranno dimostrare che il pensiero computazionale ha una reale inluenza sull’apprendimento e sulle abilità cognitive dei bambini. Via via che emergeranno risultati tangibili relativamente alle speciiche implementazioni e alle scelte pedagogiche fatte nei diversi paesi, lo scambio di esperienze e di lezioni imparate a livello europeo e internazionale diventerà un fattore di importanza cruciale» (Bocconi et al., 2016, p.52). Si potrà così arrivare ad una visione del pensiero computazionale fondata anche su ipotesi confermate dall’esperienza. 8. BIBLIOGRAFIA Abell, S. K. (2008). Twenty years later: Does pedagogical content knowledge remain a useful idea?. International Journal of Science Education, 30(10), 1405-1416. doi:10.1080/09500690802187041 Ammann, D. P., & Offut, J. (2017). Introduction to Software Testing. Cambridge, UK:Cambridge University Press. Barr, D., Harrison, J., & Conery, L. (2011). Computational Thinking: A Digital Age Skill for Everyone. Learning & Leading with Technology, 38(6), 20–23. Retrieved from http://www.iste.org/docs/learningand-leading-docs/march-2011-computational-thinking-ll386.pdf Bender, E., Hubwieser, P., Schaper, N., Margaritis, M., Berges, M., Ohrndorf, L., ... & Schubert, S. (2015). Towards a competency model for teaching computer science. Peabody Journal of Education, 90(4), 519-532. doi:10.1080/0161956X.2015.1068082 Bocconi, S., Chioccariello, A., Dettori, G., Ferrari, A., & Engelhardt, K. (2016). Developing computational thinking in compulsory education – Implications for policy and practice. EUR 28295 EN; doi:10.2791/792158 Brennan, K., & Resnick, M. (2012). New frameworks for studying and assessing the development of computational thinking. In Proceedings of the Congress of the American Educational Research Association (pp. 1-25). Vancouver, CA: American Educational Research Association. Retrieved from http://web.media.mit.edu/~kbrennan/iles/Brennan_Resnick_AERA2012_CT.pdf D’Amore B. (2014). Le tante soluzioni di un problema. La Vita Scolastica (GiuntiScuola), 69(1), 25. Retrieved from http://www.dm.unibo.it/rsddm/it/articoli/damore/838%20Le%20tante%20soluzioni%20di%20un%20problema.pdf D’Amore B., & Fandiño Pinilla, M. I. (2006). Che problema i problemi! L’insegnamento della matematica e delle scienze integrate, 29(6), 647. Retrieved from http://www.dm.unibo.it/rsddm/it/articoli/damore/588%20%20Problemi.pdf Demo, B. G. (2013, July). Reading data schemas and knowing a db query interface in non technical secondary schools. Paper presented at X World Conference on Computers in Education, Toruń, Poland 24 Italian Journal of Educational Technology / Volume 25 / Issue 2 / 2017 (pp. 112-120). Retrieved from http://wcce2013.umk.pl/publications/v2/V2.14_196-Demo-fullN.pdf European Commission (2015). Relazione congiunta del Consiglio e della Commissione sull’attuazione del quadro strategico per la cooperazione europea nel settore dell’istruzione e della formazione (ET 2020) — Nuove priorità per la cooperazione europea nel settore dell’istruzione e della formazione. Gazzetta Uficiale dell’Unione Europea. Retrieved from http://eur-lex.europa.eu/legal-content/IT/TXT/PDF/?uri=CELEX:52015XG1215(02)&from=IT European Commission. (2016). A new skills agenda for Europe. Working together to strengthen human capital, employability and competitiveness. Gazzetta Uficiale dell’Unione Europea. Retrieved from https://ec.europa.eu/transparency/regdoc/rep/1/2016/EN/1-2016-381-EN-F1-1.PDF Fowler M. and Highsmith J. (2001). The Agile Manifesto. Retrieved from http://agilemanifesto.org/ Halpern, D. (2003). Thought and knowledge: An introduction to critical thinking (4th edition). Mahwah, NJ: Earlbaum. O. Hazzan, T. Lapidot, N. Ragonis (2014). A Guide to Teaching Computer Science. London, UK: Springer-Verlag Klahr, D., & Carver, S. M. (1988). Cognitive objectives in a LOGO debugging curriculum: Instruction, learning, and transfer. Cognitive Psychology, 20(3), 362-404. doi:10.1016/0010-0285(88)90004-7 Manilla L., Dagiene, V., Demo, B., Grgurina, N., Mirolo, C., Rolandsson, L., & Settle, A. (2014). Computational Thinking in K-9 Education. In M. Goldweber (Ed.), ITiCSE-WGR ‘14 Proceedings of the Working Group Reports of the 2014 on Innovation & Technology in Computer Science Education Conference (pp. 1-29). Uppsala, SE: Uppsala Universitet. doi:10.1145/2713609.2713610 Olimpo G. (2011). Information lows and graphic knowledge representations. Trentin G. (Eds.), Technology and knowledge lows: the power of network (pp. 91-132). Oxford, UK: Chandos Publishing. Olimpo, G. (2015). Pensiero computazionale = buona programmazione e non solo. In V. Midoro (Ed.), La scuola ai tempi del digitale (pp. 60-84). Milano, IT: Franco Angeli Editore. Papert, S. (1980). Mindstorms: Children, computers, and powerful ideas. New York, NY: Basic Books. Parnas D. (1972). On the criteria to be used in decomposing systems into modules. Communications of the ACM, 14(1), 1053-1058. Retrieved from https://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf Polya G. (1945). How to Solve It. Princeton, NJ: Princeton University Press (trad. it. Come risolvere i problemi di matematica, UTET Università, Torino, 2016). Peyton Jones, S., Mitchell, B., & Humphreys, S. (2013, April). Computing at school in the UK. Microsoft Research Paper, 4. Retrieved from https://www.microsoft.com/en-us/research/wp-content/uploads/2016/07/ComputingAtSchoolCACM.pdf Strödter, C. (2012, November). Data modeling and database systems as part of general education in CSE. In Proceedings of the 7th Workshop in Primary and Secondary Computing Education (pp. 137-140). New York, NY: ACM. doi:10.1145/2481449.2481481 The Royal Society. (2012). Shut down or restart? The way forward for computing in UK 25 Giorgio Olimpo Schools. London, UK: The Royal Society. Retrieved from https://royalsociety.org/~/media/education/computing-in-schools/2012-01-12-computing-in-schools.pdf Verborgh, R. (2013). Programming is an art [blog post]. Retrieved from http://ruben.verborgh.org/blog/2013/02/21/programming-is-an-art/ Weintrop, D., Beheshti, E., Horn, M., Orton, K., Jona, K., Trouille, L., & Wilensky, U. (2016). Deining computational thinking for mathematics and science classrooms. Journal of Science Education and Technology, 25(1), 127-147. doi:10.1007/s10956-015-9581-5 Wing, J. M. (2006). Computational thinking. Communications of the ACM, 49(3), 33-35. doi:10.1145/1118178.1118215 Wing J. (2017). Computational Thinking’s Inluence on Research and Education for All. International Journal of Educational Technology, 25(2). doi:10.17471/2499-4324/922 26