He estado leyendo la nota de Martin Fowler sobre Integración continua y él enumera como imprescindible "Todos se comprometen con la línea principal todos los días".
No me gusta confirmar código a menos que la sección en la que estoy trabajando esté completa y que en la práctica confirme mi código cada tres días: un día para investigar / reproducir la tarea y hacer algunos cambios preliminares, un segundo día para completar los cambios y un tercer día para escribir las pruebas y limpiarlas ^ para enviarlas. No me sentiría cómodo enviando el código antes.
Ahora, saco los cambios del repositorio y los integro localmente generalmente dos veces al día, pero no me comprometo tan a menudo a menos que pueda hacer un trabajo más pequeño.
Pregunta: ¿comprometerme todos los días es una práctica tan buena que debería cambiar mi flujo de trabajo para acomodarlo, o no es tan aconsejable?
Editar: Supongo que debería haber aclarado que quise decir "comprometerse" en el sentido de CVS (también conocido como "push"), ya que eso es probablemente lo que Fowler habría querido decir en 2006 cuando escribió esto.
^ El orden es más arbitrario y depende de la tarea, mi punto era ilustrar el lapso de tiempo y las actividades, no la secuencia exacta.
fuente
Respuestas:
No estoy de acuerdo con esta regla y estoy de acuerdo con lo que dijo Mason Wheeler . Me gustaría agregar algunas ideas.
Intento comprometerme cada vez que tengo un cambio significativo que comprometer: esto puede ser varias veces al día si reparo varios errores pequeños, o una vez a la semana si estoy trabajando en un software más grande que no puede ser usado por el resto de el código de manera significativa hasta que alcance un estado consistente.
Además, interpreto el compromiso como la publicación de una revisión significativa que aporta una nueva funcionalidad a la base del código. Creo que uno debería tratar de limpiar el código antes de comprometerse para que otros desarrolladores puedan comprender el significado y el propósito del cambio cuando miran el historial de revisiones. Cuantos menos cambios vean otros desarrolladores en el historial, mejor: cuando miro el historial de revisiones quiero ver incrementos que agreguen alguna funcionalidad significativa; No estoy interesado en cada pequeña idea que cada desarrollador tenía y quería probar antes de llegar a la solución.
Además, no creo que sea una buena idea usar el servidor SVN (o cualquier sistema de control de versiones) como un recurso de respaldo al que se compromete la instantánea actual del código (siempre que se compile): puede usar una memoria USB o una unidad USB externa o un disco de red para reflejar su código actual para que no se pierda si su computadora se descompone. El control de revisión y la copia de seguridad de datos son dos cosas diferentes. Publicar una revisión no es lo mismo que guardar una instantánea de su código.
Finalmente, creo que no debería ser un problema comprometerse de vez en cuando (es decir, solo cuando uno está realmente satisfecho con el estado actual del código) y evitar conflictos de fusión no es una buena justificación para comprometerse (demasiado) a menudo. Muchos conflictos de fusión ocurren cuando diferentes personas trabajan en los mismos archivos al mismo tiempo, lo cual es una mala práctica (ver, por ejemplo, este artículo , punto 7). Los conflictos de fusión deben reducirse dividiendo un proyecto en módulos con interfaces claras y la menor cantidad de dependencias posible, y coordinando el trabajo de los desarrolladores para que el código en el que trabajan se superponga lo menos posible.
Solo mis 2 centavos.
EDITAR
Otra razón contra las confirmaciones prematuras que se me ocurrió es que no se puede probar una versión (muy) defectuosa. Si se está comprometiendo en el tronco y su equipo de prueba está probando todos los días, es posible que no tengan una versión comprobable durante unas horas (o por un día). Incluso si no intenta corregir el error y simplemente revierte los cambios, una reconstrucción puede demorar un par de horas. Con, por ejemplo, cinco probadores trabajando en su equipo, ha perdido 5 x 2 = 10 horas del tiempo del equipo debido a la inactividad. Me sucedió una vez, así que realmente trato de evitar los commits prematuros en nombre del commit lo antes posible .
fuente
Revision control and data backup are two different things
Sí, definitivamente me siento así.Cometo código varias veces al día . Cada vez que llego a un punto donde el código está lo suficientemente completo como para compilar y no rompe otras cosas, entra.
Debe considerar dividir su trabajo para poder registrarse con seguridad algunas veces al día.
Las razones para esto son dos:
fuente
Adherirse a cualquier metodología o práctica sin comprender las razones detrás de esto nunca es una buena idea. De ahí viene la programación de culto a la carga.
Por lo tanto, "debería comprometerme todos los días porque Martin Fowler lo dijo" es una estupidez. Y a veces tampoco es práctico. Si está trabajando en una nueva característica complicada, es posible que no llegue a un punto en el que valga la pena registrarse hasta que ya haya trabajado en ella durante unos días.
Esto no significa que deba asegurarse de que todo esté perfecto antes de registrarlo. Esa es una buena manera de perder el trabajo si algo sale mal. Lo correcto es desarrollar y utilizar el buen juicio al respecto. Las reglas generales solo pueden ayudarte mucho.
fuente
Oded dio dos razones importantes para confirmar el código con la mayor frecuencia posible. Agregaré algunos más:
Mientras trabaja en su código, otros podrían necesitar algunas funciones en ese código. No deberían esperar 6 días para obtenerlo. En este caso, mis colegas generalmente crean un prototipo en mi código, lo confirman, agrego el cuerpo y lo confirmo nuevamente. Y esto generalmente se hace en unas pocas horas.
El código 'común' es para que todos vean cada cambio lo antes posible. Si el código en el que está trabajando está totalmente separado del trabajo de los demás y no los hará esperar, entonces se recomienda crear una rama para que trabaje y luego, si todo tiene éxito, combínelo para La línea principal.
fuente
Creo firmemente en cometer todos los cambios lógicos que vale la pena mantener. Comprometerse con frecuencia, y si no vale la pena mantener el código, vuelva a ponerlo en un estado limpio. Cuanto más espere para enviar / publicar su código, más difícil será implementarlo y más problemas tendrá. También recibirá comentarios sobre sus contribuciones mucho más rápido:
Los pequeños cambios son mucho más fáciles de administrar.
Además, vale la pena señalar la diferencia entre los diferentes sistemas de control de versiones. Algunos, como Git (distribuido), le permitirán confirmar y controlar su historial completo localmente, solo presionando cuando esté listo para publicar. Otros, como SVN (centralizado), combinarán los dos pasos haciendo que las pequeñas confirmaciones sean muy ineficientes.
No olvide que sus confirmaciones son esencialmente documentación de cambios. Cuando las cosas salgan mal, te alegrará tener más historia que la suficiente. Un solo compromiso por un trabajo de una semana me parece inútil. Acabo de leer cada línea de código modificada en lugar del resumen de cada fragmento lógico.
fuente
Creo que la mayoría de las respuestas aquí pierden uno de los puntos principales en la declaración de Martin Fowlers. Esto está relacionado con la integración continua . El código que no se registra (se envía / publica / combina) en la línea principal no se prueba.
Esto no debe leerse como un estímulo para comprometer cualquier código que tenga en su máquina local cada vez que sea hora de salir de la oficina. Como señalaron varios otros aquí, eso sería malo, rompería la construcción y causaría una línea principal inestable.
Sin embargo, es alentador intentar realizar los cambios en pequeños pasos que se pueden registrar en la línea principal sin causar problemas. Esto fomenta la evolución del código en lugar de desgarrarlo todo y reescribirlo.
Ahora, ¿qué tiene de bueno esta forma de trabajar?
Por supuesto, no todos los cambios se prestan a este enfoque. Como otros señalaron, ninguna regla es absoluta. Sin embargo, para los cambios que se espera que permanezcan fuera de la línea principal durante mucho tiempo, configure una línea principal alternativa con su propio esquema de integración continua y siga el mismo enfoque. Con los VCS distribuidos de hoy es algo bastante fácil de hacer.
fuente
Argumentos para registrarse todos los días:
Argumentos en contra de registrarse todos los días:
No creo que haya una buena razón para registrarse menos de un día, aparte de la pereza o la desorganización. Nada peor que ver que el código que se ejecuta en el entorno de desarrollo no coincide con el código en la rama de desarrollo porque alguien "aún no ha terminado" y, por lo tanto, no se ha registrado.
Me encantaría estar equivocado en esto, así que hágame saber cualquier argumento legítimo contra el check-in diario.
fuente
Si quiere decir "comprometerse" como "fusionarse en la línea principal", definitivamente no debería hacerlo todos los días en un proyecto de software que se lanza a los clientes. Debería fusionar los cambios que se realizan y prueban, para que la línea principal siempre funcione y se pueda liberar, y no en un estado roto con características a medio terminar.
Sin embargo, el lujo de trabajar con el control de versión distribuido de hoy en día es que ambos pueden mantener la línea principal estable y, al mismo tiempo, hacer lo mismo
git/hg/whatever commit
cada vez que sienten que desean preservar el estado de las cosas. Hago esto una vez cada pocas horas y definitivamente al final de cada día.Con DVCS, puede publicar su trabajo, colaborar en él con otros miembros de su equipo y mantenerlo actualizado con los cambios en la rama principal. Puede hacer todo esto sin contaminar la estabilidad del código del que dependen sus clientes u otros equipos.
En tiempos en que Subversion era la última tecnología y no había forma de bifurcar y fusionar ramas de características sin un dolor extremo, tener una línea principal donde varias características diferentes se encontraban en construcción simultánea podría haber sido el mejor enfoque. Pero esta superioridad no se extiende más allá de 2010.
fuente
En Team Foundation Server puede 'Shelve', que no es lo mismo que registrarse, pero solo hace una copia de seguridad de su código para que si su máquina muere no haya perdido los cambios.
También he visto casas de software que tienen una 'línea de desarrollador' y una 'línea principal'. Los desarrolladores son libres de registrarse en la línea del desarrollador cuando lo consideren conveniente y solo el líder del equipo tiene acceso a la línea principal, por lo que son responsables de copiar el código del desarrollador al principal cuando esté listo para la producción.
fuente