J'ai récemment constaté de plus en plus de problèmes similaires à ceux expliqués dans cet article sur les intersections de fonctionnalités. Un autre terme pour ce serait les lignes de produits, même si j'ai tendance à les attribuer à des produits réellement différents, alors que je rencontre généralement ces problèmes sous la forme de configurations de produits possibles.
L'idée de base de ce type de problème est simple: vous ajoutez une fonctionnalité à un produit, mais les choses se compliquent d'une manière ou d'une autre en raison d'une combinaison d'autres fonctionnalités existantes. Finalement, QA trouve un problème avec une combinaison rare de fonctionnalités auxquelles personne n'avait pensé avant et ce qui aurait dû être un simple bugfix peut même devenir nécessitant des modifications de conception majeures.
Les dimensions de ce problème d'intersection de caractéristiques sont d'une complexité époustouflante. Disons que la version actuelle du logiciel a des N
fonctionnalités et que vous ajoutez une nouvelle fonctionnalité. Simplifions également les choses en disant que chacune des fonctionnalités peut être activée ou désactivée uniquement, alors vous avez déjà 2^(N+1)
des combinaisons de fonctionnalités possibles à considérer. En raison d'un manque de meilleurs termes de formulation / recherche, je me réfère à l'existence de ces combinaisons comme problème d'intersection de fonctionnalités . (Points bonus pour une réponse comprenant des références pour un terme plus établi.)
Maintenant, la question avec laquelle je lutte est de savoir comment traiter ce problème de complexité à chaque niveau du processus de développement. Pour des raisons évidentes de coût, il n'est pas pratique, au point d'être utopique, de vouloir aborder chaque combinaison individuellement. Après tout, nous essayons de nous éloigner des algorithmes de complexité exponentielle pour une bonne raison, mais transformer le processus de développement lui-même en un monstre de taille exponentielle est susceptible de conduire à un échec total.
Alors, comment obtenez-vous le meilleur résultat d'une manière systématique qui n'explose aucun budget et est complète de manière décente, utile et professionnellement acceptable.
Spécification: lorsque vous spécifiez une nouvelle fonctionnalité - comment vous assurez-vous qu'elle joue bien avec tous les autres enfants?
Je peux voir que l'on pourrait systématiquement examiner chaque fonctionnalité existante en combinaison avec la nouvelle fonctionnalité - mais ce serait indépendamment des autres fonctionnalités. Étant donné la nature complexe de certaines fonctionnalités, cette vision isolée est souvent déjà tellement impliquée qu'elle a besoin d'une approche structurée en elle-même, sans parler du
2^(N-1)
facteur causé par les autres fonctionnalités que l'on a volontairement ignoré.Implémentation: lorsque vous implémentez une fonctionnalité - comment vous assurez-vous que votre code interagit / intersecte correctement dans tous les cas.
Encore une fois, je m'interroge sur la complexité même. Je connais diverses techniques pour réduire le potentiel d'erreur de deux entités qui se croisent, mais aucune qui ne serait mise à l'échelle de manière raisonnable. Je suppose cependant qu'une bonne stratégie lors de la spécification devrait éviter le problème lors de la mise en œuvre.
Vérification: lorsque vous testez une entité - comment gérez-vous le fait que vous ne pouvez tester qu'une fraction de cet espace d'intersection d'entités?
Il est assez difficile de savoir que tester une seule fonctionnalité isolément ne garantit rien de près d'un code sans erreur, mais lorsque vous le réduisez à une fraction,
2^-N
il semble que des centaines de tests ne couvrent même pas une seule goutte d'eau dans tous les océans combinés . Pire encore, les erreurs les plus problématiques sont celles qui proviennent de l'intersection de caractéristiques, dont on ne s'attend pas à ce qu'elles entraînent des problèmes - mais comment les tester si vous ne vous attendez pas à une intersection aussi forte?
Bien que j'aimerais savoir comment les autres gèrent ce problème, je m'intéresse principalement à la littérature ou aux articles analysant le sujet de manière plus approfondie. Donc, si vous suivez personnellement une certaine stratégie, ce serait bien d'inclure des sources correspondantes dans votre réponse.