Como aprendo a abordagem correta para implementar metade de um recurso? [fechadas]

12

Lidero uma equipe de desenvolvimento e quero lançar nosso produto o mais rápido possível (Entrega contínua).

Em muitos casos, precisamos implementar um recurso que leva mais tempo para ser implementado do que o tempo entre os lançamentos. Eu ainda quero que as pessoas comprometam seu código diariamente (integração contínua).

Muitas vezes, a implementação de um novo recurso exige que o recurso existente seja alterado e os recursos existentes, é claro, ainda precisam funcionar, mesmo que o novo recurso ainda não esteja concluído.

Se o desenvolvedor usar a abordagem correta , poderá ajustar os recursos existentes com cuidado e todas as opções acima não são um problema.

No entanto, qual é a abordagem correta, na verdade? Minha própria mente sintonizada em programação me diz o que fazer para cada caso individual, mas preciso aprender mais e preciso de algum material de leitura que possa ler e indicar os membros da equipe para ler. Ou qualquer outro método de aprender a maneira correta de aprender essa abordagem serve.

Então essa é a questão. Como garantir que os membros da equipe aprendam a abordagem correta para implementar metade de um recurso?

Procurei pessoas que afirmam ter estratégias em relação a isso, mas ainda não as encontrei, exceto pessoas que escrevem algumas idéias aleatórias sobre o assunto. Talvez eu não esteja usando as palavras de pesquisa corretas ou talvez ninguém tenha feito nenhuma orientação oficial sobre isso.

Niels Brinch
fonte
"recursos existentes, é claro, ainda precisa de trabalho" - dependendo do contexto, prazo para uma exigência como esta poderia ser a compatibilidade ou ausência de erros de regressão
mosquito
1
Diferentes tipos de teste automatizado podem reduzir o risco de erros nas alterações de código. Verifica. Estou procurando a abordagem a ser usada como desenvolvedor que precisa implementar um grande recurso que pode envolver 75% de alterações no código existente e 26% de novo código (a porcentagem extra existe para aumentar o mistério).
Niels Brinch 10/09
1
@ Niels: Você deve ter alguns desenvolvedores incríveis para que eles possam ter código de trabalho no final de cada dia que possa ser verificado no ramo principal e aprovado em todos os testes. Ou isso, ou eles só fazem o mínimo possível, para que possam verificar seu código até o final do dia.
Dunk
eles não chamariam isso de "Filial de Recursos". Você faz suas alterações na ramificação e, em seguida, mescla a ramificação novamente no mestre quando o recurso é concluído. Você não deve apresentar recursos semi-implementados em demos, portanto não vejo por que isso não funcionaria.
deltree

Respostas:

14

Eu tenho uma visão diferente das outras respostas aqui já. Concordo que você deseja integrar as alterações dos desenvolvedores o mais rápido possível e continuar testando a combinação combinada de código.

No entanto, não concordo que o seu direito de enviar código tenha se desenvolvido nesta manhã, apenas porque estamos lançando esta tarde. Essa é uma receita para clientes decepcionados.

A solução é ter ramificações em sua árvore de controle de versão e que você tenha um processo separado para promover deltas verificados da ramificação de desenvolvimento até a ramificação de liberação.

Dessa forma, você obtém o melhor dos dois mundos. Você tem desenvolvedores fazendo integração contínua e as vantagens que isso traz, você tem o envio estável de código regularmente para o cliente e possui um novo processo que testa os recursos completos na filial do desenvolvedor e, se eles passarem no teste, fazem parte do produto lançado .

Conheço duas ferramentas que suportam bem esse tipo de processo. Se sua estrutura de desenvolvimento é simples, o git, com o git-flow, implementa uma boa estrutura de ramificação que funciona bem em equipes de pequeno a médio porte (talvez 20 desenvolvedores).

Para equipes de desenvolvimento maiores, ou onde uma estratégia de ramificação mais complexa é necessária para dar suporte a várias 'rotações' do seu produto, o precisrev é o melhor que existe. Os desenvolvedores não envolvidos no gerenciamento das alterações irão reclamar que é mais difícil do que a sub-versão etc ... mas suporta ambientes de desenvolvimento complexos.

Michael Shaw
fonte
Eu ficaria muito interessado em saber mais sobre a estratégia de ramificação a que você está se referindo. Você tem um link para um artigo ou algo mais que explique mais profundamente o conceito ao qual você está se referindo?
Niels Brinch 10/09
2
aqui é nvie.com/posts/a-successful-git-branching-model para o fluxo de git
Michael Shaw
A principal característica do fluxo git é sua estratégia de ramificação claramente definida, o que a torna uma boa escolha para um produto que possui apenas um release a ser produzido. Accurrev não impõe uma estratégia de ramificação, mas possui flexibilidade e fornece as ferramentas para gerenciar efetivamente uma árvore de ramificações muito mais complexa.
Michael Shaw
6

Existem dois problemas aqui: um está implementando metade de um recurso; o outro é manter o produto da remessa funcionando durante o desenvolvimento contínuo.

Implementando metade de um recurso

Um forte design abrangente ajudará com isso. Isso permite implementar o recurso com seus limites claramente definidos - por exemplo, APIs para bits de código adjacentes, expectativas sobre estruturas de dados e uma compreensão de como e quando o código implementado será chamado.

Os testes podem incluir versões simuladas do código para as outras partes do recurso; isso ajuda a facilitar a transição quando você implementa a segunda metade.

Manter o produto de remessa funcionando

Existem algumas opções aqui:

  1. Desative o recurso no produto enviado. Só porque o código está no produto não significa que ele deve ser executado ou apresentado aos usuários. A desvantagem é que você não fornecerá valor incremental aos seus usuários e não receberá feedback.
  2. Revele as bordas do recurso para seus usuários. Mostre o que você tem e forneça algumas indicações do que está por vir.
  3. Permita que os usuários alternem entre funcionalidades novas e antigas. Às vezes, isso exige a manutenção de dois caminhos de código prontos para o usuário final.

Finalmente, se você estiver tendo problemas com alguma dessas soluções, considere se você dividiu o recurso nos limites corretos. Se você cortasse as coisas de uma maneira diferente, seria mais fácil separá-las?

Alex Feinman
fonte
É fácil o suficiente para desativar um novo recurso que não está completamente pronto. Esse é um bom conselho. Portanto, o principal problema no produto enviado é que os recursos EXISTENTES podem ser interrompidos se as pessoas não usarem a abordagem correta ao alterar o código existente.
Niels Brinch
2
É aí que entra o bom teste. Se você não tem uma cobertura decente para sua base de código, talvez isso possa ser um gatilho para esse esforço?
Alex Feinman
Mas a resposta para minha pergunta pode ser simplesmente "executar boas práticas de código e fazer testes de unidade" etc ...?
Niels Brinch 10/09
1

Como garantir que os membros da equipe aprendam a abordagem correta para implementar metade de um recurso?

Ensinando-os. (duh)

O aprendizado envolverá a iteração: tentar algo, ver como funciona e, em seguida, modificar sua abordagem para obter melhores resultados. Para esse tipo de coisa, eu defenderia as revisões de design / código. Você vê como o meio-recurso é projetado / implementado e tem a oportunidade de dar feedback. "Isso e aquilo não funcionam porque eles quebram o nosso IC; que tal XYZ?", "Bom trabalho aqui, isso é realmente limpo."

Fazer as revisões em equipe ajudará todos a aprender o que você já sabe intuitivamente.

Telastyn
fonte
Estou totalmente de acordo com isso. Mas, assim como eu posso ensinar alguém como fazer testes de unidade OU encaminhá-los para o livro "A arte de testar unidades" - existe um recurso semelhante ao qual eu possa me referir para este tópico?
Niels Brinch 10/09
1

A principal coisa que o ajudará aqui é ter uma boa separação de preocupações, para que, na medida do possível, uma área do código não interfira na outra.

É um local em que o uso da Injeção de Dependências e a programação na interface realmente ajudam, para que você possa ter sua implementação atual do ISupportingFeature no site e, quando precisar criar o INewFeature que depende de uma implementação diferente, você pode apenas desenvolver com o nova implementação e mantenha a existente em produção até que seja bem testada e pronta para ser lançada. Supondo que você tenha seu DI trabalhando em algum tipo de sistema de configuração, isso permitirá que você tenha o mesmo código em paralelo em seu sistema e esteja usando código estável o tempo todo.

De fato, essa abordagem de configuração é descrita por Martin Fowler como uma alternância de recursos.

Claro, o problema só surge se você estiver implantando todos do código de todos os tempos. Esse é precisamente o tipo de cenário para o qual as ramificações de recursos foram projetadas e, embora eu reconheça que o Sr. Fowler as franja de sobrancelhas, não sei se elas são tão ruins assim, especialmente se forem criadas e usadas de forma planejada e pensada. através do caminho.

glenatron
fonte
Tenho a impressão de que comprometer todo o código no mesmo ramo e implantar todo o meu código o tempo todo faz parte de uma boa estratégia de integração contínua?
Niels Brinch
Ler mais sobre Entrega Contínua, certamente faz parte disso. I estremecer um pouco com o pensamento de que, embora - se você quer ser a implantação de meia-escrita de código mesmo se ele deve ser desativado? Talvez funcione bem em um cenário em que a segurança não é importante, mas soa como uma abordagem de alto risco para muitos espaços de aplicativos. Provavelmente isso me marca como um velho safado e antiquado que abraça a segurança.
glenatron
Parece haver duas estratégias concorrentes, em que uma tem como ramificação principal única e outra com ramificação para cada tarefa e muitas mesclagens ... Não sei o que é melhor ou certo - ou se atinge o cerne das minhas perguntas.
Niels Brinch 10/09
Eu acho que depende muito do tipo de coisa que você está fazendo - eu estaria mais inclinado a ramificações se tivesse alguma prioridade em segurança e não quisesse arriscar realmente implantar código não testado onde alguém possa encontrá-lo ou pode ser acidentalmente ativado. Portanto, se eu estivesse executando um site de banco, não acho que o CD seria o ideal, mas talvez, se estivesse executando um site de alta rotatividade para visitantes ocasionais / ocasionais, seria o ideal.
glenatron