Sono finalizzati a migliorare la manutenibilità di un software ormai deteriorato dagli interventi di manutenzione subiti.
Diverse tipi di intervento possibili:
Consiste in una analisi statica del codice sorgente (attraverso appositi strumenti) al fine di produrre documentazione del sistema.
Si analizzano: usi delle variabili, chiamate fra componenti, path del flusso di controllo, dimensioni dei componenti, parametri di chiamate, per capire cosa fa il codice e come lo fa.
Gli output di una attività di ridocumentazione possono essere:
Attività che trasforma il codice esistente in codice equivalente dal punto di vista funzionale, ma migliorato dal punto di vista della sua qualità.
In genere si esegue in tre passi:
Anche i sistemi object-oriented sono soggetti al deteriorarmento e diventano legacy!
Il refactoring è un insieme di tecniche usabili per migliorare il codice ed il design di sistemi object-oriented.
Martin Fowler è autore del libro “Refactoring: Improving the Design of Existing Code” (1999) dove presenta più di 70 pattern per eseguire il refactoring.
Tali tecniche cercano di eliminare i cosiddetti Bad Smells dal codice.
It is the examination and alteration of a subject system to reconstitute it in a new form and the subsequent implementation of the new form [Chikofsky & Cross][1 ]
La reingegnerizzazione (reengineering) è un’attività di re-implementazione di un sistema software esistente svolta per migliorarne la manutenibilità.
Essa può comprendere: ridocumentazione, ristrutturazione e riscrittura di parte del software (o anche di tutto) senza modificare l’insieme di funzionalità che esso realizza.
[1] Chikofsky and Cross, Reverse engineering and design recovery: A taxonomy. IEEE Software, 1990.
Restructuring
— [Chikofsky and Cross][1]
Reengineering dei dati
— [Sommerville]
Refactoring
Reverse Engineering
[1] Chikofsky and Cross, Reverse engineering and design recovery: A taxonomy. IEEE Software,1990
Reengineering
Restructuring (o Code Refactoring)
È un’attività che consente di ottenere specifiche e informazioni sul design di un sistema a partire dal suo codice, attraverso processi di estrazione ed astrazione di informazioni.
La definizione di Chikofsky and Cross, 1990 [1]:
Analyzing a subject system
A two-steps process
[1] Chikofsky and Cross, Reverse engineering and design recovery: A taxonomy. IEEE Software, 1990.
A partire dal software e dalla sua documentazione, si ricostruiscono nuove viste descrittive del software, usando idonei analizzatori e visualizzatori.
I processi di Reverse Engineering si basano su due fasi fondamentali:
Estrazione
Astrazione
Canfora e Di Penta [1] hanno recentemente proposto un modello concettuale che sistematizza tutti i concetti chiave di un processo di reverse engineering, quali:
[1] Canfora, Di Penta “Frontiers of Reverse Engineering:a Conceptual Model”, FOSM08 – IEEE Comp. Soc. 2008.
I componenti fondamentali del modello concettuale:
I processi di Reverse engineering vengono svolti per raggiungere i seguenti obiettivi:
I processi di Reverse engineering sono spesso eseguiti in maniera (semi) automatica.
L’intervento manuale degli ingegneri del software è fondamentale e non eliminabile.
Esistono diverse categorie di analizzatori usabili per il RE:
Il codice sorgente o altri artifatti software possono essere analizzati per ricostruire un modello di rappresentazione del codice (ad esempio un ‘Parse Tree’).
Si possono usare grammatiche di tipo ‘Island grammars’ o trasformazioni di codice
Il sistema viene esercitato mediante casi di test, oppure impiegando i dati tratti da scenari d’uso realistici.
Si basa sulla raccolta di tracce di esecuzione.
Può essere necessaria l’instrumentazione del codice per raccogliere tali tracce.
Vantaggi:
Problemi:
É possibile usare altre informazioni sul software analizzato quali:
Tali informazioni consentono di identificare le parti più soggette a cambiamenti, più difettose o vulnerabili, che tendono a cambiare insieme.
Quali artifatti software possono essere analizzati durante un processo di reverse engineering?
Qualora un artifatto necessario per un task di comprensione o di cambiamento non sia disponibile, esso può essere ricostruito mediante reverse engineering!
Sono ottenute a partire dalle informazioni prodotte dagli analizzatori usando meccanismi di interrogazione.
Esempi di meccanismi di interrogazione:
Le viste ottenute sono a loro volta costituite da artifatti e relazioni fra artifatti.
Esistono diverse strategie di manutenzione alternative a cui un sistema software può essere sottoposto.
Come scegliere tra le varie opzioni?
Necessità di idonei modelli decisionali che guidino la scelta sulla base del Valore Tecnico e del Valore di Business di un sistema.
Un esempio di approccio decisionale è descritto in [1]
[1] De Lucia, A., Fasolino, A.R., Pompella, E., 2001. A decisional framework for legacy system management. In Proceedings of the IEEE International Conference on Software Maintenance, IEEE CS Press, pp. 642 – 651.
Una recente analisi di strategie proposta da Grady Booch
1. Abbandonarlo
Quando il suo valore economico si è esaurito, o lo sforzo di risviluppo non è eccessivo.
2. Regalarlo
Se non serve più, si può cederlo a qualche comunità open-source dove potrà ancora tornare utile a qualcuno.
3. Ignorarlo
Se è abbastanza stabile, e fa qualcosa di utile, si può continuare a usarlo senza però modificarlo.
G. Booch, Nine things you can do with old software, IEEE Software, Sept 2008.
4. Farlo sopravvivere
Quando l’hardware su cui gira non è più supportato (e non si dispone del codice sorgente per portarlo in nuove piattaforme), si fa sopravvivere o cercando vecchio hardware da cannibalizzare, o usando emulatori di piattaforma.
5. Riscriverlo
Quando la manutenzione è troppo costosa, o il sistema è troppo fragile, si può riscriverlo (ma sapendo che ottenere un sistema funzionalmente equivalente al primo è impossibile, e che bisognerà probabilmente convincere gli utenti ad accettare qualche cambiamento).
6. Farlo fruttare (in qualche modo)
Cercare parti del sistema da conservare (algoritmi, pattern, astrazioni…) perché ancora utili, ed usarle come una base di conoscenza per un nuovo sviluppo.
7. Wrapping
Usare tecniche di wrapping per integrarlo in nuove piattaforme (quali SOA).
8. Trasformarlo
È la strategia più difficile e va praticata per mantenere il sistema in condizioni ottimali, se si prevede di continuare ad usarlo a lungo termine: va dal semplice refactoring, alla trasformazione architetturale.
9. Preservarlo
Anche il software antico può avere un valore storico (es. vecchi sistemi operativi, o videogiochi) e culturale da preservare (magari in un Museo della Storia dei Computer).
Per Software economicamente interessante ci sono due possibili opzioni di gestione:
Preservarlo
Farlo evolvere
La scelta è alla fine sempre dettata da fattori economici (e non solo tecnici)!
2. Ciclo di Vita e Processi Software
3. Processi per lo sviluppo rapido del software
4. Sviluppo Agile del Software
5. Test Driven Development (TDD)
7. Component Based Software Engineering (CBSE): Generalità
8. Component Based Software Engineering (CBSE): Il processo di svi...
9. Ingegneria del Software orientato ai Servizi
10. Ingegnerizzazione dei Servizi
11. I Processi di Manutenzione del Software
12. Reengineering, Refactoring e Reverse Engineering del Software
13. Verifica e Convalida del Software. Richiami e concetti di base ...
14. Tecniche di Testing Dinamico
15. Testing di Sistemi Object Oriented
16. Automazione del testing e Analisi Mutazionale
17. Tecniche di Analisi Statica del codice e il Debugging
18. Stima dei costi nei progetti Software
19. Il Modello COCOMO per la stima dei costi Software – La gestio...
20. Gestione e Miglioramento dei Processi di Produzione del Softwar...
21. La Valutazione della Qualità dei Processi Software – Il Capa...
Sommerville, Ingegneria del Software, 8a ed., Capitolo 21
Ulteriori Letture Raccomandate
Canfora, Di Penta “Frontiers of Reverse Engineering:a Conceptual Model”, FOSM08 – IEEE Comp. Soc. 2008
Grady Booch, Nine Things you can do with old software, IEEE Software, Sept/Oct 2008