Ho pensato molto a questa domanda esatta.
Penso che sia importante distinguere tra suddivisione in base alle responsabilità individuali e suddivisione in base alle responsabilità del team. Concentrerò questa risposta principalmente sull'affettare le squadre.
Per alcuni retroscena: ho lavorato a progetti con sviluppatori full-stack, sviluppatori single-tier, team verticali (full-stack), team orizzontali (single-tier) 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 anche contenere più sviluppatori che si concentrano sugli stessi livelli; in altre parole verticale nello spirito ma forse in qualche modo orizzontale nell'aspetto o nei dettagli di attuazione.
Di recente 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 chiari alcuni vantaggi e svantaggi.
Fin qui completerò la mia opinione con il seguente confronto di sintesi:
Squadre orizzontali
vantaggi:
- Favorisce una buona separazione delle preoccupazioni e livelli vagamente 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 modelli di comunicazione naturali / emergenti
svantaggi:
- Può portare all'isolamento dei livelli e quindi ostacolare la comunicazione tra livelli
- Abilita la cultura di livello "bolla" se non modificata
- Difficile trarre vantaggio dalla leadership generalista
- Ostacola i generalisti
Squadre verticali / diagonali
vantaggi:
- Tutte le parti di una user story in un team ("sportello unico")
- Aiuta in particolare a fornire 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
- Consente una scarsa separazione delle preoccupazioni e livelli strettamente accoppiati
- Ostacola la specializzazione limitando la comunicazione intra-tier; è difficile vedere come una cultura dell'eccellenza possa nascere da questa struttura senza aggiungere comportamenti mitigatori orizzontali / specialistici
Non credo che l'appartenenza al team abbia una soluzione unica per tutti. Sembra abbastanza semplice, tuttavia, che il team verticale si allinei meglio per le organizzazioni che richiedono generalizzazione. Se i tuoi ingegneri sono generalisti e ti piace lavorare a tutto campo, questa è una buona ragione per considerare i team verticali. Il team orizzontale si allinea meglio per le organizzazioni che richiedono specialisti. Se i tuoi ingegneri sono specialisti, questa è una buona ragione per prendere in considerazione team orizzontali.
Come altri hanno già detto, strutture / comportamenti secondari che tagliano l'altra direzione possono aiutare a mitigare gli svantaggi di entrambi i sistemi. Un fattore mitigante interessante è la durata dello sprint. Gli sprint brevi rendono più tollerabili alcuni degli svantaggi delle squadre orizzontali. Se riesci a costruire il backend questa settimana e il frontend la prossima settimana, potrebbe essere abbastanza veloce?
Per applicare alcuni di questi principi proposti a un problema del mondo reale ... Dirò che le sezioni orizzontali hanno funzionato abbastanza bene per un team di sviluppo SaaS molto reale a cui ho lavorato che stava risolvendo problemi tecnici molto impegnativi in ogni livello ( dove la specializzazione era secondo me incredibilmente importante), dove la frequenza di consegna (e l'affidabilità ad alta granularità / frequenza) era fondamentale per il successo aziendale. Si noti che questa conclusione è per un team del mondo reale molto particolare, non una dichiarazione generale di superiorità dell'affettatura orizzontale.
Un avvertimento: probabilmente sono di parte contro il credere alle affermazioni delle capacità generaliste di qualsiasi individuo nel moderno mondo dello sviluppo del software senza prove significative, anche se ho conosciuto alcuni rari generalisti eccezionali. Sento che la generalità è davvero un ordine elevato (verticale?), In particolare man mano che ogni livello cresce in complessità e con la proliferazione di linguaggi / piattaforme / quadri / distribuzioni alternative, ognuno dei quali soddisfa esigenze diverse. In questi giorni, in particolare, un tuttofare può facilmente diventare un maestro di nessuno. Inoltre, aneddoticamente, trovo che la maggior parte delle persone voglia specializzarsi un po ', sempre con alcune eccezioni.