Studi universitari

Il 12 dicembre 2003 ho conseguito una laurea in Informatica, indirizzo "Sistemi Software" presso la facoltà di Scienze MM. FF. Naturali, Ateneo di Bologna.

Qualcuno mi ha chiesto una volta cosa si studi a Informatica. Non è facile rispondere visto che i programmi dei corsi cambiano di anno in anno ed esistono probabilmente poche persone che abbiano seguito un percorso identico. In questa pagina darò una risposta che valga per il mio caso.

Innanzitutto mi preme sfatare una falsa credenza: tanto tempo fa un amico ingegnere mi mise al corrente di una voce in voga da loro secondo cui la facoltà di Ingegneria Informatica fornisce una formazione più completa e a 360 gradi coinvolgendo sia aspetti teorici che pratici, mentre il corso di Informatica avrebbe avuto un'orientazione più pratica e meno teorica limitata perlopiù allo studio degli algoritmi e dei linguaggi di programmazione. Non so quale sia la situazione attuale, ma se parliamo del corso di studi che ho frequentato io è una credenza del tutto erronea, che a quanto pare hanno a volte anche i ragazzi che si apprestano ad affrontare il corso di laurea (ho sentito spesso storie di neo-iscritti rimanere shockati al primo anno dalla presenza massiccia di "tutta quella teoria" e di "tutta quella matematica").

Il corso fornisce in realtà una solida base teorica che è un toccasana per chiunque sceglierà come lavoro la progettazione di sistemi informativi complessi e articolati. Dei 25 esami che ho sostenuto, 7 erano matematici, 2 di fisica, i restanti 16 di informatica: in parte esami di formazione di una cultura informatica di base (Programmazione, Architettura degli Elaboratori, Sistemi Operativi, Sistemi di Elaborazione 1, Algoritmi e Strutture Dati), in parte esami orientati alle tecnologie usate nel mondo del lavoro di oggi con programmi aggiornati di anno in anno (Interazione Uomo Macchina, Ingegneria del Software, Basi di Dati, Reti di Calcolatori) e in parte esami tesi a fornire quelle preziose basi teoriche che ogni operatore del settore IT dovrebbe avere per poter condividere con i suoi colleghi un comune background cognitivo: Teoria dell'Informazione e della Trasmissione, Informatica Teorica, Metodi Formali 1, Metodi Formali 2, Linguaggi di Programmazione, Crittografia.

Si dice spesso che nel caso del lavoro nel campo dell'IT sia praticamente inutile il percorso di studi affrontato, visto che le tecnologie utilizzate cambiano quasi completamente ogni pochi anni. Alcuni arrivano addirittura a teorizzare che laureati in facoltà umanistiche (scienze politiche, DAMS) abbiano rispetto ai laureati in informatica e ingegneria informatica un handicap minimo iniziale che verrà quasi completamente annullato nei primi anni di lavoro. Ritengo che non ci sia nulla di più falso: è vero che in questo settore le tecnologie che si utilizzano cambiano spesso (in certi casi anche ogni anno / anno e mezzo), ma un corso di laurea universitario non serve per imparare un pool di linguaggi di programmazione o per prendere familiarità con tecnologie in voga oggi nel mondo del lavoro: serve per acquisire una forma mentis che prima di tutto è scientifica, poi ingegneristica e in ultima analisi specialistica della scienza computazionale. E' poi anche vero che l'algoritmica cambia molto più lentamente dei linguaggi e delle tecnologie: gli algoritmi che usiamo oggi o hanno più di 40 annni o sono varianti di algoritmi concepiti più di 40 anni fa, per cui anche volendo fermarsi al mero nozionismo non è vero che tutto quello che si impara diventa vecchio nel giro di 5-10 anni. Il punto però non è questo, piuttosto chi ha quel tipo di background culturale si adatterà ai rapidi cambiamenti della computer science molto meglio di chi non ce l'ha.

Tesi di laurea

La mia tesi di laurea si colloca nell'ambito di un progetto accademico in seguito denominato PiDuce, un linguaggio di orchestrazione basato su pi-calcolo realizzato da Samuele Carpineti sotto la supervisione del prof. Laneve. Il mio contributo è della seconda metà del 2003 in un momento in cui il progetto è ancora in fase embrionale e consiste nella scrittura di XRel (XML Regular expression language), un parser per la decodifica e il processamento dei dati XML che insieme ad HiPi di Paolo Milazzo sarà poi preso a modello per la realizzazione della prima versione del linguaggio (chiamato prima BoPi o Bologna Pi-Calculus e successivamente PiDuce). A pag. 11 di questo articolo c'è un accenno al contributo specifico da me apportato al progetto (qui presentato con ancora un altro nome, Fusion Project).

XRel è di fatto un porting in Java degli algoritmi presenti in XDuce, un linguaggio ML-like scritto dal ricercatore giapponese Haruo Hosoya per il processamento di dati XML.
Il titolo della tesi è XRel: Analisi dei Tipi di Dato di XDuce e Implementazione dei Relativi Algoritmi, e oltre alla parte progettuale di scrittura del codice ha un contributo originale nell'ideazione di un algoritmo per il controllo dell'ambiguità di un'espressione regolare ad albero più efficiente di quello presentato all'epoca da Hosoya stesso e basato sul concetto di ambiguità debole invece che sull'ambiguità forte (si consulti all'interno della tesi il paragrafo 3.3.3 pagg. 50-51 per una trattazione sulla differenza tra i due tipi di ambiguità e il paragrafo 4.3.3 pagg. 77-78 che fornisce la descrizione dettagliata del nuovo algoritmo).

Qui riporto le pagine inizialmente incluse nel sito ufficiale del progetto e successivamente spostate sul mio sito privato.

Progetti

I progetti hanno un ruolo fondamentale nella formazione di un informatico. Rievocarli suscita in me una piccola vena di nostalgia

Intelligenza Artificiale (nov.-dic. 2002)
Io, Paola Cristofanelli e Paola Di Tomasso abbiamo realizzato un programma che risolve il finale di scacchi "Il bianco matta in 2 mosse" tradizionalmente proposto dalle rubriche enigmistiche. L'algoritmo è un classico MiniMax con potatura AlfaBeta scritto sia in Prolog che in Delphi e corredato di una graziosa interfaccia grafica programmata in Delphi che permette di testare entrambi i motori comparandone le performance. Qui il file di distribuzione completo comprensivo di sorgenti e di un'implementazione di Filetto (Tris) scritta in Delphi che fa uso dello stesso algoritmo. 
Ingegneria del software (gen.-mag. '99)
Il mio gruppo (vedi sito) ha realizzato JavaToXmiUML, una doclet JavaDoc che analizza un sorgente Java e produce i Class Diagram UML in formato XMI  (un formato IBM per l'interscambio di dati). Ringrazio e saluto Leonardo Scardamaglio per il bel sito realizzato
Interazione Uomo-Macchina (feb.-lug. '99)
Il mio gruppo (vedi sito) ha realizzato C.A.P. (Curriculum Assistant Project), un motore di interrogazione HTML per curricula, scritto con script CGI in Perl e interfacciato con MySQL. Inoltre io e Massimiliano abbiamo tenuto un seminario su VBScript (qui i lucidi Power Point).
Basi di dati (apr.-lug. '98)
Io, Davide Lucchesi e Alessandro Zambonelli abbiamo progettato e implementato il database gestionale per una piccola azienda (DefGest) con analisi dei costi e delle prestazioni.
Sistemi operativi ('97)
Il progetto per questo esame consisteva nello scrivere in C un piccolo sistema operativo multitasking (YAOS - Yet Another Operative System) per un emulatore PDP 11 (CHIP).. uno sforzo veramente epocale. Il gruppo era composto da me, Alessandro Pini, Federico Roversi e Silvia Zini... e se ho scordato qualcuno chiedo perdono ma è passato veramente tanto tempo.
Programmazione ('96)
C'era un piccolo progetto in Pascal per questo esame del primo anno ma non ne ho più memoria.
Architettura degli Elaboratori ('96)
C'erano un paio di progetti individuali per questo esame del primo anno.

Tesine

Metodi Formali 1 (mar.-mag. 2003)
Ho messo a confronto due articoli che propongono 2 diverse filosofie per estendere il Java Bytecode Verifier con verifiche sull'utilizzo corretto della concorrenza in Java: il primo è "A Type System for JVM Threads" scritto dal prof. Laneve e potete trovarlo qui mentre l'altro è "A New Type System for JVM Lock Primitives" scritto da F. Iwama e N. Kobayashi. e potete trovarlo qui. Per questo esame non ho dovuto produrre niente di scritto.
Crittografia (gen-feb. 2001)
Per questo esame ho scritto una tesina su EVox, un sistema di voto elettronico sviluppato dal DARPA e utilizzato all'interno del MIT per le elezioni studentesche. Si differenzia da quella preparata per Metodi 2 non solo per il fatto di essere un'analisi approfondita di un singolo protocollo piuttosto che una panoramica generale su problematiche e metodi ma anche per un maggior livello di dettaglio sulle tecniche crittografiche utilizzate (laddove la tesina di  Metodi tende ad astrarre dai concetti implementativi di basso livello).
Metodi Formali 2 (set. 2000 - feb. 2001)
Per questo esame ho scritto una tesina sulle tematiche di sicurezza relative al voto elettronico in generale e al voto su Internet in particolare (tesina e lucidi in formato PostScript).
Reti di Calcolatori (giu. 2000)
Ho scritto una tesina sui problemi di sicurezza relativi all'utilizzo di sistemi di conferencing real-time (audio-video conferenza, IRC, ICQ, ecc..) all'interno di una rete sicura.
Interazione Uomo-Macchina (feb.-lug. '99)
Io e Massimiliano Zanoni abbiamo tenuto un seminario su VBScript

Esami sostenuti

Elenco qui gli esami da me affrontati per "fotografare" quello che è stato il mio personale percorso formativo in una facoltà in cui programmi e corsi cambiano praticamente ogni anno (si può ottenere più o meno lo stesso elenco qui).

Esame A Tipo Professore Argomenti principali
Analisi Mat. 1 1 Ann. C. Parenti Basi di analisi matematica
Architettura degli Elaboratori 1 Ann. F. Panzieri Architetture hardware, L/M e processori, circuiti logici
Matematica Discreta 1 Ann. C. Tinaglia Algebra + Geometria
Programmazione e Laboratorio 1 1 Ann. L. Donatiello,
C. Laneve
Introduzione a programmazione e algoritmi, Pascal
Analisi Mat. 2 2 Sem. V. Sordoni Argomenti avanzati di analisi matematica
Algoritmi e strutture dati 2 Ann. L. Margara Excursus di tutta l'algoritimica classica, teoria della complessità
Fisica Gen. 1 2 Ann. Rambaldi Meccanica classica, termodinamica
Sistemi Operativi e Laboratorio 2 2 Ann. P. Ciancarini,
R. Davoli
Teoria di sistemi operativi. Durante il laboratorio: C, Unix lato utente, introduzione alle reti, Unix lato developer
Logica matematica 2 Sem. A. Asperti Corso di logica
Analisi Numerica 3 Ann. G. Casciola  
Basi di Dati e Sistemi Informativi + Laboratorio 3 3 Ann. P. Ciaccia Argomenti tipici di un corso di bd: E/R, SQL, dipendenze funzionali, problematiche di ottimizzazione, algoritmi usati dalle basi dati
Calcolo delle Prob. e Statistica Mat. 3 Sem. M. Campanino Calcolo delle Probabilità e Statistica
Fisica Gen. 2 3 Ann. Spurio Elettromagnetismo
Informatica Teorica 3 Ann. A. Asperti Teoria della calcolabilità; Teoria dei linguaggi
Sistemi di Elaborazione 1 3 Sem. O. Babaoglu Corso introduttivo alle reti, problematiche di sincronizzazione
Linguaggi di Programmazione 4 Ann. A. Asperti Teoria dei linguaggi, teoria dei compilatori
Ricerca Operativa 4 Sem. A. Cavallucci  
Teoria dell'Informazione 4 Sem. L. Margara Teoria dell'informazione e della Trasmissione di Shannon
Interazione Uomo Macchina 4 Ann. A. Asperti Tecnologie Web (Perl, PHP, Javascript, ..), Web Usability
Ingegneria del Software 4 Ann. P. Ciancarini Software Engineering, progettazione in team
Metodi Formali 1 5 Sem. C. Laneve Qualità del software, OOP, Metodi di verifica del codice
Metodi Formali 2 5 Sem. R. Gorrieri,
N. Busi
Problematiche di sicurezza, formalismi per la verifica della correttezza dei processi distribuiti (pi calcolo e altri)
Crittografia 5 Sem. R. Segala Tematiche di crittografia e sicurezza
Reti di Calcolatori 5 Sem. Capiluppi Sicurezza di reti, Firewall
Intelligenza Artificiale 5 Ann. G. Casadei,
A. Palareti
Introduzione a tematiche AI, Prolog