Moov-Tech: dall'idea di una startup ad un progetto scalabile in 10 settimane

Raccolta iniziale delle informazioni utili

La natura delle startup è di andare veloce, “fail fast, learn faster”, e validare un servizio andando sul mercato il prima possibile. La messa a terra di questo progetto si è basata esattamente su questo principio, a partire da un’attività di ricerca estremamente snella e resistente agli inevitabili cambi di direzione. 

Abbiamo realizzato incontri di discovery con il team e numerosi colloqui con il Product Owner e gli stakeholder per esplorare gli aspetti meno definiti. La raccolta di informazioni ha incluso pitch, stakeholder map, assumptive personas con i loro bisogni e service blueprint. 

Da queste attività strategiche sono emersi gli scenari principali di utilizzo, ordinati per priorità, e un backlog delle attività da avviare.

Progettazione con informazioni limitate: euristiche e stakeholder interviews 

Una volta terminata la fase di discovery, la progettazione si è concentrata su scenari, user flows e wireflows. 

L'approccio di facilitare insieme al Product Owner, sia user flows che i wireflow, è servito a passare rapidamente ai kit di componenti scelti e produrre prototipi funzionanti da usare e sui cui iterare indipendentemente dal framework che è stato adottato e mutato nel corso del progetto. 

Proprio a dimostrazione che il valore della progettazione non è essenzialmente legato alla consegna di interfacce utente finite una volta per tutte e definite al pixel, l’aver realizzato prototipi tramite flussi e wireframe ha permesso di raccogliere feedback dal cliente e dagli utenti utilizzando delle semplici board FigJam. 

Fatto è meglio che perfetto, lo scopo di questa fase iniziale era appunto raccogliere feedback, non progettare il prodotto finito.

Le scelte del team Cloud e BackEnd

Quando si avvia un nuovo progetto software, la scelta della tecnologia giusta è fondamentale per assicurare scalabilità, rapidità di sviluppo e contenimento dei costi. Nel nostro caso, avevamo la necessità di individuare soluzioni tecnologiche che ci permettessero di sviluppare rapidamente un prototipo iniziale, che offrissero una vasta gamma di strumenti già pronti all’uso e che fossero sufficientemente modulari per adattarsi facilmente a eventuali cambiamenti futuri.

Serverless Framework

L’utilizzo di Serverless Framework ha permesso agli sviluppatori di semplificare la gestione di parte dell’infrastruttura e la distribuzione del progetto. Grazie alla modularità dei plugin offerti da Serverless, siamo riusciti ad avere rapidamente gran parte dell’infrastruttura già operativa, consentendoci di iniziare a testare le prime versioni del software fin dalle fasi iniziali. 

Inoltre, l’adozione di soluzioni serverless ha permesso al cliente di ridurre i costi infrastrutturali, un aspetto particolarmente vantaggioso considerando le incertezze legate al carico di lavoro tipiche delle startup nelle prime fasi di sviluppo.
 

NestJS

NestJS offre una struttura solida e modulare, arricchita da numerosi pacchetti già pronti all’uso. Questi strumenti hanno consentito agli sviluppatori di concentrarsi principalmente sulla logica di business, mantenendo al contempo un’architettura organizzata e coerente durante tutte le fasi di sviluppo.

In un contesto startup, dove i processi possono cambiare rapidamente, la modularità di NestJS si è rivelata un elemento chiave. Ha permesso agli sviluppatori di lavorare con maggiore agilità, sviluppando inizialmente una singola lambda monolitica e, solo in un secondo momento—quando le logiche di dominio sono diventate più definite—separare da questa struttura i moduli che potevano evolvere in microservizi indipendenti.
 

Airtable

Una delle sfide più complesse e delicate all’avvio di un nuovo progetto è la corretta progettazione del database. Errori in questa fase possono infatti avere ripercussioni significative sugli sviluppi successivi, costringendo spesso il team a convivere con debito tecnico difficilmente recuperabile. 

Progettare un database da zero richiede tempo, una delle risorse più preziose per una startup, dove il “time to market” è fondamentale. Per questo motivo, il team di sviluppo ha deciso inizialmente di affidarsi a una base dati già esistente, utilizzata dal cliente su Airtable. Questa scelta ha permesso di lavorare e testare il software fin dalle prime settimane su dati realistici, consentendo agli sviluppatori di dedicare il tempo necessario alla definizione ottimale della struttura del database, senza rallentare l’avanzamento degli altri sviluppi.
 

AWS

Per quanto riguarda la parte infrastrutturale, è stata progettata un'architettura event-driven su AWS, sfruttando la suite di servizi nativi per assicurare massima efficienza, modularità e flessibilità. Il sistema si basa sul principio di disaccoppiamento, permettendo a ciascun microservizio di operare in maniera indipendente e di gestire in autonomia le proprie funzionalità specifiche. 

I microservizi sono stati sviluppati principalmente utilizzando AWS Lambda, una soluzione serverless ideale per i contesti in cui i volumi di utilizzo iniziali sono difficili da prevedere. A supporto, ogni microservizio è stato dotato di una propria coda SQS per la gestione dell'input, mentre i topic SNS sono stati implementati come dispatcher centralizzati per orchestrare la comunicazione tra i vari componenti. 

Per i microservizi che presentavano tempi di esecuzione superiori ai limiti di AWS Lambda, è stato introdotto Amazon ECS, una soluzione containerizzata che ha consentito di gestire workload che richiedono operazioni più complesse. 

Sul fronte della comunicazione, i microservizi backend sono stati resi accessibili tramite Amazon API Gateway, per un accesso sicuro e scalabile alle API. Per quanto riguarda i microservizi frontend, si è utilizzato CloudFront per la distribuzione delle interfacce grafiche, assicurando un'elevata velocità di caricamento. 

Per quei microservizi frontend che richiedevano il rendering lato server, la scelta è ricaduta sul servizio di hosting di AWS Amplify, Questa integrazione ha ulteriormente migliorato la velocità e la qualità delle funzionalità dinamiche nelle GUI. 

Infine, per garantire un flusso di deploy agile e ottimizzato, sono state implementate pipeline di deployment utilizzando AWS CodePipeline. Questo processo automatizzato ha assicurato deployment rapidi e coerenti, consentendo al cliente di rilasciare aggiornamenti in maniera efficiente e senza interruzioni.

infrastruttura
Infrastuttura

Terraform

Terraform Cloud ha svolto un ruolo fondamentale nel garantire un’infrastruttura altamente scalabile e completamente automatizzata.  

L’intero ecosistema – inclusi i microservizi, le pipeline di deployment e tutti i servizi accessori (SQS, SNS, ECS, API Gateway, CloudFront, Amplify e Cognito) – è interamente definito e gestito tramite codice Terraform. Questo approccio infrastrutturale "as code" ha permesso di modellare configurazioni flessibili e facilmente replicabili.  

Sfruttando il workflow VCS, ogni modifica al codice Terraform, una volta pushata sul branch del repository relativo all’ambiente AWS (stage o produzione), veniva automaticamente applicata. Questo approccio ha reso lo sviluppo e il deployment di nuovi microservizi e delle pipeline di CI/CD estremamente rapido e affidabile. 

Un altro vantaggio chiave dell’utilizzo di Terraform è stato legato alla flessibilità nella gestione dei microservizi. Per creare un nuovo microservizio, era sufficiente definire alcune variabili nel codice Terraform. Queste variabili determinavano tutti gli elementi necessari, come la configurazione del microservizio, le relative pipeline di deployment, le connessioni alle code SQS o ai topic SNS, così come altri servizi integrati. Questo approccio modulare semplifica la scalabilità del sistema e consente di aggiungere nuovi microservizi in tempi rapidi. 

Analogamente, per distruggere un microservizio non più necessario, era sufficiente rimuovere le variabili associate dal codice Terraform. Grazie alla sincronizzazione automatica, l’intera infrastruttura correlata veniva smantellata senza lasciare risorse inutilizzate o configurazioni residue. Questo garantisce un'elevata efficienza nella gestione delle risorse e una riduzione significativa dei costi operativi.

Prototipo funzionante tramite tecnologie low-code 

La definizione dei flussi ha chiarito quale fosse la migliore direzione da prendere per avviare quanto prima la fase di sviluppo con l’implementazione della logica lato server. 

Con la consapevolezza che dai primi utilizzi in scenari reali sarebbero scaturiti numerose modifiche ed affinamenti, si è deciso di procedere con uno strumento low-code per la realizzazione della prima versione di interfaccia utente. 

Questo ci ha permesso di essere estremamente agili e reattivi ad ogni nuovo scenario, riducendo drasticamente i tempi per allineare l’interfaccia alle modifiche nella logica di business, modifiche scaturite proprio grazie alla possibilità di avere ad ogni iterazione una nuova interfaccia funzionante e costruita in poco tempo. 

Al passare dei primi mesi, avendo acquisito maggior stabilità e visione sugli sviluppi futuri (grazie anche alle solide basi messe in precedenza), è stato possibile effettuare una transizione dallo strumento low-code ad una vera e propria applicazione web che permettesse un’esperienza utente molto più fluida ed ottimizzata.

Estetica del software a sostegno di credibilità del sistema 

Una volta avviato lo sviluppo del prototipo funzionante, il team di design ha iniziato a progettare gli elementi visuali del prodotto finale. 

Seguendo la stessa filosofia snella della progettazione iniziale, l'uso di kit e componenti ci ha consentito di avere in una prima fase un prototipo funzionante e già pronto a generare valore e raccogliere feedback. 

Una volta assodata l’esperienza di utilizzo che il sistema vuol offrire, il focus si è spostato sul cercare di rendere più coerente il sistema al brand del cliente e ai portali online già in essere, tenendo anche in considerazione l’efficacia dell’esperienza utente. 

Grazie alla style-guide fornita dal cliente, è stato possibile personalizzare i componenti adottati nei wireframe e uniformare l’identità visiva del software. Questo processo ha garantito modularità e coerenza nei design pattern del sistema, portando il software a un livello professionale superiore, rendendolo altamente credibile e affidabile.

Risultati ottenuti per il cliente 

In poche settimane (circa 10) definite in fase di discovery, il sistema era operativo e pronto a generare valore, fornendo poi la base per gli sviluppi delle settimane successive. 

Grazie al metodo di sviluppo snello ed antifragile adottato dal team è stato possibile validare ed intraprendere la giusta direzione per consegnare a Moov-Tech un software in grado di automatizzare gli incarichi più tediosi ed il lavoro di molte persone, riducendo di fatto i costi e consentendo alle persone di occuparsi di attività di maggior valore. 

L’infrastruttura AWS ben architettata e configurata è pronta sin da subito a scalare e adattarsi alle necessità future. 

Guardando ad un orizzonte temporale più esteso, dove i carichi di lavoro possono crescere esponenzialmente e diventare totalmente insostenibili per essere gestiti manualmente, il software è già pronto a supporto del business.