Pergunta

O escopo do projeto que estou trabalhando está sendo expandida. A aplicação é bastante simples, mas atualmente tem como alvo um nicho muito específico. Para o futuro imediato eu fui perguntado se bifurcar o projeto para atingir um novo mercado e continuar a desenvolver os dois projetos em conjunto.

Ambos os projetos serão funcionalmente semelhantes para que haja um incentivo muito forte para generalizar um monte de tripas do projeto original. Também estou certo de que vou ser alvo de mais mercados no futuro próximo (os mercados estão geográfica).

O problema é um mantenedores anteriores do projeto fez um monte de suposições que amarrá-lo a seu mercado original. Vai levar um pouco de refatoração para separar o genérico do código específico de mercado.

Para tornar as coisas mais complexas várias sugestões foram atiradas em torno de como organizar os projectos para o número crescente de mercados:

  1. Cada mercado é um projeto separado, semelhanças entre os projetos são movidos para uma biblioteca compartilhada, os projetos são implantados de forma independente.
  2. Expanda o projeto existente para atingir vários mercados, limitando a funcionalidade baseada na licença adquirida.
  3. Criar um aplicativo pai e projetos de redesenho como plugins, adquiridos separadamente

Todas as três sugestões têm mérito e, idealmente, gostaria de estruturar o codeto ser suficiente flexível que qualquer um destes é possível com pequenos ajustes. Sugestão 3 parece ser o mais difícil, uma vez que exigiria a construção de uma arquitetura de plug-in. As duas primeiras sugestões são um pouco mais plausível.

Existem bons recursos disponíveis sobre os prós e contras dessas arquiteturas diferentes?

Quais são os prós e contras sobre compartilhamento de código entre projetos versos copiando e bifurcação?

Foi útil?

Solução

bifurcação é geralmente vai te dar um rápido resultar inicialmente, mas quase sempre vai vir ao redor e mordê-lo na manutenção - correções de bugs e melhorias de recursos de um garfo se perder nas outras garfos, e, eventualmente, você encontrar-se jogando fora garfos integrais e ter que re-adicionar os seus recursos para o "melhor" garfo. Evitá-lo se você puder.

Seguindo em frente:. Todos os três de suas opções podem trabalhar, mas eles têm vantagens e desvantagens em termos de complexidade de construção, custo de manutenção, implantação, a sobrecarga de comunicação e da quantidade de refatoração que você precisa fazer


1. Cada mercado é um projeto separado

Uma boa solução se você vai estar se desenvolvendo simultaneamente para vários mercados.

Pros:

  • Ele permite aos desenvolvedores para o mercado de A para quebrar o A construção, sem interferir com o trabalho em curso sobre B
  • Isso torna muito menos provável que uma alteração feita para o mercado A causará um erro para o mercado B

Contras:

  • Você tem que ter o tempo para separar o código compartilhado
  • Você tem que ter o tempo para configurar paralelo cria
  • modificações no código compartilhado agora têm mais sobrecarga uma vez que afetam ambas as equipes.

2. Expanda o projeto existente para atingir vários mercados

Pode ser feito para funcionar bem por um bom tempo. Se você estiver indo para estar trabalhando em versões para um mercado de cada vez, com uma pequena equipe, que poderia ser sua melhor aposta.

Pros:

  • O trabalho de licença é, provavelmente, de qualquer maneira valiosa, mesmo se você se mover em direção (1) ou (3).
  • A base de código único permite refatoração em todos os mercados.

Contras:

  • Mesmo se você está apenas trabalhando em algo para o mercado A, você tem que construir e enviar o código para mercados B, C e D, bem como - bem se você tem uma pequena base de código, mas cada vez mais irritante como você começa em milhares de aulas
  • Alterações a um risco de mercado quebrando o código para outros mercados
  • Alterações a um mercado exigem outros mercados para ser re-testado

3. Criar um aplicativo pai e projetos de redesenho como plugins

Parece tecnicamente doce, e pode permitir que você compartilhe mais código.

Pros:

  • Todas as vantagens de (1), potencialmente, mais:
    • separação mais clara de código compartilhado e específicos do mercado
    • pode permitir que você se mover em direção a uma API pública, o que permitiria o descarregamento de alguns de seus trabalhos para seus clientes e / ou venda de projetos de serviços lucrativos

Contras:

  • Todos os contras de (1), além de requer ainda mais refatoração.

Eu diria que (2) é uma espécie de onde você se encontra agora, além do licenciamento. Eu acho que não há problema em ficar lá por um tempo, mas colocar algum esforço em se movendo em direção (1) - mover o código compartilhado em um projeto separado, mesmo que tudo é construído em conjunto, por exemplo, tentando certificar-se as dependências de mercado código para código compartilhado são one-way.

Se você acabar em (1) ou (3) tipo de depende. Principalmente se trata de quem é "responsável" - o código compartilhado, ou o código específico do mercado? A linha entre um plugin, e uma classe de controlador que configura algum componente compartilhado, pode ser bastante embaçada. Meu conselho seria, deixe o código de dizer-lhe o que ele precisa.

Outras dicas

1) NÃO! Você não quer para gerir diferentes ramos da mesma base de código ... Porque tão comum quanto o código pode ser, você vai querer fazer mudanças radicais, e um projeto "no momento" não ser tão importante quanto os outros , e então você vai ter um ramo crescendo mais rápido do que os outros .... inserção bola de neve.

2) Este é mais ou menos o padrão da indústria. arquivo de configuração grande, coisas limite baseados licença / configuração. Ele pode fazer o aplicativo um pouco pesado, mas enquanto o código reclama coisas sobre mutuamente exclusivos e todos os desenvolvedores estão em constante comunicação sobre os novos recursos e como eles ondulação ao longo de todo o aplicativo, você deve fazer bem. Este também é o mais fácil de cortar, se isso é uma preocupação.

3) Isso também trabalho 'lata'. Se você estiver usando C #, plugins são relativamente simples, você só precisa se preocupar com o inferno da dependência. Se os plugins ter alguma chance de se tornar interdependentes circular (ou seja, um exige b requer c requer a), então isso vai explodir rapidamente e você será revertida (facilmente) de volta para # 2.

Os melhores recursos que você tem são provavelmente as experiências passadas de seus colegas de trabalho em diferentes projetos, e a experiência das pessoas yammering sobre isso aqui ou Slashdot ou onde quer. Certamente o mais barato.

Pros de compartilhamento de código: Uma mudança muda tudo. modelo de dados unificado. Há apenas uma verdade. (Muito mais fácil para que todos possam estar na mesma página)

contras de compartilhamento de código: Uma mudança muda tudo .. Tenha cuidado. Se um bug está nele, isso afeta tudo.

Pros de copiar / bifurcação: Geralmente mais rápido para implementar um recurso específico para um cliente específico. Mais rápido para cortar quando você percebe essa suposição Um só é aplicável para os mercados B e C, não D.

Contras de copiar / bifurcação: Um ou mais dos projetos copiados acabará por falhar, devido a uma falta de coesão no seu código. Como disse acima: mudanças radicais levar muito mais tempo

.

Boa sorte.

Você disse que "copiar e bifurcação" O que me leva a pensar que talvez você não tenha considerado a gestão desta "fork" como um ramo em um sistema de controle de revisão como SVN. Ao fazê-lo desta forma, quando você refatorar o ramo para acomodar um setor diferente, você pode mesclar essas alterações de volta para o tronco principal com o auxílio do sistema de controle de revisão.

Se você está seguindo uma estratégia de longo prazo de se mudar para um aplicativo único, onde todas as variações são controlados por um arquivo de configuração (ou um banco de dados de configuração SQLITE), então esta abordagem irá ajudá-lo. Você não tem que mesclar qualquer coisa até que você esteja confiante de que você tenha generalizado lo para ambas as indústrias, assim você ainda pode construir dois sistemas únicos, desde que você precisa. Mas, você não está fazendo sozinho em um canto, porque é tudo em uma fonte árvore de código, o tronco para a indústria de legado, e um ramo para cada nova indústria.

Se a sua empresa realmente quer atack vários setores, então eu não acho que a solução de banco de dados de configuração irá satisfazer todas as suas necessidades. Você ainda precisará de ter módulos de código especiais de algum tipo. A arquitetura plug-in é uma coisa boa para colocar em porque ele vai ajudar, especialmente se você incorporar um mecanismo de script como Python em seu aplicativo. No entanto, eu não acho que os plugins será capaz de satisfazer todas as suas necessidades de variação de código quando você entrar em "milhares de aulas" escala.

Você precisa ter uma abordagem pragmática que lhe permite construir um aplicativo separado hoje para a nova indústria, mas faz com que seja relativamente fácil de fundir as melhorias no aplicativo existente como você vá junto. Você nunca pode atingir o nirvana de um único tronco com milhares de classes e várias indústrias, mas pelo menos você vai ter domado a complexidade, e só terá de lidar com variações muito importantes onde há divergência real na necessidade da indústria.

Se eu estivesse no seu lugar, eu também estaria olhando para qualquer e todos os recursos do aplicativo que possam ser considerados "reporting" e tentando fator-los, talvez até mesmo em um fora da prateleira ferramenta de relatórios.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top