Luca Dan Șerbănați all'esame di maturità, 1961
Luca Dan Șerbănați nei primi anni Settanta
Luca Dan Șerbănați all'ultima lezione del quinto anno, aprile 1989

Luca Dan Șerbănați

Professore emerito alla Politehnica di Bucarest

Ricerca, insegnamento, industria e memorie

RO | EN | IT
Luca Dan Șerbănați a Venezia, 1990
Luca Dan Șerbănați a New York, 2005
Luca Dan Șerbănați

Riferimenti essenziali

  • Istituzione: Università POLITEHNICA di Bucarest
  • Facoltà: FILS – Facoltà di Ingegneria in Lingue Straniere
  • Specializzazione: Information Engineering
  • Anno / semestre: quarto anno, primo semestre
  • Lingua di insegnamento: inglese
  • Titolo ufficiale: Software Design Techniques
  • Docente responsabile: Luca Dan Șerbănați
  • Struttura: 2 ore di lezione + 2 ore di laboratorio
  • Valutazione: due progetti principali + esame scritto
  • Crediti: da verificare
  • Prerequisiti: Software Development Methods, Object-Oriented Programming

Il posto del corso nell’evoluzione della mia attività didattica

Questo corso rappresenta una delle forme più mature del modo in cui ho inteso insegnare l’ingegneria del software alla FILS. Se in Software Development Methods l’accento era posto sul processo, sui requisiti, sulla modellazione del dominio e sulla costruzione graduale del modello di analisi, qui l’interesse si sposta sulla progettazione: come si organizza il sistema, come si distribuiscono le responsabilità, come si scelgono le strutture architetturali e come si riutilizzano soluzioni di progettazione convalidate dall’esperienza.

Inoltre, il corso apre esplicitamente la strada ai sistemi distribuiti, al middleware e alle architetture orientate ai servizi; non rimane quindi al livello della progettazione locale orientata agli oggetti, ma passa ai problemi più ampi dei sistemi software enterprise.

Obiettivo del corso

Il corso mira a formare una visione ingegneristica della progettazione software: come passare dai modelli risultanti dall’analisi a strutture implementabili, come separare l’astrazione dall’implementazione, come scegliere stili e pattern adeguati e come progettare sistemi che rimangano modulari, scalabili, manutenibili ed estensibili.

Da questa prospettiva, la disciplina ha un duplice carattere: da una parte, chiarisce i principi teorici della progettazione; dall’altra, obbliga gli studenti ad applicarli concretamente in progetti di dimensioni maggiori rispetto ai consueti esercizi di programmazione.

Profilo del corso

Il materiale del corso lo presenta come un insegnamento di advanced software design, destinato allo sviluppo di sistemi software di grandi dimensioni. L’accento cade sulla relazione tra progettazione orientata agli oggetti, architettura dei sistemi e tecniche di riuso. Il corso supera così il livello di un semplice repertorio di diagrammi UML e cerca di offrire un quadro concettuale coerente per la progettazione di sistemi complessi.

Può essere considerato un ponte tra le discipline di analisi e modellazione, da una parte, e quelle dedicate all’architettura software, ai sistemi distribuiti e all’integrazione delle applicazioni, dall’altra.

Struttura del corso

1. Introduzione al software design

La parte introduttiva discute il posto della progettazione nel ciclo di vita dello sviluppo software, la differenza tra forward engineering e reverse engineering, il ruolo dei modelli nel processo di sviluppo e il carattere architecture-centric dello Unified Process. In quest’area viene chiarita anche la distinzione tra architectural design e object design.

2. Concetti e principi fondamentali di progettazione

Il corso introduce gli strumenti concettuali della progettazione: astrazione, reificazione, deduzione e induzione. Su questa base vengono discussi i moderni principi di progettazione: SOLID, DRY, KISS, YAGNI, nonché l’idea di separation of concerns. Compaiono anche tecniche classiche quali stepwise refinement, livelli di astrazione e progettazione strutturata.

3. Qualità perseguite nella progettazione

Una sezione importante riguarda il vocabolario della qualità ingegneristica: modularità, componentizzazione, riuso, prestazioni, scalabilità, resilienza, tolleranza ai guasti ed elasticità. L’accento cade sul fatto che la progettazione è essenzialmente una negoziazione tra vincoli e qualità desiderate.

4. Dall’analisi alla progettazione

Il corso spiega esplicitamente come il modello di progettazione derivi dal modello di analisi: la relazione tra use-case model, modello del dominio, SSD, contratti delle operazioni e classi di progettazione. Viene sottolineata l’idea della tracciabilità della progettazione rispetto all’analisi e quella di “ridurre la distanza intellettuale” tra il dominio del problema e la struttura software.

5. Riuso e pattern nello sviluppo software

Una componente centrale del corso è dedicata al riuso: non soltanto riuso del codice, ma anche di idee, strutture, comportamenti, esperienza ingegneristica e modelli di soluzione. In questo contesto vengono introdotti i concetti di pattern, stile architetturale, pattern architetturale e architettura specifica di dominio.

6. Assegnazione delle responsabilità

Prima dei pattern GoF propriamente detti, il corso discute i principi fondamentali per l’assegnazione delle responsabilità alle classi: Information Expert, Creator, Low Coupling, High Cohesion e Controller. Essi svolgono il ruolo di criteri generali della progettazione orientata agli oggetti.

7. Pattern fondamentali e creazionali

Vengono trattati pattern fondamentali quali Delegation, Interface, Marker Interface e Proxy, seguiti dai pattern creazionali: Factory Method, Abstract Factory, Builder, Prototype, Singleton e Object Pool.

In questa parte il corso insiste sul disaccoppiamento del client dalle classi concrete, sul controllo del processo di creazione e sul riuso delle strutture per la costruzione di oggetti complessi.

8. Pattern strutturali e comportamentali

Il corso affronta poi pattern strutturali quali Filter, Composite, Adapter, Iterator, Bridge, Facade, Decorator e Virtual Proxy, nonché il repertorio dei pattern comportamentali (Command, Observer, State, Strategy, Template Method, Visitor, Mediator, Interpreter ecc.).

L’obiettivo non è memorizzarli isolatamente, ma comprendere le relazioni tra loro e il modo in cui possono essere combinati nella progettazione di un’applicazione reale.

9. Stili e pattern architetturali

Un’altra sezione importante è dedicata all’architettura software: la differenza tra stile architetturale, pattern architetturale e architettura di riferimento, nonché il loro ruolo nell’organizzazione dei grandi sistemi. Vengono discussi stili quali monolitico, client–server, N-tier, layered, component-based, event-driven, message-passing, SOA, REST, microservices, peer-to-peer e space-based.

Sono presentati anche pattern architetturali quali Broker, Model-View-Controller, Model-View-ViewModel, Microkernel, Plug-ins, CQRS e Ports and Adapters.

10. Sistemi distribuiti, middleware e servizi

Nella parte avanzata, il corso si occupa della progettazione delle applicazioni distribuite: le dimensioni della distribuzione, della concorrenza e della persistenza, i servizi necessari al calcolo distribuito e l’infrastruttura middleware. Vengono introdotte forme di middleware per la comunicazione remota: RPC/RMI, ORB e Message-Oriented Middleware, seguite dal ruolo degli application server.

Il corso passa quindi alle architetture orientate ai servizi, all’approccio SOMA e a un’introduzione alle architetture orientate ai web service.

11. Progetti

Il materiale del corso indica esplicitamente una componente applicativa consistente: esercitazioni pratiche e due importanti progetti di progettazione. Questi miravano non soltanto all’applicazione isolata di alcuni pattern, ma alla loro integrazione in un design coerente, capace di sostenere requisiti funzionali e non funzionali realistici.

Laboratorio e progetto

La componente pratica del corso aveva il compito di trasformare principi e pattern in decisioni effettive di progettazione. Gli studenti dovevano scegliere strutture adeguate, giustificare l’uso di determinati pattern e costruire modelli di collaborazione tra oggetti, sottosistemi e servizi.

I progetti occupavano un posto centrale nella valutazione. Dal materiale recuperato risulta che erano concepiti come veri progetti di design, non come semplici esercizi di codifica: dovevano dimostrare la scelta di uno stile architetturale, di pattern dominanti e di una struttura coerente delle responsabilità.

Bibliografia di base

  • Luca Dan Șerbănați, Software Design Techniques, materiale del corso.
  • L. D. Șerbănați, Integrating Tools for Software Development, Yourdon Press / Prentice Hall, 1992.
  • E. Gamma, R. Helm, R. Johnson, J. Vlissides, Design Patterns.
  • G. Booch, J. Rumbaugh, I. Jacobson, The Unified Modeling Language. User Guide.
  • M. Fowler, UML Distilled.
  • C. Larman, Applying UML and Patterns.
  • R. C. Martin, lavori sui principi SOLID.

Significato del corso

Visto retrospettivamente, questo corso segna il passaggio dall’insegnamento della modellazione software all’insegnamento dell’arte di progettare concretamente sistemi complessi. Non tratta più soltanto “come descriviamo” un sistema, ma “come lo organizziamo” affinché resista al cambiamento e possa essere esteso, distribuito e integrato.

In questo senso, occupa una posizione di collegamento tra l’analisi e la modellazione apprese in precedenza e le discipline dedicate all’architettura software, ai sistemi distribuiti e all’integrazione. Cercava di abituare gli studenti all’idea che la progettazione non è una semplice continuazione dell’analisi, ma un’attività distinta nella quale intervengono compromessi, vincoli, scelte tecnologiche e forme di riuso.

Risorse

Nel contesto degli altri corsi