Pregunta

El alcance del proyecto que estoy trabajando se está ampliando. La aplicación es bastante simple, pero actualmente se dirige a un nicho muy específico. En el futuro inmediato se me ha pedido que bifurcar el proyecto para llegar a un nuevo mercado y continuar el desarrollo de los dos proyectos en tándem.

Ambos proyectos serán funcionalmente similar por lo que es un incentivo muy fuerte para generalizar una gran parte del tripas del proyecto original. También estoy seguro de que voy a ser la orientación más mercados en un futuro próximo (los mercados son geográfica).

El problema es un mantenedores anteriores del proyecto hicieron muchas suposiciones que atan a su mercado de origen. Se va a tomar un poco de refactorización para separar el genérico del código específico de mercado.

Para hacer las cosas más complejas varias sugerencias han sido rechazado en todas partes en la forma de organizar los proyectos para el creciente número de mercados:

  1. Cada mercado es un proyecto independiente, en común entre los proyectos se mueven a una biblioteca compartida, los proyectos se implementan de forma independiente.
  2. Ampliar el proyecto existente para apuntar múltiples mercados, lo que limita la funcionalidad basada en la licencia comprada.
  3. Crear una solicitud principal y proyectos de rediseño como plugins, adquirido por separado

Las tres propuestas tienen mérito y Tu lugar ideal para estructurar el codeto ser lo suficientemente flexible que cualquiera de ellos es posible con ajustes menores. Sugerencia 3 parece ser el más desalentador ya que requeriría la construcción de una arquitectura de plugins. Las dos primeras sugerencias son un poco más plausible.

¿Hay alguna buena información disponible en los pros y los contras de estas diferentes arquitecturas?

¿Cuáles son los pros y los contras de compartir código entre proyectos versos copia y se bifurcan?

¿Fue útil?

Solución

El bifurcar por lo general se va a obtener un resultado más rápido al principio, pero casi siempre va a entrar en razón y morder en el mantenimiento - correcciones de errores y mejoras de características de un tenedor se pierden en las otras horquillas, y con el tiempo usted se encuentra lanzando cabo horquillas integrales y tener que volver a añadir sus características a la "mejor" tenedor. Evitar, si es posible.

Pasando:. Los tres de sus opciones pueden trabajar, pero tienen ventajas y desventajas en términos de complejidad de construcción, coste de mantenimiento, despliegue, sobrecarga de comunicación y la cantidad de refactorización que tiene que hacer


1. Cada mercado es un proyecto independiente

Una buena solución si va a estar desarrollando de forma simultánea para múltiples mercados.

Pros:

  • Permite a los desarrolladores para el mercado de A a romper la A a construir sin interferir con el trabajo en curso sobre B
  • Esto hace que sea mucho menos probable que un cambio realizado para el mercado Un causará un error para el mercado B

Contras:

  • Usted tiene que tomar el tiempo para separar el código compartido
  • Usted tiene que tomar el tiempo para crear compilaciones paralelas
  • Las modificaciones al código compartido ahora con más sobrecarga, ya que afectan a ambos equipos.

2. Ampliar el proyecto existente para dirigirse a múltiples mercados

Se puede hacer funcionar bien durante bastante tiempo. Si usted va a estar trabajando en lanzamientos para un mercado a la vez, con un pequeño equipo, que podría ser la mejor opción.

Pros:

  • El trabajo de licencia es probablemente valiosa de todos modos, incluso si se mueve hacia (1) o (3).
  • La base de código único permite refactorización en todos los mercados.

Contras:

  • Incluso si sólo está trabajando en algo para el mercado A, usted tiene que construir y enviar el código para los mercados B, C y D, así - está bien si usted tiene una pequeña base de código, pero cada vez más molesto a medida que se en miles de clases
  • Los cambios en uno de los riesgos de mercado rompiendo el código para otros mercados
  • Los cambios en un mercado requieren otros mercados para volver a probar

3. Crear una solicitud principal y proyectos de rediseño como plugins

Se siente técnicamente dulce, y puede permitir que comparta más código.

Pros:

  • Todas las ventajas de (1), potencialmente, más:
    • más clara separación de código compartido y específico de mercado
    • puede permitir que usted se mueva hacia una API pública, lo que permitiría la descarga de parte de su trabajo a sus clientes y / o venta de proyectos de servicio lucrativos

Contras:

  • Todos los contras de (1), más requiere aún más refactorización.

Me imagino que (2) es una especie de donde se encuentra ahora, aparte de la concesión de licencias. Creo que es bueno para alojarse allí por un tiempo, pero hacer un esfuerzo para avanzar hacia (1) - mover el código compartido en un proyecto separado, incluso si todo está construido juntos, por ejemplo, tratando de asegurarse de que las dependencias de mercado el código al código compartido están todos en un solo sentido.

Ya sea que terminan en (1) o (3) tipo de depende. En su mayoría se trata de quién está "a cargo" - el código compartido o el código específico en el mercado? La línea entre un plug-in, y una clase controlador que configura algún componente compartido, pueden ser bastante borrosa. Mi consejo sería, que el código que diga lo que necesita.

Otros consejos

1) NO! Usted no desea administrar diferentes ramas de la misma base de código ... Debido a que es tan común como el código puede ser, usted tendrá que hacer cambios radicales, y un proyecto va "por el momento" no ser tan importante como los demás y por lo que recibirá una rama creciendo más rápido que los demás .... insert bola de nieve.

2) Esto es más o menos el estándar de la industria. archivo de configuración grande, limitar las cosas basadas en la licencia / configuración. Puede hacer que la aplicación de un poco engorroso, pero siempre y cuando el código se queja cosas sobre mutuamente excluyentes y todos los desarrolladores están en comunicación constante sobre nuevas características y la forma en que ondean en toda la aplicación, se debe hacer bien. Esto también es el más fácil de cortar, si eso es una preocupación.

3) Esto también 'puede' trabajo. Si está usando C #, los plugins son relativamente simples, sólo tiene que preocuparse por el infierno de dependencia. Si los plugins tienen ninguna posibilidad de llegar a ser interdependiente circular (es decir, una requiere b requiere C requiere a), entonces esto va a explotar de forma rápida y que volverá (con bastante facilidad) de nuevo a # 2.

Los mejores recursos que tiene son, probablemente, las experiencias pasadas de sus compañeros de trabajo en diferentes proyectos, y la experiencia de las personas yammering sobre él en aquí o Slashdot o donde sea. Sin duda el más barato.

Pros de intercambio de código: Uno de los cambios cambia todo. modelo de datos unificado. Sólo hay una verdad. (Mucho más fácil para todo el mundo para estar en la misma página)

Contras de intercambio de código: Uno de los cambios cambia todo .. Tenga cuidado. Si un bicho que está en él, que afecta a todo.

Ventajas de copiar / bifurcación: Por lo general, más rápido de implementar una función específica para un cliente específico. Más rápido que cortar cuando se da cuenta de que una suposición sólo es aplicable para los mercados B y C, no D.

Contras de copia / bifurcación: Uno o más de los proyectos copiados, finalmente, se producirá un error, debido a una falta de cohesión en el código. Como se dijo más arriba: Los cambios radicales toman mucho más tiempo

.

Buena suerte.

Usted dijo que "copiar y que se bifurcan", que me lleva a pensar que tal vez usted no ha considerado la gestión de este "tenedor" como una rama en un sistema de control de versiones como SVN. Al hacerlo de esta manera, cuando la rama refactoriza para acomodar una industria diferente, puede combinar los cambios en el tronco principal con la ayuda del sistema de control de revisión.

Si usted está siguiendo una estrategia a largo plazo de avanzar a una sola aplicación en todas las variaciones son controlados por un archivo de configuración (o una base de datos de configuración SQLITE), entonces este enfoque le ayudará. Usted no tiene que fusionar nada hasta que esté seguro de que ha generalizado para ambas industrias, por lo que aún puede construir dos sistemas únicos, siempre y cuando sea necesario. Sin embargo, no se está realizando una copia a sí mismo en una esquina, ya que es todo en un solo árbol de código fuente, el tronco para la industria de la herencia, y una rama para cada nueva industria.

Si su empresa realmente quiere atack múltiples industrias, entonces no creo que la solución de base de datos de configuración para satisfacer todas sus necesidades. Usted todavía tendrá que tener módulos de código especial de algún tipo. Una arquitectura plug-in es una buena cosa que poner en porque ayudará, sobre todo si incrusta un motor de scripting como Python en su aplicación. Sin embargo, no creo que los plugins serán capaces de satisfacer todas sus necesidades de variación de código cuando usted entra en los "miles de clases" escala.

Es necesario adoptar un enfoque pragmático que le permite construir una aplicación separada hoy para la nueva industria, pero hace que sea relativamente fácil de fusionar las mejoras en la aplicación existente a medida que avanza. Nunca se puede alcanzar el nirvana de un solo tronco con miles de clases y varias industrias, pero tendrá al menos has domesticado la complejidad, y sólo tendrá que lidiar con variaciones muy importantes en caso de divergencia real en la necesidad de la industria.

Si yo estuviera en tu lugar, me gustaría también estar mirando a cualquiera y todas las características de la aplicación que podrían considerarse "información" y tratar de factorizar a cabo, tal vez incluso en un fuera de la herramienta de informes estante.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top