Ho pensato molto a questa domanda esatta.
Penso che sia importante distinguere tra affettare le responsabilità individuali e affettare le responsabilità del team. Concentrerò questa risposta principalmente sull'analisi dei team.
Per alcuni background: ho lavorato a progetti con sviluppatori full-stack, sviluppatori single-tier, team verticali (full-stack), team orizzontali (a livello singolo) e team diagonali. Per squadra diagonale intendo contenere tutti i livelli necessari per una storia ma non necessariamente tutti i livelli del sistema, e possibilmente contenere più sviluppatori focalizzati sullo stesso livello (i); in altre parole verticale nello spirito, ma forse in qualche modo orizzontale nell'aspetto o nei dettagli di implementazione.
Recentemente ho lavorato in un gruppo che è passato da squadre orizzontali a squadre diagonali (quasi verticali). È stato particolarmente istruttivo vedere lo stesso gruppo di persone allineato in due modi diversi. Rende abbastanza evidenti alcuni vantaggi e svantaggi.
Arrotolerò la mia opinione finora con il seguente confronto riassuntivo:
Squadre orizzontali
I vantaggi:
- Favorisce una buona separazione delle preoccupazioni e dei livelli liberamente accoppiati
- Gestione della distribuzione del carico di lavoro molto più semplice
- Facile da gestire per tecnici specializzati
- Promuove la collaborazione intra-livello, le migliori pratiche, l'orgoglio e una cultura di eccellenza
- Si allinea con i modelli di comunicazione naturali / emergenti
Svantaggi:
- Può portare all'isolamento dei tier e quindi ostacolare la comunicazione inter-tier
- Abilita la cultura "bolla" di livello se non attenuata
- Difficile approfittare della leadership generalista
- ostacola i generalisti
Squadre verticali / diagonali
I vantaggi:
- Tutte le parti di una storia di un utente in una squadra ("sportello unico")
- Assiste in modo specifico la distribuzione di storie di livello n in un singolo sprint (anche se ne hai davvero bisogno?)
- Promuove la collaborazione inter-tier e la crescita delle competenze generaliste
- Supporta i generalisti
Svantaggi:
- Gestione della distribuzione del carico di lavoro molto più difficile
- Permette una scarsa separazione delle preoccupazioni e livelli strettamente accoppiati
- ostacola la specializzazione riducendo la comunicazione intra-tier; è difficile vedere come una cultura di eccellenza possa nascere da questa struttura senza aggiungere attenuanti comportamenti orizzontali / specialistici
Non credo che l'appartenenza al team abbia una soluzione valida per tutti. Sembra piuttosto semplice, tuttavia, che la squadra verticale si alline meglio per le organizzazioni che richiedono generalizzazione. Se i tuoi ingegneri sono generalisti e amano lavorare con lo stack completo, è un buon motivo per considerare i team verticali. Il team orizzontale si allinea meglio per le organizzazioni che richiedono specialisti. Se i tuoi ingegneri sono specialisti, è un buon motivo per considerare i team orizzontali.
Come altri hanno già menzionato, strutture / comportamenti secondari che tagliano l'altra direzione possono aiutare a mitigare gli inconvenienti di entrambi i sistemi. Un fattore mitigante interessante è la durata dello sprint. Brevi sprint rendono alcuni degli svantaggi dei team orizzontali più tollerabili. Se puoi costruire il backend questa settimana e il frontend della prossima settimana, potrebbe essere abbastanza veloce?
Applicare alcuni di questi principi proposti a un problema del mondo reale ... Dirò che le sezioni orizzontali hanno funzionato abbastanza bene per un vero team di sviluppo SaaS su cui ho lavorato che stava risolvendo problemi tecnici molto impegnativi in ogni livello (dove la specializzazione era a mio avviso incredibilmente importante), dove la frequenza di consegna (e l'affidabilità a granularità / frequenza elevate) era fondamentale per il successo aziendale. Si prega di notare che questa conclusione è per un team del mondo reale molto particolare, non una dichiarazione generale di superiorità dell'affinamento orizzontale.
Un avvertimento: sono probabilmente prevenuto nel credere alle affermazioni di abilità generaliste di qualsiasi individuo nel moderno mondo dello sviluppo software senza prove significative, sebbene abbia conosciuto alcuni rari generalisti eccezionali. Ritengo che la generalità sia un ordine (verticale?) Alto, in particolare perché ogni livello cresce in complessità e con la proliferazione di linguaggi / piattaforme / framework / implementazioni alternative, ciascuno dei quali soddisfa esigenze diverse. In particolare, in questi giorni, un tuttofare può facilmente diventare un maestro di nessuno. Inoltre, aneddoticamente, trovo che molte persone vogliano specializzarsi un bel po ', anche con alcune eccezioni.