Estoy trabajando en un gran proyecto de software altamente personalizado para varios clientes de todo el mundo. Esto significa que tenemos quizás un 80% de código, que es común entre los distintos clientes, pero también mucho código que tiene que cambiar de un cliente a otro. En el pasado hicimos nuestro desarrollo en repositorios separados (SVN) y cuando comenzó un nuevo proyecto (tenemos pocos, pero grandes clientes) creamos otro repositorio basado en cualquier proyecto pasado que tenga la mejor base de código para nuestras necesidades. Esto ha funcionado en el pasado, pero nos encontramos con varios problemas:
- Los errores que se corrigen en un repositorio no se reparan en otros repositorios. Esto podría ser un problema de organización, pero me resulta difícil corregir y parchear un error en 5 repositorios diferentes, teniendo en cuenta que el equipo que mantiene este repositorio podría estar en otra parte del mundo y no tenemos su entorno de prueba , ni conoce su programación ni los requisitos que tienen (un "error" en un país podría ser una "característica" en otro).
- Las características y mejoras realizadas para un proyecto, que también podrían ser útiles para otro proyecto, se pierden o si se usan en otro proyecto a menudo causan grandes dolores de cabeza al fusionarlas de una base de código a otra (ya que ambas ramas podrían haberse desarrollado de forma independiente durante un año) )
- Las refactorizaciones y las mejoras de código realizadas en una rama de desarrollo se pierden o causan más daño que bien si tiene que fusionar todos estos cambios entre las ramas.
Ahora estamos discutiendo cómo resolver estos problemas y hasta ahora se nos ocurrieron las siguientes ideas sobre cómo resolver esto:
Mantenga el desarrollo en ramas separadas pero organícelo mejor al tener un repositorio central donde se fusionen las correcciones de errores generales y hacer que todos los proyectos combinen los cambios de este repositorio central en los suyos de forma regular (por ejemplo, diariamente). Esto requiere una gran disciplina y mucho esfuerzo para fusionarse entre las ramas. Por lo tanto, no estoy convencido de que funcione y podemos mantener esta disciplina, especialmente cuando la presión del tiempo aumenta.
Abandone las ramas de desarrollo separadas y tenga un repositorio de código central donde viva todo nuestro código y realice nuestra personalización al tener módulos conectables y opciones de configuración. Ya estamos utilizando contenedores de Inyección de dependencias para resolver dependencias en nuestro código y estamos siguiendo el patrón MVVM en la mayoría de nuestro código para separar limpiamente la lógica de negocios de nuestra interfaz de usuario.
El segundo enfoque parece ser más elegante, pero tenemos muchos problemas sin resolver en este enfoque. Por ejemplo: cómo maneja los cambios / adiciones en su modelo / base de datos. Estamos usando .NET con Entity Framework para tener entidades fuertemente tipadas. No veo cómo podemos manejar las propiedades que se requieren para un cliente pero que son inútiles para otro cliente sin saturar nuestro modelo de datos. Estamos pensando en resolver esto en la base de datos utilizando tablas satelitales (que tienen tablas separadas donde nuestras columnas adicionales para una entidad específica viven con un mapeo 1: 1 a la entidad original), pero esta es solo la base de datos. ¿Cómo manejas esto en código? Nuestro modelo de datos vive en una biblioteca central que no podríamos ampliar para cada cliente utilizando este enfoque.
Estoy seguro de que no somos el único equipo que lucha con este problema y me sorprende encontrar tan poco material sobre el tema.
Entonces mis preguntas son las siguientes:
- ¿Qué experiencia tiene con un software altamente personalizado, qué enfoque eligió y cómo funcionó para usted?
- ¿Qué enfoque me recomiendan y por qué? ¿Hay un mejor enfoque?
- ¿Hay algún buen libro o artículo sobre el tema que pueda recomendar?
- ¿Tiene recomendaciones específicas para nuestro entorno técnico (.NET, Entity Framework, WPF, DI)?
Editar:
Gracias por todas las sugerencias. La mayoría de las ideas coinciden con las que ya teníamos en nuestro equipo, pero es realmente útil ver la experiencia que tuvo con ellos y consejos para implementarlos mejor.
Todavía no estoy seguro de qué camino tomaremos y no estoy tomando la decisión (solo), pero transmitiré esto en mi equipo y estoy seguro de que será útil.
Por el momento, el tenor parece ser un repositorio único que utiliza varios módulos específicos del cliente. No estoy seguro de que nuestra arquitectura esté a la altura o cuánto tengamos que invertir para que encaje, por lo que algunas cosas podrían vivir en repositorios separados por un tiempo, pero creo que es la única solución a largo plazo que funcionará.
Entonces, gracias de nuevo por todas las respuestas!