MokaByte 96 - Maggio 2005
  MokaByte 96 - Maggio 2005  

 

 

 

Il Processo Unificato nelle applicazioni J2EE
Velocità, affidabilità e qualità

Chi non ricorda i mattoncini Lego? Facili da usare e praticamente senza restrizioni su come assemblarli: potevano essere applicati sulla testa dei personaggi con la stessa facilità con cui un tetto poteva essere applicato su quattro muri. Adesso alzi la mano chi si è anche cimentato nel tentativo di costruire la struttura raffigurata sulla scatola semplicemente guardandola. Non era così semplice vero? Se però si seguivano le istruzioni contenute nel manualetto di circa venti pagine che mostrava passo dopo passo come costruirla le cose erano decisamente più facili. Ecco il motivo fondamentale per cui si modella il software, e cioè per evitare di procedere a tentoni spendendo tempo e risorse e per cercare di raggiungere un elevato livello qualitativo. Un prodotto ben studiato e documentato e dotato di una solida struttura alla fine paga, ma la qualità elevata non è "compresa nel prezzo": esistono diverse cose che devono accadere tra la fase di concepimento di un progetto e il prodotto finito, e che rappresentano il risultato diretto della modellazione del software prima del suo sviluppo. L'obiettivo del presente articolo è appunto quello di riassumere le idee alla base del Processo Unificato - metodologia di progettazione tra le più diffuse e apprezzate - discutendone le problematiche di applicazione pratica, compresa l'utilità di disporre di strumenti adeguati in grado di supportare in modo completo il compito del team di lavoro.

Il Processo di Modellazione Unificato
Il grande successo che ha avuto UML (rif.[1]) risiede nella sua elevata potenza espressiva, perchè si tratta di un linguaggio semantico che può essere applicato a qualsiasi processo di sviluppo software. Tuttavia UML è soltanto un formalismo per modellare, non un modo di progettare un sistema. Per utilizzare efficacemente UML è necessario avvalersi di un metodo di progettazione. Ne esistono diversi (ad esempio OOSP - rif.[2] - oppure ICONIX - rif.[3]- o ancora OPEN - rif.[4]), ma il più comune è probabilmente il primo che è stato utilizzato insieme con UML, quello noto come Rational Unified Process (RUP nel seguito) anche se poi è stato rinominato semplicemente Unified Process, ovvero Processo Unificato (rif.[5]). Come spiegato dettagliatamente in rif.[6], RUP non è fisso e inalterabile, ed è perfettamente possibile fare in modo che si adatti alle proprie competenze e alle proprie necessità, al fine di utilizzarlo con efficacia nel proprio processo produttivo.

 

Sviluppare il software
Un processo di sviluppo software è costituito da un insieme di fasi da seguire per portare un sistema dall'ideazione all'implementazione effettiva. Tali fasi comportano la messa in campo di numerose discipline, che tipicamente sono:

- Modellazione del Business
- Raccolta dei requisiti
- Analisi e Progettazione
- Implementazione
- Test
- Deployment
- Gestione della Configurazione e dei Cambiamenti
- Project Management
- Gestione dell'ambiente

Ciascuna delle suddette discipline necessita della possibilità di essere raffinata ed iterata, sia perchè è impossibile pensare che l'attività ad essa relativa sia a un dato momento completamente "stabile e definitiva", sia perchè occorre sempre poter gestire al meglio eventuali modifiche da apportare "in corsa" in virtù di cambiamenti che il sistema finale deve osservare. Anche per questo si tende a raccomandare l'impiego di strumenti di sviluppo visuali che permettono di raggiungere quella astrazione fondamentale per catturare al meglio gli aspetti più rilevanti del business, ma si sottolinea altresì la necessità di prevedere intense fasi di verifica tramite test del software che viene via via prodotto, proprio al fine di garantirne in modo sempre maggiore il livello qualitativo.

 

RUP: le fasi componenti
Nel caso specifico del Processo Unificato (RUP), è possibile individuare quattro fasi componenti, e precisamente:

- Inception, ovvero Inizio, fase in cui il sistema da sviluppare viene identificato, assieme ai suoi contenuti e casi d'uso
- Elaboration, ovvero Elaborazione, fase in cui viene eseguita una progettazione dettagliata che porta ad identificare le basi del sistema
- Construction, ovvero Costruzione, fase in cui si procede alla scrittura del software
- Transition, ovvero Transizione, fase in cui il sistema viene fornito agli utenti

Nella sottostante figura 1, il collocamento delle varie discipline discusse nel paragrafo precedente "incrociate" in modo matriciale con le quattro fasi del RUP.


Figura 1
- Il Processo Unificato

E' molto importante ricordare che il RUP possiede due dimensioni, una di tipo "statico", che raggruppa le diverse discipline rilevanti al ciclo di vita del progetto, l'altra di tipo "dinamico", che crea e mantiene un appropriato "contesto" per l'implementazione delle diverse attività corrispondenti alle medesime discipline coinvolte. Ecco il motivo per cui all'interno di ciascuna fase devono essere individuate, pianificate ed eseguite tutte le diverse iterazioni necessarie a portare avanti il progetto con il massimo controllo possibile.

 

Applicare RUP in pratica
Quando si decide di utilizzare RUP per i propri obiettivi di business, diviene vitale la scelta di uno strumento di sviluppo appropriato, in grado di coprire le diverse fasi del Processo Unificato e, all'interno di ciascuna di esse, garantire la possibilità di effettuare le varie iterazioni come previste dall'impiego delle diverse discipline coinvolte, il tutto con l'obiettivo di assicurare al sistema da sviluppare la massima qualità nei tempi più brevi.
Altro aspetto non meno importante è identificare con chiarezza i diversi attori e ruoli coinvolti in ciascuna fase, allo scopo di garantire al team di lavoro una accorta e precisa suddivisione dei compiti e assegnazione di ciascun attore al ruolo più appropriato secondo i suoi specifici skill.
Per illustrare meglio tutto ciò, può essere a questo punto utile seguire lo sviluppo di una applicazione J2EE-tipo mediante RUP evidenziando, per ciascuna delle quattro fasi, le diverse azioni e/o iterazioni da svolgere, i flussi di lavoro previsti, gli attori coinvolti con i rispettivi ruoli. Questo è proprio ciò che verrà illustrato nei prossimi paragrafi.

 

Inception
La fase di Inception (Inizio) è caratterizzata dalla raccolta e relativa comprensione dei requisiti di business di base, a partire dai quali è possibile tracciare i casi d'uso e i diversi attori coinvolti nel sistema assieme alle relazioni e interazioni con i casi d'uso medesimi. Questa fase coinvolge tipicamente figure professionali quali architect, project manager e business analyst.
Essi individuano dapprima gli aspetti salienti del core business del sistema da sviluppare e successivamente procedono alla formalizzazione dei relativi modelli, servendosi di strumenti di lavoro opportuni. Un esempio di tali strumenti può essere offerto dalla soluzione Steeltrace Catalyze (rif.[7]), un tool dedicato proprio alla cattura requisiti e produzione documentazione, con l'obiettivo di permettere ai diversi attori coinvolti di condividere le varie informazioni così formalizzate.
Nella figura 2 un esempio di modellazione dei requisiti, in un ipotetico sistema di gestione degli ordini denominato OptiShop.


Figura 2 - Raccolta requisiti con Steeltrace Catalyze
(clicca sull'immagine per ingrandire)

L'insieme dei requisiti raccolti e documentati in tal modo può essere a questo punto esportato in diversi formati (fig. 3), al fine di permetterne l'utilizzo da parte di altri strumenti.


Figura 3 - Export dei requisiti

Nella figura 3 si può notare come uno dei tool verso cui è possibile effettuare l'export sia Compuware OptimalJ (rif.[8]), tool di sviluppo J2EE completamente visuale e conforme ai principi della Model Driven Architecture (rif.[9]). OptimalJ permette di approcciare in una varietà di modi le problematiche inerenti la modellazione di un sistema durante la fase di Inception, e ciò in quanto offre sia un completo supporto UML (figura 4), sia la possibilità di interagire e cooperare con altri strumenti di modellazione (Catalyze, ad esempio). Questo lascia la massima libertà di scelta in termini di tool da impiegare per catturare i requisiti.


Figura 4
- Supporto UML in OptimalJ


E' quindi possibile acquisire quanto è stato prodotto da Catalyze in termini di requisiti (figura 5) e visualizzarlo sotto forma di diagrammi Use Case (figura 6).


Figura 5
- Import UML da Catalyze



Figura 6
- Use Case Diagram Sistema Optishop

Viceversa, nel caso in cui si sia invece utilizzato Rose per la modellazione, sarà possibile effettuare un import in OptimalJ del file UML/XMI prodotto, deducendo da esso il Class Diagram necessario a iniziare l'attività di sviluppo. Nelle seguenti figure 7 e 8 un import del file UML/XMI corrispondente al medesimo sistema Optishop proveniente da una modellazione effettuata con Rose.


Figura 7 - Import UML da Rose

 


Figura 8
- Class Diagram Sistema Optishop

 


Elaboration
La fase di Elaboration (Elaborazione) è caratterizzata dalla progettazione di una architettura di base destinata a contenere tutti i requisiti raccolti durante la fase precedente, tanto quelli funzionali quanto quelli non funzionali. Anche questa fase coinvolge tipicamente figure professionali quali architect, project manager e business analyst.
Durante questa fase è di primaria importanza poter considerare stabili i requisiti "immersi" nel modello architetturale in corso di sviluppo, proprio perchè da essi occorre partire per lo step successivo (Construction, vedi paragrafo successivo). Questa è appunto una criticità, proprio perchè tale esigenza di "stabilità" non è riscontrabile nella pratica, pur essendo fondamentale per poter procedere con i lavori. Ecco perchè diviene determinante avere a disposizione un tool che permetta di ricavare in modo veloce e quanto più possibile affidabile il modello architetturale di base (il Class Diagram), permettendo altresì di apportarvi, se e quando necessario, le varie modifiche via via richieste, salvo aggiornare e allineare tutti i modelli derivati da esso. In pratica, occorre uno strumento che permetta di "iterare" in modo facile, veloce, affidabile. Questo è completamente garantito dall'impiego della metodologia MDA (rif.[9]) che permette di lavorare per astrazioni e modelli. Proprio su di essi è possibile effettuare le modifiche che dovessero rendersi necessarie per esigenze di business. Vale la pena qui ricordare che i modelli previsti da MDA sono quelli indipendenti dalla tecnologia (i cosiddetti Platform Independent Model, o PIM), e quelli specifici della tecnologia scelta, J2EE nel nostro caso (Platform Specific Model o PSM). Uno strumento che implementa completamente MDA permette di lavorare sui modelli PIM e PSM garantendo la sincronizzazione tra di essi e offrendo la possibilità di intervenire per attività di "fine-tuning". Qualsiasi modifica apportata su uno qualsiasi dei modelli sarà in modo immediato riportata su tutti gli altri, proprio grazie ai principi di MDA.
Alcuni esempi? Nella figura 9 l'inserimento di un vincolo ("constraint") nella classe UML Customer, utile ad esempio per modellare regole di validazione su attributi.


Figura 9 - Modellare vincoli sul Class Diagram di Optishop

Nella figura 10, un esempio di Component Model Diagram utile per modellare e personalizzare le invocazioni tra le diverse parti del sistema.


Figura 10 - Application Component Diagram di Optishop

Nella figura 11 infine, un esempio di Activity Diagram utilizzato per modellare sul PSM Web model un flusso applicativo personalizzato.


Figura 11 - Web Flow Diagram di Optishop


Construction
La fase di Construction (Costruzione) prevede la progettazione dettagliata di quanto ricavabile dal modello architetturale messo a punto durante la fase precedente e la susseguente scrittura materiale del codice, inteso come sviluppo di tutte le componenti software che realizzano e implementano le funzionalità del sistema. Questa fase, ragionevolmente piuttosto costosa in termini di effort temporale, coinvolge tipicamente figure professionali quali team leader e sviluppatori, impegnati a identificare e implementare le cosiddette "Business Rules", processo oltremodo delicato e complesso (rif.[10]).
Se utilizziamo uno strumento che supporta MDA, ricaviamo il codice Java dai modelli PSM costruiti durante la fase precedente, eventualmente personalizzandolo e modificandolo secondo le nostre esigenze. E' importante essere certi che il codice generato in modo automatico sia efficiente e di qualità, e questo non dipende solo dalla bontà dei modelli costruiti precedentemente, ma anche dalle regole di derivazione del codice dai modelli stessi. Proprio a questo proposito, uno strumento che, oltre a supportare MDA, produce il codice implementando i Core J2EE Pattern rappresenta una notevole garanzia in termini di qualità e affidabilità (rif.[11]).
Per quanto concerne invece le attività di personalizzazione del codice, è importante notare che esse tipicamente riguarderanno:

  • interventi sulla interfaccia grafica, in cui è necessario applicare alla GUI tutti i requirements "cosmetici" richiesti dall'utente finale (in figura 12 un esempio di JSP authoring su una form)


Figura 12 - JSP Authoring

  • interventi sulla logica di business, che possono essere effettuati tanto sui modelli (PIM o PSM, in figura 13 il wizard di definizione di metodi di business sul layer EJB)


Figura 13 - Wizard di definizione dei metodi di bsuiness

quanto sul codice (in figura 14 un esempio di visualizzazione del codice di un Entity Bean, in cui sono evidenziate le zone bianche in cui è possibile inserire il proprio codice, i cosiddetti free blocks)


Figura 14
- Codice generato di un Entity Bean

- interventi di "internazionalizzazione" al fine di adattare la user interface alle diverse realtà internazionali (in figura 15 un esempio di impostazione internazionalizzazione).


Figura 15 - Internazionalizzazione


Transition
La fase di Transition (Transizione) corrisponde alla preparazione del sistema per la consegna fino alla fase di delivery vera e propria effettiva del sistema agli utenti finali. Durante tale fase è fondamentale poter disporre di facility che permettano in modo rapido e affidabile di effettuare le diverse attività di debugging, unit test, logging, collaudo integrato, deployment. Mentre funzionalità come quella di debugging o di logging sono ampiamente fornite e supportate (chi non conosce JPDA o log4j, tanto per fare due esempi?), meno diffusa forse è la possibilità di modellare anche i propri unit test o la capacità di effettuare un collaudo direttamente sulla piattaforma target prima del deployment vero e proprio, per non parlare della possibilità di effettuare, sempre durante il collaudo, attività di "troubleshooting", individuando ad esempio i classici "colli di bottiglia" o i cosiddetti "memory leak".
Per nostra fortuna, esistono soluzioni a tutto, vediamole brevemente e nell'ordine.
A proposito dello unit test, a partire da marzo 2004 è diventato standard in ambito OMG il cosiddetto U2TP (UML 2.0 Testing Profile), ossia la possibilità di modellare con UML e i modelli MDA proprio i test funzionali, abbattendo in tal modo i tempi della verifica del codice e parallelizzando al massimo la comunicazione tra team di sviluppo e team di test, proprio in virtù dell'utilizzo del medesimo formalismo (rif.[12]). In figura 16 un esempio di definizione del test funzionale secondo U2TP.


Figura 16 - Model Driven Testing secondo U2TP

Come spiegato dettagliatamente in rif.[13], è altresì di vitale importanza poter verificare, prima ancora di affrontare il deployment vero e proprio della applicazione, che essa sia compatibile con l'ambiente in cui dovrà operare, l'ambiente cioè di esercizio. E' per questo che sempre in rif.[13] si parla di Management Specification e Application Deployment, una serie di "regole" e "guidelines" che si propongono l'obiettivo di rendere le procedure di deployment quanto più semplici possibile. E' ovvio che disporre di tool che permettono questo tipo di approccio facilita enormemente il processo di deployment. In figura 17 un esempio di wizard di definizione del server di deployment prima di lanciare, direttamente su di esso e prima del deployment vero e proprio, l'applicazione oggetto delle sviluppo.


Figura 17 - Collaudo integrato nel contesto del tool di sviluppo

Se si desidera poi controllare in modo approfondito se l'applicazione sviluppata determina problemi in termini di performance ovvero in termini di allocazione e consumo della memoria è particolarmente utile servirsi delle funzionalià di troubleshooting disponibili, che servono appunto a "mettere a punto" l'applicazione in questione, cercando di individuare per tempo e con la massima accuratezza l'origine di problemi prima che possano causare un degrado significativo del software che deve essere consegnato. Nella figura 18 un esempio delle funzionalità di troubleshooting offerte dallo strumento Compuware OptimalJ.


Figura 18 - Funzionalità di troubleshooting

A questo punto sembra proprio che siamo pronti ad affrontare la fase di consegna agli utenti finali, ed è indispensabile essere pronti a pensare che sarà necessario un buon numero di attività di regressione dovute proprio alla richiesta, da parte degli utenti, di apportare modifiche e/o aggiunte, senza contare ulteriori errori e/o malfunzionamenti che dovessero essere rilevati durante questa fase. E' durante questa delicata fase che è di primaria importanza avere effettuato correttamente e in modo completamente integrato tutte le precedenti fasi di sviluppo, al fine di poter in qualsiasi momento tornare indietro ad una delle fasi precedenti per apportare le modifiche che dovessero essere necessarie. Nel caso del nostro esempio, in cui si è applicato RUP mediante uno strumento MDA-compliant, appare chiaro come il fatto di poter disporre dei modelli PIM (di business) e PSM (applicativi) permetta in modo veloce, efficiente e affidabile di far fronte a qualsiasi tipo di cambiamento venga richiesto.

 

Un Case Study reale
Abbiamo sin qui esaminato i concetti di base e le problematiche che nel corso delle quattro fasi principali di RUP devono essere prese in considerazione. Per motivi di spazio non è qui possibile analizzare in dettaglio un esempio più significativo. Tuttavia, per chi desiderasse ulteriori approfondimenti, un Case Study completamente svolto e tratto da una situazione reale è reperibile in rif.[14].

 

Conclusioni
Nonostante il grande successo e la grande popolarità che UML ha acquistato non bisogna dimenticare che si tratta solo di un formalismo, utile per poter esprimere concetti e per poter modellare oggetti di business. Al fine di riuscire a progettare con successo un sistema occorre servirsi di una metodologia, e il Processo Unificato (RUP) nasce proprio con tale scopo. In questo articolo si è cercato di andare oltre, offrendo spunti per la applicazione pratica di RUP nell'ambito di situazioni reali e ponendo il focus sulla necessità di disporre di adeguate soluzioni software che permettano di applicarlo nel modo più efficiente possibile, fornendo il più elevato valore aggiunto.

 

Bibliografia
[1] UML Resource Page, http://www.uml.org/
[2] Scott Ambler, "Process Patterns, Building Large-Scale Systems using Object Technology",
Cambridge University press
[3] "Il processo ICONIX", Unified Object Modeling www.iconixsw.com/Spec_Sheets/UnifiedOM.html
[4] "Il processo OPEN", www.open.org.au
[5] Jacobson, Booch, Rumbaugh, "The Unified Software Development Process", Addison Wesley
[6] Jason T. Roff "Fondamenti di UML", McGraw Hill
[7] Steeltrace Home Page, http://www.steeltrace.com/
[8] Compuware Lab "OptimalJ Community" - http://javacentral.compuware.com
[9] Mokabyte - "Uso della Model Driven Architecture nello Sviluppo di Applicazioni J2EE", parte 1 http://www.mokabyte.it/2004/07/mda-1.htm e parte 2 http://www.mokabyte.it/2004/09/mda-2.htm)
[10] Mokabyte -"Le Business Rules nelle Applicazioni J2EE", http://www.mokabyte.it/2004/12/busrules.htm
[11] Compuware Lab "Implementing Sun Microsystems' Core J2EE Patterns" http://javacentral.compuware.com/members/downloads/pdf/OJSunpatterns.pdf
[12] Mokabyte -"Model Driven testing nelle Applicazioni J2EE", http://www.mokabyte.it/2005/01/mdatesting.htm
[13] E. Armstrong et al. "The J2EE 1.4 Tutorial", http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html
[14] Compuware Lab "Using OptimalJ in a Unified Software Development Process" http://javacentral.compuware.com/members/optimalj/documentation/v3.3/pe/2310-6-20-17-22.html


Doriano Gallozzi è nato a Roma nel 1964 e si è laureato in Ingegneria Elettronica (indirizzo Informatica) nel 1989. Da sempre interessato a problematiche di analisi, progettazione e sviluppo di Sistemi Informativi, ha lavorato per diversi anni in aziende del settore informatico italiano (gruppo ENI, gruppo Telecom Italia), dove ha acquisito diverse esperienze tanto nel campo della progettazione e sviluppo del software (in ambiente M/F come in ambiente distribuito) quanto nel campo dei RDBMS (DBA su diversi progetti per clienti finali quali Telecom Italia). Da gennaio 2000 lavora nella Divisione Prevendita di Compuware Italia. La sua attività verte principalmente sulla piattaforma J2EE e tecnologie correlate, ma anche su ambiti tecnologici quali l'Enterprise Application Integration, i Portali Web, gli strumenti di Business Process Modeling.