Eu estive pensando muito sobre essa pergunta exata.
Eu acho que é importante distinguir entre fatiar por responsabilidades individuais e fatiar por responsabilidades da equipe. Vou focar essa resposta principalmente nas equipes de fatiamento.
Para algumas informações: trabalhei em projetos com desenvolvedores de pilha completa, desenvolvedores de camada única, equipes verticais (pilha completa), equipes horizontais (camada única) e equipes diagonais. Por equipe diagonal, quero dizer, conter todas as camadas necessárias para uma história, mas não necessariamente todas as camadas do sistema, e também possivelmente conter vários desenvolvedores focados nas mesmas camadas; em outras palavras, de espírito vertical, mas talvez um pouco horizontal na aparência ou nos detalhes da implementação.
Recentemente, trabalhei em um grupo que passou de equipes horizontais para equipes diagonais (quase verticais). Foi particularmente instrutivo ver o mesmo grupo de pessoas alinhadas de duas maneiras diferentes. Isso deixa bem claras algumas vantagens e desvantagens.
Até agora, arredondarei minha opinião com a seguinte comparação resumida:
Equipas horizontais
Vantagens:
- Promove uma boa separação de preocupações e níveis pouco acoplados
- Gerenciamento de distribuição de carga de trabalho muito mais fácil
- Fácil para o líder técnico especializado gerenciar
- Promove a colaboração entre níveis, melhores práticas, orgulho e uma cultura de excelência
- Alinha com padrões de comunicação naturais / emergentes
Desvantagens:
- Pode levar ao isolamento de camadas e, assim, dificultar a comunicação entre camadas
- Ativa a cultura de "bolha" da camada se não mitigada
- Difícil tirar vantagem da liderança generalista
- Impede generalistas
Equipas Verticais / Diagonais
Vantagens:
- Todas as partes de uma história de usuário em uma equipe ("balcão único")
- Auxilia especificamente na entrega de histórias de n camadas em um único sprint (embora você realmente precise disso?)
- Promove a colaboração entre níveis e o crescimento de habilidades generalistas
- Suporta generalistas
Desvantagens:
- Gerenciamento de distribuição de carga de trabalho muito mais difícil
- Permite uma má separação de preocupações e camadas fortemente acopladas
- Impede a especialização, restringindo a comunicação entre níveis; é difícil ver como uma cultura de excelência poderia surgir dessa estrutura sem adicionar comportamentos horizontais / especializados atenuantes
Não acho que a participação em equipes tenha uma solução única para todos. Parece bem claro, no entanto, que a equipe vertical se alinha melhor para organizações que exigem generalização. Se seus engenheiros são generalistas e gostam de trabalhar com uma pilha cheia, esse é um bom motivo para considerar equipes verticais. A equipe horizontal se alinha melhor para organizações que exigem especialistas. Se seus engenheiros são especialistas, esse é um bom motivo para considerar equipes horizontais.
Como outros já mencionaram, estruturas / comportamentos secundários que dividem a outra direção podem ajudar a mitigar os inconvenientes de qualquer sistema. Um fator atenuante interessante é a duração do sprint. Sprints curtos tornam algumas das desvantagens das equipes horizontais mais toleráveis. Se você pode criar o back-end esta semana e o front-end na próxima semana, isso pode ser rápido o suficiente?
Para aplicar alguns desses princípios propostos a um problema do mundo real ... direi que as fatias horizontais funcionaram muito bem para uma equipe de desenvolvimento SaaS muito real em que trabalhei, que resolvia problemas técnicos muito desafiadores em todos os níveis ( onde a especialização era, na minha opinião, incrivelmente importante), onde a frequência de entrega (e a confiabilidade com uma granularidade / frequência alta) eram essenciais para o sucesso dos negócios. Observe que esta conclusão é para uma equipe do mundo real muito particular, não para uma declaração geral de superioridade do fatiamento horizontal.
Uma ressalva: eu provavelmente sou tendencioso contra alegações de habilidades generalistas por qualquer indivíduo no mundo moderno de desenvolvimento de software sem provas significativas, embora eu tenha conhecido alguns generalistas excepcionais raros. Sinto que a generalidade é uma ordem alta (vertical?), De fato, especialmente à medida que cada camada cresce em complexidade e com a proliferação de idiomas / plataformas / estruturas / implantações alternativas, cada uma atendendo a diferentes necessidades. Hoje em dia, especialmente, um grande número de negócios pode facilmente ser um mestre de ninguém. Além disso, curiosamente, acho que a maioria das pessoas deseja se especializar um pouco, novamente com algumas exceções.