Un track Exercism completo ha due tipi di esercizi: gli esercizi di concetto e gli esercizi di pratica. Sono profondamente diversi e si completano bene a vicenda.
Gli esercizi di concetto di un track sono esercizi pensati per insegnare singoli concetti che formano la base di un linguaggio di programmazione specifico. Questi concetti formano un syllabus.
Questa documentazione contiene indicazioni e suggerimenti su come progettare con successo un syllabus per il tuo track.
L'obiettivo finale di un syllabus è portare gli studenti a leggere e scrivere con disinvoltura codice idiomatico nel linguaggio scelto.
Ogni singolo esercizio di concetto è molto mirato. È un passo piccolo e preciso che avvicina lo studente a capire qualcosa del linguaggio. Si basa solo sui concetti introdotti in precedenza.
Risolvendo l'esercizio, lo studente inizia a familiarizzare con il concetto. La comprensione arriva soprattutto facendo, molto meno attraverso le spiegazioni. I contenuti esplicativi servono a introdurre lo studente alle idee che gli servono per risolvere l'esercizio (da qui la scelta del nome del file: "introduction.md").
Vogliamo permettere agli studenti di iniziare a scrivere codice subito, senza dover capire tutto in anticipo. Per riuscirci, sorvoliamo sui dettagli e lasciamo molte cose non spiegate. Semplifichiamo e, dove possibile, forniamo degli stub di codice. Questo riduce il carico cognitivo dell'inizio e offre il tempo e lo spazio perché le conoscenze si consolidino. Con questo approccio non diciamo che lo studente non ha bisogno di sapere queste cose, ma che non ha bisogno di saperle ancora.
Spesso i primi esercizi devono contenere codice non idiomatico. All'inizio, infatti, gran parte del linguaggio è ancora sconosciuto allo studente, e la maggior parte dei concetti non è stata ancora introdotta. Permettere codice non idiomatico nei primissimi esercizi consente agli studenti di fare molti passi piccoli in terreno familiare invece di pochi passi grandi in terreno sconosciuto. Di conseguenza, riescono a raggiungere più in fretta e con meno attrito la fase del codice idiomatico.
Gli esercizi sono strutturati come un albero, con un esercizio introduttivo in cima come punto di partenza. Gli esercizi successivi insegnano concetti che dipendono dalla comprensione di concetti insegnati prima.
Può valere la pena guardare come altri track di linguaggi hanno costruito i loro esercizi di concetto. Puoi trovare esempi di esercizi di concetto di altri track qui.
Detto questo, se decidi di usare altri esercizi come punto di partenza per i tuoi, fai attenzione a che l'esercizio che ne risulta riguardi il concetto così come esiste nel tuo linguaggio. A volte i concetti differiscono in modo sottile, a volte in modo radicale. A volte i concetti non esistono affatto in altri linguaggi.
Il syllabus, e quindi l'albero dei concetti, dovrebbe rappresentare i concetti che esistono in questo specifico linguaggio.
Non includere concetti solo perché lo fanno altri track.
In alcuni casi può essere allettante inserire un concetto perché le persone spesso devono aggirarlo usando concetti che esistono davvero. Invece di farlo, introduci il concetto che il linguaggio usa davvero, e valuta di aggiungere un esercizio che spieghi come usarlo in quel tipo di situazione.
Per esempio, in Go non esistono gli enum. L'albero dei concetti di Go introduce invece le costanti e insegna a usarle in quei tipi di situazione in cui in altri linguaggi useresti gli enum.
Non esitare a chiedere aiuto. È meglio chiedere in anticipo o mentre lavori a un esercizio che discuterne durante la revisione del codice.
Su GitHub puoi menzionare il team @exercism/learning-mode. Nel forum di Exercism apri una issue nella categoria Exercism Support.
La nostra esperienza ci ha insegnato che il modo più pragmatico per sviluppare un syllabus è far crescere l'albero dei concetti in modo organico, partendo dai concetti più semplici. Non dobbiamo progettare tutto in anticipo, ed è anzi generalmente utile non pensare troppo in là.
Partiamo dal minimo indispensabile di concetti, quelli più fondamentali per scrivere qualsiasi cosa nel linguaggio. Cerchiamo anche di partire dai concetti più familiari allo sviluppatore medio. Ciò che è familiare è un bene: familiare non vuol dire confuso.
Ricorda: anche se il traguardo è scrivere codice idiomatico, i passi che portano fin lì non sono sempre idiomatici. Usare ciò che è familiare, anche se non è un grande esempio di codice in quel linguaggio, aiuta lo studente a muoversi più in fretta verso l'obiettivo di un codice più tipico del linguaggio.
Invece di provare a delineare in anticipo l'intero albero dei concetti, parti semplicemente dal primo esercizio. L'obiettivo del primo esercizio è permettere allo studente di iniziare a imparare con il minor attrito possibile. Stanno facendo il primissimo passo per familiarizzare con l'aspetto del codice in questo linguaggio. Potrebbero scrivere un piccolo pezzo di codice, o magari fare solo un paio di aggiunte a uno stub per completare l'esercizio. Gli studenti hanno già risolto "Hello, World!" per accedere a questo esercizio. Ma in "Hello, World!" stanno solo cambiando le parole. Tutta la sintassi del linguaggio può ancora essere sconosciuta. Cerca di puntare su una vittoria rapida e di far familiarizzare gli studenti abbastanza con lo stretto necessario della sintassi da poter andare avanti con sicurezza.
Leggi di più su sviluppare il primo esercizio.
Il primo esercizio dovrebbe sbloccare una manciata di esercizi che introducono concetti fondamentali. Saranno cose come i tipi primitivi o di base e le operazioni semplici su quei tipi.
Leggi di più su sviluppare gli esercizi successivi.
È qui che di solito le cose iniziano a farsi interessanti. Ci sono tantissime cose che potresti introdurre a questo punto. Come decidi quali concetti affrontare dopo?
In realtà non importa granché. Finché parti da un punto che sembra ragionevole, andrà bene.
Leggi di più su cosa intendiamo per "ragionevole" nel contesto di espandere l'albero dei concetti.
Un buon esercizio di concetto è estremamente mirato e, idealmente, insegna un solo concetto. Di solito c'è un solo approccio previsto per risolverlo. Questo è l'opposto degli esercizi di pratica, che sono aperti e si prestano all'esplorazione.
Un buon esercizio di concetto è di solito un cattivo esercizio di pratica, e viceversa. Dato che gli obiettivi degli esercizi di pratica e di quelli di concetto sono completamente diversi, non prendiamo esercizi di pratica per convertirli in esercizi di concetto. Scriviamo tutti gli esercizi di concetto da zero, oppure li basiamo su storie create appositamente per insegnare concetti semplici.
A volte ti sembrerà di essere in un vicolo cieco. Il concetto A richiede di capire il concetto B, e B richiede di capire A.
In questo caso semplifica. Sorvola su un po' di complessità in uno dei due, così puoi far familiarizzare gli studenti con l'altro. Va benissimo dire che qualcosa sarà approfondito più avanti e che per ora lo studente deve capire solo questo pezzetto.
I concetti si capiscono più a fondo per gradi e con il tempo.
Un esercizio di concetto ha sempre una storia.
Se stai facendo il fork di un esercizio da un altro track, l'esercizio avrà già una storia. In quel caso sei a posto.
Per vedere se ci sono storie esistenti che puoi usare o esercizi di cui puoi fare il fork, dai un'occhiata all'elenco delle storie.
Se hai un concetto ma non una storia, ti consigliamo di scrivere un piccolo esempio di codice semplice che usi il concetto che stai introducendo. Poi costruisci a ritroso una storia su quel codice. Mantieni la storia stupidamente semplice. Non deve essere buona narrativa. Non ha bisogno di una trama forte o di uno sviluppo dei personaggi. Può durare solo un paio di righe.
Discuti le tue idee per le storie con il team di Exercism. Abbiamo molta esperienza nel trovare storie adatte.
Una volta che hai una storia, probabilmente dovrai ritoccare un po' il codice perché si adatti alla storia.
Lavorare a un syllabus comporta due attività separate ma intrecciate:
Abbiamo scoperto che coinvolgere la comunità più ampia nell'implementazione degli esercizi è divertente e arricchente. La progettazione del syllabus in sé, invece, è più facile da affrontare con un piccolo team di contributori, tutti impegnati a costruire una comprensione del syllabus completo con tutte le sue sfumature.
Detto questo, consigliamo al team di progettazione del syllabus di implementare prima i primi cinque o sei concetti, prima di aprire ai contributi della comunità. Questo aiuta ad assicurarsi che le persone del team principale di progettazione capiscano il processo da sole prima di dover revisionare le pull request di persone della comunità più ampia.
È anche più facile creare issue per questi concetti di ordine superiore, e tende a essere più divertente per i membri della comunità lavorarci, dato che ci sono meno vincoli di cui preoccuparsi.
Non abbiamo ancora capito come creare al meglio le issue per gli esercizi di concetto.
In alcuni track abbiamo provato a creare esercizi separati per il concetto in sé e per l'esercizio. In altri abbiamo provato a creare issue con una checklist da seguire. Nel complesso, pensiamo che sia ancora troppo intimidatorio, e vorremmo trovare un modo migliore.
Parla con noi del processo quando inizi a creare le issue, e faremo del nostro meglio per aiutarti a capire come procedere.
Aggiorneremo la documentazione man mano che impariamo modi migliori di affrontare la questione.