Esta semana no trabalho, fiquei agilizado mais uma vez. Tendo estudado a metodologia ágil padrão, TDD, propriedade compartilhada e desenvolvimento ad hoc de nunca planejar nada além de algumas histórias de usuários em um pedaço de papel, mastigar verbalmente as rumores sobre as características técnicas de uma integração de terceiros ad nauseam sem nunca fazer nada real pensando ou devendo diligência e acoplando arquitetonicamente todo o código de produção ao primeiro teste que vem à cabeça de qualquer pessoa nos últimos meses, chegamos ao final de um ciclo de lançamento e observamos que o principal recurso visível externamente que estamos desenvolvendo é muito lento para uso, buggy, tornando-se labirintinamente complexo e completamente inflexível.
Durante esse processo, "picos" foram feitos, mas nunca documentados e nem um único projeto arquitetônico foi produzido (não havia FS, então que diabos, hein, se você não sabe o que está desenvolvendo, como planejar ou pesquisá-lo? ?) - o projeto passou de par para par, cada um dos quais apenas focou em uma única história de usuário de cada vez e, bem, o resultado foi inevitável.
Para resolver isso, saí do radar, fui (a temida) cascata, planejei, codifiquei e basicamente não troquei o par e tentei o máximo que pude trabalhar sozinho - com foco em arquitetura e especificações sólidas, em vez de testes de unidade que virá mais tarde quando tudo estiver definido. O código agora é muito melhor e é realmente totalmente utilizável, flexível e rápido. Certas pessoas parecem realmente se ressentir de mim por fazer isso e se esforçaram para sabotar meus esforços (possivelmente inconscientemente) porque isso vai contra o santo processo de agilidade.
Então, como você, como desenvolvedor, explica à equipe que não é "pouco ágil" planejar o trabalho deles, e como você encaixa o planejamento no processo ágil? (Não estou falando do IPM; estou falando de me sentar com um problema e esboçar um design de ponta a ponta que diz como um problema deve ser resolvido com detalhes suficientes para que qualquer pessoa que trabalhe no problema saiba o que arquitetura e padrões que eles devem usar e onde o novo código deve integrar-se ao código existente)
Respostas:
Eu acho que (e talvez eu esteja saindo mal aqui) que TODOS os projetos devem ter um pouco de cascata clássica: a fase inicial de análise e especificação é essencial. Você deve saber o que está fazendo e deve ter por escrito. Obter os requisitos por escrito é difícil, demorado e fácil de fazer mal. É por isso que tantos ignoram - qualquer desculpa serve: "Ah, agimos de maneira que não precisamos fazer isso". Era uma vez, antes do Agile, era "ah, eu sou muito esperto e sei como resolver isso, então não precisamos fazer isso". As palavras mudaram um pouco, mas a música é essencialmente a mesma.
Obviamente, tudo isso é absurdo: você precisa saber o que deve fazer - e uma especificação é o meio pelo qual o desenvolvedor e o cliente podem comunicar o que se pretende.
Depois de saber o que você deve fazer - esboce uma arquitetura. Esta é a parte "entenda bem a situação". Não há solução mágica aqui, nenhum caminho certo e nenhuma metodologia que o ajude. As arquiteturas são a SÍNTESE de uma solução e provêm de um gênio parcialmente inspirado e de um conhecimento parcialmente conquistado.
Em cada uma dessas etapas, haverá a iteração: você encontra coisas erradas ou ausentes e as corrige. Isso é depuração. Isso é feito antes que qualquer código seja escrito.
Alguns vêem essas etapas como chatas ou não necessárias. De fato, esses dois passos são os mais importantes na solução de qualquer problema - entenda errado e tudo o que se segue estará errado. Essas etapas são como as fundações de um edifício: entenda errado e você tem uma Torre Inclinada de Pisa.
Depois de ter o WHAT (que é sua especificação) e o HOW (que é a arquitetura - que é um design de alto nível), você terá tarefas. Geralmente muitos deles.
Busque as tarefas como quiser, aloque-as como quiser. Use qualquer metodologia da semana que você gosta ou que funcione para você. E conclua essas tarefas, sabendo para onde está indo e o que precisa realizar.
Ao longo do caminho, haverá trilhas falsas, erros, problemas encontrados com as especificações e a arquitetura. Isso leva a coisas como: "Bem, todo esse planejamento era uma perda de tempo". O que também é touro. Isso significava que você tinha menos problemas para lidar mais tarde. Como você encontra problemas com as coisas de alto nível dos primeiros dias, CORRECIONE-OS.
(E em uma questão secundária aqui: há uma grande tentação que eu tenho visto repetidamente tentar atender a uma especificação que é cara, difícil ou mesmo impossível. A resposta correta é perguntar: "Minha implementação está quebrada ou a especificação está quebrada? "Porque, se um problema pode ser resolvido de maneira rápida e barata, alterando a especificação, é isso que você deve fazer. Às vezes isso funciona com um cliente, às vezes não. Mas você não saberá se não pergunte.)
Finalmente - você deve testar. Você pode usar o TDD ou qualquer outra coisa que desejar, mas isso não garante que, no final, você tenha feito o que disse que faria. Ajuda, mas não garante. Então você precisa fazer o teste final. É por isso que coisas como Verificação e Validação ainda são itens importantes na maioria das abordagens ao gerenciamento de projetos - seja o desenvolvimento de software ou a criação de escavadeiras.
Resumo: você precisa de todo o material chato inicial. Use coisas como o Agile como um meio de entrega, mas você não pode eliminar o pensamento antiquado, a especificação e o design arquitetônico.
[Você seriamente esperaria construir um edifício de 25 andares colocando 1000 trabalhadores no local e dizendo-lhes para formar equipes para realizar alguns trabalhos? Sem planos. Sem cálculos estruturais. Sem um design ou visão de como o edifício deve parecer. E apenas sabendo que é um hotel. Não - acho que não.]
fonte
Ainda estou surpreso que muitas pessoas pensem que TDD significa escrever testes de unidade primeiro. Não, isso significa escrever os testes necessários antes de escrever o código. Na verdade, o teste pode ser teste de unidade, teste de integração, teste de ponta a ponta e, é claro, teste de desempenho (bem, você provavelmente não escreverá o teste de desempenho antes do código testado, mas isso não significa que você não deva escrevê-lo). O tipo necessário de teste deve ser visível a partir da definição de concluído para a história do usuário. Se um dos critérios de aceitação para a história do usuário disser que o recurso deve fornecer o resultado em 500 ms com 50 usuários simultâneos, a história do usuário não poderá ser considerada concluída até que você tenha um teste de desempenho que comprove que esse critério de aceitação é atendido. Depois de fazer o teste automático, você pode verificar todos os dias se está passando à medida que adiciona outros recursos.
Parece mais que seus critérios de aceitação não foram definidos corretamente e, por isso, você não pôde testar seu desempenho. Ainda assim, pode acontecer que o aplicativo tenha um desempenho ruim depois que você o implanta no ambiente real e o usa sob carga pesada, mas sempre pode ser considerado como falha de requisitos (se o requisito não for definido, o desenvolvedor não o levará em consideração ao trabalhar em o código) ou equipe de desenvolvimento (teste insuficiente em relação a requisitos definidos).
Outra coisa interessante é que os desenvolvedores da sua equipe estão focados na história de um único usuário. Agile é sobre comunicação, para que os desenvolvedores comuniquem o que as histórias de usuário exigem e como isso afeta o restante do aplicativo - a colaboração é uma obrigação. O teste deve cobrir isso também, se um desenvolvedor interromper a funcionalidade necessária para outra história de usuário, ele deverá estar visível em testes automatizados. Se você ainda acha que isso não é suficiente ou não funciona, pode introduzir uma reunião de arquitetura em que toda a equipe coopera e discute a arquitetura do aplicativo. Geralmente, basta realizar essa reunião uma vez por semana.
Muitas coisas do processo em cascata são substituídas por comunicação e testes automáticos. Ninguém diz que você não pode escrever nenhuma documentação ou design de alto nível! Você pode e muitas equipes usam, por exemplo, o Wiki para isso.
fonte
Isso não tem nada a ver com ágil, é um sinal de programadores que não estão fazendo seu trabalho corretamente.
Uma idéia básica do ágil é que a equipe tenha controle total sobre o processo. Isso significa que eles devem concordar com a quantidade de planejamento, documentação, testes e como lidam com a refatoração. Todo esse poder é ótimo, mas também vem com responsabilidade e provavelmente é aí que sua equipe falhou. Eles aceitaram sua liberdade, mas negligenciaram suas responsabilidades.
No final, é apenas uma questão de explicar sobre a qualidade do código e tentar concordar em uma maneira de aumentá-lo e mantê-lo dessa maneira. Práticas normais de programação se aplicam, realmente.
Dica profissional: use sua "Definição de Concluído" para aplicar isso. Certifique-se de que todos concordam e o deixem visível para todos. Use-o como um gatekeeper rigoroso para decidir se uma história é concluída ou não. É até possível adicionar requisitos não funcionais (como desempenho) a essa lista também.
fonte
Sim. Seus colegas de equipe são idiotas. Seu projeto foi péssimo por causa do Agile. Sentir-se melhor? Ok, vamos seguir em frente. : P
Acho que você e sua equipe serão capazes de se comunicar de maneira mais eficaz sobre o que deu errado se você se concentrar menos nos nomes de suas metodologias M-capital e mais no motivo pelo qual o software que você escreveu foi tão lento e com erros. Não use os termos Ágil ou cascata . Eles são claramente carregados emocionalmente em seu escritório.
Ágil funciona às vezes. Desta vez, não funcionou para sua equipe. Algumas pessoas dizem que é porque você fez o Agile errado. Afinal, o Agile funciona, então, se você tivesse feito certo, teria funcionado, certo? Tanto faz.
Não parece que alguém discorde de que houve um fracasso, mas você não vai ganhar amigos, influenciar pessoas ou melhorar da próxima vez se culpar uma metodologia. Isso provavelmente tinha pouco a ver com o que realmente deu errado.
Em vez disso, concentre-se em identificar as causas mais diretas da falha e trabalhe com a equipe para garantir que elas não aconteçam novamente. Isso exigirá habilidades das pessoas.
Falando em habilidades de pessoas, você não deve se surpreender com o fato de sua equipe não ter gostado de fazê-las parecer ruins fazendo todo o trabalho delas e melhor do que elas. Ao fazer isso "sob o radar", você pode ter prejudicado alguns relacionamentos que agora precisará reconstruir para ser um membro eficaz da equipe.
Acho que a melhor maneira de encarar uma situação como essa é considerar a produção total de longo prazo da equipe como um todo. Você pode ter salvo a semana dessa vez, mas pode ter feito melhor a longo prazo para sua empresa, construindo uma equipe melhor .
Estou lhe contando todas essas coisas, mas acho que você provavelmente já conhece a maioria delas e poderia explicá-las a outra pessoa se não estivesse tão perto dessa situação.
fonte
Se você quiser adicionar uma citação concisa às suas discussões, Eisenhower fez uma boa:
"Planos não são nada; planejar é tudo."
http://www.brainyquote.com/quotes/quotes/d/dwightdei149111.html
Ele quis dizer que você deve mudar seus planos e não colocar muito valor no plano como ele existe, mas, ao mesmo tempo, o processo de planejamento focará suas energias de maneira crucial. Você precisa fazer planos antes de poder testá-los e refiná-los.
fonte
+1 Esta é a melhor descrição do Enterprise Agile que li recentemente.
Todo mundo que se dá bem com o ágil ressalta que nunca deveria significar isso, mas uma vez que todos são apanhados nas métricas, é exatamente isso que você recebe de uma equipe que não tem paixão pela qualidade do produto e que está obcecada por teste a cobertura acima de tudo ou cumpra os prazos de entrega semanais, independentemente do canto em que pintaram todos os outros, porque isso é tudo o que compõe o nível de gerenciamento semanalmente.
Eu nunca vi isso consertado com nada menos que uma re-organização. Se você é uma empresa de nível médio, sem nada de especial para atrair pessoas realmente apaixonadas, mesmo isso não será resolvido, a menos que o próximo gerenciamento mude de metodologia algumas vezes.
O Agile parece funcionar bem apenas nas organizações em que a equipe de desenvolvimento se importa o suficiente para criar um bom produto, apesar do trabalho extra e não creditado necessário. Efetivamente, eles precisam se preocupar o suficiente para torná-lo bom em seu próprio tempo, lutar por melhorias (e estar dispostos a gravar muito tempo extra refazendo testes em alguns casos de TDD)
Obviamente, você se preocupa em enviar um bom produto, eles obviamente se importam em passar por um conjunto de movimentos roteirizados e receber um salário para limpar continuamente a bagunça que eles fazem.
Eu procuraria emprego menos irritante em outro lugar, seja ágil ou não.
Se você é completamente queimado com o ágil, há muitos lugares que ainda fazem outras metodologias. Quase tudo em oferta ou contrato, por exemplo.
fonte
Eu costumo usar uma espécie de híbrido. O plano geral é em cascata, mas há agilidade na execução.
Meu palpite é que, se a situação é tão ruim quanto você diz, sua equipe não está realmente usando o Agile, eles estão apenas sendo preguiçosos ou indisciplinados. Agile não significa não planejar, é apenas ser flexível e, bem, ágil.
fonte
Temos os mesmos problemas com alguns funcionários.
Basicamente, "não sei até escrevê-lo" é uma afirmação favorita. Então, seguimos o caminho oposto, trabalhamos com o cliente para definir as entregas com pontos de aprovação. O último sendo "agora escreva o código para executar o X".
Se temos "escrever design / teste / plano etc" no mesmo sprint de entrega que "faça o código divertido e interessante", a primeira parte nunca acontece ...
MAS se eu colocar "você não consegue fazer nenhum código divertido e interessante até que você tenha dito o que vai construir e o cliente tenha assinado" então
A parte ágil surge quando o cliente muda de plano e você pode se adaptar dentro de um ciclo de 2 semanas, NÃO voe pelo assento da calça e faça as pazes ao longo do caminho.
No nosso caso, o "grande projeto inicial" foi dividido em 9 estágios (liberações reais de produção), com uma média de 5 subestações. Os designers e desenvolvedores mantêm o ritmo um do outro, sendo os designers de 1 a 3 sub-subestações à frente dos desenvolvedores ... longe demais e as descobertas no desenvolvimento quebram muito o design, são muito próximas e ajustam o custo do design, tanto quanto foram. já implementado "definido na pedra" dentro do desenvolvimento. Cada subestágio tem de 2 a 4 sprints para 1 desenvolvedor.
Em projetos menores, apenas temos o mesmo desenvolvedor para projetar primeiro> assinar> fatura> desenvolver> assinar> fatura ... em ciclos.
O problema de nomeação de teste
O teste tem muitas faces, formalmente existem cerca de 7 categorias de testes, cada uma com subseções ... uma delas é "escrever testes de unidade automatizados".
É um péssimo nome ter "primeiro desenvolvimento de teste" apenas por os desenvolvedores entenderem o que significa "testes". Nesse contexto, eles vêem os testes como escrever o código real do teste na interface para a implementação. Quando não é realmente assim ... você pode fazer isso quando se trata de escrever o código, mas é realmente "validar o design contra casos de uso e histórias de usuário ANTES de começar a escrever o código" ... feito corretamente, isso remove muitos dos problemas normalmente descobertos durante o desenvolvimento, enquanto ainda está na versão "papel que pode ser jogado fora", muito mais barato.
fonte
Um dos elementos principais do Agile é a idéia de melhoria contínua e a idéia de que toda a equipe é dona do projeto. Portanto, a abordagem correta seria revisar os problemas com a equipe e fazer com que a equipe decidisse como corrigi-la.
Um membro da equipe que trabalha sozinho, abandonando todos os princípios do Agile e fazendo as coisas do seu jeito pode resultar em uma pequena quantidade de código funcionando bem, mas na verdade não avança o projeto inteiro de uma maneira positiva.
fonte
Uma maneira de fazê-los funcionar pode ser criar um T-Map que cubra todo o seu backlog de sprint
Cada equipe tem um segmento, cada sprint é um período. Tudo se une (que é onde sua equipe parece cair). Coloque isso em algum lugar e obtenha ímãs para representar os pares / subequipes. Eles podem até 'correr'. Mas todo mundo sabe onde eles e as outras equipes estão. Coloque dependências aqui, se houver.
O ponto aqui é que você transmite o processo total, mas também o divide em sprints. Mesmo que apenas o primeiro sprint seja colocado lá, e os outros períodos estejam em branco, esse deve ser um excelente roteiro para concluir o projeto.
fonte
Você tem dois problemas: falta de forma nos requisitos e arquitetura ruim.
Exigências
Você precisa de uma meta final geral e do roteiro detalhado de como chegar lá.
No mundo da cachoeira, o objetivo final é a especificação funcional, e o roteiro de como chegar lá é o plano do projeto.
No mundo ágil, uma maneira é capturá-lo em uma história épica de usuário. Em seguida, o roteiro são as histórias detalhadas dos usuários que detalham os detalhes do épico.
Eu nunca fiquei completamente feliz com essa história, porque a história épica nunca captura carne suficiente para transmitir a ideia completa. Então, o que eu costumava usar é um documento de requisitos de sistemas de alto nível em conjunto com uma história épica de usuário ou duas. Depois disso, o roteiro é a história detalhada do usuário.
O bom de ter um documento de requisitos de sistema é que, então, os critérios de aceitação para muitas das histórias de usuários podem ser retirados.
Pense no documento de requisitos de sistema de alto nível como uma "folha de corte" que o marketing pode usar para vender o produto a um cliente tecnicamente experiente.
Arquitetura
Uma das coisas que a "folha cortada" fornece é que coloca limites no sistema que você está projetando. Isso permite que você tome decisões informadas, desde o início, sobre a arquitetura a ser usada.
Se sua equipe tivesse esse documento desde o início, você não precisaria re-arquitetar o sistema posteriormente.
Na verdade, um terceiro problema que você tem é falta de comunicação. A comunicação é uma via de mão dupla (ou de mão múltipla entre várias pessoas). No entanto, isso é apenas uma falha humana e requer (às vezes) esforços sobre-humanos para acertar.
fonte