Disclaimer: I am un architetto in un ambiente agile ma, come dice Helmuth von Moltke the Elder, "Nessun piano di battaglia sopravvive al contatto con il nemico". In altre parole, praticità significa che non è sempre possibile seguire la lettera esatta delle linee guida.
La maggior parte dei punti sopra riportati sono seguiti al meglio dalla squadra. Tuttavia, principio 1 (I team che codificano il sistema di progettazione del sistema) è davvero difficile da seguire quando il team è composto da decine (o centinaia) di sviluppatori suddivisi tra diversi continenti e fusi orari . Questo non ha nulla a che fare con le abilità o gli atteggiamenti degli sviluppatori, più il problema logistico di tutti loro è presente per raccogliere le richieste dei clienti e comprendere i sistemi complessi esistenti.
So, how is the system design done? Using UML? Or a document
that defines interfaces and major blocks? Maybe something else?
Spesso l'architetto identifica i componenti principali, quindi definisce le interfacce tra di loro (compresi i requisiti non funzionali come sicurezza, velocità e affidabilità) e delega la progettazione interna dei componenti ai singoli team . Questo è un buon compromesso tra consentire ai team di progettare i propri componenti senza richiedere a tutti di sapere tutto sul sistema.
Ogni organizzazione ha una propria serie di standard per i progetti architettonici e questo a volte varia da progetto a progetto all'interno dell'organizzazione. Questo disegno è stato fatto prima che il team iniziasse la codifica o il prima possibile e di solito contiene (e non è un elenco completo):
- Requisiti estesi e definizione dell'ambito. Questi includono casi d'uso o storie di utenti che soddisfano i requisiti aziendali di livello superiore. Personalmente mi piace usare RFC 2119 per i requisiti non funzionali. Il design è basato su e ricondotto a questi. Anche se potrebbe non adattarsi alla definizione comune di design, spesso sono altrettanto importanti.
- Una panoramica costituita da un diagramma di rete o componente di alto livello e una pagina di testo. Questo è per un pubblico molto ampio, dalla gestione superiore fino allo sviluppo e al controllo qualità. Questo raramente utilizza UML o una notazione definita a causa dell'ampio pubblico.
- Dettagli per singoli componenti, spesso incentrati sulle interfacce o API tra di loro come menzionato sopra. Le interfacce possono essere specificate come firme del metodo nella lingua di destinazione con i dettagli di precondizione e post-condizione. I componenti possono avere diagrammi di rete, come mostrare il layout delle VM in un cloud o in un data center e le loro disposizioni di networking. I database relazionali di solito hanno diagrammi Entità-Relazione.
- Una lista di rischi architettonici e loro mitigazioni, se conosciuti. Come i requisiti, questi dimostrano decisioni di progettazione e compromessi.
In breve, la progettazione di un sistema in un processo agile è esattamente la stessa di una procedura tradizionale a cascata. Tuttavia, in ambienti agili, meno del design viene eseguito in anticipo e più di esso è delegato ai team dei componenti . La chiave sta determinando la profondità iniziale, quali decisioni rimandare e identificare quando devono essere prese le decisioni. Le decisioni che incidono su più team di sviluppo dovrebbero essere prese prima, in particolare scalabilità e sicurezza. Decisioni come l'aggiunta di lingue aggiuntive a un prodotto già internazionalizzato possono essere posticipate molto tardi.
Dopo aver creato la progettazione iniziale, l'architetto lavora con ciascuno dei team e rivede i loro progetti. Se sono necessarie modifiche progettuali o di progetto aggiuntive per un'unità di lavoro (come una scrum sprint), l'architetto intende renderlo disponibile al momento in cui inizia l'unità di lavoro. L'architetto è anche responsabile della comunicazione di eventuali modifiche ai team o agli stakeholder interessati.