Software Architectures
Corso avanzato tenuto in lingua inglese, presentato qui in italiano per essere integrato nell’insieme della mia attività didattica. Nel materiale del corso compare anche con il titolo Software Architectures. È dedicato all’architettura dei sistemi software complessi, considerati su larga scala: distribuzione, middleware, componenti, stili e pattern architetturali, applicazioni enterprise e architetture orientate ai servizi.
Riferimenti essenziali
- Istituzione: Università POLITEHNICA di Bucarest
- Facoltà: FILS – Facoltà di Ingegneria in Lingue Straniere
- Lingua di insegnamento: inglese
- Programma: master in Software Engineering
- Anno / semestre: secondo anno, primo semestre
- Titolo ufficiale: Software Architecture
- Titolo nel materiale del corso: Software Architectures
- Docente responsabile: Luca Dan Șerbănați
- Struttura: 3 ore di lezione + 2 ore di laboratorio
- Valutazione: esame finale
- Crediti: 5
- Prerequisiti: Software Development Methods, modellazione UML ed esperienza consistente di programmazione in Java o C++
Il posto del corso nella mia attività didattica
Questo corso rappresenta il punto di maturità della mia sequenza didattica dedicata all’ingegneria del software. Se in altri corsi l’accento cadeva sul processo, sull’analisi e sulla progettazione orientata agli oggetti, qui l’interesse si sposta sulle principali decisioni strutturali: come il sistema viene suddiviso in componenti, come tali componenti comunicano, come vengono sostenute scalabilità, integrazione, tolleranza ai guasti ed evoluzione, e quali meccanismi middleware sono necessari per sistemi distribuiti reali.
È, per eccellenza, un corso sul software considerato su larga scala. Non si tratta più soltanto di classi e collaborazioni locali, ma dell’architettura come insieme di decisioni difficili da modificare in seguito e dell’infrastruttura concettuale e tecnologica richiesta dai sistemi enterprise e distribuiti.
Obiettivo del corso
L’obiettivo generale del corso è sviluppare una comprensione approfondita dell’architettura software: che cos’è, come si rapporta all’analisi e alla progettazione dettagliata, quali stili e pattern la strutturano e come può essere utilizzata per costruire sistemi robusti, manutenibili, estensibili e integrabili.
In questa prospettiva, l’architettura appare come il livello al quale vengono trattati esplicitamente distribuzione, concorrenza, persistenza, comunicazione remota, container di componenti, application server, interoperabilità e architetture orientate ai servizi.
Struttura del corso
1. Introduzione al software design e al ruolo dell’architettura
Il materiale inizia con un riepilogo delle nozioni fondamentali di progettazione software: ciclo di vita, forward e reverse engineering, ruolo dei modelli nello sviluppo, processo iterativo e incrementale, relazione tra analisi e progettazione e differenza tra architectural design e object design.
In questo contesto vengono discusse anche la complessità del software, la progettazione come gestione dei vincoli, i principi di progettazione (SOLID, DRY, KISS, separation of concerns), nonché l’idea di model-driven design.
2. L’architettura software come livello distinto della progettazione
Una sezione importante chiarisce la posizione dell’architettura tra i diversi livelli di progettazione: enterprise-wide architecture, stili architetturali delle applicazioni, pattern architetturali e design pattern. L’architettura viene presentata come il livello in cui si decide la distribuzione delle responsabilità tra componenti e tecnologie e si stabilisce il contesto nel quale può avvenire la progettazione di livello inferiore.
3. Stili, pattern e architetture specifiche di dominio
Il corso distingue tra architectural styles, architectural patterns e domain-specific software architectures. Gli stili definiscono il vocabolario dei componenti e dei connettori e il modo in cui possono essere combinati, mentre i pattern architetturali offrono soluzioni ricorrenti a problemi architetturali ben noti. Parallelamente, le architetture specifiche di dominio vengono presentate come forme avanzate di riuso della conoscenza ingegneristica.
4. Sistemi distribuiti
Un blocco fondamentale del corso è dedicato ai sistemi distribuiti. Vengono discusse le loro caratteristiche fondamentali, le trasparenze che devono realizzare e le difficoltà introdotte dalla distribuzione. La distribuzione viene trattata insieme alla concorrenza e alla persistenza come una delle dimensioni concettuali centrali del calcolo distribuito.
Si insiste sul fatto che l’infrastruttura di comunicazione costituisce il problema centrale nella progettazione dei sistemi distribuiti e che la trasparenza di accesso, localizzazione, migrazione, replica, concorrenza, prestazioni e scalabilità non è data, ma deve essere costruita mediante adeguati mezzi architetturali.
5. Middleware per la comunicazione remota
Una parte consistente del corso è dedicata al middleware. Vengono discussi i servizi necessari al calcolo distribuito — naming, security, transaction, persistence, event e message queuing — e quindi le principali famiglie di middleware per la comunicazione remota: RPC-based middleware, ORB-based middleware e Message-Oriented Middleware.
In quest’area compaiono esplicitamente la comunicazione con oggetti remoti, Java RMI, il ruolo di stub e skeleton, il registro RMI e CORBA.
6. Architetture basate su componenti e component middleware
Il corso attribuisce un posto importante alle architetture basate su componenti. Vengono presentate le idee di componente, container, contratto tra componenti e container, nonché i componenti CORBA con porte di tipo facets, receptacles, event sources, event sinks e attributi configurabili.
L’accento cade sulla modificabilità e sull’integrabilità: i componenti sono trattati come entità debolmente accoppiate, dotate di interfacce ben definite, facili da sostituire e integrare in un sistema più ampio.
7. Application server e Jakarta EE / EJB
Un’altra sezione solida è dedicata agli application server come forma avanzata di middleware. Vengono discussi il runtime environment, i servizi offerti dagli application server, il component model, la scalabilità, il load balancing, la fault tolerance, la sicurezza e le capacità di integrazione.
In questa parte compaiono esplicitamente Jakarta EE e i suoi container (Enterprise Bean container, Web container, Application Client container), nonché Enterprise JavaBeans come modello server-side per incapsulare la logica di business. Vengono presentati anche gli strumenti associati a Eclipse GlassFish Server.
8. Design pattern come fondamento architetturale
Sebbene l’obiettivo principale del corso sia l’architettura, il materiale include anche un’ampia ripresa dei design pattern, trattati come base concettuale per le soluzioni architetturali. Vengono discussi i principi di assegnazione delle responsabilità e i pattern fondamentali, creazionali, strutturali e comportamentali.
In questo modo, il corso suggerisce chiaramente la continuità tra le decisioni locali di design e l’organizzazione architetturale complessiva.
9. Service-Oriented Architecture
Una parte ampia è dedicata alle architetture orientate ai servizi. Vengono presentati i livelli di una SOA, il ruolo dei gateway, il livello di normalizzazione tecnologica e dei dati, il livello di composizione dei processi e il problema delle transazioni in tali architetture.
Sono discussi anche l’ESB, l’orchestrazione e la coreografia dei web service, nonché Service Locator, Service Façade e Virtual Provider come pattern di integrazione e accesso ai servizi.
10. Web service, integrazione e API economy
Nella parte finale, il corso considera l’evoluzione delle soluzioni di integrazione: da EAI e SOA verso le web API e l’API management. Vengono discusse la relazione tra SOA e web API, l’evoluzione delle soluzioni basate su ESB, la comparsa dei gateway, l’esposizione delle API al di fuori dell’impresa e il passaggio verso l’API Economy e i microservizi.
Questa parte conferisce al corso un’apertura molto attuale, mostrando come i principi dei servizi e dell’integrazione si prolunghino naturalmente nelle nuove architetture orientate alle API e nei sistemi agili fortemente distribuiti.
Laboratorio e attività
La componente pratica mirava ad applicare le idee architetturali in contesti Java enterprise e distribuiti. La pagina poneva già l’accento su JavaBeans, NetBeans, Eclipse e sulla componente di laboratorio, mentre il materiale recuperato conferma esplicitamente la presenza delle tecnologie Jakarta EE / EJB, dei container, degli application server e degli strumenti GlassFish.
Dal punto di vista didattico, ciò mostra che non si trattava di un corso puramente teorico, ma di un insegnamento che metteva in relazione i concetti architetturali con l’infrastruttura tecnologica effettivamente necessaria alle applicazioni enterprise e distribuite.
Valutazione
La valutazione si basava sull’attività svolta durante il semestre e sull’esame finale. Dal punto di vista del contenuto, era essenziale non soltanto memorizzare stili o pattern, ma comprendere come si scelgono le strutture architetturali, come si giustifica l’uso del middleware e come si progetta un sistema coerente, distribuito e integrabile.
Bibliografia di base
- M. Shaw, D. Garlan, Software Architecture: Perspectives on an Emerging Discipline, Prentice Hall, 1996.
- F. Buschmann et al., Pattern-Oriented Software Architecture, Wiley, 1996.
- E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Patterns, Addison-Wesley, 1995.
- M. Fowler et al., Patterns of Enterprise Application Architecture, Addison-Wesley, 2002.
- G. Hohpe, B. Woolf, Enterprise Integration Patterns, Addison-Wesley, 2004.
- P. Kuchana, Software Architecture Design Patterns in Java, Auerbach, 2004.
Significato del corso
Visto retrospettivamente, questo corso esprime molto bene un’idea che mi ha accompagnato costantemente: il software di grandi dimensioni non può essere compreso e costruito soltanto a livello del codice. Richiede modelli, stili, pattern, componenti, middleware, application server e meccanismi di integrazione capaci di sostenere il funzionamento dell’intero sistema.
Per questo motivo, Software Architecture non è soltanto un corso sulle architetture note o sulle tecnologie distribuite. È un corso sul giudizio ingegneristico necessario per organizzare la complessità, integrare sottosistemi eterogenei e trasformare un insieme tecnologico disperso in un sistema coerente, robusto ed evolutivo.





