Cornice di riferimento per affettatura verticale

1

Ultimamente abbiamo sentito molto spesso il concetto di "affettamento verticale". Penso che abbiamo fatto un lavoro migliore nel creare storie più piccole e ben definite. Quando stavo cercando informazioni sull'affinamento verticale, nessuno ha definito quanto fossero grandi i loro sistemi. Ad esempio, ne ho visto uno in cui Adobe ha stipulato un contratto con il software di capra di montagna per trovare una soluzione per ottenere le feature in verticale, anche su più team.

Per maggiori informazioni su di me, il mio background era con un'azienda più grande in cui i team erano responsabili di alcuni sistemi di back-end e dovevamo lavorare su almeno due sprint per fare le cose come "feature" - c'era il lavoro di back-end per l'altro sistema e il lavoro di integrazione per il nostro sistema. Il mio punto è che il quadro di riferimento per l'affettatura verticale in quella società era in qualche modo a livello di "progetto". Un progetto può essere un insieme completo di database, server back-end, servizi in background, accodamento / elaborazione dei messaggi, ecc., Ma era ben definito attorno a un progetto aziendale centrale.

La nostra app web orientata al cliente, ad esempio, aveva più DB propri, estratta da diversi archivi dati in cui altri progetti hanno riversato informazioni, avevano app batch che venivano eseguite ogni notte, leggere e scrivere da e verso diverse code di messaggi a inviare e-mail ai clienti, ecc. Anche con tutto ciò, tutte le "funzionalità deliverable" erano verticali all'interno del "progetto". Lo stack di solito è andato: client - > server web - > database o servizio web.

Alla nuova società, abbiamo una rete di progetti piuttosto intricata con pochi sviluppatori (avevo più sviluppatori del mio team nell'ultima azienda e principalmente ci siamo integrati solo con altri sistemi).

Ultimamente,perunadeterminatafunzione,dobbiamoapportareleseguentimodifiche:

  1. IdatifunzionanoinunfamosoCRMbasatosucloud(esisteunteamseparatoperquesto)
  2. lavorosuldatabaseinloco,disolitosolo2o3deiDBvengonotoccatiperunadeterminatafunzione3.DueappdiserviziAPIdistinte:unaèinmodalitàdimanutenzionefinoaquandotutteleapppossonoessereaggiornateallanuovaAPI.Entrambisiintegranocon1.e2.sopra.
  3. PiùclientchesiconnettonoallavecchiaAPI
  4. PiùclientchesiconnettonoallanuovaAPI(alcunisicolleganoadentrambi)
  5. LavecchiaAPIchiamalanuovaAPIperalcunecose,quindiintegriamolalogicaprincipaleinun'unicaposizione,inattesacheiclientvenganoaggiornati.
  6. Abbiamodiversiprocessieseguiticomeappdiserviziooappbatchsuiserverdelleapp.

*notacheogniwebclienthaancheilproprioserverback-end,nonmostratoneldiagramma.

Ilmioframeofreferenceperattaccarequestoecrearestoriediutentièsimileallamiaesperienzanellasocietàprecedente,principalmenteacausadeiseguentifattori:

  1. Dimensionidellasquadra(2-3)
  2. DimensioniUserStory(8punti)
  3. lunghezzasprint
  4. variandoletecnologielatoclient
  5. Sentocheunauserstorydovrebbeessereingradodiessereaffrontatadaunasingolapersonapertracciarepiùfacilmenteilcompletamento.Inalcunicasi,illavoropotrebbeesserediviso,maaquelpuntosarebbeprobabilmentealivelloorizzontale("Si può fare il database mentre funziona la logica di back-end, e io farò l'interfaccia utente?") .

Penso che la cosa più grande di cui siamo preoccupati sia l'8 punti. La gestione è flessibile su questo, ma non molto. È difficile quando i punti della storia sono 2-3 ore. Quello che ho proposto è che abbiamo un quadro di riferimento di "progetto". Credo che ottenere la funzionalità implementata nella nuova API, ad esempio, sia un buon risultato in 8-13 punti. Questo può includere il livello del database, ecc., Quindi è ancora una fetta verticale all'interno dell'ecosistema, ma stiamo tagliando orizzontalmente i sistemi.

Dopodiché, ogni app client può essere la sua storia, poiché ognuno di essi ha il proprio codice client e server, oltre all'integrazione API.

Noi (sviluppatori) di solito proviamo a utilizzare una funzione [TFS] per i principali sistemi di back-end (logica aziendale) e una funzione [TFS] per le app client (integratori dei sistemi back-end). Monitoriamo le "funzionalità" su larga scala richieste dall'azienda come Iniziative o Epiche quando toccano un'ampia gamma di applicazioni e per quelle che potremmo avere una funzione per app cliente. Potremmo affrontare 2-3 funzionalità in uno sprint come questo, ed è più facile per noi monitorare gli sviluppatori e cercare di avere una storia per realizzare questo, che si estende su più implementazioni di servizi e app web.

Ci sono dei pro o dei contro in entrambi gli approcci e hai altre esperienze con l'affettamento verticale su un'ampia catena di applicazioni / servizi?

    
posta ps2goat 02.09.2016 - 06:09
fonte

2 risposte

1

Il principale svantaggio di fare la sezione orizzontale di 1 storia di back-end e storie di front-end N è che non avrai nulla da mostrare al cliente se hai implementato solo la storia di back-end. Ciò significa che il cliente non può fornire feedback in caso di malintesi e il back-end non recupera le informazioni giuste.

In alternativa, potresti iniziare con una storia per 1 applicazione front-end e l'API del back-end. In questa storia, il back-end restituirebbe solo dati fittizi plausibili senza realmente toccare il database. Questo dà al cliente la possibilità di dare feedback, anche se il sistema nel suo insieme non è completamente funzionale.
Nelle seguenti storie, puoi implementare l'effettivo back-end e le altre applicazioni front-end.
Se il tuo team è sicuro di poter offrire sia il primo front-end che il back-end completo in uno sprint , quindi ovviamente possono saltare la versione stoppata del back-end in quel caso.

Nella teoria dell'affettatura, la storia del front-end iniziale con un back-end stoppato è ancora vista come una fetta verticale, perché offre al cliente una piccola quantità di valore aziendale. La cosa a cui prestare molta attenzione è evitare che il cliente inizi a pensare che il back-end stoppato sia effettivamente pienamente funzionante.

    
risposta data 02.09.2016 - 11:45
fonte
0

Trovo che quando hai molte dipendenze come questa si "rompe agile". Fondamentalmente sei costretto a scrivere una specifica per le modifiche del sistema dipendente, anche se è solo "nel tuo cervello", in base ai tuoi requisiti previsti per il prodotto finale. Questi si rivelano quindi errati, ritardati o dipendenti da un'altra squadra o da qualsiasi altra cosa e riducono lo sprint.

Un modo per aggirare questo è rendere i tuoi servizi dipendenti più generici. Quindi, invece di service.getCustomers, service.GetOrders ad esempio lo si espande per essere service.queryAnythingDymanically.

Invece di DataAccessLayer.RunStoredProc, si passa a DataAccessLayer.ExecuteEntityQuery ecc.

Questo riduce quindi le situazioni in cui un aggiornamento al servizio dipendente è richiesto da una modifica "front-end".

Tuttavia ci sono degli svantaggi. Più un servizio generico è tanto più difficile da testare, le prestazioni potrebbero diminuire e la sicurezza è più difficile da verificare.

Un altro approccio consiste nell'utilizzare un'architettura di microservizio. Questo può ridurre la difficoltà di aggiungere nuove funzionalità perché piuttosto che dover modificare un servizio esistente, basta aggiungerne uno nuovo.

ad esempio service1.getOrders - > service1.getOrders + service2.getNewStyleOrders

devi ancora implementare le funzionalità fino in fondo, ma sei libero da alcuni dei problemi di compatibilità e dipendenza a ritroso.

Tuttavia, passare a questo stile di architettura non è così facile come potrebbe sembrare. dove prima disponevi di un chiaro endpoint service1.getOrders a cui connettersi, ora hai un sistema di messaggi più asincrono, guardi i messaggi persi, devi sapere quali tipi possono gestire il tuo servizio e assicurarti che tutto sia orchestrato ecc.

    
risposta data 02.09.2016 - 12:47
fonte

Leggi altre domande sui tag