Introduzione

Nell’era moderna, il software viene fornito sempre più di frequente come servizio (delivered as a service): si parla di web app o software as a service (SaaS). La twelve-factor app è una metodologia di sviluppo orientata alla costruzione di applicazioni software-as-a-service che:

La metodologia twelve-factor può essere applicata a ogni software, scritto in qualsiasi linguaggio di programmazione, che fa uso di una serie di servizi come database, code, cache e così via.

Background

Chi ha scritto questo documento è stato coinvolto direttamente nella realizzazione e nel deployment di centinaia di applicazioni, e ha indirettamente assistito allo sviluppo, le operazioni e lo scaling di centinaia (o migliaia) di app tramite il proprio lavoro sulla piattaforma Heroku.

Questo documento riassume tutta quella che è stata la nostra esperienza, basata sull’osservazione di un grande numero di applicazioni SaaS. Si tratta di una “triangolazione” di pratiche di sviluppo ideali (con una particolare attenzione alla crescita organica dell’app nel tempo), la collaborazione dinamica nel corso del tempo tra gli sviluppatori sulla codebase e la necessità di evitare i costi di software erosion.

La nostra motivazione è di far crescere la consapevolezza intorno ad alcuni problemi sistemici che abbiamo scoperto nello sviluppo di applicazioni moderne, cercando di fornire un vocabolario condiviso per la discussione di tali problemi. Oltre, ovviamente, a offrire delle soluzioni concettuali a queste situazioni (senza però tralasciare il fattore tecnologia). Questo format si rifà ai libri di Martin Fowler Patterns of Enterprise Application Architecture e Refactoring.

A chi è destinato questo documento?

A ogni sviluppatore che costruisca applicazioni SaaS (Software As a Service), e a ogni ops che effettui il deploy e gestisca queste applicazioni.

I “Dodici Fattori”

I. Codebase

Una sola codebase sotto controllo di versione, tanti deployment

II. Dipendenze

Dipendenze dichiarate e isolate

III. Configurazione

Memorizza le informazioni di configurazione nell’ambiente

IV. Backing Service

Tratta i backing service come “risorse”

V. Build, release, esecuzione

Separare in modo netto lo stadio di build dall’esecuzione

VI. Processi

Esegui l’applicazione come uno o più processi stateless

VII. Binding delle Porte

Esporta i servizi tramite binding delle porte

VIII. Concorrenza

Scalare attraverso il process model

IX. Rilasciabilità

Massimizzare la robustezza con avvii veloci e chiusure non brusche

X. Parità tra Sviluppo e Produzione

Mantieni lo sviluppo, staging e produzione simili il più possibile

XI. Log

Tratta i log come stream di eventi

XII. Processi di Amministrazione

Esegui i task di amministrazione/management come processi una tantum