¿Cómo administrar el código fuente que se ejecuta en diferentes sistemas del cliente?

Tenemos una aplicación que se implementa para nuestra propia empresa. Por time, la aplicación ha sido comprada por varias compañías.

Para cada compañía, creamos una nueva Sucursal de TFS en control de fuente. Y cada uno ha sido modificado para requisitos específicos del cliente.

Es por eso que el código fuente tiene muchas versiones ahora. Hacer un cambio se volvió tan difícil porque el cambio necesita ser implementado y probado por separado para cada twig si es de una estructura común.

¿Cuál es la mejor y más convencional manera de administrar el código fuente?

¿Se recomienda tener una SOLUCIÓN ÚNICA que pueda ejecutarse en los sistemas de cada cliente?

Hay varias maneras de manejar personalizaciones específicas del cliente, entre ellas:

  • Mantenga una sucursal completamente separada por cliente y, finalmente, combine el código entre sucursales. Esta es la solución que implementa en este momento.
  • Arquitecte la aplicación de forma que tenga un "kernel" independiente del cliente que tenga ganchos de personalización conectables. Solo las personalizaciones se mantendrían en repositorys independientes separados.
  • Coloque las personalizaciones en una aplicación común y haga que sean configurables ("activar / desactivar").

Qué ruta tomar depende de la naturaleza de la aplicación y la cantidad de personalizaciones por cliente. Si el context lo permite, las sucursales separadas son less favorables debido a la fusión manual, la reparación de errores y la sobrecarga de las testings.

En una industria específica (sistemas de facturación de telecomunicaciones), he visto los tres: proveedores que trabajan con twigs de código dedicadas, otros con personalizaciones conectables y productos listos para usar configurables. Naturalmente, cada proveedor tiene un nivel diferente de flexibilidad de personalización, nivel de productificación y enfoque de integración.

Como proveedor de software, la gran desventaja es equilibrar el nivel de flexibilidad de personalización con el nivel de productificación.