Pensiero computazionale: il fondamento della programmazione

Il pensiero computazionale non è programmazione. È il modo di pensare che permette di risolvere problemi, grandi o piccoli, scomponendoli in parti gestibili. Lo insegno ai miei studenti del liceo perché è una competenza che serve nella vita, indipendentemente dalla carriera scelta.

Definizione

Pensiero computazionale = saper scomporre un problema complesso in sottoproblemi semplici, riconoscere pattern, e definire una sequenza di passi per risolverlo.

Problema complesso

   Decomposizione

Sottoproblemi semplici

   Riconoscimento pattern

   Algoritmo (sequenza di passi)

   Soluzione

I 4 pilastri del pensiero computazionale

1. Decomposizione (Breaking Down)

Dividere un problema grande in pezzi piccoli e gestibili.

Esempio reale: Organizzare una festa

Problema: Organizzare una festa
  ├─ Invitare persone
  ├─ Preparare cibo
  │  ├─ Scegliere menu
  │  ├─ Fare spesa
  │  └─ Cucinare
  ├─ Decorare
  └─ Gestire timing

Ogni sottoproblema è indipendente (puoi delegare) e risolvibile.

2. Riconoscimento di Pattern (Pattern Recognition)

Identificare somiglianze e pattern ricorrenti per riutilizzare soluzioni.

Esempio: Algoritmo per preparare pasta

1. Riempi pentola con acqua
2. Accendi fuoco
3. Aspetta che bolle
4. Aggiungi sale
5. Aggiungi pasta
6. Aspetta X minuti
7. Scola e servi

Pattern: "Aspetta che bolli", "Aggiungi Y", "Aspetta tempo X"
Riutilizzo: Stesso pattern per preparare riso, patate, verdure

3. Astrazione (Abstraction)

Nascondere i dettagli non necessari per focalizzarsi sull’essenziale.

Esempio: Usare un’app di mappe

ASTRAZIONE: Clicco A e B, mi dice il percorso
DETTAGLI NASCOSTI:
  ├─ Come calcola la strada più breve? (Algoritmo Dijkstra)
  ├─ Come sa dove sei? (GPS + triangolazione)
  ├─ Come scarica mappe? (Tile server)
  └─ Come stima il traffico? (Big data)

Come utente, NON mi interessa. Mi interessa solo: A → B → Percorso

Questo è il potere dell’astrazione: semplificare la complessità.

4. Algoritmo (Algorithm Design)

Sequenza finita di passi ordinati per risolvere il problema.

Esempio: Trovare il numero più grande in una lista

Input: [3, 7, 2, 9, 1, 5]
Output: 9

Algoritmo:
1. Assegna il primo numero come "massimo"
2. Per ogni numero rimanente nella lista:
   a. Se il numero > massimo:
      - Assegna questo numero come nuovo "massimo"
3. Ritorna massimo

Traccia:
Step 1: massimo = 3
Step 2: 
  - 7 > 3? SI → massimo = 7
  - 2 > 7? NO
  - 9 > 7? SI → massimo = 9
  - 1 > 9? NO
  - 5 > 9? NO
Step 3: Ritorna 9 ✓

Come insegno il pensiero computazionale senza codice

Attività 1: Diagrammi di flusso

Rappresentazione visuale di un processo:

         START

    Leggi numero N

    N è pari? ──SI──→ Stampa "Pari" ──┐
           ↓ NO                        │
           └────→ Stampa "Dispari" ←──┘

                     END

Gli studenti disegnano questi diagrammi prima di scrivere codice. Aiuta a visualizzare la logica.

Attività 2: Giochi di logica

Esempio: “8 Puzzle” (sliding puzzle)

Stato iniziale:          Stato target:
┌─┬─┬─┐               ┌─┬─┬─┐
│1│2│3│               │1│2│3│
├─┼─┼─┤               ├─┼─┼─┤
│4│5│6│               │4│5│6│
├─┼─┼─┤               ├─┼─┼─┤
│7│8│ │               │7│8│9│
└─┴─┴─┘               └─┴─┴─┘

Problema: Come ordinare i numeri?
Decomposizione: Muovi ogni numero nella posizione corretta
Pattern: BFS (Breadth-First Search) per trovare il percorso

Attività 3: Pseudocodice

Scrivere la logica in linguaggio quasi-naturale prima del codice vero:

ALGORITMO: Calcola media di N numeri

INPUT: lista di numeri
VARIABILI: somma = 0, contatore = 0, media

PER OGNI numero nella lista:
  somma = somma + numero
  contatore = contatore + 1

media = somma / contatore
RITORNA media

Una volta che la logica è chiara, tradurre in Python/JavaScript è facile.

Applicazioni nel mondo reale

Google Maps

Problema: Trovare percorso più veloce A → B
Decomposizione: Mappe (grafo) + Traffic data + Algoritmi
Pattern: Algoritmo Dijkstra (cammino minimo)
Astrazione: L'utente clicca "Vai", il resto è magia

Spotify Recommendation

Problema: Consigliare canzoni che piacciono all'utente
Decomposizione: Dati (ascolti), Modello (ML), Ranking
Pattern: Collaborative filtering (chi ascolta A ascolterà anche B?)
Astrazione: "Scopri nuova musica" → Algoritmo complesso nascosto

WhatsApp Encryption

Problema: Mandare messaggi che solo il ricevente può leggere
Algoritmo: End-to-end encryption (RSA + AES)
Pattern: Chiave pubblica (chiunque può inviare) + Chiave privata (solo ricevente decodifica)
Astrazione: L'utente non sa che sto usando crittografia

Perché insegnarlo alle scuole?

Non dipende dalla tecnologia

Pen & paper: Funziona allo stesso modo del codice
Sviluppo: La logica rimane uguale anche se cambio linguaggio

Transferibile a tanti ambiti

Ricette di cucina, Istruzioni IKEA, Progettazione, Economia, Biologia

Prepara i ragazzi al problem-solving reale

Non è "quale sintassi uso", è "come divido il problema?"

Esercizio: Pensiero computazionale nella vita

Pensa a una situazione quotidiana e applica i 4 pilastri:

Situazione: Preparare un esame

  1. Decomposizione:

    • Leggi capitoli 1-3
    • Risolvi esercizi pratica
    • Ripeti concetti chiave
    • Fai simulazione esame
  2. Pattern:

    • Pattern di domande: Definizioni, calcoli, applicazioni
    • Riutilizzo: Se ho studiato bene il capitolo 1, il capitolo 2 sarà simile
  3. Astrazione:

    • Focus: Cosa è importante? (Concetti, non tutti i dettagli)
    • Ignora: Esempi marginali, storia degli autori
  4. Algoritmo:

    PER OGNI argomento:
      LEGGI spiegazione
      RISOLVI esercizi correlati
      SE non capisco:
        RIPETI lezione oppure CHIEDI aiuto
    RIPETI tutto una volta
    FATTI simulazione esame

Il pensiero computazionale è un’abilità per la vita, non solo per la programmazione.