# Processo e Sviluppo del Software
### Lezione 06/10/21
Presentazione del corso (blended learning).
Corso diviso in 3 parti:
- Come sviluppare software in team. (DevOps, CMM, Analisi dei rischi)
- Quale software implementare. (Analisi dei requisiti)
- Come sviluppare il software efficientemente. (MVC, JPA, EJB)
Metodi agili: i metodi agili sono utili in quanto avendo multipli rilasci ho diversi feedbacks del cliente in modo da poter migliorare il prodotto ad ogni iterazione. C'è un continuo cambiamento dei requisiti. Ci sono molte varianti per implementari i metodi agili. Principi:
- Focus sulle persone coinvolte.
- Documentazione limitata in quanto difficile da mantenere (agile documentation).
- Comunicazione diretta.
- Molteplici meeting con obiettivi precisi.
- Non cercare un design completo ma pensare in modo iterativo.
- Serie di pratiche di miglioramento iterativo e continuo del progetto.
- Testing iterativo.
Esempi di metodi agili:
SCRUM: Molto legato alla definizione di processo. Partendo da un insieme di requisiti (product backlog) ad ogni iterazione ne viene selezionata una parte (Sprint backlog), ogni iterazione dura tra le 1 e 4 settimane. Ogni giorno avviene un daily meeting, ogni persona risponde a 3 domande: cosa è stato fatto dall'ultimo meeting, cosa ci si aspetta di fare entro il prossimo e quali difficoltà ci si aspetta di incontrare. Durante questi meeting sono proibiti discussioni ed interazioni. Daily meeting fondamentali per capire chi sta facendo cosa.
Ruoli: Product owner (rappresenta i clienti), team members(sviluppatori), scrum master(responsabile per il processo di sviluppo)
Ci sono diversi meeting: quello iniziale, quello giornaliero, sprint review meeting (con il cliente per ottenere ed utilizzare il feedback ottenuto(incentrato sul prodotto)), spring retrospective meeting(tra i membri del team per ragionare se il processo adottato risulta funzionale).
#### DevOps
Per sfruttare pienamente i concetti dei metodi agili è necessario avere un'infrastruttura che permette di facilitare la capacità di rilascio del software prodotto. Si cerca di abbattere la barriera che rallenta la comunicazione tra chi fa sviluppo e chi fa operation. (I metodi agili rendono veloci la parte di sviluppo (dev) serve quindi rendere agile la parte di operation).
Concetti di DevOps:
- Dev ed Ops devono cooperare.
- La parte di Ops deve essere automatizzata (meno errori, molto veloce)
DevOps comprende:
- Sviluppo continuo.
- Integrazione continua.
- Testing continuo.
- Deployment continuo.
- Monitoring continuo.
Sfrutta spesso la virtualizzazione ed i container.

Ruoli:
- DevOps evangelist.
- Quality assurance.
- Automation expert: l'automazione è fondamentale in DevOps.
- Code release manager.
- Security engineer.
- Software Developer/Tester.
Principi chiave:
- Punto di vista customer-centric.
- Responsabilità di tipo end to end.
- Miglioramente continuo.
- Automazione (automate everything).
- Lavorare come un unico team.
- Monitorare e testare tutto.
Ciclo: operate->monitor->plan->code->build->test->release->deploy->operate->...
Continuos selivery pipelines: Vengono definite una serie di procedure automatiche (pipeline) per gestire in modo ottimale i cambiamenti. Build, test e deployment possono essere molto articolari. Vengono quindi introdotty dei quality gates che valutano automaticamente la qualità di un cambiamento per valutare se possa essere promosso al branch successivo. Possibili controlli sono: code reviews, unit tests, static code analysis, test sulla sicurezza.
Risulta molto difficile automatizzare la parte di deployment in quanto possibili errori avrebbero conseguenza direttamente "sul campo". Si cerca di effettuarlo in modo incrementale, in quanto un cambiamento totale sarebbe troppo rischioso. L'incrementalità può essere rivolte ai clienti, alle richieste, ai componenti ecc... .
Senza incrementalità ho blue/green deployment e faccio uno switch radicale tra le 2 versioni(che devono essere completamente separate sia sw che hw), mantenendo comunque la possibilità di poter tornare indietro.