¿Está mi empresa fusionando sucursales mal?

28

Recientemente me encontré con un artículo de MSDN sobre ramificación y fusión y SCM: Ramching and Merging Primer - Chris Birmele .

En el artículo dicen que 'big bang merge' es una combinación antipatrón:

Big Bang Merge: diferir la fusión de sucursales hasta el final del esfuerzo de desarrollo e intentar fusionar todas las sucursales simultáneamente.

Me di cuenta de que esto es muy similar a lo que mi empresa está haciendo con todas las ramas de desarrollo que se producen.

Trabajo en una empresa muy pequeña con una persona que actúa como la revisión final + autoridad de fusión de troncales. Tenemos 5 desarrolladores (incluyéndome a mí), a cada uno de nosotros se le asignará una tarea / error / proyecto por separado y cada uno se bifurcará del tronco actual (subversión) y luego realizaremos el trabajo de desarrollo en nuestra rama, probaremos los resultados, escribiremos documentación si es necesario, realice una revisión por pares y un ciclo de retroalimentación con los otros desarrolladores, y luego envíe la sucursal para su revisión + fusión en nuestro software de gestión de proyectos.

Mi jefe, la única autoridad en el repositorio de troncales, en realidad diferirá todas las revisiones de sucursales hasta un solo punto en el tiempo donde realizará revisiones tanto como sea posible, algunas ramas serán devueltas para mejoras / correcciones, algunas las ramas se fusionarán directamente en el tronco, algunas ramas serán arrojadas hacia atrás debido a conflictos, etc.

No es raro que tengamos entre 10 y 20 sucursales activas en la cola de revisión final para fusionarlas en el tronco.

También con frecuencia tenemos que resolver conflictos en la revisión final y la etapa de fusión porque dos ramas se crearon desde el mismo tronco pero modificaron el mismo código. Por lo general, evitamos esto simplemente reorganizando el tronco y volviendo a aplicar nuestros cambios y resolviendo los conflictos y luego presentando la nueva rama para su revisión (rebase del hombre pobre).

Algunas preguntas directas que tengo son:

  • ¿Estamos exhibiendo el anti-patrón que se describió como la 'fusión del Big Bang'?
  • ¿Algunos de los problemas que estamos viendo son el resultado de este proceso de fusión?
  • ¿Cómo podemos mejorar este proceso de fusión sin aumentar el cuello de botella en mi jefe?

Editar: dudo que mi jefe afloje su control sobre el repositorio de troncales, o permita que otros desarrolladores se fusionen con la troncal. No estoy seguro de cuáles son sus razones para eso, pero realmente no planeo mencionar el tema porque ha sido mencionado antes y derribado bastante rápido. Creo que simplemente no confían en nosotros, lo que no tiene sentido porque todo se rastrea de todos modos.

Cualquier otra idea de esta situación sería apreciada.

usuario6567423
fuente
2
¿Por qué se difiere la fusión? Por lo general, hay una razón para no hacerlo de inmediato. ¿Está el hombre soltero con exceso de trabajo y la cartera de pedidos se vuelve tan grande? ¿Hay alguna otra razón por la que la fusión no se realiza de manera oportuna?
Polygnome
1
Estaba en una posición similar a la tuya, varias veces. Puedo decir por experiencia personal que muchas compañías controlan las versiones, especialmente las ramificaciones, terriblemente mal.
MechMK1
3
¿Qué pasa cuando el jefe se va de vacaciones?
Liath
¿Cómo definirías la estrategia de fusión / ramificación del kernel de Linux?
Braiam
¿Los cambios que se devuelven debido a conflictos pero no a otros defectos deben pasar por el proceso de aprobación nuevamente una vez que se resuelven los conflictos o se consideran "aprobados provisionalmente"?
Gregory Nisbet

Respuestas:

60

Algunas sugerencias:

  • No hay nada de malo en tener muchas ramas de características o corrección de errores siempre que los cambios realizados en cada rama sean lo suficientemente pequeños como para que pueda manejar los conflictos de fusión resultantes de manera efectiva. Ese debería ser su criterio si su forma de trabajar está bien, no algún artículo de MSDN.

  • Cada vez que una rama se fusiona en el tronco, el tronco debe fusionarse en todas las ramas de desarrollo abiertas lo antes posible. Esto permitiría a todas las personas del equipo resolver conflictos de fusión en paralelo en su propia rama y, por lo tanto, quitarle una carga al guardián de la troncal.

  • Esto funcionaría mucho mejor si el guardián no esperara hasta que 10 sucursales estén "listas para fusionarse en el tronco" - resolver conflictos de fusión de las últimas integraciones de troncales siempre necesita algo de tiempo para el equipo, por lo que probablemente sea mejor trabajar en intervalos de tiempo entrelazados - una integración por parte del guardián, una nueva fusión por parte del equipo, la siguiente integración por parte del guardián, la próxima fusión por parte del equipo, etc.

  • Para mantener las ramas pequeñas, podría ayudar dividir las características más grandes en varias tareas más pequeñas y desarrollar cada una de esas tareas en una rama propia. Si la función no está lista para producción hasta que se implementen todas las subtareas, escóndela de la producción detrás de una función de alternancia hasta que se completen todas las subtareas.

  • Tarde o temprano, encontrará tareas de refactorización que afectan a muchos archivos en la base del código; estos tienen un alto riesgo de causar muchos conflictos de fusión con muchas ramas. Esos pueden manejarse mejor comunicándolos claramente en el equipo, y asegúrese de manejarlos exactamente como escribí anteriormente: integrándolos primero en todas las ramas de desarrollo antes de la reintegración, y dividiéndolos en sub-refactorizaciones más pequeñas.

  • Para el tamaño de su equipo actual, tener un solo portero puede funcionar. Pero si su equipo crecerá en tamaño, no hay forma de tener un segundo guardián (o más). Tenga en cuenta que no estoy sugiriendo que todos se fusionen en el tronco, pero eso no significa que solo su jefe sea capaz de hacerlo. Probablemente haya uno o dos desarrolladores senior que también podrían ser candidatos para hacer el trabajo del portero. E incluso para el tamaño de su equipo actual, un segundo guardián podría facilitar que su equipo se integre al tronco más a menudo y antes, o cuando su jefe no esté disponible.

Doc Brown
fuente
2
Creo que tiene el mejor comentario aquí, reconociendo que no podemos simplemente abrir el tronco para todos, y que nuestra pila de ramas no siempre es exactamente un problema (solo cuando entran en conflicto). Creo que hizo un buen trabajo al señalar cómo podemos reducir los conflictos y garantizar que el ciclo de fusión sea fluido, también creo que tiene toda la razón cuando dice que podríamos necesitar otro guardián. Muchas gracias por esta idea!
usuario6567423
@ user6567423 Otra cosa que quizás desee considerar es hacer ramas para cada versión de desarrollo (por ejemplo, 5.2.3 o lo que sea), que cada desarrollador puede ramificar para el trabajo de características y luego fusionarse, y que luego pueden fusionarse nuevamente en el principal liberar la rama por el jefe cuando se complete el desarrollo.
nick012000
@ nick012000: ¿esa sugerencia no dificultaría que el guardián acepte o rechace las ramas de características individuales para / contra la integración en el tronco? Quiero decir, si varias características se mezclan en una rama de desarrollo, la reintegración de esos cambios en parte en el tronco sería realmente difícil. ¿O me estoy perdiendo algo?
Doc Brown
10
" resuelven los conflictos de fusión en paralelo en su propia rama y, por lo tanto, tomen algo de carga del guardián de la cajuela " . Siento que esta parte se reduce injustamente a una nota al margen. "Es mejor para la empresa, PERO TAMBIÉN es más fácil para usted " parece ser el principal argumento de venta cuando se lo sugiere al jefe. Eso va más en la dirección política de la oficina, de lo que SE no se trata, pero en esta situación, sin la aceptación del jefe, todo lo demás en esta respuesta técnicamente excelente simplemente no sucederá.
R. Schmitz
@DocBrown Sí, lo haría, pero también significaría que tendría muchos menos conflictos entre las ramas de desarrollo y aún así le daría el grado de seguridad dado al no fusionarse directamente en la rama principal, y él simplemente puede rechace aceptar el trabajo como Listo y realice la fusión hasta que esté satisfecho con el estado del código en su conjunto.
nick012000
18

¿Estamos exhibiendo el anti-patrón que se describió como la 'fusión del Big Bang'?

Suena como eso

¿Algunos de los problemas que estamos viendo son el resultado de este proceso de fusión?

Seguro

¿Cómo podemos mejorar este proceso de fusión sin aumentar el cuello de botella en mi jefe?

En mi empresa, cada desarrollador tiene la capacidad de fusionarse. Asignamos una Solicitud de fusión a otro desarrollador, revisamos el ciclo de revisión / retroalimentación / actualización hasta que ambas partes estén satisfechas. Luego, el revisor fusiona el código.

10-20 sucursales en espera de fusionarse es una señal de que su proceso es defectuoso. Si tuviéramos tantos, todo el trabajo de desarrollo se detendría hasta que se despejara.

Mateo
fuente
1
No era la respuesta que estaba buscando porque dudo que mi jefe afloje su control sobre el repositorio de la cajuela. Sin embargo, una respuesta increíblemente útil, ¡gracias por la información!
user6567423
55
@ user6567423: Si su jefe se convierte en el cuello de botella, que ahora está de acuerdo con su descripción, tendrá que cambiar su enfoque o aceptar que él es el causante de los retrasos (de lo cual no se puede culpar a sus empleados). Negarse a cambiar su enfoque, ignorar los problemas que está creando y echar la culpa a los demás no es una forma de dirigir un negocio.
Flater
1
Él está de acuerdo en que él es el cuello de botella y ciertamente no culpa a otros por ello. Pero sí, estaba buscando algún consejo que pudiera no ser tan obvio que pudiera reducir nuestro cuello de botella. Gracias por la información
usuario6567423
1
@ user6567423 Tengo curiosidad por saber si alguna vez ha explicado por qué es el único que puede fusionarse con el tronco.
Mateo
13

Esto es esencialmente cómo funcionan muchos proyectos de código abierto, incluido el kernel de Linux, que tiene muchas más ramas en vuelo que usted en un momento dado. La forma típica de evitar las fusiones de Big Bang en estos proyectos es crear otra rama (o varias ramas) para una integración continua. Esta es la rama que usa para asegurarse de que sus cambios funcionen junto con sus colegas, y se vuelve a colocar periódicamente en el tronco cuando el guardián se encarga de hacer revisiones.

Opcionalmente, puede usar esta rama para combinar varias de sus propias solicitudes de extracción en una gran solicitud coherente para que su jefe la revise. Linus Torvalds generalmente recibe solicitudes de extracción que se han integrado en dos o más niveles de profundidad, y puede tener un tamaño del orden de, por ejemplo, un nuevo controlador de sistema de archivos completo.

Karl Bielefeldt
fuente
Gracias Creo que los consejos para combinar ramas y prevenir conflictos probablemente serán nuestro mejor curso de acción.
user6567423
8

Estoy de acuerdo con ambos Doc Brown pero también veo otro antipatrón:

Mi jefe, la única autoridad en el repositorio de troncales , en realidad diferirá todas las revisiones de sucursales hasta un solo momento en el que realizará revisiones tanto como sea posible, algunas ramas serán devueltas para mejoras / correcciones, algunas las ramas se fusionarán directamente en el tronco, algunas ramas serán arrojadas hacia atrás debido a conflictos , etc.

En mi humilde hay algunos antipatrones de gestión:

  1. Él / ella es el único punto de estrangulamiento que limita la velocidad del equipo. Su factor de bus es 1. La teoría de las restricciones dice que debe esforzarse en mejorar la parte más lenta de la cadena.
  2. Su gerente está haciendo que su ciclo de comentarios sea más lento y está reduciendo la agilidad de su equipo. ¿Puedes liberar cada semana?
  3. La complejidad de las fusiones crece exponencialmente con la cantidad de código. Es mejor hacer 10 fusiones con 100 líneas que 1 de 1000 líneas. Esa es solo una de las razones por las que deberías hacerlo lo antes posible
  4. Si detecta una falla en el tronco, lo hará a tiempo. ¿Cuál de las varias ramas fue la problemática?
  5. Las decisiones deben ser tomadas por aquellos que tienen más conocimiento sobre ellas. ¿Quién sabe más en este caso? Apuesto a que los desarrolladores que hicieron el código.
  6. No puede corregir un error en la producción si su gerente está de vacaciones.
  7. Estás rehaciendo el trabajo y lanzando ramas hacia atrás. Esto es una pérdida de tiempo. El tiempo que está esperando alcanzar la producción también es un desperdicio.

Recomendaciones

  • Su gerente necesita delegar la responsabilidad al equipo. Debes demostrar que el equipo es maduro, profesional. Dejar en claro que pueden confiar en el equipo
  • Implementar algún método de revisión. Puede ser que necesite la aprobación de otros dos miembros del equipo.
  • Puede estar usando SVN lo está haciendo más difícil. Prueba Git y mira si te ayuda. Aún más. Si usa GitHub, puede usar el mecanismo de solicitud de extracción para que una fusión requiera ciertos votos.
  • Lea y comparta información sobre prácticas ágiles, integración continua y DevOps.
Borjab
fuente
77
He trabajado profesionalmente tanto con SVN como con git, y diría que SVN definitivamente es parte del problema: obliga a una política de confirmación de fusión única en las ramas que no está presente en git. En git, todas las fusiones son iguales, en SVN, algunas son más iguales que otras. Además, la falta de commits locales hace que sea mucho más difícil experimentar con SVN que con git, y la falta de una zona de preparación solo se suma a la inflexibilidad de SVN. Hay una razón por la cual Torvalds no solo usó SVN en lugar de desarrollar git ...
cmaster
Git es mucho mejor que svn en mi opinión por las razones que @cmaster presentó y más
reggaeguitar
Estoy de acuerdo en que git probablemente resolvería algunos de nuestros problemas de fusión, y querido dios, me encantaría tener disponible un rebase. Pero no creo que hagamos el cambio pronto :(
user6567423
1
@ user6567423, hice una consulta el año pasado en la que ayudé a un pequeño equipo a pasar de svn a Git y a cambiar su flujo de trabajo, lo que incluyó capacitarlos en Git y configurarlos con la edición comunitaria de GitLab (que es de código abierto) para revisiones de código y colaboración . Estaban muy entusiasmados al respecto; fue una noche y un día de diferencia. (También tomó solo tres días.)
Comodín
2

Cuando realiza trabajos de características en ramas separadas, no puede realizar fácilmente ninguna prueba de integración hasta que una de las ramas se fusione con el tronco y se coloque en las otras ramas de características. En mi experiencia, este es el principal problema con el antipatrón Big Bang Merge. Idealmente, debería realizar un trabajo de características, probarlo en la rama de características, fusionarlo en el tronco y, en ese momento, habrá terminado con la característica. Si no se ha fusionado, debe volver a visitarlo cada vez que algo más se fusione en el tronco antes que él. El dolor de este antipatrón es que tiene muchos errores de tipo de integración que aparecen al final del ciclo de desarrollo.

bmm6o
fuente
1

Entonces tienes 20 sucursales. La rama 1 acaba de fusionarse. Luego, el desarrollador de la rama 2 tiene que fusionar la rama 1 en su rama para poder fusionarse en main sin conflicto, luego se fusiona. Luego, el desarrollador de la rama 3 tiene que fusionar la rama 1 y la rama 2 en su rama para poder fusionarse en main sin conflicto, luego se fusiona.

Ejercicio para el lector: escriba un programa que imprima mi publicación completa :-)

Esto es una locura. Pasará una increíble cantidad de tiempo fusionándose.

gnasher729
fuente
Bueno, no necesariamente, a menos que las ramas estén en conflicto, entonces él puede fusionarlas todas en el tronco sin problemas. Por lo general, intentaremos evitar cualquier conflicto haciendo una fusión de prueba antes de enviar la sucursal para su revisión, pero los conflictos surgen inevitablemente a medida que aumenta el número de sucursales en la cola. Sin embargo, estoy de acuerdo en que suena a locura.
user6567423
2
Comportamiento normal de fusión de SVN, por lo que puedo decir ...
cmaster
0

Dada la forma en que trabaja y que su jefe es un fanático del control responsable, la ramificación en sí misma parece ser el problema. En lugar de crear una rama para cada característica, haga que cada desarrollador confirme su característica en partes, directamente en el tronco. Esto pone la carga de la integración en el desarrollador en múltiples pasos más pequeños (ganar-ganar). Gate keeper puede seguir el ritmo de los cambios más pequeños durante un período más largo antes en el ciclo de desarrollo y seguir siendo el maestro revisor.

La ramificación en sí misma es algo que no desea hacer a menos que tenga una muy buena razón para hacerlo o no tenga otra opción. Eres lo suficientemente pequeño como para mantener las cosas sincronizadas más estrechamente, lo que será más fácil y seguro.

Martin Maat
fuente
1
¿Y cómo manejará el lanzamiento si solo 1 de esas características tiene un error o no está terminada a tiempo? "La ramificación en sí misma es algo que no desea hacer a menos que tenga una muy buena razón para hacerlo". Una vez que tenga 5 personas trabajando en múltiples funciones cada una, debe usar la ramificación a menos que tenga una muy buena razón para no hacerlo.
Ivo van der Veeken
Se trataba de dos cosas: el jefe quiere seguir siendo el único guardián de la puerta y no se supone que las cosas diverjan demasiado. Sí, habrá un momento en el que se presionó algo que aún debe ser examinado por el jefe. Sin embargo, debería poder hacerlo rápidamente y, en el improbable caso de que deba cumplir de inmediato, puede revertir los últimos compromisos. Esto mantendrá las cosas sincronizadas y si fallas en algo, ciertamente fracasarás rápidamente. Me parece un buen compromiso para la situación en cuestión.
Martin Maat
1
Consideraría esto como último recurso
reggaeguitar