Image

Porting

Migrazione di software esistenti verso altre piattaforme hardware e/o software.

Porting per codebase legacy

Le applicazioni hanno un ciclo di vita limitato a qualche anno. L’obsolescenza, infatti, non colpisce solo l’hardware, e l’evoluzione costante dei sistemi operativi rende necessaria una manutenzione costante che a volte diventa impraticabile e antieconomica.

L'aggiornamento di una intera codebase comporta tipicamente una fase di re-ingegnerizzazione, simile a quella di una applicazione che viene scritta partendo da zero.

L'unica differenza consiste nel fatto che i requisiti funzionali sono in buona parte determinati a priori. Tuttavia, se l'intento è anche quello di ampliare le funzionalità originali, ancora una volta non si può prescindere da una attenta analisi dei requisiti per scegliere la tecnologia più idonea.

Per questa ragione è prudente non confondere il porting con una mera opera di ri-scrittura. Vi sono infatti una serie di criticità che, se non prese in considerazione, possono prolungare eccessivamente la transizione tra la vecchia e la nuova versione della codebase, sottraendo risorse da dedicare allo sviluppo di nuove funzionalità.

I nostri servizi includono la re-ingegnerizzazione per vari tipi di applicativi software:

  • Riscrittura o porting di applicazioni standalone e servizi per sistemi desktop
  • Integrazione di sistemi di gestione di plugin
  • Decomposizione di applicazioni web monolitiche in architetture a microservizi

Linguaggi di programmazione e framework

La scelta di un linguaggio di programmazione non è una questione di mera sintassi.

Il linguaggio definisce in modo implicito il paradigma di riferimento usato per la codifica, e sebbene tutti i linguaggi di alto livello siano equipotenti, non tutti sono equivalenti quando si tratta di implementare applicazioni complesse e multi-paradigma.

In altre parole, quando il porting comporta un cambiamento del linguaggio di programmazione di riferimento è necessario valutare attentamente le implicazioni semantiche di ogni singola istruzione, rapportandole all'architettura dell'intero programma.

Inoltre, a volte è necessario effettuare un porting dell'applicazione perchè essa si basa su framework o librerie che non sono più attivamente supportati. In questi casi, la migrazione implica la possibilità di doversi adattare non solo all'uso di nuovi linguaggi, ma anche a nuovi design pattern, aggiungendo un ulteriore livello di complessità.

Come progettisti e sviluppatori abbiamo acquisito competenze specifiche per quanto riguarda la sintassi di vari linguaggi di programmazione. Abbiamo inoltre una conoscenza approfondita delle regole semantiche e dei costrutti idiomatici di molti linguaggi di alto livello.

I linguaggi in cui siamo particolarmente fluenti sono:

  • C++
  • C
  • C# e altri linguaggi della CLI Microsoft
  • Java
  • PHP
  • JavaScript
  • Python

La nostra competenza comprende l'uso di svariati framework e librerie, nonchè la conoscenza approfondita dei design pattern su cui sono basati:

  • Application framework: Qt/C++ e QML, Microsoft .NET, Node.js, Angular
  • Web front-end: jQuery, Angular, React, librerie CSS-in-JavaScript, Vaadin
  • Web back-end: Node.js, Laravel
  • 3D: OpenGL, DirectX
  • Geo positioning: GDAL/OGR, proj4

Semplificazione, modularità ed estendibilità

Molte applicazioni, soprattutto quelle caratterizzate da un basso livello di ingegnerizzazione, sono difficilmente manutenibili per via dell'elevato livello di interdipendenza tra le varie componenti.

L'aggiornamento di una codebase legacy offre l'occasione di riprogettare l'intera applicazione alla luce del riscontro ottenuto dal proprio bacino d'utenza. Potare le funzionalità inutili e semplificare allo stesso tempo le modalità di interazione per quelle più apprezzate, valorizza il nuovo prodotto anche se esso non aggiunge nuove funzionalità rispetto il precedente.

La definizione di un'architettura modulare comporta due vantaggi chiave:

  • Incremento della leggibilità del codice, a beneficio della manutenibilità
  • Semplificazione degli sviluppi futuri per l'estensione delle funzionalità

Una progettazione modulare ed estendibile non può prescindere da una fase di analisi e progettazione accurata e richiede inevitabilmente più tempo perchè implica la scrittura di codice boilerplate, cioè propedeutico all'implementazione delle funzionalità effettive dell'applicazione.

In altre parole il porting di un'applicazione può essere complicato quanto l'avviamento di un progetto di sviluppo nuovo, con il rischio aggiuntivo di viziare la nuova applicazione basandosi su vecchie assunzioni o preconcetti derivati dalle competenze limitate o dalla forma mentis del team di sviluppo.


Vuoi riprogettare tua applicazione legacy?