Sviluppo Software presso Engineering USA

ARTICOLO

Pubblicato da Giacomo Tagliabue


In Engineering ci piace risolvere i problemi e ci sforziamo di fornire ad ognuno dei nostri clienti la soluzione più adatta ai loro problemi. A volte questo significa sfruttare le potenzialità di un prodotto già esistente dei nostri clienti e personalizzarlo meglio; altre volte significa andare fuori dai sentieri già battuti e cercare di inventare qualcosa di completamente nuovo per adattarlo alle esigenze dei nostri clienti.

Tuttavia costruire un prodotto solido e sostenibile è un compito difficile. Quello che potrebbe sembrare il modo più veloce per spedire e finalizzare un prodotto di solito finisce per incorrere in un costo complessivo più elevato a causa dei problemi di manutenzione che si presentano dopo che il prodotto è già stato spedito. Creare e mantenere il software richiede degli standard qualitativi e metodologici consolidati al fine di offrire un prodotto superiore in modo tempestivo.

Ultimamente, Engineering ha lavorato allo sviluppo di soluzioni software personalizzate, sia per i nostri clienti che per i nostri partner. Questo nuovo impegno ha reso necessario ripensare il modo in cui il software viene creato e spedito, al fine di raggiungere standard di qualità più elevati

In questo articolo, si metterà in evidenza ciò che rende Engineering in grado di fornire soluzioni software personalizzate che soddisfano gli standard di settore e abbracciano le tecnologie più moderne e si mostrerà come si analizzano e si mostrano il funzionamento interno delle nostre prassi di sviluppo software.

Obiettivi

In sintesi, possiamo definire qualsiasi progetto "un successo"  quando soddisfa le aspettative del cliente o dello stakeholder . Nel caso di un progetto di sviluppo software di successo, la soddisfazione del cliente si raggiunge quando si ottengono i seguenti risultati:

  • Alta qualità: il prodotto consegnato riflette le esigenze del cliente con attenzione ai minimi dettagli.
  • Affidabile: il software è stato sottoposto a dei test per rimuovere l'insorgenza di errori che possono determinare interruzioni di utilizzo.
  • Consegna veloce: è importante consegnare il progetto in tempo rispetto alle scadenze del cliente.
  • Mantenibile ed estensibile: Tutto il software deve essere mantenuto. Come tale, deve essere progettato in modo da facilitare la manutenzione dopo la consegna e permettere una semplice modifica nel caso i requisiti cambino o vengano aggiunti nuovi requisiti.

Engineering Agile

Negli ultimi 15 anni, una nuova filosofia denominata Extreme Programming (XP) ha iniziato a diffondersi nel settore Sviluppo Software. XP permette a piccole squadre di affrontare grandi progetti e di ridurre i costi di manutenzione. Molte metodologie per lo Sviluppo Software sono nate seguendo diverse declinazioni dei principi XP. In quanto insieme di concetti e principi di alto livello, XP è molto prezioso, ma a volte si scontra con alcuni preconcetti che permangono nello Sviluppo Software, in particolare quando, nel caso di Engineering, abbiamo a che fare con le soluzioni legacy e le tecnologie aziendali.

In Engineering, sfruttiamo i principi fondamentali della metodologia agile quando dobbiamo costruire i nostri software e progettiamo un semplice flusso di lavoro che è scalabile, in modo che possa essere utilizzato sia in un progetto per uno che in un progetto con dieci persone o più.

Il nostro approccio ci da numerosi vantaggi. Iniziamo fissando una scadenza per un MVP (Minimum Viable Product – minimo prodotto fattibile) che siamo in grado di mostrare ai nostri clienti nel più breve tempo possibile; da li, si procede in brevi iterazioni fino a quando i tutti i casi d'uso possibili non vengono contemplati. Questo ci permette di comunicare con i clienti in modo semplice e riceviamo i loro feedback nel più breve tempo possibile, quando apportare cambiamenti è meno costosi. I nostri clienti sono felici di essere coinvolti nel processo di sviluppo, seguire il progetto fin dall'inizio e vedere il progresso effettivo del lavoro su base giornaliera. L'approccio "agile" ci permette di affrontare qualsiasi condizione supplementare o un errore recentemente scoperto, molto rapidamente, e di apportare modifica successive alla spedizione senza problemi.

Il nostro approccio mescola alcuni aspetti del software Scrum, per quello che riguarda la gestione degli sprint ed il flusso GitHub per quanto riguarda il monitoraggio del codice di base ed i problemi.

Approccio standardizzato

Quando si costruisce un software è importante uniformare le procedure e le regole da seguire durante tutto il processo di sviluppo. In Engineering, selezioniamo le nostre tecnologie ed i nostri strumenti in base a ciò che è più produttivo e che meglio soddisfa gli standard di settore sviluppando regole interne e schemi da applicare ai progetti stessi. Questo ci consente di avere una gamma di prodotti coerenti e di poter facilmente integrare tra loro diversi progetti, oltre che di riutilizzare dei moduli aziendali indipendenti. Quando dobbiamo iniziare un nuovo progetto è molto facile cominciare a creare la soluzione e iniziare a scrivere il codice che compie effettivamente il lavoro, perché possiamo sfruttare un mix già collaudato di tecnologie e processi di lavoro. Engineering utilizza e applica quanto segue per assicurarsi che il processo ed i prodotti soddisfino i più alti standard di qualità con il più basso impatto sui costi:

  • Regole automatiche per il controllo del codice
  • Regole automatiche di analisi statica del codice
  • Implementazione automatica con un click del flusso di lavoro
  • Regole interne e convenzioni dai diversi progetti

Controllo del codice sorgente

Noi crediamo che il controllo del codice sorgente sia uno dei più importanti (e più trascurati) componenti per garantire elevati standard di qualità nel settore Sviluppo Software. Non usare un metodo di controllo del codice sorgente fa si che il codice si "sporchi" nel corso del tempo, aumentando drasticamente il debito tecnico (possibili complicazioni) che può causare il fallimento di un progetto ancora prima della distribuzione.

In Engineering, trattiamo il codice sorgente come il documento di progettazione più importante e gli diamo un'attenzione particolare per garantire che solo il codice ben collaudato e di alta qualità finisca nel prodotto finale. Usiamo GitHub per ospitare i nostri progetti ed anche il loro strumento di gestione dei problemi ed il loro meccanismo di richiesta di "pull" per comunicare sia internamente che con i nostri clienti.

Sfruttiamo anche la potenza di controllo del codice sorgente quando dobbiamo gestire rami diversi per le diverse implementazioni dello stesso progetto, in cui ogni distribuzione potrebbe avere requisiti aggiuntivi o ha bisogno di indirizzare un cliente o un impianto specifico.

Verifica del codice

Due paia di occhi sono sempre meglio di uno, così facciamo varie verifiche del codice prima che venga accettato nel codice base. Questo aiuta a individuare bug e code smells (probabili indicazioni di difetti) o inefficienze nel codice, cosa che permette di ridurre il debito tecnico. La revisione del codice favorisce anche la diffusione delle migliori pratiche tra gli sviluppatori, in modo che chiunque possa riconoscere i proprio errori ed imparare più velocemente, evitando che questi errori influenzino la qualità del prodotto.

Test Driven Development (TDD) – Sviluppo guidato dai test

Testiamo sempre ogni funzionalità e ogni volta che viene aggiunta una nuova funzionalità deve essere accompagnata da un test che contempli tutti i casi d'uso possibili. Ci piacciono i test unitari, perché possono essere eseguiti senza spese aggiuntive ogni volta che il codice cambia per assicurarsi che le modifiche non interrompano le funzionalità introdotte in precedenza.

Integrazione Continua & Erogazione Continua

In Engineering, amiamo l'automazione. L'automazione delle operazioni significa che è possibile delegare ad una macchina le faccende più noiose ed i computer sono ben noti per eseguire le faccende noiose in un modo molto veloce, poco costoso e privo di errori. Usiamo grunt e gulp per creare i nostri compiti di implementazione e verifica. Usiamo l'impressionante AppVeyor CI per eseguire il nostro compito automaticamente ogni volta che il codice viene modificato. Ad esempio, con una Erogazione Continua, possiamo automatizzare tutte le seguenti attività sul server CI e con un unico comando far si che il progetto integrato non dipenda dall'ambiente in cui è stato costruito:

  • Analisi dello stile
  • Analisi del codice statico
  • Risoluzione delle dipendenze esterne
  • Compilazione del progetto .NET
  • Compilazione del progetto JavaScript
  • Minimizzazione
  • Esecuzione di test
  • Generazione documentazione PDF
  • Compilazione dell’installazione

Questo rende la costruzione di un progetto dal codice sorgente un processo davvero economico, replicabile e senza errori. Ogni generazione è anche strettamente identificata da un numero di versione in modo che sappiamo sempre quale versione viene distribuita.

Tecnologie orientate al Web

Il mondo dello Sviluppo è cambiato radicalmente negli ultimi 5 anni: abbiamo assistito ad un cambiamento globale verso prodotti basati sul web. Engineering accoglie questa tendenza, fornendo soluzioni basate sul Web e scegliendo tecnologie all'avanguardia per sfruttare questo nuovo modo di costruire i software.

Le più recenti tecnologie basate su Web ci permettono di sviluppare i progetti più velocemente e senza errori e rendere l'implementazione un processo semplice e replicabile, riducendo di conseguenza i costi ed aumentando considerevolmente la qualità dei prodotti. Ci concentriamo su una specifica tecnologia "stack" per creare un flusso di lavoro ben collaudato e solido:

  • C# e .NET poiché sono gli standard nella produzione e dell’impresa IT
  • Il server SQL fornisce la soluzione più solida quando si tratta di gestire un database per l'industria manifatturiera
  • ServiceStack è un modello basate su rete per costruire servizi web solidi ed estensibili e REST APIs
  • Typescript unisce la formalità e la sicurezza della tipizzazione statica con la versatilità e la velocità di JavaScript e le librerie lato cliente
  • NodeJS e grunt automatizzano i nostri compiti e sfruttano molte delle migliori pratiche di sviluppo lato cliente
  • AngularJS ci permette di costruire interfacce utente molto ricche e interattive con una quantità assurdamente bassa di codice
  • NPM e NuGet sono i nostri sistemi di gestione delle dipendenze di scelta per i clienti ed i server, rispettivamente

Il risultato è un software che è facile da usare e da installare, con una moderna interfaccia per il cliente, potenti funzionalità di debug e diagnostica, impronta leggera nell'hardware e ottima velocità.

Engineering

In Engineering, abbracciamo la filosofia Open Source nello Sviluppo Software e cerchiamo di introdurre questo concetto nel mondo della produzione e dell'impresa IT.

Il moderno flusso di lavoro di sviluppo è fortemente basato sull' Open Source. Questa tendenza può essere vista anche nella recente politica di Microsoft verso le tecnologie di sviluppo: il gigante Redmond è sempre stato rinomato per la sua politica di Closed source, tuttavia nell'ultimo anno ha reso Open source la maggior parte delle sue piattaforma .NET. Questo è un chiaro segno che, anche per i progetti di impresa è giunto il momento di sfruttare le enormi potenzialità che i software Open Source (OSS) hanno da offrire.

In Engineering, ci affidiamo molto agli OSS per i nostri componenti di base, e ci piace dimostrare il nostro impegno rendendo aperti molti dei moduli che non fanno parte del nostro core business. Potete trovare i nostri progetti Open Source qui https://github.com/hylasoft-usa. Lo facciamo non solo per far crescere la comunità, ma anche per aiutare noi stessi a sviluppare una mentalità modulare e a fornire dipendenze facilmente gestibili e riutilizzabili.

Riusabilità

Pensiamo che sia importante non cominciare d'accapo ogni volta che si avvia un nuovo progetto. Sarebbe bello iniziare a scrivere il codice principale il primo giorno di sviluppo, ma naturalmente ci sono molte attività collaterali che devono essere attuate prima di ogni progetto, dal meccanismo di registrazione, all'integrazione con sistemi esterni, l'autenticazione , il quadro generale e le librerie di utilità. Quando un progetto è finito, ci occupiamo delle parti che possono essere estratte e riutilizzate in modo indipendente in altri progetti. Ciò non solo permette di ridurre drasticamente il lavoro e le linee di codice per ogni progetto, ma aumenta anche la qualità del prodotto e riduce il debito tecnico, poiché ogni modulo è completamente indipendente da un singolo progetto ed è già stato testato unitariamente e usato.

E poi?

In Engineering, siamo sempre alla ricerca di nuovi modi per migliorare il nostro lavoro di sviluppo e perfezionare il nostro stack tecnologico. Viviamo in un momento molto emozionante per lo Sviluppo Software e siamo sicuri che il mondo aziendale sarà rivitalizzato da questi cambiamenti di paradigma.

Molti concetti stanno facendo la loro strada dal mondo delle tecnologie start-up innovative al mondo industriale: lo sviluppo basato su contenitore, come il tipo fornito da Docker si prospetta come lo standard che sostituirà il più vecchio modello di virtualizzazione, il futuro si prospetta molto interessante per la sperimentazione di Tecnologie Indossabili e per la Realtà Aumentata, ma anche Internet delle cose (IoT) sta diventando sempre più importante nel settore manifatturiero.

In Engineering, non vogliamo perdere nessuna opportunità per rivoluzionare il mondo della produzione, e, come sempre, siamo molto entusiasti di lavorare con i nostri clienti e partner su progetti che rendano queste idee una realtà.


Contattaci