Dal problema all'algoritmo
Fin dal primo argomento del corso, parlando di informatica in generale, abbiamo incontrato il concetto di algoritmo: una sequenza finita di istruzioni che risolve un problema, con le sue quattro proprietà (finito, deterministico, non ambiguo, generale). In questo ultimo blocco di argomenti del corso vediamo come si arriva davvero, passo dopo passo, da un problema reale a un buon algoritmo: il cosiddetto pensiero computazionale, un modo di ragionare utile ben oltre l'informatica.
Il pensiero computazionale è un metodo per affrontare problemi complessi, nato nell'informatica ma utile in qualsiasi ambito della vita quotidiana e non solo. Si basa su quattro fasi principali, spesso applicate una dopo l'altra:
- Scomposizione: dividere un problema grande in sotto-problemi più piccoli e gestibili
- Riconoscimento di pattern: individuare somiglianze o schemi che si ripetono tra problemi simili
- Astrazione: concentrarsi sui dettagli davvero importanti, ignorando quelli superflui
- Formulazione dell'algoritmo: scrivere la sequenza di passi che risolve il problema, come già visto
I quattro pilastri del pensiero computazionale
Scomposizione: dividere un problema in parti più piccole. Riconoscimento di pattern: notare somiglianze con problemi già affrontati. Astrazione: ignorare i dettagli superflui, concentrandosi su ciò che conta davvero. Algoritmo: scrivere la sequenza di passi che risolve il problema. Le prime tre fasi preparano il terreno; l'ultima produce la soluzione vera e propria.
Prima di vedere le altre tre fasi in dettaglio con esempi concreti, ricordiamo che si applicano di solito nell'ordine appena elencato, anche se nella pratica capita spesso di tornare indietro e rivedere una fase precedente man mano che il problema si chiarisce. Vediamo un esempio concreto di scomposizione. Il problema "organizzare una festa di classe" sembra complicato tutto insieme, ma diventa gestibile se lo dividiamo in sotto-problemi più piccoli: stilare la lista degli invitati, scegliere il luogo, occuparsi del cibo, organizzare la musica. Ogni sotto-problema può a sua volta avere un proprio piccolo algoritmo, e puo' essere affrontato separatamente magari da persone diverse, come nel lavoro di squadra su un progetto scolastico.
Una strategia militare diventata una strategia di programmazione
La scomposizione di un problema grande in problemi piu' piccoli ha un nome tecnico ancora piu' specifico in informatica: "divide et impera" (dal latino, "dividi e domina"), la stessa espressione che secondo la tradizione descriveva le strategie politiche e militari dell'antica Roma per gestire territori vasti dividendoli in parti piu' piccole da controllare separatamente. Oggi "divide and conquer" e' il nome di un'intera famiglia di algoritmi basati esattamente su questo principio.
Dopo aver scomposto un problema, spesso conviene chiedersi se qualcuno dei sotto-problemi assomiglia a qualcosa gia' risolto in passato, magari in un contesto completamente diverso: riutilizzare una soluzione gia' pronta fa risparmiare tempo prezioso.
Un esempio di riconoscimento di pattern
Immagina di dover calcolare l'area di tre stanze rettangolari diverse per un preventivo. Anche se le misure cambiano ogni volta, il procedimento e' sempre lo stesso: base per altezza. Riconoscere questo pattern (schema che si ripete) permette di scrivere una sola procedura generale, riutilizzabile per qualsiasi rettangolo, invece di risolvere ogni caso da zero come se fosse completamente nuovo.
Anche l'astrazione, la terza fase del pensiero computazionale, si vede molto meglio con un esempio concreto che con una sola definizione teorica.
Una mappa che sacrifico' la precisione per la chiarezza
Uno degli esempi piu' famosi di astrazione nella storia del design non viene dall'informatica, ma dai trasporti: nel 1931 il disegnatore Harry Beck reinvento' la mappa della metropolitana di Londra, abbandonando le proporzioni geografiche reali e disegnando solo linee dritte e angoli di 45 o 90 gradi. La mappa risultante era geograficamente scorretta, ma molto piu' facile da leggere: un'astrazione perfetta, che ignora i dettagli superflui (la forma esatta delle strade) per concentrarsi su cio' che conta davvero per chi deve prendere la metro (l'ordine delle fermate e i cambi).
Concluse le prime tre fasi preparatorie, arriviamo finalmente a scrivere davvero l'algoritmo. Un modo utile per farlo prima di tradurlo in un vero linguaggio di programmazione è lo pseudocodice: una via di mezzo tra il linguaggio naturale e il codice, con parole chiave semplici come INIZIO, SE, RIPETI, FINE, ma senza la sintassi rigida di un linguaggio di programmazione vero e proprio, tipica di ogni singolo linguaggio. Permette di concentrarsi sulla logica della soluzione, prima ancora di preoccuparsi dei dettagli tecnici del linguaggio di programmazione che si usera' davvero. Ogni informatico, indipendentemente dal linguaggio che conosce, riesce a capire uno pseudocodice scritto da un altro, proprio perche' non dipende da regole sintattiche specifiche di nessun linguaggio in particolare.
Un esempio concreto di pseudocodice
Ecco come si potrebbe scrivere in pseudocodice un algoritmo che trova il numero piu' grande tra tre numeri: INIZIO — leggi A, B, C — SE A > B E A > C ALLORA massimo e' A — ALTRIMENTI SE B > C ALLORA massimo e' B — ALTRIMENTI massimo e' C — scrivi massimo — FINE. Si legge quasi come una ricetta, ma segue gia' la logica esatta che servira' per scrivere il codice vero e proprio.
Un termine reso famoso nel 2006
Sebbene l'idea sia più antica, il termine "pensiero computazionale" (in inglese computational thinking) diventò davvero popolare grazie a un articolo del 2006 dell'informatica statunitense Jeannette Wing, della Carnegie Mellon University. Wing sostenne che questo modo di ragionare dovrebbe essere una competenza fondamentale per chiunque, non solo per chi programma computer di mestiere: un'abilità di base come saper leggere o fare di conto.
Un paese che rese il pensiero computazionale materia scolastica
Nel 2014 il Regno Unito e' stato tra i primi paesi al mondo a rendere il pensiero computazionale e la programmazione parte obbligatoria del curriculo scolastico nazionale, fin dalle scuole primarie, non solo per chi sceglie un indirizzo tecnico. La scelta segui' proprio le idee diffuse dall'articolo di Jeannette Wing del 2006, e da allora molti altri paesi hanno seguito esempi simili.
►VideoLezione 1 - Il Coding e il Pensiero Computazionale (Informatica - Open Source)
►VideoIl Pensiero Computazionale (Informatica - Open Source)
►VideoPerche' lo pseudocodice? (Lorenzo Morelli - Web Developer)Scomponi il problema
Scegli uno di questi problemi: "preparare la valigia per una gita scolastica" oppure "organizzare lo studio per una verifica di più materie". Scomponilo in almeno quattro sotto-problemi più piccoli, come visto nell'esempio della festa di classe. Scegli poi uno dei sotto-problemi e scrivi il suo algoritmo in pseudocodice, usando parole chiave come INIZIO, SE, RIPETI, FINE.
Nel prossimo argomento vedremo come rappresentare graficamente un algoritmo con i diagrammi di flusso, uno strumento visivo che rende ancora più chiaro, a colpo d'occhio, il percorso dal problema alla soluzione.
Mettiti alla prova
1. Cos'è il pensiero computazionale?
Un metodo per affrontare problemi complessi, basato su scomposizione, riconoscimento di pattern, astrazione e formulazione di un algoritmo.
2. Elenca i quattro pilastri del pensiero computazionale.
Scomposizione, riconoscimento di pattern, astrazione, formulazione dell'algoritmo.
3. Cosa si intende per "scomposizione" di un problema? Fai un esempio.
Dividere un problema grande in sotto-problemi più piccoli e gestibili, ad esempio dividere "organizzare una festa" in invitati, luogo, cibo, musica.
4. Cosa si intende per "astrazione" nel pensiero computazionale?
Concentrarsi sui dettagli davvero importanti di un problema, ignorando quelli superflui.
5. Cos'è lo pseudocodice, e a cosa serve?
È un modo di scrivere un algoritmo a metà tra linguaggio naturale e codice, utile per progettarne la logica prima di tradurlo in un vero linguaggio di programmazione.
6. Richiama le quattro proprietà che deve avere un algoritmo, viste in un argomento precedente.
Finito, deterministico, non ambiguo, generale.
7. Vero o falso: il pensiero computazionale serve solo a chi programma computer.
Falso: è un metodo utile per affrontare problemi complessi in qualsiasi ambito, non solo in informatica.
8. Cosa significa "riconoscere un pattern" in un problema? Fai un esempio.
Individuare uno schema che si ripete tra problemi simili, ad esempio notare che calcolare l'area di rettangoli diversi segue sempre lo stesso procedimento (base per altezza).
9. Da quale espressione latina deriva il nome della strategia "divide and conquer" in informatica?
"Divide et impera" (dividi e domina).
10. Chi disegno' nel 1931 la famosa mappa astratta della metropolitana di Londra, e perche' e' un esempio di astrazione?
Harry Beck; e' un esempio di astrazione perche' ignora le proporzioni geografiche reali per concentrarsi solo su cio' che serve davvero a chi prende la metro (ordine delle fermate e cambi).
11. Quale paese rese il pensiero computazionale materia scolastica obbligatoria gia' nel 2014?
Il Regno Unito.