Suggerimenti: corso non di programmazione ma quasi

Cari nerd,
vorrei un vostro parere visto che molti di voi hanno fatto un percorso universitario dove hanno avuto corsi di programmazione a vari livelli.

Il prossimo semestre devo tenere un corso di data science avanzato. L’argomento principale del corso e’ insegnargli ad utilizzare varie librerie (in python e C++) che esistono sul mercato per fare analisi dati.

Il corso non e’ quindi prettamente di programmazione (anche perche’ non sono titolato per farlo), ma e’ comunque un corso hands-on dove gli mostro tanti esempi di codice che utilizza queste librerie per risolvere vari problemi che gli do. Si tratta di brevi programmini, tipicamente in python, di un paio di centianaia di righe che chiamano le librerie, fanno cose, e salvano il risultato.

Mi sto chiedendo qual e’ la maniera migliore di presentare questi argomenti. Da un lato, potrei preparare i programmini che utilizzano queste librerie e darglieli, ma questo sarebbe poco interattivo e ho l’impressione che imparerebbero poco.
Dall’altro, mi sembra poco pratico mettermi li’ e scriverle a mano una a una sul mio schermo mentre loro le riscrivono sul loro. Insomma vorrei che loro interagissero con il codice in qualche maniera e non ricevessero i programmini gia’ fatti perche’ in questo caso assorbirebbero poco.
Ho pensato di mettere i codici spezzati da qualche parte, e loro devono prenderne i pezzi uno a uno e costruire il programma, ma non sono particolarmente convinto.

Voi che esperienze avete avuto all’universita’ o in contesti simili che avete trovato che fossero ottimali per imparare?

Sono perfettamente d’accordo che mettere le mani al codice ti obbliga a impararlo e si impara molto di più rispetto a vedere il codice in una slide.

Quello che in università per me ha funzionato molto bene, quando stavo imparando, era dover finire l’implementazione di una cosa il cui scheletro era già fornito dal professore durante le esercitazioni, per evitare i tecnicismi del linguaggio, che comunque venivano assorbiti lavorandoci su avendo a disposizione uno scheletro funzionante, ma che evitavano di perdere tanto tempo per cose non attinenti al core del corso stesso.

Ti faccio un esempio pratico visto che parli di analisi dati: potresti fornire già lo script che carica i dati da disco, che esegue una funzione tipo “analyzeData” in cui lo studente deve implementare ciò che desideri e una funzione di test in cui viene confrontato con il risultato atteso. Lo studente deve implementare solo quella funzione, ma il contorno è già pronto, sia esso un main cpp che già compila e include le librerie necessarie o lo script py già pronto, e magari qualche classe/script (a seconda del linguaggio) di utilità, anch’esso da te fornito.

2 Likes

da che grado di preparazione partono i tuoi studenti/allievi? vengono da aree dove è stato necessario affrontare algebra o no? nella mia limitata esperienza questa è la maggior discriminante

fallo fare a chatgpt, e no, non scherzo.

Tu hai l’obiettivo di insegnare la analisi dati… quindi alla fine inizierai immagino a mostrare cosa c’è sul mercato.
E da quella di volta in volta mostri gli spezzoni di codice usati per fare quelle specifiche chiamate.
Mettere a video listati immensi è inutile.
Meglio un approccio “hei questa è la funzione, la richiami così, e questi sono i dati in risposta: fammi ora un programma che usando questa funzione fa questo e questo”
Secondo me è più efficiente come metodologia

Sono studenti della magistrale in fisica, quindi quello non e’ un problema.

Mi piace l’approccio che propone Kaeh+Kaya, cioe’ di dargli uno scheletro e spiegargli l’interfaccia, e devono farlo loro nella lezione, ovviamente con la mia supervisione.

1 Like

L’approccio che si usa in ingegneria informatica (unibo) è fare lezioni a slide e laboratorio.
Es di computer vision: lezione frontale in cui si spiegano gli algoritmi di image processing, opencv, reti neurali, come leggere la documentazione, che librerie esistono etc etc, con magari tu che spieghi qualche snippet di codice e/o scrivi al volo qualche script, modificandolo per vedere come si fa. Poi lezione di laboratorio/esercitazione in cui hai davanti lo scheletro e devi implementare un Canny edge detector, o allenare una rete per fare classificazione, o fare object tracking di un video, o fare la calibrazione di una camera matriciale o qualsiasi altra cosa fosse l’argomento della settimana.

Poi sono passati un po’ di anni da quando ero attivamente uno studente, ma parlando con i nuovi colleghi neulaureati/laureandi/tesisti l’approccio è rimasto più o meno quello negli ultimi 10 anni da quando sono uscito io.

2 Likes

Che livello di complessità hai in mente?
È grosso modo un’introduzione a conda/pandas/numpy?
Quante persone sono?

scusa le domande un po’ shotgun; quando ho collaborato a qualcosa di simile, la impostammo con il far usare una struttura dati complessa per fare una qualsiasi elaborazione.

era qualche anno fa quindi era un po’ più punk come approccio, ma nella fattispecie il caso fu scrapare dati dall’archivio top 250 movies di imdb e fare un po’ di query (qual è l’anno con più film in classifica, quali sono i film più lunghi, qual è il regista più presente, et via dicendo).

fornimmo sezioni di documentazione su come funzionassero le strutture che aveva senso utilizzare, fornimmo cose più specifiche per scrapare (avevamo scritto direttamente funzioni che estraessero un insieme di dati utilizzabili), e poi via liberi a pascolare.

Direi che principalmente copriro’ keras + librerie varie in C++ del nostre settore (che pero’ hanno interpreti in python, quindi quasi tutto puo’ essere fatto con delle call in python).

I dati che usero’ sono principalmente da esperimenti di fisica, per fortuna c’e’ una certa quantita’ di dati rilasciati pubblicamente proprio per scopi didattici.

Eh allora l’approccio è quello.

La percezione che mi son sviluppato è che quel che serva sia il ponte tra le strutture logiche (sia in senso generale, sia del linguaggio) matchino l’astrazione che possa avere in mente la persona che stia elaborando: l’esempio che sto per fare potrebbe essere fuori luogo, ma una volta che capisci che una classe ha una sua logica di utilizzo di base ed una sua estendibilità, matchare l’astratto matematico ad uno strumento pratico - che la trasformazione da dato grezzo a dato elaborato è una sequenza di f(g(r(w(x)))) e serva scomporre l’analisi in ognuna di queste funzioni - diventa affrontabile.

Altrimenti ci sono cose un po’ più specifiche, come la differenza tra una struct ed una class, ma quelle mi sembrano più nozioni da sviluppo che da ricerca.

Suggerimento laterale che secondo me è importantissimo e non valorizzato abbastanza - insegna loro cosa sia il versionamento, sapere come funzioni git (e non “github”!) secondo me è molto importante.

Si ma prima devo imparare io come funziona git :asd:

beh github è un’istanza di git, quindi tecnicamente vale :sisi:

non è peregrina l’idea che abbiate un’istanza locale di git; ma l’importante per me sarebbe far sapere che github è un’instanza “e basta” :asd:

1 Like

Dovessi imparare a programmare ora una cosa come Jupyter per python sarebbe una benedizione.
Ha plugin per vscode; puoi creare documenti/incorporare pezzi di codice e modificarli dinamicamente far vedere “cosa fa cosa”.
Immagino richieda pochino di sbatti a preparali ma fanno da slide+codice esempio.

Si ho pensato a Jupyter, il problema principale e’ che le librerie che usiamo noi nel nostro settore sono compilate esternamente, quindi (immagino) dovrei creare un’istanza di Jupyter che le importa, insomma e’ un po’ uno sbatti, a fronte del fatto che i nostri studenti hanno questi programmi tipicamente gia’ installati nei loro laptop, perche’ li usano per fare l’analisi dati di base nei corsi di laboratorio.