«[Figlio dell'uomo] Porgi l'orecchio e ascolta le parole di KGB
e applica la tua mente alla SUA istruzione
» Pv. 22,17

Qui si straparla di vari argomenti:
1. Il genere dei pezzi è segnalato da varie immagini, vedi Legenda
2. Istruzioni per i nuovi lettori (occasionali e non) qui
3. L'ultimo corto è questo

lunedì 7 marzo 2016

Corso di programmazione: Lezione 0

Ho una nuova idea: ho deciso di provare a scrivere un breve corso di introduzione alla programmazione. Ovviamente, tanto per cambiare, il mio approccio all'argomento sarà abbastanza peculiare e oggi mi limiterò a spiegare come ho intenzione di procedere.

Ho conosciuto un paio di persone che, provenendo da ambiti diversi, hanno poi deciso di imparare a programmare. In genere si sono affidati a corsi specifici trovati in rete, magari anche di importanti università americane o europee, che insegnavano specifici linguaggi come il C, Java, Javascript, Python etc...
Però, più o meno a metà corso, l'allievo iniziava a perdere colpi e progressivamente si scoraggiava.
Ovviamente non è così per tutti: molto dipende dalle passate esperienze e dalla pratica informatica che si ha, ma credo di aver comunque individuato un limite di fondo di questi corsi: non insegnano a programmare bensì uno specifico linguaggio di programmazione. Almeno inizialmente i due argomenti, che secondo me dovrebbero essere considerate due materie distinte, vanno a braccetto; poi però, inevitabilmente, il corso inizia a concentrarsi sugli aspetti specifici del linguaggio e a dare per scontati delle tecniche e idee di programmazione che invece non lo sono. Ed è qui che lo studente senza basi di programmazione inizia a perdersi.

Quando invece io imparo un nuovo linguaggio scarico dalla rete un buon minicorso che copra tutte le caratteristiche del linguaggio; poi inizio a leggerlo e mi copio i comandi o le chiamate di funzioni che più mi interessano in un semplice text editor. Durante la lettura provo a usare i comandi che mi sono meno chiari copiando il codice nel solito documento; infine scrivo dei programmi nel nuovo linguaggio aiutandomi a ricordare la sintassi dei vari comandi grazie al documento che mi sono creato...
Quando scrivo un programma io penso in termini di algoritmi e, in maniera praticamente automatica, uso le strutture e i comandi che un dato linguaggio mi mette a disposizione. In pratica considero l'algoritmo come il progetto di un edificio da realizzare mentre i comandi, le funzioni e le librerie di uno specifico linguaggio di programmazione sono semplicemente i miei mattoni.

L'errore del principiante, quando si trova a dover costruire qualcosa di suo senza essere guidato passo passo da un corso, è quello di guardare i mattoni a sua disposizione e provare a metterli uno sopra l'altro un po' a casaccio: così facendo però al massimo ottiene una capanna pericolante o una torre tutta storta e piena di crepe...

La mia idea è quindi quella di basare il mio corso sulla programmazione e non su uno specifico linguaggio. E per programmazione intendo genericamente algoritmi e strutture dati. Voglio che il mio studente sia in grado di crearsi i propri algoritmi e strutture di cui ha bisogno: dimostrerò poi che lo specifico linguaggio con cui implementare il tutto è solo una formalità.

Questa mia teoria su come procedere non nasce dal nulla ma ha una sua precise giustificazione teorica. Per chi è interessato essa è spiegata qui di seguito... chi non lo è può semplicemente saltare il prossimo paragrafo!

Nella teoria informatica (*0) esiste la cosiddetta “ipotesi di Church”: è un'ipotesi e non un teorema semplicemente perché non è stata dimostrata anche se è generalmente ritenuta corretta. Tale ipotesi dice che qualsiasi algoritmo può essere convertito ed eseguito da una macchina di Turing (MdT). La MdT è un'astrazione matematica dove si immagina una specie di macchina che può scorrere avanti e indietro lungo un binario infinito sul quale si trovano caratteri (=informazioni) che possono letti e scritti in base al suo stato interno (=programma).
La MdT ha il vantaggio di essere chiaramente definibile e analizzabile e per questo non mancano teoremi che la impiegano nelle proprie dimostrazioni.
È stato poi dimostrato che l'espressività (quello che può fare, i problemi che può risolvere, etc) di una MdT è equivalente a quella di una macchina RAM (niente a che vedere con la memoria fisica!) con memoria infinita. La RAM è ancora una macchina virtuale ma può essere pensata come un linguaggio di bassissimo livello tipo l'Assembler.
La cosa interessante della macchina RAM è che questa, nonostante la sua semplicità, ha la stessa espressività di qualsiasi linguaggio di programmazione come C o Java. In pratica i programmi scritti in C o Java possono essere convertiti ed eseguiti anche da una macchina RAM (*1).
Anzi un mio professore diceva che i linguaggi di programmazione sono “zucchero sintattico”: ovvero differiscono fra loro per la forma (per la loro sintassi) ma nessun linguaggio è più potente di un altro (*2).
Ma se i vari linguaggi, come abbiamo visto, sono solo forma esteriore allora l'essenza della programmazione deve essere negli algoritmi. È per questo che credo sia necessario concentrarsi su questi piuttosto che su un linguaggio specifico. Anzi, secondo me, la difficoltà di scrivere un programma risiede per almeno l'80% nella stesura del suo algoritmo e solo nel 20% nei dettagli tecnici (lo zucchero sintattico) dello specifico linguaggio che vogliamo utilizzare.

Per questo motivo, che come abbiamo visto ha anche delle significative basi teoriche, mi concentrerò sull'insegnare a scrivere algoritmi e strutture dati. Per fare questo dovrò definire uno pseudo linguaggio di programmazione: ogni lettore potrà però usare il proprio. Spiegherò infatti quali dovranno essere le caratteristiche essenziali dello pseudo linguaggio poi ognuno potrà sbizzarrirsi come meglio crede: come spiegato infatti il linguaggio di programmazione (pseudo o no che sia) non è particolarmente importante perché è solo il mezzo e non il fine.

L'idea è di scrivere lezioni che introdurranno gradatamente la sintassi dello pseudo linguaggio con semplici esercizi esemplificativi accompagnati da altri, leggermente più complessi, che il lettore dovrà risolvere da solo usando il proprio pseudo linguaggio. Nella lezione successiva fornirò la soluzione degli esercizi proposti la volta precedente nel mio pseudo linguaggio. Poi (*3) mostrerò come convertire lo pseudo codice in uno specifico linguaggio sia facile traducendo il mio pseudo codice in un programma funzionante scritto in un linguaggio che non conosco (pensavo al Python o al Perl). Nel corso degli esercizi vedrò poi di aggiungere e spiegare tecniche di programmazione spesso date dagli esperti per scontate; al momento opportuno spiegherò poi come i vari linguaggi si differenziano fra loro in specifiche funzioni e caratteristiche...
Gran finale con un progetto di programmazione di difficoltà significativa.

Questa almeno è la mia idea attuale ma probabilmente essa si evolverà in base alle richieste di eventuali lettori/studenti. Oppure scriverò solo un paio di lezioni e poi lascerò perdere per mancanza di interesse!

Conclusione: vedremo!

Nota (*0): vado a memoria basandomi sul poco che ricordo di quanto studiato all'università: non dubito di infarcire questo paragrafo con qualche inesattezza ma confido nella sua correttezza generale. Comunque sono sicuro che i miei amici, ingegneri informatici e simili, saranno pronti a segnalarmi gli errori più evidenti!
Nota (*1): ciò non dovrebbe stupire visto che, quando un calcolatore esegue un programma C o Java, in realtà esegue delle istruzioni in linguaggio macchina che, con qualche grosso SE, è equivalente all'Assembler e quindi alla RAM...
Nota (*2): questo non significa che un certo linguaggio non possa essere più o meno adatto per un certo problema. In altre parole è sicuramente possibile creare in C lo stesso programma scritto in R (un linguaggio specializzato nella raccolta di dati, statistica e creazione di grafici) ma per farlo serviranno MOLTE più linee di codice!
Nota (*3): non so se nella stessa lezione oppure dopo diverse. Ci sono vantaggi e svantaggi: didatticamente introdurre prematuramente un linguaggio di programmazione reale potrebbe essere una distrazione dal vero scopo del mio corso; però aiuterebbe a mantenere l'interesso vivo e a permettere allo studente di esercitarsi autonomamente... uhm... vedremo...

Nessun commento:

Posta un commento