Advanced Programming and AI Coding
Anno accademico 2026/2027 - Docente: VINCENZA CARCHIOLORisultati di apprendimento attesi
Il corso Advanced Programming and AI Coding offre una formazione integrata nelle tre aree degli algoritmi, della programmazione avanzata in C++ e dell'AI-Assisted Coding, fornendo agli studenti conoscenze teoriche e competenze pratiche per affrontare problemi computazionali complessi e sviluppare soluzioni software moderne ed efficienti.
Per quanto riguarda gli algoritmi, il corso fornisce le nozioni necessarie per progettare, analizzare e valutare algoritmi efficienti, utilizzando tecniche quali ricorsione, divide-et-impera, programmazione dinamica e approcci greedy. Verranno inoltre approfondite le principali strutture dati avanzate e le metodologie per l'analisi della complessità computazionale, al fine di consentire agli studenti di individuare le soluzioni più appropriate per differenti classi di problemi.
Nell'ambito della programmazione avanzata in C++, gli studenti acquisiranno competenze nello sviluppo di applicazioni software robuste ed efficienti, approfondendo aspetti quali la gestione della memoria, la programmazione generica, la gestione degli errori, la concorrenza e la comunicazione tra processi e thread. Particolare attenzione sarà dedicata alle tecniche di progettazione e implementazione di software di qualità, secondo le moderne pratiche di sviluppo.
Per quanto riguarda l'AI Coding, il corso introdurrà i principali strumenti e le tecniche di Intelligenza Artificiale a supporto dello sviluppo software. Gli studenti apprenderanno come utilizzare sistemi di AI per la generazione automatica di codice, il debugging, il testing e l'ottimizzazione delle applicazioni, sviluppando al contempo la capacità di valutarne criticamente risultati, affidabilità, sicurezza e limiti applicativi.
Al termine del corso, gli studenti saranno quindi in grado di progettare e analizzare algoritmi, implementare soluzioni software avanzate in C++ e integrare efficacemente strumenti di Intelligenza Artificiale nel processo di sviluppo, adottando un approccio consapevole e professionale alla realizzazione del software..
Conoscenza e capacità di comprensione (Knowledge and understanding abilities)
· conoscenza dei principali paradigmi di programmazione e delle relative metodologie di sviluppo del software;
· comprensione dei criteri e delle tecniche per l'analisi dell'efficienza degli algoritmi e la valutazione dei tempi di esecuzione;
· conoscenza delle principali tecniche di progettazione algoritmica, inclusi gli approcci divide et impera, ricorsivi, programmazione dinamica e greedy;
· conoscenza dei principali algoritmi di ordinamento e delle relative caratteristiche prestazionali;
· conoscenza delle strutture dati fondamentali e avanzate e del loro impiego nella risoluzione di problemi computazionali;
· conoscenza delle tecniche di gestione della memoria e dei relativi modelli di allocazione e deallocazione delle risorse;
· conoscenza delle tecniche di traduzione e compilazione dei programmi;
· conoscenza delle metodologie e degli strumenti per la gestione degli errori e delle eccezioni;
· conoscenza delle tecniche e degli strumenti di Intelligenza Artificiale per la generazione, il debugging, il testing e l'ottimizzazione del codice;
· comprensione dei principi, delle opportunità e dei limiti dell'AI-Assisted Coding nel moderno processo di sviluppo software.
Capacità di applicare conoscenza e comprensione (Applying knowledge and understanding abilities)
· analizzare e valutare la complessità computazionale degli algoritmi, identificandone l'efficienza in termini di tempo e spazio;
· selezionare e applicare le tecniche algoritmiche più appropriate per la risoluzione di specifici problemi computazionali;
· individuare e utilizzare le strutture dati più adeguate in funzione dei requisiti applicativi e delle prestazioni richieste;
· progettare, implementare e verificare algoritmi utilizzando le metodologie apprese durante il corso;
· sviluppare applicazioni software in linguaggio C++, applicando principi di modularità, riuso e qualità del codice;
· utilizzare in modo efficace i meccanismi di gestione della memoria, della concorrenza e della comunicazione tra processi e thread;
· applicare tecniche di gestione e trattamento degli errori per realizzare software robusto e affidabile;
· impiegare strumenti di Intelligenza Artificiale per la generazione automatica di codice, il debugging, il testing e l'ottimizzazione del software;
· integrare strumenti di AI-Assisted Coding nel processo di sviluppo software, valutandone criticamente benefici, limiti e impatto sulla produttività e sulla qualità del codice.
Autonomia di giudizio (Ability of making judgements)
· valutare criticamente l'adeguatezza di un algoritmo e/o di una struttura dati rispetto alle caratteristiche di uno specifico problema computazionale;
· confrontare soluzioni algoritmiche alternative, individuando i compromessi tra efficienza, scalabilità, consumo di memoria e semplicità implementativa;
· scegliere in modo autonomo le tecniche di programmazione e le strutture dati più appropriate in funzione dei requisiti dell'applicazione;
· valutare la qualità, la correttezza e la manutenibilità di programmi sviluppati in linguaggio C++, adottando buone pratiche di progettazione e sviluppo del software;
· analizzare criticamente le diverse strategie di gestione della memoria, della concorrenza e degli errori, individuando le soluzioni più efficaci nei diversi contesti applicativi;
· valutare le prestazioni e l'affidabilità di un'applicazione software attraverso opportune attività di testing e debugging;
· selezionare e utilizzare consapevolmente strumenti di Intelligenza Artificiale a supporto dello sviluppo software, valutandone vantaggi, limiti e ambiti di applicazione;
· analizzare criticamente il codice generato da strumenti di AI-Assisted Coding, verificandone correttezza, sicurezza, efficienza e conformità ai requisiti progettuali;
· formulare giudizi autonomi sull'opportunità di integrare strumenti di Intelligenza Artificiale nel processo di sviluppo, tenendo conto degli aspetti tecnici, etici, di qualità e di sicurezza del software.
Abilità comunicative (Communication Skills)
Al termine del corso, lo studente sarà in grado di:
· utilizzare in modo corretto e appropriato il linguaggio tecnico relativo agli algoritmi, alle strutture dati, alla programmazione avanzata in C++ e alle tecniche di AI-Assisted Coding;
· descrivere e discutere le caratteristiche, le prestazioni e i limiti di algoritmi, strutture dati e soluzioni software adottando una terminologia scientifica adeguata;
· comunicare efficacemente le scelte progettuali e implementative effettuate nello sviluppo di algoritmi e applicazioni software, sia in forma scritta sia orale;
· interagire con specialisti del settore informatico utilizzando il lessico tecnico proprio dell'ingegneria del software e dell'intelligenza artificiale applicata alla programmazione.
Capacità di apprendimento (Learning Skills)
Al termine del corso, lo studente avrà sviluppato:
· la capacità di apprendere e approfondire autonomamente nuove tecniche algoritmiche e paradigmi di programmazione;
· la capacità di aggiornare continuamente le proprie competenze rispetto all'evoluzione delle tecnologie software, dei linguaggi di programmazione e degli strumenti basati sull'Intelligenza Artificiale;
· la capacità di reperire, comprendere e utilizzare documentazione tecnica e scientifica relativa ad algoritmi, strutture dati, programmazione avanzata e AI-Assisted Coding;
· le competenze necessarie per affrontare con elevato grado di autonomia studi successivi negli ambiti dell'informatica e dell'ingegneria del software, nonché attività professionali che richiedano capacità di analisi, progettazione e sviluppo di sistemi software complessi.
Modalità di svolgimento dell'insegnamento
L'insegnamento si svolge attraverso lezioni frontali, integrate da esempi applicativi, esercitazioni e momenti di discussione finalizzati a favorire la comprensione e l'approfondimento degli argomenti trattati.
Le attività didattiche prevedono l'analisi di problemi algoritmici, la progettazione e l'implementazione di soluzioni software in linguaggio C++, nonché l'utilizzo di strumenti di Intelligenza Artificiale a supporto della generazione, del debugging, del testing e dell'ottimizzazione del codice.
Qualora l'insegnamento venga erogato in modalità mista o a distanza, potranno essere introdotte le necessarie variazioni organizzative e metodologiche, nel rispetto degli obiettivi formativi e dei contenuti riportati nel presente syllabus
Modalità di svolgimento dell'insegnamento
Il corso prevede come metodo di insegnamento principale le lezioni frontali per acquisire le conoscenze teoriche di base e tutti gli elementi sintattici e lo svolgimento di esercitazioni proposte dal docente per acquisire la capacità di risolvere i problemi, applicare la conoscenza e utilizzare gli ambienti e le metodologie di sviluppo.
Il docente propone, inoltre, delle esercitazioni individuali che consistono nella soluzione di un problema, che lo studente deve affrontare in autonomia che vengono successivamente corrette o discusse in classe.
Prerequisiti richiesti
· concetto di algoritmo, definizione e caratteristiche di un linguaggio di programmazione, strutture dati di base
· Conoscenza delle architetture dei calcolatori base e le relative problematiche
· Conoscenze di base di ingegneria del software.
· Conoscenza dei paradigmi di programmazione procedurali e ad oggetti
· Conoscenza dei linguaggi C e Java
· Elementi di matematica discreta e di analisi matematica
Frequenza lezioni
La frequenza delle lezioni non è obbligatoria ma è fortemente consigliata.
Contenuti del corso
Parte 1: Algoritmi
· Fondamenti. Introduzione agli algoritmi ed alla loro descrizione. Tempi di esecuzione. Tecniche algoritmiche., Ordinamento e statistiche d'ordine. Ordinamento in tempo lineare.
· Strutture dati. Strutture dati elementari. Hashing. Alberi binari di ricerca e rosso-neri.
· Tecniche avanzate di progettazione e di analisi. Programmazione dinamica e greedy.
· Strutture dati avanzate. Arricchire le strutture dati. B-alberi.
Parte 2: IL linguaggio C++
· Fondamenti del linguaggio C++: classi, oggetti, puntatori, riferimenti e gestione della memoria.
· Programmazione orientata agli oggetti: incapsulamento, ereditarietà, polimorfismo e riuso del codice.
· Overloading di funzioni e operatori, creazione dinamica di oggetti e progettazione di software estensibile.
· Template, classi contenitore e utilizzo della Standard Template Library (STL).
· Gestione delle eccezioni, passaggio di parametri, valori di ritorno e sviluppo di applicazioni robuste ed efficienti.
Parte 3: AI coding:
· Introduzione all'AI-Assisted Coding e ai modelli linguistici per la programmazione.
· Strumenti per la generazione di codice a partire da specifiche in linguaggio naturale e tecniche di prompt engineering.
· Utilizzo dell'Intelligenza Artificiale per il debugging, il testing e la generazione automatica di documentazione.
· Tecniche di refactoring e ottimizzazione del codice assistite da AI.
· Valutazione critica del codice generato dall'AI: qualità, sicurezza, affidabilità e integrazione nel processo di sviluppo software.
Testi di riferimento
[T1] Introduzione agli algoritmi e strutture dati. IV Edizione. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. MCGraw-Hill. 2023.
[T2] Thinking in C++, Vol 1 Thinking in C++, Bruce Eckel
[T3] Dispensa fornita dal docenteVerifica dell'apprendimento
Modalità di verifica dell'apprendimento
E' previsto lo sviluppo di un elaborato assegnato dal docente e una prova orale successiva alla discussione dell'elaborato.
Lo studente dovrà compilare un form di richiesta di assegnazione dell'elaborato contenente alcune infomazioni sulla base delle quali il docente procedera all'assegnazione dell'elaborato.
La richiesta dovrà essere effettuata durante il periodo delle lezioni e l'elaborato assegnato potrà essere presentato entro l'anno accademico.
La consegna dell'elaborato (codice e relazione) dovrà essere inviata attraverso il portale Microsoft Teams entro la data concordata al momento dell'assegnazione dell'elaborato.
L'elaborato dovrà essere sviluppato da gruppi di 2 studenti. Solo in casi motivati sarà possibile sviluppare l'elaborato in modo individuale.
L’esame sarà organizzato in due parti che si svolgeranno nello stesso giorno.
La prima riguarderà la discussione dell’elaborato svolto, la seconda prevede una discussione sull’intero programma.
La mancata presentazione dell’elaborato progettuale comporterà lo svolgimento dell’esame esclusivamente sulla parte teorica del programma. In tal caso, la valutazione finale non potrà essere superiore a 28/30.
Esempi di domande e/o esercizi frequenti
Esempi di domande e/o esercizi frequenti
Disponibili su Microsoft Teams