¿Qué sucede si la administración pospone una característica fusionada con el desarrollo?

53

Recientemente tuvimos un problema por el cual la administración pospuso una función para nuestra aplicación web (registro automático) porque sentían que el inicio era demasiado "frío", pero querían que todas las otras funciones en las que habíamos estado trabajando se activaran.

El problema es que esta funcionalidad se había fusionado para desarrollarse cuando se terminó junto con todas las otras características que esperábamos lanzar en vivo en la próxima versión, por lo que no podríamos fusionar dev -> test -> master como solemos hacer.

¿Cómo podríamos haber evitado este problema?

Steve
fuente
Dependiendo de su punto de vista sobre cómo quiere resolver eso, esta pregunta es más adecuada para el lugar de trabajo, si no está buscando una solución técnica.
Malavos

Respuestas:

74

Un enfoque es la característica que lo marca. Puede vivir en la base del código pero puede estar deshabilitado por la configuración.

Otra opción es realizar una confirmación de reversión que revierte la fusión de características para que ya no esté en desarrollo. Se puede crear una nueva rama que revierte la reversión, y se deja pendiente para fusionarse más tarde. Si está utilizando solicitudes de extracción de Github, puede hacerlo fácilmente con el botón "revertir fusión" en una solicitud de extracción fusionada.

Daenyth
fuente
99
¿El marcado de configuración no implica una duplicación del esfuerzo de prueba para ese código? Tienes que probar ambos caminos.
16
En este caso, dado que no activará esa bandera en producción, puede probar el caso apagado ahora para el lanzamiento, luego probar el caso encendido cuando esté listo para ir a la producción. Eso debería ser aproximadamente el mismo trabajo que probar una reversión y un nuevo compromiso.
Alan Shutko
44
El término común es alternar funciones . Si hay un pequeño "punto de entrada de características", esto probablemente se puede hacer después de la decisión de gestión. Si no, uno tendrá problemas con este método, así como con cualquier método también.
Doc Brown
3
Tenemos características que están en desarrollo durante más de 6 meses que están ocultas Feature Toggling, como lo llamó Doc Brown. Esto también nos permite probar la característica (o ausencia de ella) en entornos que no son de producción. A veces, estas funciones se suman a las funciones existentes, en cuyo caso deberíamos realizar pruebas unitarias para el conjunto de funciones antiguo y nuevo. Cada prueba unitaria solo establecería el indicador a lo que sea necesario para hacer la prueba actual.
ps2goat
25

¿Cómo podríamos haber evitado este problema?

Desde la perspectiva del proceso, descubra:

  • ¿Quién tomó la decisión de comenzar este trabajo?
  • ¿Por qué cambió la decisión de lanzar esta función?
    • Expectativas perdidas?
    • Falta de comunicación?
    • ¿Soporte comercial inadecuado?
    • ¿Sin participación del cliente?

Es más que probable que haya caídas en la comunicación en el camino. Es importante tener esto porque cuando no funciona, su (s) proceso (s) de desarrollo se basarán en interpretaciones falsas e incorrectas de los requisitos comerciales.

Enderland
fuente
99
+10. Tan pronto como la gerencia comenzó a dudar del lanzamiento de la característica, deberían haber informado a los desarrolladores, de modo que la posible eliminación podría haberse tenido en cuenta al decidir fusionar la característica en el desarrollo.
Bart van Ingen Schenau
14
Esta no es una respuesta muy constructiva: a veces las cosas van de lado por todo tipo de razones. Claro, descubrir que no debe fusionarse más temprano que tarde es importante, pero eso no significa que eventualmente se eliminará una característica en el último minuto. Tal vez los cambios de contrato, tal vez su cliente no paga, tal vez cuestiones legales aparecerá .. usted todavía tiene que manejar el problema en lugar de señalar con el dedo de la culpa
gbjbaanb
11
Si hay personas en su organización que son lo suficientemente poderosas como para negarse a admitir fallas, y también lo suficientemente infantil como para no desear evitar fallas, entonces aún debe tener problemas post mortem para su propia información. Simplemente no quiere decirles (o escribirlo demasiado explícitamente). Dicho esto, enderland no usa la palabra "culpa", y si la organización interpreta este consejo como "averiguar quién tiene la culpa", entonces eso es en sí mismo un problema para que la organización trabaje. Todo lo que dice es "entender por qué ocurrió el problema", que es esencial para evitarlo en el futuro.
Steve Jessop
2
Estoy completamente de acuerdo, este es un error de gestión, no uno de desarrollador.
durron597
3
@enderland mi punto es que no puede evitar algunos problemas, por lo que debe considerar cómo reparar la situación. Con suerte, no llegará tan lejos muy a menudo, pero es probable que suceda tarde o temprano, así que planifique en consecuencia.
gbjbaanb
19

Olvídese por un momento del problema con su administración, e imagine que ya tenía la "función de registro automático" en su última versión de producción, profundamente integrada en su base de código. Ahora tiene el nuevo requisito de agregar un "interruptor de apagado" para el "registro automático". ¿Cómo manejarías esto en tu flujo de trabajo de Git?

Supongo que declararía "deshabilitar el registro automático por configuración" simplemente como una característica adicional (es solo una forma de alternancia de funciones ), por lo que esto debería integrarse sin problemas en su flujo de trabajo. Puede estimar el esfuerzo, si lo desea puede usar una rama de características para ello (o no, si no usa ramas de características para tales problemas). Y definitivamente puede usar el flujo habitual "fusionar dev -> prueba -> maestro" que describió.

Y esa es realmente la forma en que puede manejar esto en su situación actual. Desde el punto de vista del flujo de trabajo de git, no debería importar si la solicitud de cambio proviene de la administración para la versión 1.0, o si la solicitud de cambio es un nuevo deseo del cliente para la versión 2.0.

Doc Brown
fuente
Fowler tiene una salida realmente buena, pero no puedo admitir este método para la introducción de funciones. El esfuerzo coordinado para tales interruptores parece una carga innecesaria. Yo puedo apoyar la adición alterna de función para quitar características después de la fusión, pero la construcción de un interruptor como parte del requisito hace sentir incómoda.
Gusdor
@Gusdor: mira mi edición.
Doc Brown
1

Este es el problema exacto que tengo con gitflow y el flujo de GitHub, y parece que con las aplicaciones web esto sucede a menudo, o más como la norma. Parece que resolvería este problema retroactivamente (mencionado anteriormente) o proactivamente (ejemplo a continuación).

He creado 'ramas de paquete' además de las ramas estándar de gitflow. El paquete consta de todas las características que están listas para uat / qa. Se crea una lista de características uat / qa. Estos se fusionan en el paquete temporal, y ese paquete se implementa en uat / qa. Cualquier corrección de errores ocurre en la rama de características original, y eso se vuelve a integrar en el paquete y se implementa. Esto separa la próxima versión y permite probar esas características juntas antes de que encuentren su camino hacia la rama de desarrollo. Las ramas aprobadas obtienen una solicitud de extracción para desarrollar, siguiendo el proceso de gitflow. Las funciones listas para prueba se pueden agregar o eliminar de la rama de paquete temporal y volver a implementar.

  • Esto mantiene al maestro siempre reflejando el estado listo para producción (puede automatizarse con gancho)
  • El desarrollo siempre refleja el último candidato de lanzamiento entregado (y probado)

Los contras incluyen administrar la lista de paquetes y agregar otro tipo de rama; Sin embargo, además de la solución retro, que creo que es demasiado tarde, esta parece ser la solución más viable.

Con un complemento de GUI, podría ser óptimo marcar las ramas de características por implementación de paquete, teniendo en cuenta la automatización.

David Latty
fuente