Ergonomia dell'architettura

Ho pensato un po' a questo post e lo vedo come un punto di passaggio in un percorso di crescita personale.

Negli ultimi anni mi sono interessato sempre maggiormente di architettura, in particolare l'architettura e l'approccio cosiddetto enterprise (industriale) hanno fortemente influenzato alcune mie scelte progettuali. Rivestendo il ruolo duale di specialista tecnico e di project leader mi sono trovato a prendere delle scelte a questo riguardo, scelte che ho preso dettate anche dall'esperienza, dall'intuito e dalla passione.

Sono convinto che l'architettura sia un elemento determinante della maturazione del processo di sviluppo informatico, uno strumento che serve per gestire ed organizzare la complessità del software, complessità sempre crescente. Utilizzando l'attributo complessità nella sua forma più generica additando sia ricchezza di requisiti, dimensione del sistema e complessità specifica di determinati processi.

La mia esperienza, anche negativa, mi ha portato a formulare alcuni idee che ho voluto rappresentare sotto il tema di ergonomia dell'architettura. L'obiettivo di questo post non è quello di insegnare o spiegare qualcosa ma semplicemente introdurre un concetto mettendo parzialmente in discussione l'approccio architetturale puro alla progettazione di un sistema informatico. In effetti penso che questa sia una visione agile dell'approccio architetturale alla progettazione del software.

L'approccio enterprise ad esempio prevede che si adottino determinati pattern per la progettazione, la realizzazione e l'esecuzione del software. I pattern di solito sono metodi e/o strutture ripetibili per l'implementazione di un aspetto di una soluzione. Volendo essere più precisi ci sono più aspetti di approccio enterprise oltre ai pattern ci sono, modelli di design, metodologie, eccettera.

Veniamo al dunque.

Tutte le scelte che producono metodologie o modelli di fatto producono "interfacce". Cioè strumenti con cui lo sviluppatore a diversi livelli interagisce per la costruzione del software. Il successo di vari strumenti è dovuto a vari fattori, cioè efficacia, affidabilità, specificità ma non solo, anche ergonomia. Cioè quelle caratteristiche che rendono uno strumento facilmente interfacciabile con l'uomo. (Basti pensare ad esempi reali di strumenti che hanno avuto particolarmente successo)

Se pensiamo ai linguaggi, alle librerie, ai framework, come strumenti, allora chi è l'utente che si deve interfacciare? Non è forse il programmatore.

Con l'accrescere della quantità e complessità dei requisiti, il programmatore deve raggiungere obiettivi di produttività e ricchezza funzionale sempre più elevati. Ecco perchè secondo me è appropriato introdurre l'argomento dell'ergonomia dell'architettura con l'obiettivo di definire architetture e realizzare strumenti più ergonomici per lo sviluppatore.

Faccio un esempio

Immaginiamo di dover utilizzare un servizio per effettuare un calcolo su un entità, non ci interessa definire il calcolo o l'entità ma il problema generico. Pensiamo al codice più semplice in un linguaggio ad oggetti come C#. E poi pensiamo all'utilizzo di una Object Factory per la creazione di oggetti (quest'ultima può essere uno strumento utile soprattuto in abbinamento a modelli di design o pattern quali Inversion of Control o Dependency Injection rendendo maggiormente scalabili i componenti in termini di configurabilità e composizione), la Factory richiede di essere configurata e crea un livello di isolamento rispetto alla costruzione degli oggetti.  In questo secondo caso diciamo che il servizio è definito da un contratto specificato con  un interfaccia denominata ICalcolatore che è implementata dalla classe Calcolatore.

Esempio A costruzione diretta dell'oggetto

//Costruzione classica dell'oggetto

Calcolatore calcolatore = new Calcolatore();

calcolatore.EseguiCalcolo(...);

Esempio B utilizzo di una Object Factory

//Configurazione: "<object Name="Calcolatore" Type="mynamespace.Calcolatore"/>

//Costruzione con l'ausilio di una Object Factory non tipizzata

ICalcolatore calcolatore = (ICalcolatore) Factory.GetObject("Calcolatore");

calcolatore.EseguiCalcolo(...);

Provo a definire una misura dell'ergonomia dei due differenti approcci utilizzati. Come primo elemento parliamo di leggibilità cioè cosa ci dice il codice, allora A mi dice che costruisco un oggetto di tipo Calcolatore, B mi dice che chiedo ad una classe Factory di restituirmi un oggetto di nome "Calcolatore" il quale implementa un interfaccia ICalcolatore. Come secondo elemento parliamo di conoscenza, cioè numeriamo gli elementi che si devono conosciere per utilizzando i due approcci, per A devo conoscere che esiste una classe che si chiama Calcolatore, per B devo conoscere che esiste una classe di nome Calcolatore, ed inoltre devo conoscere che esiste una configurazione che associa al nome logico "Calcolatore" un oggetto di classe namespace.Calcolatore, inoltre che Calcolatore implementa un interfaccia ICalcolatore, devo anche sapere che il servizio di fabbricazione degli oggetti è esposto attraverso metodi statici di una classe Factory in particolare che è definito un metodo GetObject che richiede di passare il nome logico dell'oggetto e ritorna un tipo object generico.

Se dovessi dare un giudizio generale di ergonomia mi verrebbe di dire che l'architettura di A è più ergonomica di B. (NOTA IMPORTANTE: Questo non significa che A è migliore di B o più scalabile o più elegante o più adatto o più efficiente ecc...)

Per chi si sta chiedendo perché di questa divagazione, in realtà ho visto e vissuto la frustrazione del programmatore che ricevute specifiche funzionali, scopre che per riuscire ad implementare qualcosa, deve acquisire una conoscenza molto estesa, articolata e a volte un po' frammentaria dell'architettura, dei servizi, della configurazione magari per implementare qualcosa che dal punto di vista funzionale è relativamente banale. Questo può succedere se si pensa solo in termini di scalabilità e architettura senza ragionare sull'agilità dell'architettura una volta applicata su un progetto di medie/grandi dimensioni.

Il messaggio è, per chi si occupa di architettura o di scelte specialistiche all'interno di un progetto mediamente strutturato: prestare attenzione all'impatto degli strumenti sui programmatori, cioè ai misuratori di quella che in questo contesto ho chiamato ergonomia dell'architettura, perché l'architettura e gli strumenti che si scelgono potranno avere effetto diretto sulla frustrazione degli sviluppatori, ma peggio ancora potranno inficiare la produttività e la qualità, soprattutto se si pensa in termini di crescita, rinnovamento o cambiamenti del software e del gruppo di lavoro.

L'obiettivo è di catalizzare uno spunto di riflessione, e stimolare a pensare alle architetture anche da un altro punto di vista, l'ergonomia, cioè il modo e la misura di quanto questi strumenti siano facili da imparare, manipolare, integrare e controllare per l'utente, cioè, lo sviluppatore.

posted @ mercoledì 31 dicembre 2008 12.34

Print

Comments on this entry:

# re: Ergonomia dell'architettura

Left by Luca Minudel at 31/12/2008 19.04
Gravatar

sono riuscito a vedere realmente questa esigenza che hai chiamato ergonomia della architettura (è un nome standard?) quando la code-base è almeno di alcune 100naia di 1000gliaia di righe cioè nessun developer può da solo avere una espereienza diretta di tutta la code-base.

in questi casi diventa evidente

- l'importanza di essere consistenti nella scelta di soluzioni a problemi comuni ossia problemi simili vanno risolti sempre allo stesso modo in tutta la code base: per questo diventa importante la comprensione e la condivisione da parte di tutti su come fare le cose (comunicazione, consenso, semplicità), più importante che fare la scelta tecnica migliore

- evitare tutte le duplicazioni e promuovere il disaccopiamento perchè altrimenti si è condannati a non cambiare più le soluzioni adottate in passato per problemi comuni perchè diventa impossibile farlo in modo consistente su tutta la code-base

- localizzare e ridurre l'accoppiamento verso componenti/librerie/tecnologie (per esempio verso un provider odbc, un visualizzatore di disegni cad, un generatore di stampe, una libreria grafica) e mantenersi il più possibile neutri rispetto la tecnologia (per esempio preferire una propria implementazione su db di ruoli e privilegi e autorizzazioni e log o usare il semplice tcp/ip per comunicare intra-processo e remotamente) perchè i progetti di successo durano più delle tecnologie che impiegano e vengono usati in ambienti eterogenei (in cui convive COM e .NET e Java, VB6 e C# e BAAN)

- Scegliere in modo comune e consistente tool, tecnologia e infrastruttura anche qui in modo da usare sempre la stessa soluzione per esigenze simili evitando accuratamente ogni varietà inutile (comunicazione, consenso, semplicità) in modo che ogni developer, amministratore, help-desk possa sentirsi a suo agio e sapere come operare su ogni parte del sistema e della code-base

- Favorire la competenza, la formazione e la professionalità perchè svela le alternative possibili a ogni apparentemente inevitabile eccezione, caso particolare, soluzione parziale incompleta

# re: Ergonomia dell'architettura

Left by Marco Baldessari at 31/12/2008 23.00
Gravatar
Grazie per le utili considerazioni, trovo particolarmente interessante la necessita da te ribadita di essere consistenti nella scelta delle soluzioni e degli strumenti, purtroppo a volte è difficile raggiungere questo obiettivo in un gruppo, soprattutto in progetti con frequenti aggiunte e modifiche di requisiti ed obiettivi.
Per quanto riguarda la definizione "ergonomia dell'architettura" non è uno standard, semplicemente ho scelto l'espressione che esprimeva meglio il concetto che volevo trasmettere.

# re: Ergonomia dell'architettura

Left by Alessandro Pulvirenti at 02/01/2009 7.11
Gravatar
Sfortunatamente, per quanto si possano utilizzare accorgimenti per rendere espandibile una applicazione e ridurre l’accoppiamento tra le classi; l’evoluzione software/competenze umane renderà l’applicazione non mantenibile oltre un certo tempo.
Immaginate soltanto a un’applicazione che, considerando tutte le migliori metodologie architetturali, si sia dovuta evolvere passando da:
1) MS/DOS, interfaccia grafica (C / C++ 20.000 righe di codice);
2) Windows 3.x, UI grafica in OWL (C++);
3) Windows 95, UI grafica in VCL (C++ 90.000 righe di codice);
4) Windows XP, UI grafica in VCL (C++ 200.000 righe di codice);
5) Windows Vista, UI in WinForm (C# .NET 150.000 righe di codice).
6) In futuro… Windows 7, UI in WPF (C# .NET previsti 200.000 righe di codice).

Io ho realizzato un’applicazione che ha seguito l’evoluzione su indicata e devo dire sfortunatamente che per ogni passaggio (tranne quello numero 3 e 4 che utilizza VCL in entrambi i casi), l’applicazione ha avuto una consistente riscrittura; dato che la UI è stata una parte consistente dell’applicazione.

Per semplicità, considerando anche solo l’interfaccia grafica, come in questa elencazione, chi conosce le tecnologie su indicate, sa benissimo che la differenza non è soltanto nel fatto che per visualizzare una cosa, in una tecnologia si deve richiamare una classe e in un’altra tecnologia se ne deve richiamare un’altra; ma è anche il modo d’interagire che è completamente diverso!

Quindi, tutte le migliori metodologie architetturali potranno essere utili nel breve periodo, ma potranno solo limitare i danni (le modifiche da fare) nel medio periodo fino a dover riscrivere la maggior parte dell’applicazione nel lungo periodo!

Certo è meglio che niente, ma è pura utopia pensare che si possa scrivere un’applicazione che duri nel tempo e che possa sfruttare il meglio delle tecnologie che vengono presentate. Prima o poi si dovrà buttare tutto o quasi e riscrivere l’applicazione!

Anche perché le cose che cambiano sono molte:
1) Tecnologie;
2) Esperienza degli architetti (una soluzione ottima oggi, potrebbe non esserlo domani);
3) Requisiti;
4) Ambiente d’esecuzione (sistema operativo, CPU, dispositivo portatile o server);
5) Ecc.

L’esperienza mia, mi porta ad affermare che: una buona architettura realizzata con le migliori metodologie da risultati ottimi per la manutenzione nel breve/medio periodo, ma non evita la riscrittura dell’applicazione nel lungo periodo.

# re: Ergonomia dell'architettura

Left by Marco Baldessari at 02/01/2009 9.42
Gravatar
Ti ringrazio per le tue interessanti considerazioni basate sull'esperienza, sono d'accordo con te sul fatto che le tecnologie evolvono rapidamente, così come di solito evolvono i requisiti di un progetto. Inoltre bisogna tenere conto, come l'esperienza insegna, che nel campo dello sviluppo software quando hai fatto una cosa allora è il momento di rifarla (o riscriverla). Ovviamente a parte quest'ultima considerazione un po' estrema ma che esprime una verità (non a caso nei modelli agili si trova il refactoring come pratica), l'architettura e la metodologia è un elemento importante per la progettazione e lo sviluppo dei sistemi software, e con la dovuta ragionevolezza vale anche per progetti di piccole/medie dimensioni come quelli che hai esemplificato tu, ma diventa un elemento determinante in progetti di medie/grandi dimensioni (la mia esperienza è stata su progetti con codebase di +1.000.000 righe e analisi funzionale di migliaia di pagine).

Parlando di esperienza vorrei citare il blasonato e concettualmente valido modello multi-tier di cui ormai sentiamo parlare di anni, la separazione tra business-logic e interfaccia utente si può fare, ma purtroppo per varie ragioni in molti progetti e per molti programmatori è cosa oscura. Io a volte mi sono trovato a dover rifattorizzare codice di interfaccia utente di un applicazione perché dovevo isolare un caso d'uso ed esporlo attraverso un servizio WEB ed ho scoperto che parte del comportamento era scritto nell'interfaccia stessa. Ovviamente quando un applicazione è realizzata in questo modo è chiaro che risulta difficile riutilizzare parte del codice in una evoluzione della stessa.

In realtà l'obiettivo di questo post non era un esaltazione dell'utilizzo dell'approccio architetturale semmai era una critica all'approccio puro all'architettura perché poi i programmatori si incontrano con l'architettura. Concludo dicendo: menomale che i software devono essere riscritti o rifattorizzati per via dell'evoluzione della tecnologia, perché se non fosse così ci troveremmo presto senza lavoro ;-)

# re: Ergonomia dell'architettura

Left by Alessandro Pulvirenti at 02/01/2009 12.13
Gravatar
Ritornando all'esempio che hai fatto tu, è vero che richiede molte informazioni da conoscere, ma utilizzando uno standard coerente si potrebbe risolvere semplicemente con:

ICalcolatore calcolatore = Factory.Calcolatore();
oppure:
ICalcolatore calcolatore = Factory.NewCalcolatore();

Quindi le informazioni da sapere nel primo caso è una sola: esiste una classe Factory che crea gli oggetti, il metodo da chimare è lo stesso del nome dell'interfaccia escluso la I.
Nel secondo caso il nome del metodo può essere più esplicativo e bisogna ricordare che si deve aggiungere New al nome della classe.

Come vedi ci sono standard coerenti che possono essere anche semplici.
La cosa invece si complica quando, invece di essere solo la creazione di una classe, è l'architettura d'interazione di un tipo di finestra.

Per esempio, io utilizzo il pattern MVP. Per quanto riguarda il “Presenter” io eredito da una classe base che ha già implementato l’architettura d’interazione di una finestra di dialogo semplice.
In base a quello che nella finestra devo fare, eredito dal “Presenter” più appropriato, ridefinisco solo qualche metodo e la finestra è già gestita.
Faccio una cosa simile anche per le Form semplici.
In questo caso, un nuovo programmatore, deve sapere che se vuole creare e gestire una nuova finestra, deve andare ad ereditare dall’opportuno Presenter; se fa così il progetto risulta coerente e la finestra risulta semplice da implementare, se no, sporca il progetto con codice che non coerente allo standard.

Penso che un’eventuale versione futura del Visual Studio potrebbe aiutare anche in questo caso, quando non solo si vuole ereditare una classe, ma applicare un pattern direttamente.
Ci dovrebbe essere la possibilità di definire nuovi pattern e il Visual Studio dovrebbe creare e gestire l’architettura definita.

Un passo lo si sta già facendo con ASP MVP, ma penso che ci sia ancora molta strada da fare.

# re: Ergonomia dell'architettura

Left by Marco Baldessari at 02/01/2009 13.18
Gravatar
Ringraziandoti per le tue considerazioni, ricordo che la filosofia del mio post non era quella di stabilire un dibattito su una specifica soluzione d'architettura, infatti nell'esempio ho spiegato che l'obiettivo non è di stabilire la soluzione migliore ma semplicemente di evidenziare che ogni scelta d'architettura ha un impatto diverso sull'utente, cioè lo sviluppatore.

Detto questo nell'ambito del problema specifico ci sono vari metodi per rendere "più ergonomica l'architettura", ad esempio l'utilizzo del pattern "Registry" (come nell'esempio che hai fatto).

# re: Ergonomia dell'architettura

Left by Alessandro Pulvirenti at 02/01/2009 14.03
Gravatar
Non sapevo che si chiamava "Registry" questo pattern e che fosse già stato catalogato.
Io nei miei libri sui Pattern non vi è traccia, tu quali libri utilizzi sui Pattern?

Comunque torno a dire che se una versione futura del Visual studio dasse una mano in proposito, farebbe una cosa molto gradita.

Basterebbe inserire alcuni commeti o attributi in modo tale che il Visual Studio riconosca i Pattern che si stanno utilizzando e aiuti nel loro utilizzo.

# re: Ergonomia dell'architettura

Left by Marco Baldessari at 02/01/2009 17.17
Gravatar
Il pattern Registry è documentato da Martin Fowler su PoEAA vedi http://martinfowler.com/eaaCatalog/registry.html.
Inoltre puoi trovare post su ugidotnet.org che lo citano direttamente o indirettamente.

# re: Ergonomia dell'architettura

Left by Luca Minudel at 05/01/2009 19.39
Gravatar
@Alex

> L’esperienza mia, mi porta ad affermare che: una buona architettura realizzata con le migliori metodologie da risultati ottimi per la manutenzione nel breve/medio periodo, ma non evita la riscrittura dell’applicazione nel lungo periodo.

intendi dire che nel caso che hai riportato hai impiegato le precauzioni previste per un disegno a regola d'arte e queste non sono state sufficenti?

Your comment:



 (will not be displayed)


 
 
 
Please add 2 and 7 and type the answer here:
 

Live Comment Preview: