Recientemente he presenciado más y más problemas similares a los explicados en este artículo sobre intersecciones de características. Otro término para ello sería líneas de productos, aunque tiendo a atribuirlos a productos realmente diferentes, mientras que generalmente encuentro estos problemas en forma de posibles configuraciones de productos.
La idea básica de este tipo de problema es simple: agrega una característica a un producto, pero de alguna manera las cosas se complican debido a una combinación de otras características existentes. Eventualmente, QA encuentra un problema con una rara combinación de características en las que nadie había pensado antes y lo que debería haber sido una simple corrección de errores puede incluso requerir grandes cambios de diseño.
Las dimensiones de este problema de intersección de características son de una complejidad alucinante. Digamos que la versión actual del software tiene N
características y agrega una nueva característica. Simplifiquemos también las cosas al decir que cada una de las funciones solo puede activarse o desactivarse, entonces ya tiene 2^(N+1)
posibles combinaciones de funciones para considerar. Debido a la falta de mejores términos de redacción / búsqueda, me refiero a la existencia de estas combinaciones como un problema de intersección de características . (Puntos de bonificación por una respuesta que incluye referencias para un término más establecido).
Ahora, la pregunta con la que lucho es cómo lidiar con este problema de complejidad en cada nivel del proceso de desarrollo. Por razones obvias de costos, no es práctico hasta el punto de ser utópico, querer abordar cada combinación individualmente. Después de todo, tratamos de mantenernos alejados de los algoritmos de complejidad exponencial por una buena razón, pero convertir el proceso de desarrollo mismo en un monstruo de tamaño exponencial seguramente conducirá a un fracaso total.
Entonces, ¿cómo se obtiene el mejor resultado de una manera sistemática que no explote ningún presupuesto y se complete de una manera decente, útil y profesionalmente aceptable?
Especificación: cuando especifica una nueva función, ¿cómo se asegura de que funcione bien con todos los demás niños?
Puedo ver que uno podría examinar sistemáticamente cada característica existente en combinación con la nueva característica, pero eso sería un aislamiento de las otras características. Dada la naturaleza compleja de algunas características, esta visión aislada a menudo ya está tan involucrada que necesita un enfoque estructurado en sí mismo, y mucho menos el
2^(N-1)
factor causado por las otras características que uno ignoraba voluntariamente.Implementación: cuando implementa una función, ¿cómo se asegura de que su código interactúa / intersecta correctamente en todos los casos?
Nuevamente, me pregunto acerca de la gran complejidad. Conozco varias técnicas para reducir el potencial de error de dos características que se cruzan, pero ninguna que se escalara de manera razonable. Sin embargo, supongo que una buena estrategia durante la especificación debería mantener el problema a raya durante la implementación.
Verificación: cuando prueba una característica, ¿cómo lidia con el hecho de que solo puede probar una fracción del espacio de intersección de esta característica?
Es lo suficientemente difícil saber que probar una sola característica de forma aislada no garantiza nada cerca del código libre de errores, pero cuando lo reduce a una fracción
2^-N
parece que cientos de pruebas ni siquiera cubren una sola gota de agua en todos los océanos combinados . Peor aún, los errores más problemáticos son los que se derivan de la intersección de las características, que uno no esperaría que condujeran a ningún problema, pero ¿cómo los prueba si no espera una intersección tan fuerte?
Si bien me gustaría escuchar cómo otros tratan este problema, estoy principalmente interesado en literatura o artículos que analicen el tema con mayor profundidad. Por lo tanto, si sigue personalmente una determinada estrategia, sería bueno incluir las fuentes correspondientes en su respuesta.