O que você descreve é - pelo menos na minha experiência - um padrão emergente bastante comum de equipes que tentam "ser ágeis". Está aberto a debate se isso é realmente parte do próprio Agile ou uma má implementação comum dele, é contra o manifesto / princípios ágeis ou uma conseqüência inerente dele, e assim por diante. Apenas do ponto de vista empírico e baseado no meu pequeno conjunto de experiências (e nas pessoas com quem converso), se uma equipe é ágil, parece ter uma chance maior que a média de se deparar com esse padrão. Vamos deixar assim e focar no seu exemplo concreto.
Existem dois aspectos separados para o que você descreve:
- Falta de entendimento / visão comum e, portanto, não é eficiente
- Como medir o sucesso / progresso e o custo total
Seguindo o caminho errado ou correndo em círculos
Na minha experiência, o principal motivo para isso acontecer é que, na tentativa de produzir código rapidamente, as equipes afastam ativamente casos de uso ou requisitos que eles já conhecem ou podem facilmente descobrir. Pense dessa maneira: 10 a 20 anos atrás, as pessoas tentaram escrever especificações gigantes e pensar em tudo com antecedência e muitas vezes falharam. Eles demoraram demais ou ignoraram alguma coisa. Uma das aprendizagens do passado é que, no desenvolvimento de software, existem coisas que você não pode saber e que mudam muito, daí a idéia de iterar rapidamente e produzir rapidamente uma saída sensível. Qual é um princípio muito bom. Hoje, porém, estamos no outro extremo: "Eu não ligo para isso porque faz parte do próximo sprint" ou "Eu não arquivo esse bug, lido com ele quando ele aparecer novamente".
- Reúna todos os casos de uso , requisitos, dependências e restrições de alto nível que você pode encontrar. Coloque-o em algum wiki para que todos os interessados e desenvolvedores possam vê-los. Adicione a eles quando algo novo surgir. Converse com seus acionistas e usuários. Use isso como uma lista de verificação durante o desenvolvimento para impedir a implementação de coisas que não contribuem para o produto final ou são soluções alternativas / hacks que resolvem um problema, mas causam três novos.
- Formule um conceito de alto nível . Não estou falando sobre o design de interfaces ou classes, mas, em vez disso, esboçar o domínio do problema. Quais são os principais elementos, mecanismo e interações na solução final? No seu caso, isso deve ficar óbvio ao usar a solução alternativa do jquery como uma etapa intermediária e quando causa apenas trabalho adicional.
- Valide seu conceito usando a lista que você reuniu. Existem problemas óbvios? Isso faz sentido? Existem maneiras mais eficientes de atingir o mesmo valor de usuário sem causar dívidas de longo prazo com a tecnologia?
Não exagere. Você só precisa de algo para que todos na equipe (incluindo não-desenvolvedores) tenham um entendimento comum sobre qual é o melhor caminho para o seu MVP. Todos devem concordar que não há omissões óbvias e que poderia realmente funcionar. Isso, em geral, ajuda a evitar quedas sem saída ou a necessidade de refazer a mesma coisa várias vezes. O Agile pode ajudá-lo a lidar melhor com o inesperado; não há argumento para ignorar o que é conhecido.
Esteja ciente da falácia do custo irrecuperável : se você começar com um tipo de arquitetura ou banco de dados, a maioria das pessoas hesita em alterá-lo no meio do projeto. Portanto, é uma boa ideia investir algum tempo em ter uma "melhor estimativa" antes de começar a implementar as coisas. Os desenvolvedores tendem a querer escrever código rapidamente. Mas, muitas vezes, ter algumas simulações, protótipos ao vivo, capturas de tela, estrutura de arame etc. permite uma iteração ainda mais rápida do que escrever código. Lembre-se de que todas as linhas de código escritas ou mesmo testes de unidade tornam mais difícil mudar seu conceito geral novamente.
Medindo o Sucesso
Um aspecto completamente separado é como você mede o progresso. Digamos que o objetivo do seu projeto é construir uma torre com 1 metro de altura usando coisas por aí. Construir um castelo de cartas pode ser uma solução totalmente válida se, por exemplo, o tempo de colocação no mercado for mais importante que a estabilidade. Se seu objetivo é construir algo que dure, usar o Lego teria sido melhor. A questão é: o que é considerado um hack e que solução elegante depende inteiramente de como o sucesso do projeto é medido .
Seu exemplo do "carregamento" é muito bom. Eu tinha coisas assim no passado, onde todos (incluindo vendas, pedidos de compra, usuários) concordavam que era irritante. Mas não teve impacto no sucesso do produto e não causou dívida de longo prazo. Então deixamos de lado porque havia coisas mais valiosas a ver com os recursos de desenvolvimento.
Meu conselho aqui é:
- Mantenha tudo, até pequenos bugs, como tickets no seu sistema de tickets . Tome uma decisão ativa sobre o que está dentro do escopo do projeto e o que não está. Crie marcos ou filtre sua lista de pendências para ter sempre uma lista "completa" de tudo o que ainda precisa ser feito.
- Tenha uma ordem estrita de importância e um ponto de corte claro onde o projeto possa ser considerado um sucesso. Qual nível de estabilidade / qualidade do código / documentação o produto final realmente precisa? Tente passar todos os dias do trabalho da melhor maneira possível, escolhendo de cima para baixo. Ao trabalhar em um ticket, tente resolvê-lo completamente sem introduzir novos tickets (a menos que faça sentido adiar as coisas devido à menor prioridade). Todo commit deve levá-lo adiante em direção ao seu objetivo final, não para os lados ou para trás. Mas, para enfatizar novamente: às vezes, um hack que produz trabalho adicional mais tarde ainda pode ser um resultado positivo para o projeto!
- Use seu PO / usuários para descobrir o valor do usuário, mas também faça com que seus desenvolvedores descubram o custo da tecnologia . Os não-desenvolvedores normalmente não podem julgar qual é o verdadeiro custo de longo prazo (não apenas o custo de implementação!), Então ajude-os. Esteja ciente do problema do sapo fervente: muitos pequenos problemas irrelevantes podem, com o tempo, prender uma equipe. Tente quantificar a eficiência da sua equipe.
- Fique de olho na meta / custos gerais. Em vez de pensar de sprint em sprint, mantenha uma mentalidade de "podemos, como equipe, fazer tudo o que for necessário até o final do projeto" . Os sprints são apenas uma maneira de quebrar as coisas e ter pontos de verificação.
- Em vez de querer mostrar algo mais cedo, trace seu caminho no caminho mais rápido para um produto mínimo viável que possa ser dado ao usuário. Ainda assim, sua estratégia geral deve permitir resultados verificáveis no meio.
Portanto, quando alguém fizer algo que não se encaixa no seu objetivo final de implementação, idealmente, não considere a história concluída. Se for benéfico fechar a história (por exemplo, para obter feedback dos clientes), abra imediatamente uma nova história / bug para resolver as deficiências. Torne transparente que a tomada de atalhos não reduz custos, apenas os oculta ou atrasa!
O truque aqui é discutir com o custo total do projeto: se, por exemplo, um pedido de compra forçar atalhos para estabelecer um prazo, quantifique a quantidade de trabalho que deve ser feito posteriormente para considerar o projeto!
Também tenha cuidado com a otimização baseada em critérios : se sua equipe é avaliada pelo número de histórias que podem ser exibidas em uma revisão de sprint, a melhor maneira de obter uma boa "pontuação" é cortar cada história em dez pequenas. Se for medido pelo número de testes de unidade escritos, tenderá a escrever muitos testes desnecessários. Não conte histórias, avalie quanto da funcionalidade necessária do usuário funciona, qual é o tamanho do custo por dívida de tecnologia a ser resolvido no escopo do projeto etc.
Sumário
Para resumir: Ir rápido e mínimo é uma boa abordagem. O problema está na interpretação de "rápido" e "mínimo". Deve-se sempre considerar o custo de longo prazo (a menos que você tenha um projeto onde isso é irrelevante). Usar um atalho que leva apenas 1 dia, mas gera uma dívida técnica de 1 mês após a data de envio, custa à sua empresa mais do que uma solução que levou 1 semana. Imediatamente, começar a escrever testes parece rápido, mas não se o seu conceito for defeituoso e eles consolidarem uma abordagem errada.
E lembre-se do que "longo prazo" significa no seu caso: conheço mais de uma empresa que faliu ao tentar escrever um ótimo código e, portanto, foi enviada muito tarde. Uma boa arquitetura ou código limpo - da perspectiva da empresa - só é valiosa se o custo para alcançá-lo for menor que o custo de não tê-lo.
Espero que ajude!