Prima degli anni ‘40: il computer è una persona che effettua calcoli numerici a mano (es. posizioni dei pianeti, conversioni al sistema metrico).
Dopo gli anni '40: sistema elettronico (programmabile o non programmabile) di elaborazione delle informazioni.
Un agente che, se istruito correttamente, esegue calcoli a partire da qualche informazione iniziale (detta input) per produrre una risposta (detta output).
L'insieme delle componenti fisiche (alimentatori, elementi circuitali fissi, unità di memoria, ecc.), di un computer.
Piccoli chip di silicio che contengono innumerevoli transistor che funzionano come interruttori elettrici:
Periferiche (Input/Output): tastiera, monitor, mouse…
L’insieme delle componenti digitali (es. programmi, procedure, applicativi) assiociate alle operazioni effettuate da un computer.
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.
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.
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.
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.
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.
Risolvere un crimine può essere un problema molto complesso, poiché ci sono molte cose da considerare.
Immaginiamo di voler creare un videogioco.
Domanda: come possiamo usare la decomposizione per affrontare questo problema?
Decomponiamo il problema in una serie di problemi più piccoli:
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.
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.
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.
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.
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:
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.
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.
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.
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.
Quando si prepara una torta, ci sono alcune caratteristiche generali che accomunano le torte.
Ad esempio, sappiamo che:
Di contro, se pensiamo ad un livello più generale, non dobbiamo sapere:
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.
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.
Gli algoritmi possono essere usati per descrivere praticamente qualsiasi tipo di processo.
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.
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.
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.
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.

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.

Un programma che chiede all'utente il nome e l'età e che fa un commento sulla base di questi.
Come superiamo questo livello?
Da queste informazioni possiamo elaborare una strategia per completare il livello nel modo più efficiente possibile.
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.