Como obter um bom design ao usar métodos ágeis?

15

Uso uma metodologia ágil (SCRUM) há cerca de três anos e vejo algumas vantagens, especialmente no feedback de curto prazo em vários níveis (de clientes com acesso antecipado aos recursos implementados, de testadores que podem testar recursos como assim que são implementados, de outros desenvolvedores que podem fornecer feedback muito cedo sobre o novo código por meio de revisão etc.).

Por outro lado, tenho dois problemas em aberto, o primeiro dos quais tentarei explicar nesta questão.

Problema: dificuldade para obter um bom design

Tento fazer a refatoração assim que o código fica confuso, escrevo testes de unidade o máximo que posso (o que ajuda a evitar erros em geral e ao refatorar em particular). Por outro lado, desenvolver um recurso complexo em pequenos incrementos, com confirmações diárias e repensar continuamente o código quando ele é desestruturado, não está me permitindo produzir um design realmente bom.

O único módulo bem projetado que eu pude produzir recentemente obtive usando uma abordagem diferente: analisei o problema por alguns dias (na verdade, tive o problema em minha mente por alguns meses antes de começar a trabalhar seriamente. ), esboçou um design bastante detalhado de todas as classes envolvidas e seus relacionamentos por mais alguns dias e depois me trancou em meu escritório e anotou todo o código trabalhando sem interrupção por cerca de três semanas. O resultado foi a melhor coisa que produzi há algum tempo, com pouquíssimos bugs que eram fáceis de localizar e corrigir, e com um design muito claro, que não exigia nenhuma alteração relevante desde então.

Até agora, achei muito mais eficaz obter uma visão geral do que quero fazer antes do que começar a escrever código em pequenos incrementos, na esperança de que a grande figura surja magicamente no processo. Com o meu melhor esforço, a abordagem de desenvolvimento de pequeno incremento sempre me levou a um design pior.

Pergunta : Alguém já teve uma experiência semelhante? Estou aplicando o SCRUM da maneira errada ou no que devo prestar atenção se desejar desenvolver em pequenos incrementos e ainda assim acabar com um software bem projetado? Ou devo agendar uma história de usuário de design antes de iniciar a codificação real? Isso é considerado uma boa prática, pelo menos para recursos mais complexos que a média?

EDITAR NOTA

Estou ciente do fato de que um bom design não é algo absoluto e não tem valor por si só, mas depende do contexto, e que se deve buscar um design que seja bom o suficiente para o problema em questão.

Por exemplo, eu não me importo (muito) com o bom design se tiver que implementar um componente simples que (1) esteja pronto o mais rápido possível, (2) será usado apenas uma vez, (3) não usado por outras partes do sistema (YAGNI).

Eu me preocupo com o bom design quando um componente (1) será usado várias vezes e em várias versões diferentes de um produto, (2) precisa ser mantido e estendido ao longo do tempo, (3) possui muitos outros componentes, dependendo dele .

Giorgio
fonte
5
The only well-designed module I could produce recently I obtained by taking a different approach-- Você respondeu sua própria pergunta. Você ainda precisa de um design inicial; você não pode esperar que um bom design simplesmente cresça organicamente a partir da refatoração. Não é assim que funciona.
Robert Harvey
1
Não. Porque talvez eu não esteja aplicando o SCRUM corretamente.
Giorgio
3
Não existe "SCRUM corretamente". Existe apenas esse processo que produz o resultado desejado.
Robert Harvey
1
É por isso que eles são chamados de "diretrizes" :) De qualquer forma, comprometa-se todos os dias, faça sprints curtos (de 1 semana a 1 mês), regras como essa não falam nada sobre design. Você ainda tem que ter design.
Robert Harvey

Respostas:

13

Por outro lado, desenvolver um recurso complexo em pequenos incrementos, com confirmações diárias e repensar continuamente o código quando ele é desestruturado, não está me permitindo produzir um design realmente bom.

Então não faça isso.

Nem tudo se encaixa na bela caixa ágil. Muitas vezes, um produto tem algumas coisas complexas que não podem ser criadas por indivíduos e não podem ser concluídas de maneira sadia dentro de um sprint. Forçá- los a entrar nessa caixa só causará problemas. Mas estes devem ser poucos e distantes entre si. Se você achar que muitos de seus componentes são assim, o proprietário do produto precisa trabalhar para melhorar as coisas (com sua equipe). Estou bem em fazer o que você fez: pegue a história, projete-a e depois martele-a o mais rápido possível, com a expectativa de que levará algumas semanas.

No caso mais geral, há três coisas que eu vi para obter um bom design no Agile:

  • Na verdade, crie um design - muitos lugares que eu vi começar seu sprint e apenas começar a criar código de cowboy. Você terá um design ruim dessa maneira. O Agile não altera o processo de desenvolvimento do plano - código - teste - lançamento, apenas o reduz para partes mais granulares. No início do sprint, sente-se conforme necessário e crie a sua solução.

  • Tenha um arquiteto / líder - assim que seu projeto for grande o suficiente, você terminará com várias equipes de scrum trabalhando em diferentes partes do aplicativo. É muito útil ter alguém (ou várias pessoas, dependendo do tamanho do aplicativo) cujo trabalho principal é saber o que todas as equipes estão fazendo do ponto de vista do design. Eles podem responder perguntas e orientar as equipes em direção a um design mais abrangente e abrangente. Cada equipe de scrum tem uma liderança que sabe a maior parte do que as outras equipes estão fazendo. Também vi e foi muito eficaz.

  • Seja um pragmático - eu cobri este acima. Agile é uma ferramenta, e como qualquer ferramenta; não se aplica a todos os problemas. Se não faz sentido aplicar a algum componente, não o aplique lá. Seu objetivo é enviar um bom software; não esqueça isso.

Telastyn
fonte
3
+1 (+10 se eu tivesse mais de um voto!) Por "Forçá-los a entrar nessa caixa só causará problemas".
Giorgio
17

É muito possível implementar em pequenos incrementos e acabar com um código de manutenção bem estruturado. Em teoria, é muito simples: se você garantir que o código esteja bem estruturado após cada alteração, ele sempre será bem estruturado. Seu código está se tornando mal estruturado porque você continua adicionando código quando deveria refatorar.

Não importa quanto tempo você gaste no design, eventualmente os requisitos serão alterados de maneira imprevista e você precisará escrever um código que não se encaixe no design original. Então você terá que fazer uma alteração incremental. Se você tiver um bom conjunto de testes de unidade e tiver habilidade em refatoração, poderá manter o código bem estruturado à medida que atender aos novos requisitos.

Kevin Cline
fonte
+1: OK. Portanto, devo agendar uma história de refatoração quando achar necessário e não adicionar novos recursos até que eu tenha um design suficientemente bom novamente. Provavelmente é isso que estamos perdendo em nosso processo (além do fato de que, na IMO, os incrementos que estamos desenvolvendo geralmente são muito pequenos).
Giorgio
2
na verdade, você deve adicionar a história da dívida técnica e discutir quando realmente agir com o Dono do produto, é isso que significa dívida técnica .
4
Todos os projetos que vi em que você coloca a responsabilidade da qualidade do código nas mãos do proprietário do produto, criando histórias de "dívida técnica" ou similar; a qualidade do código sempre foi priorizada de maneira tão baixa que prejudica seriamente a velocidade e o moral. Acredito que a equipe é a entidade que assume a responsabilidade pela qualidade do código. A equipe deve estimar as histórias para que haja espaço para a entrega com dívida técnica preservada ou, se necessário, reduzida.
Buhb
4
"História de refatoração" ou "História da dívida técnica" não deve acontecer. Nunca. O custo da refatoração faz parte do desenvolvimento e não deve ser uma tarefa separada. Deve ser feito continuamente em pequenas etapas, não planejadas, após o fato, histórias. Eu sei disso, nossa equipe tentou as histórias de refatoração, é ruim. Ao iniciar a refatoração 'on-the-fly', você verá que a refatoração se torna parte do seu estilo de codificação e não uma tarefa separada a ser executada.
Patkos Csaba
1
Se você acredita que a base de código não conseguirá lidar convenientemente com a história X sem uma reestruturação / reescrita significativa, essa reestruturação deve fazer parte da história X e o trabalho necessário para essa reestruturação deve ser levado em consideração ao estimar a história X.
Buhb
6

"Bem desenhado" é subjetivo

O que faz "bem desenhado" significa para você? para o proprietário do produto? Para o consumidor?

É "bem desenhado " um objetivo do proprietário do produto? um objetivo do cliente? ou apenas você?

O que você considera "não bem projetado" ainda atende às expectativas dos Proprietários do Produto e faz o cliente feliz? Então isso é muito "bem desenhado" .

Bom o suficiente e YAGNI

Nada na maioria das metodologias ágeis fala de "bem projetado", porque qualquer sistema que o Dono do produto aceita as histórias como completas e os clientes acreditam que atende a seus requisitos é "bem projetado" .

Espera- se que os desenvolvedores sejam profissionais e usem pragmaticamente as melhores práticas, designs e expressões apropriadas para implementar os recursos e as histórias.

Se você não considerar o momento de fazer as coisas corretamente, isso é um problema do desenvolvedor, se o Dono do produto exigir coisas em menos tempo que isso possa ser feito, é sua prerrogativa fazer isso e sua responsabilidade de educá-los sobre o problema. consequências na forma de dívida técnica histórias de .

SCRUM

A metodologia Agile que pode ser escrita, não é a metodologia Agile. "- Jarrod Roberson

O SCRUM deveria ser uma estrutura de ferramentas para gerenciar o ciclo de vida total de um produto de software. Não é para ser um conjunto rígido de coisas, apenas um bom lugar para começar e, com sorte, melhorar.

A maioria das lojas em que trabalhei tem o que é chamado Sprint ZERO, Sprints para os membros seniores da equipe esboçarem uma arquitetura ou tema geral do produto.

Histórias maiores do que 20 dizem que geralmente são divididas até que sejam realmente algumas histórias de 3 a 5 pontos. Uma dessas histórias é: "Como equipe, precisamos nos reunir para discutir como vamos projetar esse recurso, para que tenhamos o mínimo de dívida técnica possível, considerando o tempo alocado".

Geralmente

Em geral, um sistema "bem projetado" é bom o suficiente e segue o YAGNI.

O Agile e o SCRUM, em particular como uma implementação do Agile, são mais sobre como produzir um produto da maneira mais transparente possível para o Dono / Patrocinador do produto.

Não se trata de nada de design técnico / arquitetura. É mais uma filosofia sobre como abordar a entrega de software que atenda às necessidades e expectativas dos clientes. Se não houver o que você chama de partes "bem projetadas" , isso não é uma falha per se, pois não é uma parte fundamental da filosofia.

Robert Harvey
fonte
2
"Bem projetado" é uma meta do proprietário do produto: não uma meta direta. Indiretamente, sim: bem projetado significa mais fácil de depurar e manter. Eu tive que passar semanas encontrando bugs críticos (que travavam o aplicativo) em códigos confusos e mal projetados.
Giorgio
3
Que resposta deprimente. Ele basicamente garante um software medíocre envolvendo o planeta como uma gosma cinzenta.
Robert Harvey
@ Giorgio que não é uma meta, é uma expectativa implícita.
@RobertHarvey Eu sei que você viu o vídeo Big Ball of Mud e leu o jornal . Isso é a vida real, o SCRUM em particular é um reconhecimento do BBOM e o adota na metodologia, aceitando a entropia como parte do processo e gerenciando-a, tentando documentá-la (estréia técnica) e desacelerá-la (refatoração). Sim, você deve começar o mais longe possível do BBOM / Entropia total, mas na vida real esse nem sempre é o caso.
1
OK, mas você não pode comer uma "expectativa implícita". Isso é apenas um aceno de mão. "Vai ser bem arquitetado, porque sou profissional e sei o que estou fazendo." (usando minha melhor voz de Bill Murray) Sim, certo.
Robert Harvey
3

Trabalhamos com o scrum há vários meses e quero compartilhar minha experiência com seu problema.

Alguns meses atrás, recebi um grande pedaço para implementar. Eu tinha todas as especificações prontas, então tive que implementar novos recursos de acordo. A tarefa era levar de 5 a 6 semanas (como eu calculei). Passei a primeira semana trabalhando apenas no design. A tarefa era um pouco complicada: havia um objeto principal que, como concluí da especificação, tinha 15 estados diferentes, e a interface do usuário deveria ter comportamentos diferentes para cada estado.

Projetei todo o fluxo de trabalho e a estrutura e as classes do banco de dados posteriormente.

Não vejo outra abordagem no meu caso. Se eu mergulhasse na codificação de uma só vez, teria uma grande confusão no final - quase impossível de manter e extremamente difícil de fazer outras alterações. Mas as mudanças ocorreram nas próximas duas semanas, então tive que refazer o código. Isso era fácil agora, com o design pensado inicial. Isso economizou nosso tempo, dinheiro e nervos.

Após essa experiência, tenho certeza absoluta de que vale a pena fazer um design aceitável no começo, do que esperar que, com algum milagre, você o consiga no final.

superM
fonte
1
+1: resposta muito interessante. Os apoiadores ágeis diriam que você deveria ter dividido sua história de seis semanas em histórias menores. Certa vez, recebi um conselho semelhante e respondi que minhas seis histórias de uma semana teriam muitas dependências entre si: porque, mesmo que eu mude meu plano de trabalho, não posso mudar o domínio do problema. Não tenho resposta para isso: o agile geralmente pressupõe que você pode terminar seu trabalho em histórias pequenas e independentes, mas no mundo real nem sempre é esse o caso.
Giorgio
1

A visão traseira é 20-20. Se você tiver as informações à sua disposição no início do projeto para descobrir tudo e depois escrever o código em algumas semanas, sugiro que você faça isso.

Você não está dando crédito suficiente a todas as informações que obteve, as abordagens que foram tentadas e falharam / tiveram que ser alteradas e a capacidade aumentada do cliente / usuários de fornecer crédito suficiente aos requisitos.

Por que alguém com um histórico de projetos bem-sucedidos de queda de água mudaria para uma metodologia ágil?

JeffO
fonte
"Por que alguém com um histórico de projetos bem-sucedidos de queda d'água muda para uma metodologia ágil?": Observação muito boa (+1). Eu acho que a escolha entre cascata e ágil deve estar relacionada ao tipo de projetos que se faz: para projetos com requisitos mal definidos que precisam de protótipos frequentes e nos quais um protótipo provavelmente se tornará o produto final, o ágil pode ser apropriado. Para um projeto em que os requisitos são mais estáveis ​​e onde a robustez e a estabilidade são mais importantes, a cascata (ou alguma variação) é provavelmente a melhor escolha.
Giorgio
0

Você sempre precisa de uma imagem maior de qual deve ser o objetivo final e quais recursos devem ser implementados e quando, antes de iniciar um projeto. Trabalhar em histórias como tarefas atômicas está causando problemas. Você precisa manter em mente os requisitos futuros o máximo possível.

James
fonte
É uma boa prática agendar uma história de usuário de design ?
Giorgio
@ Giorgio: Isso provavelmente é desnecessário, mas o Dono do Produto deve, pelo menos, dar à sua equipe uma visão geral das expectativas do cliente em relação ao projeto, antes do início do projeto, e uma explicação de como foi dividido.
James
1
Se alguém downvotes agradar dar uma razão
James
Os que recusam raramente reservam um tempo para explicar por que votaram abaixo. Eu acho isso muito chato.
Giorgio