Fondamenti di informatica, ingegneria del software e notazione UML, programmazione Java, elementi di analisi matematica su serie e successioni.
Acquisire conoscenze teoriche, 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 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, middleware e altre tecnologie per l'architettura del software.
**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.
Didattica frontale ed esercitazione in laboratorio.
Prova scritta, progetto software e prova orale.
Per il materiale didattico e altri dettagli sul corso, occorre iscriversi e fare riferimento al corso sulla piattaforma di e-learning Moodle UniBg.
Fundamentals of: Computer Science, Software Engineering and UML notation, Java programming. Mathematical basis of series and sums.
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, middleware and other technologies for software architecture.
**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.
Theoretical lessons and laboratory exercises.
Written exam, software project design and development, and oral exam.
For teaching material and other details on the course, register and always refer to the course page on the Moodle UniBg e-learning platform.