ݺߣ

ݺߣShare a Scribd company logo
Una PA agile, funzionale e serverless…
SI PUÒ FARE!
Federico Feroldi / @cloudify • Danilo Spinelli / @gunzip
Roma 2018
CC BY-NC-SA 3.0
Agenda
La genesi
Come l’abbiamo fatto
Presente e Futuro
agid.gov.it • @agidgov
teamdigitale.governo.it • @teamdigitaleit
La visione della “Cittadinanza Digitale”
Eliminare: raccomandate e
lettere, code allo sportello,
scadenze da ricordare,
moduli da compilare,
bollettini da pagare in
Posta!(e tanto altro)
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - Codemotion Roma 2018
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - Codemotion Roma 2018
I principi
Codice Open Source
Infrastruttura Cloud
Metodologia Agile e Lean
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - Codemotion Roma 2018
Le difficoltà
“Secondo me…”
“Serve una gara per…”
“Cloud ? Eccolo !”
“Quando sarà pronto ?”
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - Codemotion Roma 2018
Trasparenza totale (scrivere e condividere!)
Codice e Documentazione
Discussioni aperte (Pull Request)
Decisioni (Architecture Decision Records)
Backlog (Pivotal Tracker)
Automazione e tooling (gratis!)
Codice / Code Review (GitHub)
Build / Test (CircleCI)
Backlog e Planning (Pivotal Tracker)
Code Analysis (CodeClimate, Codacy, Snyk)
Efficienza (meno codice = meno bug e alta velocity)
Frameworks(Express, React Native)
Codice tipizzato(TypeScript, Flow)
Stile funzionale(fp-ts, io-ts, tslint-immutable)
Best practices (TSLint, ESLint, DangerJS)
PaaS (focus sulla business logic, non sull’infrastruttura)
Azure
Dati in Unione Europea
Serverless
Database/Message broker
Remote-first (usiamo tutto l’aiuto che troviamo)
Prendi l’iniziativa (Backlog→PR→Build→Merge)
Feedback continui (CircleCI → Slack)
Momenti di “sync” (Howdy, Hangouts)
Memo collaborativi (Google Docs)
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - Codemotion Roma 2018
’a󾱳ٱٳٳܰ
Terraform
Infrastructure as Code
versioning e ambienti “riproducibili”
Parziale il supporto per Azure
resource "null_resource"
"azurerm_cosmosdb_collections" {
provisioner "local-exec" {
command = …
}
}
Notifiche e Preferenze: un’API per tutte le PA !
Auth & quota (API management)
Persistenza (Cosmos DB)
Integrazione (Storage Queues)
Business logic (Functions / TypeScript)
Azure Functions
Triggers & Actions
Una tecnologia in evoluzione
// update message visibilityTimeout
getDelaySecForRetries(numberOfRetries)
.map(visibilityTimeoutSec => {
queueService.updateMessage(
queueName, ... visibilityTimeoutSec,
() => …
});
Perchè Typescript
Type system ⋍ Meno bug !
Tools & Refactor (Visual Studio Code)
Feature di ES7 (async / await, spread
operator, ...) indipendentemente dalla versione di
NodeJS !
Functional Typescript
Ancora poco “functional”...
function apply<[...ArgumentsT], ResultT>(
fn: (...fnargs: ArgumentsT) => ResultT,
args: ArgumentsT
): ResultT
{
// args becomes any[]
// fn(...args)
}
apply((x: string, y: number) => ..., [“1”, 2])
Functional Typescript
...nel frattempo
Giulio Canti fp-ts
https://github.com/gcanti/fp-ts
Untyped Express controller
Prima…
async getProfile(req, res)
{
const fiscalCode = req.params.fiscal_code;
if (!isValid(fiscalCode)) {
return res.status(400)
.json({ error: “invalid code” });
}
const profile = await
Service.getProfile(fiscalCode);
res.status(200).json(profile);
}
Typed Express controller
...dopo
async getProfile(fiscalCode: FiscalCode):
Promise<Either<
ResponseError<QueryError>,
ResponseSuccess<Profile>>>
=>
(await Model.getProfile(fiscalCode))
.map(ResponseSuccess)
.mapLeft(ResponseError);
Linting
Imporre le “best practice”
Immutabilità, type decl “pervasive”, ...
Favorire uno stile coerente
Ordine degli import, indentazione, naming, ...
… ed efficientare l’onboarding
// tslint:disable:no-any
Deploy delle Azure Functions
gulp:release
Build & Test (tsc)
Bundle (riduce drasticamente startup time !)
Tag (push release tag)
Push (git push origin master)
Pull (tramite trigger automatico nelle Functions)
(git) push the candle back !
Rollback
Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - Codemotion Roma 2018
Un po’ di metriche (9 mesi)
~170 User Stories
~300 Pull Requests
~900 Commits
~22.000 LoCs (80% TS, 20% JS)
What’s next
Lock-in Azure? (Docker, Kubernetes, Helm)
Community?
Quando sarà pronto?
github.com/
teamdigitale/
digital-citizenship
PR welcome!

More Related Content

Una Pubblica Amministrazione Agile, Funzionale e Serverless: si può fare! - Codemotion Roma 2018

  • 1. Una PA agile, funzionale e serverless… SI PUÒ FARE! Federico Feroldi / @cloudify • Danilo Spinelli / @gunzip Roma 2018 CC BY-NC-SA 3.0
  • 2. Agenda La genesi Come l’abbiamo fatto Presente e Futuro
  • 4. La visione della “Cittadinanza Digitale” Eliminare: raccomandate e lettere, code allo sportello, scadenze da ricordare, moduli da compilare, bollettini da pagare in Posta!(e tanto altro)
  • 7. I principi Codice Open Source Infrastruttura Cloud Metodologia Agile e Lean
  • 9. Le difficoltà “Secondo me…” “Serve una gara per…” “Cloud ? Eccolo !” “Quando sarà pronto ?”
  • 11. Trasparenza totale (scrivere e condividere!) Codice e Documentazione Discussioni aperte (Pull Request) Decisioni (Architecture Decision Records) Backlog (Pivotal Tracker)
  • 12. Automazione e tooling (gratis!) Codice / Code Review (GitHub) Build / Test (CircleCI) Backlog e Planning (Pivotal Tracker) Code Analysis (CodeClimate, Codacy, Snyk)
  • 13. Efficienza (meno codice = meno bug e alta velocity) Frameworks(Express, React Native) Codice tipizzato(TypeScript, Flow) Stile funzionale(fp-ts, io-ts, tslint-immutable) Best practices (TSLint, ESLint, DangerJS)
  • 14. PaaS (focus sulla business logic, non sull’infrastruttura) Azure Dati in Unione Europea Serverless Database/Message broker
  • 15. Remote-first (usiamo tutto l’aiuto che troviamo) Prendi l’iniziativa (Backlog→PR→Build→Merge) Feedback continui (CircleCI → Slack) Momenti di “sync” (Howdy, Hangouts) Memo collaborativi (Google Docs)
  • 18. Terraform Infrastructure as Code versioning e ambienti “riproducibili” Parziale il supporto per Azure resource "null_resource" "azurerm_cosmosdb_collections" { provisioner "local-exec" { command = … } }
  • 19. Notifiche e Preferenze: un’API per tutte le PA ! Auth & quota (API management) Persistenza (Cosmos DB) Integrazione (Storage Queues) Business logic (Functions / TypeScript)
  • 20. Azure Functions Triggers & Actions Una tecnologia in evoluzione // update message visibilityTimeout getDelaySecForRetries(numberOfRetries) .map(visibilityTimeoutSec => { queueService.updateMessage( queueName, ... visibilityTimeoutSec, () => … });
  • 21. Perchè Typescript Type system ⋍ Meno bug ! Tools & Refactor (Visual Studio Code) Feature di ES7 (async / await, spread operator, ...) indipendentemente dalla versione di NodeJS !
  • 22. Functional Typescript Ancora poco “functional”... function apply<[...ArgumentsT], ResultT>( fn: (...fnargs: ArgumentsT) => ResultT, args: ArgumentsT ): ResultT { // args becomes any[] // fn(...args) } apply((x: string, y: number) => ..., [“1”, 2])
  • 23. Functional Typescript ...nel frattempo Giulio Canti fp-ts https://github.com/gcanti/fp-ts
  • 24. Untyped Express controller Prima… async getProfile(req, res) { const fiscalCode = req.params.fiscal_code; if (!isValid(fiscalCode)) { return res.status(400) .json({ error: “invalid code” }); } const profile = await Service.getProfile(fiscalCode); res.status(200).json(profile); }
  • 25. Typed Express controller ...dopo async getProfile(fiscalCode: FiscalCode): Promise<Either< ResponseError<QueryError>, ResponseSuccess<Profile>>> => (await Model.getProfile(fiscalCode)) .map(ResponseSuccess) .mapLeft(ResponseError);
  • 26. Linting Imporre le “best practice” Immutabilità, type decl “pervasive”, ... Favorire uno stile coerente Ordine degli import, indentazione, naming, ...
  • 27. … ed efficientare l’onboarding // tslint:disable:no-any
  • 28. Deploy delle Azure Functions gulp:release Build & Test (tsc) Bundle (riduce drasticamente startup time !) Tag (push release tag) Push (git push origin master) Pull (tramite trigger automatico nelle Functions)
  • 29. (git) push the candle back ! Rollback
  • 31. Un po’ di metriche (9 mesi) ~170 User Stories ~300 Pull Requests ~900 Commits ~22.000 LoCs (80% TS, 20% JS)
  • 32. What’s next Lock-in Azure? (Docker, Kubernetes, Helm) Community? Quando sarà pronto?