PROGETTAZIONE, ALGORITMI E COMPUTABILITÀ | Università degli studi di Bergamo - Didattica e Rubrica

PROGETTAZIONE, ALGORITMI E COMPUTABILITÀ

Modulo Generico
Codice dell'attività formativa: 
38090-MOD1

Scheda dell'insegnamento

Per studenti immatricolati al 1° anno a.a.: 
2022/2023
Insegnamento (nome in italiano): 
PROGETTAZIONE, ALGORITMI E COMPUTABILITÀ
Tipo di attività formativa: 
Attività formativa Caratterizzante
Tipo di insegnamento: 
Obbligatoria
Settore disciplinare: 
SISTEMI DI ELABORAZIONE DELLE INFORMAZIONI (ING-INF/05)
Anno di corso: 
1
Anno accademico di offerta: 
2022/2023
Crediti: 
9
Responsabile della didattica: 
Altri docenti: 

Altre informazioni sull'insegnamento

Ciclo: 
Primo Semestre
Obbligo di frequenza: 
No
Ore di attività frontale: 
72
Ore di studio individuale: 
135
Ambito: 
Ingegneria informatica
Prerequisiti

Fondamenti di informatica, ingegneria del software e notazione UML, programmazione Java, elementi di analisi matematica su serie e successioni.

Obiettivi formativi

Al termine del modulo, lo studente acquisisce conoscenze teoriche e pratiche su metodi e strumenti di sviluppo utili per progettare e implementare “in grande” ed “in piccolo” un'applicazione software, attraverso: un processo di sviluppo “agile”; progettazione e analisi dell'architettura software; uno sviluppo orientato alle componenti/servizi e all'efficienza degli algoritmi e strutture dati impiegate; il linguaggio di modellazione UML ed un linguaggio di programmazione ad oggetti come Java; l’ambiente di sviluppo Eclipse e relativi plug-in, framework e altre tecnologie di supporto per lo sviluppo di API e architetture software anche distribuite.

Contenuti dell'insegnamento

**Progettazione in grande**: Si progetta e analizza la suddivisione del software in sotto-sistemi/componenti funzionali e lo scambio dati/comunicazione tra questi mediate API in ambito distribuito.
Argomenti: processi di sviluppo agili, AMDD, gestione dei requisiti e modellazione dei casi d'uso, progettazione dell'architettura software e delle componenti in UML, analisi di qualità di una architettura software (affidabilità e disponibilità), design pattern e stili architetturali avanzati quali architetture adattative, IoT-Cloud, architettura a (micro)-servizi, ecc., sviluppo del software per componenti/oggetti, sviluppo di interfacce grafiche di applicazioni desktop e mobili in Java/Android, sviluppo di API con REST e gRPC, testing di unità delle componenti e copertura del codice, strumenti per il calcolo di metriche di qualità e analisi statica del software.

**Progettazione in piccolo**: Analisi di dettaglio di ogni componente e definizione dell'algoritmo.
Argomenti: Introduzione agli algoritmi e strutture dati, ciclo di sviluppo di codice algoritmo, complessità del calcolo e notazione asintotica, realizzazione di algoritmi e tipi astratti di dati in Java, strutture dati e algoritmi fondamentali (liste, pile, code), algoritmi di ordinamento, alberi e loro gestione, alberi di ricerca (alberi binari di ricerca, B-alberi, alberi rosso-neri), applicazioni degli alberi per il processamento di documenti XML, tabelle hash, grafi e loro rappresentazione e gestione, cammini minimi, metodologie di progettazione di algoritmi (incrementale,divide-et-impera,greedy,programmazione dinamica).

**Computabilità**:
Teoria della computabilità: concetti e teoremi fondamentali; Macchine di Turing.

Metodi didattici

Didattica frontale ed esercitazione in laboratorio.

Modalità verifica profitto e valutazione

Prova scritta e prova orale (progettazione e sviluppo di un progetto software).

L'esame prevede una prova scritta ed una, successiva, prova orale. Entrambe le prove sono obbligatorie. La prova scritta è divisa in due parti. La prima parte comprende 4 domande a risposta aperta su "Progettazione e algoritmi" (durata di un'ora e mezza), mentre la seconda parte comprende un questionario con 10 domande a risposta multipla e una a risposta aperta sulla "Computabilità" (durata 45 minuti). Viene ammesso all'orale solo chi consegue ad entrambi gli scritti un punteggio superiore a 18/30. La prova orale consiste nella presentazione e discussione di un elaborato software, realizzabile anche a piccoli gruppi di 2-3 studenti, e la si supera con un punteggio superiore a 18/30. Il punteggio finale del modulo è dato dalla media pesata del punteggio della seconda parte dello scritto (sulla "Computabilità") e del punteggio ottenuto come media aritmetica tra il punteggio della prima parte dello scritto (su "Progettazione e algoritmi") e dell'orale.

Il voto finale dell'intero corso integrato di "PROGRAMMAZIONE AVANZATA + PROGETTAZIONE,ALGORITMI E COMPUTABILITA'" a cui questo modulo appartiene è dato dalla media pesata (in base ai CFU) tra i voti conseguiti nei due moduli.

Altre informazioni

Per il materiale didattico e altri dettagli sul corso, occorre iscriversi e fare riferimento al corso sulla piattaforma di e-learning Moodle UniBg.

In caso di disposizioni dell’autorità competenti in materia di contenimento e gestione dell’emergenza epidemiologica, l'insegnamento potrebbe subire modifiche rispetto a quanto dichiarato nel syllabus per rendere il corso e gli esami in linea con quanto disposto.

Prerequisites

Fundamentals of: Computer Science, Software Engineering and UML notation, Java programming. Mathematical basis of series and sums.

Educational goals

At the end of the course, students will acquire theoretical notions, methods and development tools useful to project and implement "coarse grained" and "fine grained" software applications.

This is accomplished through an "agile" and "component-based" development process; design and analysis of the software architecture;
involvement of good quality alghorithms and data structures; the UML modeling language; an object-oriented programming language like Java; the Eclipse development environment and associated plug-ins, frameworks and other technologies for the development of API and distributed software architectures.

Course content

**Coarse grained design**: Software architecture and API-based design and analysis.

Topics: agile development processes, AMDD, requirements manipulation and use case modeling, SW architecture design in UML, SW architecture
quality analysis (relyability and availability), architectural design patterns/styles (adaptive, IoT-Cloud-based, (micro-)service-oriented), graphical UIs for Java/Android destop/mobile applications, API-based development with REST e gRPC, unit testing and code coverage of a software applications, tools for SW metrics and static analysis.

**Fine grained design**: Detailed analysis of each component and definiton of algorithms.

Topics: Introduction to algorithms and data structures, development cycle of an algorithm, algorith complexity and asymptotic notation, guidelines for implementing algorithms and abstract data types in Java, basic data structure and algorithms (list, stack, queue), order algorithms, tree data types, research trees (binary research trees, B-trees, red-black trees), application of tree data types to manipulate XML documents, hash tables, graphs representation and traversals, graph minimum paths, design methodologies for algorithms (incremental,divide-et-impera,greedy,dynamic programming).

** Computability **:
Computability theory: fundamental concepts and theorems; Turing machines.

Teaching methods

Theoretical lessons and laboratory exercises.

Assessment and Evaluation

Written exam, and the design and development of a software project to be presented and discussed during the oral exam. So the exam includes a written test and a subsequent oral test. Both tests are mandatory.

The written test is divided into two parts. The first part includes 4 open-ended questions on "Design and algorithms" (duration of an hour and a half), while the second part includes a questionnaire (10 questions multiple choice and one open-ended) on "Computability" (duration 45 minutes). Only those obtaining a score higher than 18/30 for both the two parts are admitted to the oral exam. The oral exam consists in the presentation and discussion of an software project, which can also be developed in small groups of 2-3 students, and is considered passed with a score higher than 18/30. The final score of the module is given by the weighted average of the score of the second part of the writing (on "Computability") and of the score obtained as the arithmetic average between the score of the first part of the writing (on "Design and algorithms") and of the oral exam (the software project).

The final score of the entire integrated course of "ADVANCED PROGRAMMING + DESIGN, ALGORITHMS AND COMPUTABILITY", which this module belongs to, is given by the weighted average of the marks obtained in the two modules.

Further information

For teaching material and other details on the course, register and always refer to the course page on the Moodle UniBg e-learning platform.

In case of epidemiological emergencies, the teaching and exam methods could change according to the measures of the competent authorities.