Pensiero Computazionale

Lezione 02 del corso di Abilità Informatiche (2024/2025)

Sebastian Barzaghi | sebastian.barzaghi2@unibo.it | https://orcid.org/0000-0002-0799-1527 | https://www.unibo.it/sitoweb/sebastian.barzaghi2/

L’incantatrice dei numeri

The kilo-girls

Fonte: https://www.bbc.co.uk/bitesize/guides/zp92mp3/revision/1.

Prima degli anni ‘40: il computer è una persona che effettua calcoli numerici a mano (es. posizioni dei pianeti, conversioni al sistema metrico).

Machine of the year

Fonte: https://www.computerhistory.org/timeline/1982/.

Dopo gli anni '40: sistema elettronico (programmabile o non programmabile) di elaborazione delle informazioni.

Una definizione generale

Fonte: https://www.computerhistory.org/timeline/1986/.

Un agente che, se istruito correttamente, esegue calcoli a partire da qualche informazione iniziale (detta input) per produrre una risposta (detta output).

Componenti: Hardware

Fonte: https://www.britannica.com/facts/computer#/media/1/130429/94239.

L'insieme delle componenti fisiche (alimentatori, elementi circuitali fissi, unità di memoria, ecc.), di un computer.

Alcuni elementi hardware

Piccoli chip di silicio che contengono innumerevoli transistor che funzionano come interruttori elettrici:

  • Central Processing Unit (CPU): componente che coordina tutte le operazioni da eseguire;
  • Random Access Memory (RAM): memoria volatile per registrare temporaneamente i dati;
  • Read-Only Memory (ROM): memoria di sola lettura che contiene informazioni fisse e immodificabili;
  • Memoria di massa (hard disk): memoria dove vengono conservati i dati in modo permanente;
  • Scheda madre: connettore di tutti gli altri componenti interni.

Periferiche (Input/Output): tastiera, monitor, mouse…

Componenti: Software

Fonte: https://www.britannica.com/technology/computer/images-videos#/media/1/130429/19612.

L’insieme delle componenti digitali (es. programmi, procedure, applicativi) assiociate alle operazioni effettuate da un computer.

  • Software di sistema: controlla il funzionamento interno del computer (es. sistema operativo) e gestisce anche dispositivi esterni;
  • Software applicativo: fa eseguire ai computer i comandi dell'utente e include programmi che elaborano dati.

Pensare come un computer computazionalmente

I computer servono a risolvere problemi

Tuttavia, prima che un problema possa essere affrontato, è necessario comprendere il problema stesso e i modi in cui potrebbe essere risolto.

Il pensiero computazionale ci permette di prendere un problema complesso, capire di che si tratta e sviluppare possibili soluzioni.

Possiamo poi presentare queste soluzioni in un modo che un computer, un essere umano, o entrambi, possano comprendere.

Mindstorms (Papert, 1980)

Impariamo costruendo iterativamente conoscenza.

Le rappresentazioni potenti consentono un apprendimento efficace.

Il computer come meta-strumento per “rendere l’astratto concreto” tramite un apprendimento per tentativi, sbagli, e correzioni.

Il pensiero computazionale come strumento di apprendimento basato sulla costruzione socialmente ed emotivamente partecipata di un artefatto.

Computational Thinking (Wing, 2006)

Esiste una disponibilità enorme di strumenti digitali, soprattutto sul World Wide Web.

La maggior parte delle discipline diventano “computazionali”.

Diventa quindi necessario assumere un approccio basato sulla computazione che aiuta a risolvere problemi e progettare soluzioni.

I principi della computazione

Fonte: https://www.bbc.co.uk/bitesize/guides/zp92mp3/revision/1.
  • Decomposizione: dividere un problema in parti più piccole e gestibili;
  • Riconoscimento di pattern: cercare somiglianze e tendenze nei componenti del problema;
  • Astrazione: focalizzarsi solo sulle informazioni rilevanti, rimuovendo dettagli non necessari;
  • Algoritmi: sviluppare una soluzione sequenziale al problema.

Un approccio di risoluzione dei problemi basato sui principi della computazione

Il pensiero computazionale consiste nel prendere un problema complesso e suddividerlo in una serie di problemi più piccoli e gestibili (decomposizione).

Ognuno di questi problemi più piccoli può essere esaminato singolarmente, considerando come problemi simili sono stati risolti in passato (riconoscimento di pattern) e concentrandosi solo sui dettagli importanti, ignorando le informazioni irrilevanti (astrazione).

Successivamente, si possono progettare passi o regole semplici per risolvere ciascuno di questi problemi più piccoli (algoritmi).

Infine, questi semplici passi o regole vengono utilizzati per programmare un computer che aiuti a risolvere il problema complesso nel miglior modo possibile.

Un puzzle al contrario

Decomposizione

Fonte: https://www.bbc.co.uk/bitesize/guides/zqqfyrd/revision/1.

Affrontare più fasi diverse contemporaneamente è molto più complicato che suddividere il problema in parti più piccole e risolverle una alla volta.

La decomposizione è la suddivisione di di un problema complesso o di un sistema in parti più piccole, che sono più gestibili e facili da comprendere.

Esempio: risolvere un crimine

Risolvere un crimine può essere un problema molto complesso, poiché ci sono molte cose da considerare.

  • quale crimine è stato commesso;
  • quando è stato commesso il crimine;
  • dove è stato commesso il crimine;
  • quali solo le prove rilevanti;
  • se ci sono stati testimoni;
  • se ci sono stati recentemente crimini simili.

Esempio: sviluppo di un videogioco

Immaginiamo di voler creare un videogioco.

Domanda: come possiamo usare la decomposizione per affrontare questo problema?

Esempio: sviluppo di un videogioco

Decomponiamo il problema in una serie di problemi più piccoli:

  • che tipo di videogioco vogliamo creare;
  • chi sarà il pubblico target del videogioco;
  • come sono gli asset grafici;
  • quali strumenti utilizziamo per svilupparlo;
  • com’è l’esperienza dell’utente;
  • come lo testiamo;
  • dove lo distribuiamo e/o vendiamo.

Schemi ovunque

Riconoscimento di pattern

Fonte: https://www.bbc.co.uk/bitesize/guides/zqqfyrd/revision/1.

Quando decomponiamo un problema complesso, spesso troviamo pattern tra i sotto-problemi. I pattern sono somiglianze o caratteristiche condivise che si ripetono.

Trovare somiglianze tra i problemi decomposti ci permette di risolverli in modo più efficiente.

Esempio: disegnare gatti

Fonte: https://www.bbc.co.uk/bitesize/guides/zxxbgk7/revision/1.

Tutti i gatti condividono caratteristiche comuni (es. occhi, code e pelliccia). Queste caratteristiche sono pattern.

Una volta che sappiamo come descrivere un gatto, possiamo descriverne altri, semplicemente seguendo questo schema. L'unica cosa che cambia sono i dettagli specifici.

Perché dobbiamo cercare i pattern?

Fonte: https://www.bbc.co.uk/bitesize/guides/zxxbgk7/revision/2.

Trovare pattern è fondamentale perché semplifica la risoluzione dei problemi, potendo applicare la stessa soluzione ovunque si presenti lo stesso pattern.

Se vogliamo disegnare gatti, sapendo che tendenzialmente tutti i gatti hanno occhi, code e pelliccia, possiamo disegnarli rapidamente senza dover ripensare ogni volta le stesse caratteristiche.

Pattern tra problemi diversi

Fonte: https://www.bbc.co.uk/bitesize/guides/zxxbgk7/revision/3.

Preparare una torta implica risolvere vari problemi, come scegliere gli ingredienti e il tempo di cottura. Una volta che conosciamo il processo per una torta, possiamo applicarlo anche ad altre, poiché esistono schemi comuni, come le quantità precise di ingredienti e i tempi di cottura.

Identificando questi pattern, possiamo trovare soluzioni comuni per problemi simili.

Pattern nello stesso problema

Durante la preparazione di una torta, possiamo trovare pattern anche nei problemi più piccoli.

Ad esempio, sapendo che “ogni torta avrà bisogno di una quantità precisa di ingredienti specifici”, ogni ingrediente deve:

  • essere identificato con un nome;
  • avere una misura specifica.

Una volta che sappiamo come identificare ogni ingrediente e la sua quantità, possiamo applicare questo pattern a tutti gli ingredienti.

Di nuovo, ciò che cambia sono i dettagli specifici.

Non possediamo nient’altro che metafore

Astrazione

Fonte: https://www.bbc.co.uk/bitesize/guides/zttrcdm/revision/1.

Quando decomponiamo i problemi, cerchiamo pattern tra e all'interno dei problemi più piccoli che compongono il problema complesso.

L'astrazione è il processo di eliminare le caratteristiche dei pattern che non ci servono, per concentrarci su quelle che ci sono utili e creare così una rappresentazione di ciò che stiamo cercando di risolvere.

Questa è Londra

Questa è Londra?

La mappa non è il territorio, ma una sua interpretazione

Un’astrazione, che rappresenta qualcosa, non è quella cosa (ma può essere utile)!

Quando facciamo un’astrazione, stiamo esplicitando le nostre supposizioni sulla natura della cosa che stiamo semplificando.

Esempio: disegnare gatti (di nuovo)

Fonte: https://www.bbc.co.uk/bitesize/guides/zttrcdm/revision/1.

I gatti hanno caratteristiche generali comuni, come occhi, coda e pelliccia, che sono rilevanti per disegnarli. Tuttavia, dettagli specifici come il colore o la dimensione possono essere irrilevanti (e quindi eliminabili).

L'astrazione ci permette di concentrarci solo sulle caratteristiche essenziali, creando così un'idea di base di cosa sia un gatto, che ci aiuta a disegnarlo.

Esempio: preparazione di una torta

Quando si prepara una torta, ci sono alcune caratteristiche generali che accomunano le torte.

Ad esempio, sappiamo che:

  • Una torta ha bisogno di ingredienti;
  • Ogni ingrediente necessita di una quantità specifica;
  • Una torta necessita di un preciso tempo di cottura.

Di contro, se pensiamo ad un livello più generale, non dobbiamo sapere:

  • Quali sono questi ingredienti;
  • Quale sia la quantità dell’ingrediente;
  • Quanto dura il tempo di cottura.

Creare un modello

Fonte: https://www.bbc.co.uk/bitesize/guides/zttrcdm/revision/1.

Un modello è un'idea generale, un'astrazione. Ad esempio, un modello di gatto rappresenta tutti i gatti, un modello di torta rappresenta tutte le torte, e così via.

I modelli ci permettono di comprendere gli schemi comuni tra gli oggetti o situazioni e di applicarli per risolvere il problema.

Una volta creato un modello, possiamo progettare un algoritmo per risolverlo.

Il nuovo dio

Una ricetta

Una carta di istruzioni

Una mappa concettuale

Cosa hanno in comune?

Cosa hanno in comune?

  • Sequenziali;
  • Finiti;
  • Generali;
  • Non ambigui;
  • Corretti;
  • Efficienti.

Algoritmo

Fonte: https://www.bbc.co.uk/bitesize/guides/zqqfyrd/revision/2.

Una sequenza finita di procedure precise per produrre un risultato (output) a partire da uno stato iniziale (input).

Gli algoritmi sono spesso usati come base per sviluppare software. Possono essere espressi come diagrammi di flusso oppure come pseudocodice.

In altre parole: istruzioni

Fonte: https://www.bbc.co.uk/bitesize/guides/zqqfyrd/revision/2.

Gli algoritmi possono essere usati per descrivere praticamente qualsiasi tipo di processo.

Garbage in, garbage out

Se vogliamo dire a un computer di fare qualcosa, dobbiamo scrivere un programma che indichi, passo dopo passo, esattamente cosa vogliamo che faccia e come vogliamo che lo faccia.

Questo programma necessita di pianificazione, e per farlo utilizziamo un algoritmo.

I computer sono tanto bravi quanto gli algoritmi che vengono loro forniti: un algoritmo scadente porta ad un risultato scadente.

Un algoritmo deve essere chiaro

Possiamo suddividere il problema in parti più piccole e poi pianificare come queste si combinano di nuovo in un ordine appropriato per risolvere il problema.

Questo ordine può essere rappresentato come un algoritmo.

Deve avere un punto di partenza, un punto di arrivo e un insieme di istruzioni chiare nel mezzo.

Come rappresentare un algoritmo: Pseudocodice

La maggior parte dei programmi viene sviluppata utilizzando linguaggi di programmazione.

Questi linguaggi hanno una sintassi specifica che deve essere utilizzata affinché il programma funzioni correttamente.

Lo pseudocodice è un modo semplice di descrivere un insieme di istruzioni che non deve seguire una sintassi specifica.

Scrivere in pseudocodice è simile a scrivere in un linguaggio di programmazione

OUTPUT 'What is your name?'
INPUT user inputs their name
STORE the user's input in the name variable
OUTPUT 'Hello' + name
OUTPUT 'How old are you?'
INPUT user inputs their age
STORE the user's input in the age variable
IF age >= 70 THEN
OUTPUT 'You are aged to perfection!'
ELSE
OUTPUT 'You are a spring chicken!'

Un programma che chiede all'utente il nome e l'età e che fa un commento sulla base di questi.

Ogni passo dell'algoritmo è scritto su una riga a sé stante in sequenza. Le istruzioni sono scritte in maiuscolo, le variabili in minuscolo e i messaggi in maiuscolo e minuscolo. INPUT pone una domanda; OUTPUT stampa un messaggio sullo schermo.

Come rappresentare un algoritmo: Diagramma di flusso

Fonte: https://www.lospaziodirosanna.it/testo-e-testi/algoritmi-diagrammi-di-flusso-esempi-e-attivita/.

La rappresentazione grafica di un algoritmo.

Non ci sono molte regole precise riguardo al livello di dettaglio necessario in un diagramma di flusso. A volte vengono suddivisi in molti passaggi per fornire più dettagli, altre volte vengono semplificati per essere più comprensibili.

Esistono alcune convenzioni per rappresentare un diagramma di flusso

Fonte: https://www.bbc.co.uk/bitesize/guides/zpp49j6/revision/3.

Diagramma dell’algoritmo di prima

Fonte: https://www.bbc.co.uk/bitesize/guides/zpp49j6/revision/3.

Un programma che chiede all'utente il nome e l'età e che fa un commento sulla base di questi.

Per concludere

Fonte: https://www.bbc.co.uk/bitesize/guides/zp92mp3/revision/2.

Come superiamo questo livello?

Per completare il livello, cosa dobbiamo sapere?

Fonte: https://www.bbc.co.uk/bitesize/guides/zp92mp3/revision/2.
  • quali oggetti dobbiamo raccogliere;
  • come possiamo raccoglierli;
  • quanto tempo abbiamo per raccoglierli;
  • dove si trova l'uscita;
  • qual è il miglior percorso per raggiungerla nel minor tempo possibile;
  • che tipo di nemici ci sono;
  • quali sono i loro punti deboli.

Da queste informazioni possiamo elaborare una strategia per completare il livello nel modo più efficiente possibile.

Questo è il pensiero computazionale

Fonte: https://www.bbc.co.uk/bitesize/guides/zp92mp3/revision/2.

Abbiamo suddiviso il problema in diverse piccole decisioni e passaggi.

Abbiamo posto la nostra attenzione solo sui dettagli rilevanti.

Abbiamo usato la nostra conoscenza di problemi simili precedenti.

Abbiamo elaborato un piano d'azione sequenziale e strutturato.

Fine

Lezione 02 del corso di Abilità Informatiche (2024/2025)

Sebastian Barzaghi | sebastian.barzaghi2@unibo.it | https://orcid.org/0000-0002-0799-1527 | https://www.unibo.it/sitoweb/sebastian.barzaghi2/