Architetture ed Ingegneria del Software
| Approccio Aree di Intervento Metodi e Tecnologie Esperienze Contatti |
|
Mi occupo professionalmente di Software dal 1991, anche se la mia passione per la programmazione è nata ben prima, nell'ormai lontano 1978.
In questo lungo arco di tempo, ho organizzato la mia attività professionale in modo da coniugare teoria e pratica, ricerca e pragmatismo. Da un lato, lavorando costantemente a progetti reali; dall'altro, anche dopo la laurea (con lode) in Scienze dell'Informazione, continuando la mia attività di studio e pubblicazione, come membro dell'ACM, dell'IEEE e dell'IEEE Council on Software Engineering, partecipando come speaker a conferenze, tenendo seminari nelle università, e così via. Conosco quindi molto a fondo gli aspetti metodologici dello sviluppo del software, dai fondamenti "storici" ai recenti risultati di ricerca, ed in molti casi ho dato un personale contributo alla disciplina stessa (si vedano, ad esempio, le mie numerose pubblicazioni ed i temi trattati nel mio blog). Conosco però altrettanto bene gli aspetti pratici, su tutti i versanti: da quelli più tecnici di design, codifica e debugging, a quelli più rivolti al business, alla realizzazione di un prodotto di successo con i vincoli reali di tempi, costi, risorse. Conosco bene le difficoltà concrete che si incontrano passando dalla teoria alla pratica, ed ho sperimentato molte tecniche per superarle. Non sono un fanatico di nessuna tecnologia o filosofia di sviluppo: credo invece nella necessità di adattare tecniche e metodi ai contesti reali, sapendo dove siamo, dove vogliamo arrivare, e cercando un percorso sostenibile per giungere alla meta. Non baso il mio lavoro sull'applicazione di schemi precostituiti: i problemi complessi richiedono soluzioni brillanti e innovative. Credo fermamente nell'onestà intellettuale. Non prometto ciò che non è possibile mantenere. Non offro cure o strumenti miracolosi. Non cerco contratti a lungo termine: i risultati sono la migliore garanzia di un rapporto duraturo. Credo nell'assuzione di responsabilità e nella condivisione dei successi. Aspiro a creare un clima di libera generazione di idee, in cui lo sforzo è diretto a creare un sistema migliore, sotto ogni profilo (tecnico e di mercato), senza chiusure e senza preconcetti. In tutto questo, cerco sempre di stare a fianco delle persone. I sistemi moderni sono molto complessi, le competenze necessarie sono molto variegate. Pur avendo operato in moltissimi settori applicativi diversi, riconosco sempre la necessità di apprendere dal cliente. Per contro, so di poter contribuire con idee di valore, metodo, creatività, competenza profonda nell'ingegneria del software, grande esperienza nello sviluppo di applicazioni mission-critical. |
|
I miei clienti affrontano spesso progetti software ambiziosi. Non di rado, il mio coinvolgimento nasce da una situazione di
particolare difficoltà, dovuta alla complessità del problema, alle aspettative dell'azienda su tempi di sviluppo e/o
qualità del risultato, e così via. In altri casi, nasce dal desiderio di migliorare l'approccio alla risoluzione dei
problemi, con interventi a livello formativo (e spesso di affiancamento sul progetto), di metodo o di processo. In genere i due
aspetti si fondono, e chi si rivolge a me punta ad ottenere non solo un prodotto migliore, ma anche un team più esperto e capace.
Di conseguenza, anche se in alcuni casi i miei interventi riguardano problematiche molto specifiche, e si risolvono in pochi
incontri mirati, in genere la mia collaborazione con le aziende ha un respiro più ampio. I miei interventi sono
indirizzati ad aumentare le chance di successo di un progetto, di un team, dell'intera azienda. In questi casi, il mio
contributo spazia su fronti diversi: Una collaborazione con i responsabili di progetto, per individuare i reali requisiti del sistema, ricercando uno schedule realistico che bilanci tempi, costi, qualità, e definendo insieme un piano di release incrementali, monitorando insieme i progressi, le variazioni in corsa, la necessità di cambiare alcuni obiettivi per fare leva su ciò che si impara durante lo sviluppo, o per seguire meglio le necessità di business. Sapendo che le incertezze esistono, ma possono essere ridotte e gestite. Un lavoro costante con gli sviluppatori, per arrivare sia ad una solida architettura del sistema che a un codice migliore, con incontri mirati durante le fasi di design dettagliato e di codifica. La fase di progettazione è sempre stata, e rimane, una mia grande passione, dove posso far convergere le tante, differenti esperienze nei settori più svariati, unendo le idee più consolidate con quelle più moderne, ricercando una visione chiara e concettualmente integra della struttura interna del prodotto. Spesso, nel caso di aziende "di settore", lavoriamo insieme alla progettazione di componenti e framework domain-specific, che rendano più rapido e robusto lo sviluppo di prodotti simili (product families). In molti casi, l'organizzazione lavora anche su prodotti legacy: in queste situazioni è utile intervenire sia con strumenti automatici di analisi del codice, sia con un lavoro di refactoring, dove la guida di un progettista esperto può fare la differenza. Per sistemi interattivi, partecipo spesso allo studio dell'interfaccia uomo-macchina, con un privilegio per l'approccio task/activity centered. Nello sviluppo di sistemi embedded / real-time, partecipo spesso alla progettazione di sistema, puntantdo ove possibile ad un co-design hardware-software per raggiungere la massima efficienza. Naturalmente, i miei interventi si focalizzano poi principalmente sugli aspetti software, mantenendo però sempre la visione di sistema. Quando esiste una organizzazione di quality assurance, lavoriamo spesso insieme per introdurre alcune pratiche (come le tecniche di stima dei bug residui) che aiutano a valutare in modo più preciso la qualità del prodotto e lo sforzo necessario per migliorarla. In genere, da queste collaborazioni nascono spunti sul miglioramento del processo di sviluppo, su specifiche pratiche o strumenti da adottare, e così via. In molte occasioni, troviamo utile ricavare lo spazio per una formazione mirata, sempre con l'obiettivo di migliorare il risultato finale. Quando il cliente realizza parti del prodotto in outsourcing con terze parti, definisco spesso insieme al cliente stesso ed ai suoi fornitori dei criteri di qualità interna, basata su precise metriche, che evitino il consueto problema di ritrovarsi un prodotto "che funziona", ma che è pressochè impossibile da manutenere. Spesso, definiamo anche un programma di design e code review, per entrare in uno spin positivo che aumenti la probabilità di ottenere dai fornitori un prodotto di qualità, e che fornisca elementi concreti in base ai quali confrontare i risultati di fornitori diversi. |
|
È sempre molto difficile riassumere in poche pagine il risultato di due-tre decadi di studio e di pratica continua. Quanto segue
riassume quindi per sommi capi alcuni approcci, principi, tecniche, linguaggi, tecnologie, conoscenze che ho approfondito nel corso
del tempo. In molti casi ho contribuito con pubblicazioni e lavori originali, altrettanto spesso ho distillato in alcuni corsi specialistici i
risultati più importanti.
Analisi dei Requisiti: ho una grande confidenza con tutti i metodi di maggior rilievo, nonchè con molte tecniche avanzate e quindi meno conosciute. Dall'UML al SysML e BPML, dall'approccio basato su Use Case piuttosto che sui Problem Frames di Jackson o le Task Description di Lauesen, da KAOS alle tecniche basate su Goal e SoftGoal, ho avuto modo di sperimentare, adattare, fondere i diversi approcci per gestire al meglio le specificità di ogni settore. Al di là della mia personale esperienza, ho trovato utile lo studio degli Analysis Pattern per arricchire la batteria di mental plan con cui affrontare nuovi progetti. User Experience: prediligo soprattutto due approcci, quello Task-Centered / Activity-Centered (seguendo la scuola di Lewis, Reiman e Norman) e quello Human-Centered (ispirato da Cooper). Spesso visti come opposti incociliabili, vanno invece compresi a fondo e scelti / adattati in funzione del tipo di progetto e di target. Trovo spesso utili anche le tecniche di Lateral Thinking, così come nei giusti progetti non vanno trascurati gli aspetti di Emotional Design (sempre sulla scia di Norman, ma anche di Fogg). Anche in questo caso, lo studio dei Pattern di Interaction Design arricchisce il repertorio di tecniche e conoscenze a cui faccio riferimento durante la progettazione. Design Architetturale e di dettaglio: questa è in fondo la mia principale passione, e conosco quindi a fondo non solo gli strumenti e le tecniche mainstream (design strutturato, object oriented design, aspect oriented design, test-driven design, ecc), le fondamentali architetture applicative (rich client, client/server, web-based, event driven, service oriented, database centered, workflow centered, ecc), i design pattern ed i pattern architetturali, ma più che in ogni altro settore ho contribuito con idee ed approcci innovativi. Sin dagli anni 90 ho ideato il Systematic Object Oriented Design, un approccio sistematico per il raffinamento incrementale dei sistemi orientati agli oggetti. In tempi più recenti, sto dedicando grande attenzione allo studio delle Forze e delle Proprietà nei sistemi software, come elementi di base per la costruzione di sistemi software-intensive. Codifica: anche qui, non avendo mai abbandonato la programmazione, ho grande confidenza con tutti i linguaggi mainstream (C++, Java, C#) e con una moltitudine di linguaggi di nicchia, di tecnologie (XML, WSDL, SOAP, AJAX, ecc), di librerie (ASP.NET, WF, WPF, e così via) e di tool, il cui elenco sarebbe sin troppo lungo da stilare. La mia esperienza non si limita alla programmazione di alto livello, ma include lo sviluppo di software di sistema, incluso lo sviluppo di Kernel Driver per hardware custom e la programmazione embedded/real-time con microcontrollori. In tempi recenti, ho approfondito sul campo lo sviluppo di applicazioni Facebook canvas/iframe con back-end sia in PHP che in .NET/C# con accesso tramite Graph API, nonche' di pagine FBML, creando anche diversi componenti riusabili, nonchè la creazione di app Android per dispositivi mobili e l'interfacciamento di dispositivi Android a device esterni. Process Improvement: ho grande familiarità con le tecniche sistematiche, dal paradigma Goal-Question-Metric all'approccio CMMI del Software Engineering Institute. Da anni ho sperimentato con successo l'utilizzo mirato di metriche per valutare la qualità dei sistemi, così come per identificare situazioni problematiche in modo automatico. Sul versante del test, oltre ad una approfondita conoscenza delle tecniche sistematiche white-box e black-box, ho utilizzato con eccellenti risultati le tecniche di predizione dei bug latenti (modelli Goel-Okumoto e successivi). Al confine tra Process Improvement e Project Management, ho dedicato grande attenzione e studio alle problematiche di stima, sia con i modelli più tradizionali (come i function points) che nella diffusa tecnica della stima esperta. In questo settore ho sviluppato nuovi strumenti ed approcci (BetterEstimate, SmartFP). Project Management: anche qui, oltre ai più consueti concetti di project management (Pianificazione, Monitoraggio, Earned Value, Steering, Risk Management, Net Present Value, Real Options, ecc) e strumenti più o meno diffusi (WBS, Gantt, PERT, Slip/Lead Charts, Burn Down Charts, ecc), ho approfondito molti lavori specifici per sistemi software intensive (Weinberg, DeMarco, Constantine, Armour, Little, ecc), nonchè una grande quantità di bibliografia su tematiche di business development (dai classici di Harvard Business Review ai lavori di Tom Peters). Naturalmente, non ho trascurato le tecniche agili, puntando tuttavia a destrutturarne la visione spesso un po' integralista, reintegrandone i metodi in un approccio contingency-based. Come risultato di questo lavoro, sto da tempo sviluppando una teoria integrata, che punta a identificare i fattori determinanti (market discipline dell'azienda, tipologia di prodotto, struttura organizzativa, business model, ecc) e ne evidenzia le relazioni con importanti elementi software-specific (architettura del prodotto, tipologia di team, processo di sviluppo ideale, ecc). |
|
Ho avuto la fortuna di lavorare in molti settori applicativi. Entrare in un nuovo settore è sempre una forma di investimento personale.
Occorre apprendere nuove problematiche, nuovi concetti, nuove prospettive. Tuttavia, l'arricchimento professionale è enorme, e non solo perchè ci
consente di essere più efficaci in quello specifico settore. Ci permette anche di guardare ad altri problemi, passati e futuri, con un bagaglio
di conoscenze e di strategie più ricco ed articolato. Allo stesso modo, lavorare su sistemi di scala diversa (da piccoli sistemi embedded con microcontrollore a programmi da diversi milioni di righe) aiuta a valutare ed a specializzare le diverse tecniche, evitando la visione a tunnel e trovando in modo contingente gli approcci migliori. È praticamente impossibile ripercorrere tutti i progetti a cui ho partecipato, e soprattutto i diversi ruoli che ho ricoperto in ognuno di essi. Ho trovato quindi opportuno riassumere in quanto segue solo alcune esperienze, centrandole sui settori applicativi. In molti casi, al centro delle attività si collocava la progettazione, ed intorno a questa ruotavano le mie altre aree di intervento, dal project management al pair programming. Uno dei primi settori in cui ho lavorato è stato quello medico, progettando l'architettura di una piattaforma estendibile per l'acquisizione, processing e visualizzazione real-time di dati fisiologici. Ho curato una buona parte dell'implementazione (in C++), sia del core applicativo che di moduli di analisi dedicati per manometria esofagea e cardiologia. L'azienda (un leader mondiale del settore) produceva anche l'hardware di acquisizione, ed in quella occasione abbiamo sperimentato le prime attività di hardware-software codesign. Il passaggio al settore dell'automazione industriale e dei sistemi embedded/real-time è stato relativamente semplice - anche per il mio background culturale. Negli anni ho partecipato come software architect ad una quantità di progetti, spesso mirati a risolvere con un framework il problema ricorrente delle product family - applicazioni hw/sw simili fra loro, ma con significative variazioni o personalizzazioni sui diversi impianti. Alcuni esempi: un framework per la creazione di banchi di misura e test per apparati industriali, un framework per realizzazione di supervisori in ambiente lavorazione legno, un framework per sensori in ambiente di acciaieria. Naturalmente, ho partecipato anche alla creazione di prodotti completi, ad es. un sistema embedded per la verifica delle sicurezze elettriche in apparati consumer ed industriali, vari misuratori ottici ed elettromagnetici per le acciaierie, interfacce su palmari, e così via. Nel tempo, ho creato delle architetture di riferimento per alcuni problemi ricorrenti nei sistemi reattivi, come la virtualizzazione dell'I/O piuttosto che la gestione eventi, le problematiche di DB real-time distribuiti o la gestione centralizzata e gerarchica degli allarmi, adottate poi con successo in numerosi progetti. Un altro ambiente che ho a lungo frequentato è quello bancario. Nel corso degli anni, ho lavorato con i maggiori gruppi bancari italiani, su una varietà di progetti che vanno dai sistemi di corporate banking (client-server e web) allo smistamento flussi CBI/CBI2, dal design di un framework per i mercati finanziari ai gateway di pagamento, sino ad applicazioni back-end molto specifiche (procedura elettronica e gestione spese pratica di fido, gestione delle garanzie per la compliance alle normative Basilea 2, ecc). Anche in questo caso, l'ampia esperienza mi ha permesso di creare alcune architetture di riferimento (ad es. per lo strato di accesso ai dati), ma anche di risolvere in modo innovativo alcuni problemi (ad esempio creando un framework per il multithreading cooperativo sfruttando l'I/O asincrono su Tandem/Guardian). Rimanendo in ambiente business, ho avuto modo di lavorare a sistemi gestionali specializzati (ad es. per l'ambiente di accieria piuttosto che per le catene fitness), così come per i sistemi paghe/contributi per la pubblica amministrazione. Anche qui, il riuso di architetture sperimentate per l'accesso ai dati è stato particolarmente vincente. Tra i molti settori di nicchia in cui ho lavorato, proprio il succitato fitness/wellness mi ha visto coinvolto per molti anni, durante i quali ho progettato sia una architettura molto moderna ed estendibile per apparecchiature cardiofitness (passata poi indenne attraverso numerosi porting di sistema operativo, da Windows CE a Nucleous a Linux Embedded), nonchè un gran numero di applicativi client/server e web-based per centri, catene, trainer, utenti finali. Tra questi, in una specie di ritorno alle origini, anche un sistema per lo svolgimento di test funzionali su macchine cardio, dove l'esperienza in campo medico è risultata particolarmente utile. Restando sui settori di nicchia, ho avuto modo di entrare in grande dettaglio nelle architetture CAD, sia 2D che 3D, sia per sistemi general-purpose che per CAD specializzati (settore legno e vetro/marmo). Sempre nel settore CAD, ho progettato un PLM molto innovativo, con architettura web, integrazione con editor sul lato client, ed interfaccia task-driven particolarmente semplice da utilizzare. Rimanendo in ambiente grafico, mi sono occupato di problematiche di efficienza in sistemi GIS per uso militare, in particolare della gestione di grandi immagini sonar, di animazione hypertime di grandi quantità di contatti su scala globale, di pianificazione delle missioni. Per concludere la panoramica, seppure non esaustiva, posso citare il design di un sistema di comunicazione Radio/GPRS per flotte di veicoli (radiotaxi) ed un sistema per ottimizzare la rete di distribuzione/vendita in settori ad alta capillarità. In quest'ultimo caso, si trattava in particolare di uno studio di algoritmi greedy per evitare l'esplosione combinatoria. In molti altri casi mi sono occupato di tematiche analoghe, realizzando anche algoritmi specializzati su architetture parallele, piuttosto che modelli di previsione (ad es. un modello di stima del traffico telefonico ed internet per il cablaggio di aree industriali). Naturalmente, come accennavo in apertura, non tutti i miei interventi sono stati design-centrici. In alcuni casi, si è trattato di analizzare la qualità del codice (ad esempio, circa 6 milioni di righe COBOL nel settore assicurativo) attraverso metriche mirate, per pianificare al meglio alcune attività di manutenzione. In altri, si trattava di valutare le architetture proposte da fornitori, e di correggere eventuali divergenze rispetto alle necessità aziendali. In altri ancora, si è trattato di consulenze mirate sul process improvement, sulla gestione dei progetti o dei requisiti, e così via. In tutti questi casi, i clienti si sono rivolti a me per la grande conoscenza ed esperienza nel settore, ma soprattutto per la comprovata capacità di portarli al risultato migliore, superando insieme ogni difficoltà. |
|
Per ogni approfondimento, per ricevere un'offerta, pianificare un incontro, ecc, contattatemi
via email all'indirizzo sweng@eptacom.net
o telefonicamente al numero 019-8160697. |
