Question

La portée du projet je travaille est en cours d'extension. L'application est assez simple mais vise actuellement un créneau très spécifique. Pour l'avenir immédiat m'a demandé de bifurquer le projet de cibler un nouveau marché et continuer à développer les deux projets en tandem.

Les deux projets seront fonctionnellement similaires donc il y a une très forte incitation à généraliser beaucoup de tripes du projet initial. Aussi je suis certain que je vais cibler davantage de marchés dans un avenir proche (les marchés sont d'ordre géographique).

Le problème est un précédent mainteneurs du projet a fait beaucoup d'hypothèses qui le lient à son marché d'origine. Il va prendre un peu de refactoring pour séparer le générique du marché code spécifique.

Pour faire des choses plusieurs suggestions plus complexes ont été secoués sur la façon d'organiser les projets pour le nombre croissant de marchés:

  1. Chaque marché est un projet distinct, entre les projets communs sont déplacés vers une bibliothèque partagée, les projets sont déployés indépendamment.
  2. Développez le projet existant pour cibler plusieurs marchés, ce qui limite la fonctionnalité basée sur licence achetée.
  3. Créer une application mère et des projets de redéfinition en tant que plugins, achetés séparément

Les trois suggestions ont le mérite et, idéalement, je voudrais structurer le codeto être suffisamment souple que l'un de ceux-ci est possible avec des ajustements mineurs. Suggestion 3 semble être le plus redoutable, car cela nécessiterait la construction d'une architecture de plug-in. Les deux premières suggestions sont un peu plus plausible.

Y a-t-il des bonnes ressources disponibles sur les avantages et les inconvénients de ces différentes architectures?

Quels sont les avantages et les inconvénients sur le partage de code entre les projets vers la copie et bifurquer?

Était-ce utile?

La solution

Bifurquer va habituellement pour vous obtenir un plus rapide résultat au départ, mais presque toujours va venir autour et vous mordre dans l'entretien - corrections de bugs et améliorations de fonctionnalités d'une fourchette se perdre dans les autres fourches, et finalement vous vous trouvez jeter des fourches entières et avoir à ajouter à nouveau leurs fonctions à la fourchette « mieux ». A éviter si vous le pouvez.

Sur la route:. Les trois options peuvent travailler, mais ils ont également des compromis en termes de complexité de construction, le coût de la maintenance, le déploiement, les frais généraux de communication et la quantité de refactoring que vous devez faire


1. Chaque marché est un projet distinct

Une bonne solution si vous allez se développer en même temps pour plusieurs marchés.

Avantages:

  • Il permet aux développeurs pour le marché A à briser A construire sans interférer avec les travaux en cours sur B
  • Il est beaucoup moins probable qu'un changement fait pour le marché A entraînera un bug pour le marché B

Moins:

  • Vous devez prendre le temps de séparer le code partagé
  • Vous devez prendre le temps de mettre en place construit en parallèle
  • Les modifications du code partagé ont maintenant plus de frais généraux car ils affectent les deux équipes.

2. Développez le projet existant pour cibler plusieurs marchés

Peut être fait travailler bien pour un certain temps. Si vous allez travailler sur les versions pour un marché à la fois, avec une petite équipe, il pourrait être votre meilleur pari.

Avantages:

  • Le travail de licence est probablement utile de toute façon, même si vous vous déplacez vers (1) ou (3).
  • La base de code unique permet refactoring sur tous les marchés.

Moins:

  • Même si vous êtes juste travailler sur quelque chose pour le marché A, vous devez construire et expédier le code pour les marchés B, C et D ainsi - bien si vous avez une petite base de code, mais de plus en plus ennuyeux que vous obtenez en milliers de classes
  • Les modifications apportées à un risque de marché briser le code pour d'autres marchés
  • Les modifications apportées à un marché ont besoin d'autres marchés à tester à nouveau

3. Créer une application mère et des projets de redéfinition en tant que plugins

Se sent techniquement doux, et peut vous permettre de partager plus de code.

Avantages:

  • Tous les avantages de (1), potentiellement, plus:
    • séparation plus claire du code partagé et spécifique sur le marché
    • peut vous permettre de déplacer vers une API publique, qui permettrait déchargeant une partie de votre travail sur vos clients et / ou la vente de projets de services lucratifs

Moins:

  • Tous les inconvénients de (1), plus il faut encore plus refactoring.

Je suppose que (2) est en quelque sorte l'endroit où vous vous trouvez maintenant, en dehors de la licence. Je pense qu'il est normal de rester là pendant un petit moment, mais mettre un peu d'effort en mouvement vers (1) - déplacer le code partagé dans un projet distinct même si elle est tout construit ensemble, par exemple, en essayant de vous assurer que les dépendances de marché code code partagé sont tous à sens unique.

Que vous vous retrouvez à (1) ou (3) dépend de la nature. La plupart du temps, il se résume à qui est « en charge » - le code partagé ou le code spécifique au marché? La ligne entre un plug-in, et une classe de contrôleur qui configure certains composants partagés, peuvent être assez floue. Mon conseil serait, que le code vous dire ce dont il a besoin.

Autres conseils

1) NON! Vous ne voulez pas gérer les différentes branches de la même base de code ... Car aussi commun que le code peut être, vous voulez faire des changements radicaux, et un projet sera « au moment » ne pas être aussi important que les autres , et vous obtiendrez une branche de plus en plus vite que les autres .... insert boule de neige.

2) Ceci est plus ou moins la norme de l'industrie. Big fichier de configuration, limiter les choses en fonction de licence / configuration. Il peut faire l'application un peu lourd, mais aussi longtemps que le code se plaint de choses mutuellement exclusives et tous les développeurs sont en communication constante sur les nouvelles fonctionnalités et la façon dont ils ondulent dans toute l'application, vous devriez faire bien. Ceci est aussi le plus facile à pirater, si cela est une préoccupation.

3) Ce travail a également 'peut'. Si vous utilisez C #, les plugins sont relativement simples, il suffit de vous soucier de l'enfer de la dépendance. Si les plug-ins ont une chance de devenir circulairement interdépendant (qui est, a exige b exige c exige une), cela va exploser rapidement et vous revenir (assez facilement) Retour à # 2.

Les meilleures ressources que vous avez sont probablement les expériences passées de vos collègues de travail sur différents projets, et l'expérience des personnes yammering à ce sujet ici ou Slashdot ou ailleurs. Certes, le moins cher.

Pour de partage de code: Un changement change tout. modèle de données unifié. Il n'y a qu'une seule vérité. (Beaucoup plus facile pour tout le monde d'être sur la même page)

Moins de code de partage: Un changement change tout .. Attention. Si un bug est en elle, elle affecte tout.

Pour de copie / fork: En général, plus rapide à mettre en œuvre une fonctionnalité spécifique pour un client spécifique. Plus rapide à pirater quand vous réalisez que cette hypothèse A est applicable uniquement pour les marchés B et C, pas D.

Moins de copie / fork: Un ou plusieurs des projets copiés échouera finalement, en raison d'un manque de cohésion dans votre code. Comme ci-dessus dit: Des changements radicaux prennent beaucoup plus de temps

.

Bonne chance.

Vous avez dit « la copie et bifurquer » qui me conduit à penser que peut-être vous n'avez pas envisagé la gestion de cette « fourchette » comme une branche dans un système de contrôle de révision comme SVN. En le faisant de cette façon, lorsque vous refactoring la branche pour accueillir une industrie différente, vous pouvez fusionner ces modifications dans le tronc principal à l'aide du système de contrôle de révision.

Si vous suivez une stratégie à long terme de passer à une application unique où toutes les variations sont contrôlées par un fichier de configuration (ou une base de données de configuration SQLite), alors cette approche vous aidera. Vous ne devez pas fusionner quoi que ce soit jusqu'à ce que vous êtes sûr que vous avez généralisé pour les deux industries, de sorte que vous pouvez toujours construire deux systèmes uniques aussi longtemps que vous avez besoin. Mais, vous n'êtes pas vous-même peinturer dans un coin car il est dans un arbre de code source, le tronc pour l'industrie héritage, et une branche pour chaque nouvelle industrie.

Si votre entreprise veut vraiment atack plusieurs industries, alors je ne pense pas que la solution de base de données de configuration répondra à tous vos besoins. Vous aurez toujours besoin d'avoir des modules de code spéciaux de quelque sorte. Une architecture de plug-in est une bonne chose à mettre en car il contribuera, en particulier si vous incorporez un moteur de script comme Python dans votre application. Cependant, je ne pense pas que les plugins seront en mesure de répondre à tous vos besoins de variation de code lorsque vous entrez dans l'échelle « des milliers de classes ».

Vous devez adopter une approche pragmatique qui vous permet de créer une application séparée aujourd'hui pour la nouvelle industrie, mais il est relativement facile de fusionner les améliorations dans l'application existante que vous avancez. Vous ne pouvez jamais atteindre le nirvana d'un tronc unique avec des milliers de classes et de plusieurs industries, mais vous aurez au moins apprivoisé la complexité, et ne doivent faire face à des variations très importantes où il y a divergence réelle dans le besoin de l'industrie.

Si je dans vos chaussures, je voudrais aussi être à la recherche à tout et toutes les fonctionnalités de l'application qui pourraient être considérés comme des « rapports » et d'essayer de les factoriser, peut-être même dans un hors l'outil de reporting de conservation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top