Mi empresa está luchando con la cuestión de las versiones de mantenimiento en comparación con las versiones "normales", en el contexto de una aplicación instalada en el sitio en grandes organizaciones que pagan por soporte. Primero permítame definir mis términos:¿Política sobre versiones de mantenimiento frente a versiones normales?
- Imagine que hemos lanzado las versiones 1.0, 1.1 y 1.2 del producto. Esto es lo que llamo "normal" lanzamientos, es decir, son el próximo lanzamiento de la rama principal de desarrollo, que incorpora todas las correcciones y mejoras de errores más recientes y mejores (posiblemente decenas de cada versión).
- Ahora imagina que un cliente importante en 1.0 informa un problema que nadie ha visto antes. El problema todavía existe en 1.2, y desafortunadamente 1.3 no estará disponible por varias semanas o meses. Así que ramificamos nuestro código en 1.0 para crear una versión 1.0.1 "maintenance", que contiene solo el cambio que soluciona el problema.
Este enfoque satisface al cliente porque solucionamos el problema en un día o así, en lugar de esperar semanas hasta la próxima versión normal. Además, dado que la versión de mantenimiento solo contiene un pequeño cambio, no necesitan pasar por un proceso extenso de UAT, mientras que si se actualizan a la siguiente versión normal, que podría tener varias versiones, recibirían quizás 30 o 40. cambios de producto que (en su opinión de aversión al riesgo) requieren una UAT extensa.
El problema es que:
- Es costoso para nosotros para crear y soportar múltiples versiones de nuestro software
- Permite stick-en-el-barro clientes caigan demasiado lejos detrás de la última versión
- Complica el proceso de actualizar eventualmente esos clientes en el futuro, ya que su instalación es sutilmente diferente de la de cada otro cliente 1.0 (la actualización de su base de datos es particularmente complicada si la versión de mantenimiento lo cambió)
Entonces, me preguntaba ¿cuál es la postura de todos los demás sobre este tema? ¿Cómo puede mantener feliz al cliente sin hacer una barra por su cuenta a través de una proliferación de versiones de mantenimiento? Por ejemplo, ¿permite que se realicen algunas categorías de arreglos como una versión de mantenimiento, pero insiste en que se hagan otros tipos en la próxima versión normal?
Aclaración: escribir software sin errores no es una solución total, porque un "problema" en el contexto anterior podría ser un cambio imprevisto en el comportamiento de un sistema externo del que depende nuestro producto.
cliente => cliente * s *, hay un error en mi respuesta :) – Graviton
Incluso con la integración continua (que sí tenemos), aún puede tener una situación en la que está a una semana o más de completar una función grande, por lo que no puede liberar la rama principal en este momento. En ese caso, ¿emitiría una versión de mantenimiento a la última versión (1.2.1 en el ejemplo anterior), no a la versión en la que se encuentran actualmente? Esto al menos reduciría la proliferación de versiones, incluso si deja al cliente tener que realizar de repente una gran cantidad de UAT si quiere una solución. –
Somos una tienda de Java, y no conozco nada equivalente a las directivas de preprocesador, pero no veo cómo funcionarían en los casos en que la característica implementada parcialmente haya hecho cambios en partes del sistema que se usan fuera de esa característica.En cualquier caso, creo que el mismo resultado (es decir, omitiendo el código recientemente aceptado) puede lograrse mediante la bifurcación desde la última versión y realizando la corrección requerida allí. –