¿Deberían los controles ser pequeños pasos o completar características?

Dos usos del control de versiones parecen dictar diferentes styles de logging.

  • centrado en la distribución : los sets de cambios generalmente reflejarán una característica completa. En general, estos checkins serán más grandes. Este estilo es más amigable para el usuario / desarrollador.

  • rollback centric : los sets de cambios serán pequeños pasos individuales para que el historial funcione como un deshacer increíblemente poderoso. En general, estos checkins serán más pequeños. Este estilo es más amigable para los desarrolladores.

Me gusta usar el control de mis versiones como un poderoso deshacer mientras que me deshago de algún código obstinado. De esta manera, no tengo miedo de hacer cambios drásticos solo para probar una posible solución. Sin embargo, esto parece darme un historial de files fragmentado con muchos checkins de "bueno, eso no funcionó".

Si, en cambio, trato de que mi set de cambios refleje características completas, pierdo el uso de mi software de control de versiones para la experimentación. Sin embargo, es mucho más fácil para los usuarios / mantenedores descubrir cómo está evolucionando el código. Lo cual tiene grandes ventajas para las revisiones de código, administración de múltiples sucursales, etc.

Entonces, ¿qué debe hacer un desarrollador? ¿Verifica pequeños pasos o completas las funciones?

La belleza de los sistemas DVCS es que puedes tener ambos , porque en un DVCS a diferencia de un CVCS, la publicación es ortogonal a la hora de realizar un commit. En un CVCS, cada confirmación se publica automáticamente, pero en un DVCS, las confirmaciones solo se publican cuando se envían.

Por lo tanto, realice pequeños pasos, pero solo publique funciones de trabajo.

Si le preocupa contaminar su historial, puede volver a escribirlo. Es posible que haya escuchado que la historia de la reescritura es mala, pero eso no es cierto: solo reescribir la historia publicada es malo, pero una vez más, dado que la publicación y la confirmación son diferentes, puede reescribir su historial no publicado antes de publicarlo.

Así es como funciona el desarrollo de Linux, por ejemplo. Linus Torvalds está muy preocupado por mantener limpia la historia. En uno de los primeros correos electrónicos sobre Git, dijo que la historia publicada no debería verse como si realmente la hubiera desarrollado, sino cómo la hubiera desarrollado, si fuera omnisciente, podría ver el futuro y nunca cometió ningún error. .

Ahora, Linux es un poco especial: tiene commits entrando a una tasa de 1 commit cada 11 minutos las 24 horas del día, los 7 días de la semana, los 365 días del año, incluidas las noches, los fines de semana, las vacaciones y los desastres naturales. Y esa tasa sigue aumentando. Imagínense cuánto más se comprometería si cada error tipográfico y cerebral produjera un compromiso, también.

Pero los desarrolladores mismos en sus repositorys privados se comprometen sin embargo a menudo lo que quieran.

Entonces, ¿qué debe hacer un desarrollador? verificando pasos pequeños o completando funciones?

Es posible get lo mejor de ambos mundos, especialmente con git y otros DVCS que te permiten ser selectivo sobre qué historial publicar. Aquí hay un flujo de trabajo simple que ilustra esto.

  • Tu proyecto tiene twigs maestras y de lanzamiento . Los desarrolladores mantienen sus propias twigs de desarrollo que no empujan.

  • Usas develop para hacer tu trabajo diario. Las asignaciones del tamaño de un bocado aparecen aquí, representando avances incrementales en el estado del proyecto a lo largo del time. Puede crear twigs topic * para trabajar en funciones más largas que abarcan más de unos pocos días o en refactorizaciones importantes. Te comprometes a desarrollar con mucha frecuencia, tal vez varias veces por hora. Es como presionar "Guardar" en un documento que está editando.

  • Cuando tenga algunas confirmaciones que sean adecuadas para la próxima versión, fusionará las confirmaciones relevantes para su publicación . lanzamiento ahora tiene un montón de compromisos individuales que se han tomado de forma selectiva de su twig de desarrollo . Te comprometes a liberar cada vez que alcanzas un buen punto de parada. Eso suele ser algunas veces al día.

  • Cuando el lanzamiento está listo para comenzar, el desarrollador líder aplasta todas las confirmaciones desde la última fusión para dominar en una sola confirmación de fusión que aparece en el maestro . Luego label este compromiso con el identificador de lanzamiento (por ejemplo, v.1.0.4). Esto ocurre con poca frecuencia, quizás una vez por iteración o cada pocas semanas.

Aquí, puedes tener tu pastel y comértelo también. Antes de la publicación, puede deshacer los cambios que no deberían haber sucedido o que no desea entrar en el lanzamiento, y puede hacerlo de uno en uno. ¡Adecuado para desarrolladores! Pero los usuarios también obtienen lo que quieren: grandes y pesimistas se comprometen con el maestro que representa lo que ha cambiado desde la última versión.

Pasos pequeños. Hay una razón por la que se llama control de revisión , y no control de lanzamiento 🙂

Comprométete tantas veces como quieras. No te contengas Nunca debe haber consecuencias negativas para la asignación de código en una twig "en progreso". Las tiendas de desarrollo que esperan comprometerse a no "romper la construcción" están haciendo un mal uso del RCS. Del mismo modo, atribuir cualquier significado a un compromiso es una política peligrosa, simplemente porque entra en conflicto con el propósito del control de revisión. El significado debería ser atribuido a tags, twigs, clones, depósitos, o lo que sea que su RCS les llame. Estas cosas tienen metadatos (quizás tan mínimos como un nombre ) diseñados para transmitir el propósito. Las revisiones son simplemente un historial de lo que ha modificado.

Lo último que desea hacer es instituir una política para desalentar a los desarrolladores de comprometer su código, por cualquier razón.

Mi recomendación sería crear una sucursal o incluso un repository separado con fines de experimentación. Luego, una vez que se completa la function, puede fusionar el código de la twig en el tronco principal del código. Con suerte, eso te permitirá tener lo mejor de ambos mundos.

Una cosa que realmente me gusta de Git es que el repository de tu desarrollador. el medio ambiente es SU repository. Es una copy del repository del mantenedor. Eres libre de hacer lo que quieras con ese repository y no marcarás el mantenedor a less que levantes algunas historias locas.

A ese punto, use la ramificación y la fusión en su beneficio tanto como pueda para ayudar en su desarrollo y experimentación. Solo aplique los cambios que le resulten más cómodos con la versión anterior. Git incluso te da la capacidad de aplastar tu historial de commit en less sets de cambios si es necesario para que puedas upload una serie de commits que realizaste en una única confirmación.

La flexibilidad es summente empoderante para su flujo de trabajo personal, así como las políticas que sus colegas tienen en su lugar.

Los pequeños pasos son realmente geniales. Siempre puede agruparlos en pasos más grandes en otro repository. Para hacer lo opuesto tienes que "reescribir el historial", lo que se puede hacer en algunos sistemas (especialmente en git), pero no está tan bien soportado como te gustaría.

Otra razón por la que me gustan los pequeños pasos es para que mis colegas puedan ver fácilmente lo que hice. Si trabajo durante tres o cuatro horas, a menudo es mucho más sensato para mí sacar media docena de confirmaciones para que mis colegas puedan ver las diferencias relevantes. (Y agradezco que me extiendan la misma cortesía).

Finalmente, los pequeños pasos hacen que sea less probable que tenga conflictos, o que cuando lo haga, serán más pequeños.

Utilizo pequeños pasos incluso cuando trabajo solo, en múltiples twigs.

Resumen: para el flujo de trabajo diario, los pasos pequeños tienen muchas ventajas. Si desea un flujo de trabajo centrado en la distribución, cree un repository y una sucursal solo para su distribución, y puede configurar sus grandes pasos allí exactamente de la manera que desee.

La mayoría de las veces puedo salirse con la siguiente regla general: verifique la cantidad más pequeña a la vez que tenga sentido (y aún así ser útil o una mejora). Encuentro que esto me ayuda a planificar mejor mi trabajo, que tiene varios beneficios que incluyen (pero no se limitan a) …

  • Mejores estimaciones de desarrollo
  • Mejores estimaciones de testing
  • Tiempo de desarrollo más rápido.
  • Menos errores en general.
  • Menos acoplamiento entre modules.
  • Averiguar antes si mi código rompió involuntariamente algo más.
  • mucho mas

Sin embargo, hay momentos en los que es necesario crear una twig y luego, cuando se termina el trabajo, se fusiona nuevamente con la línea principal. Sin embargo, una vez que estoy operando en la sucursal, sigo intentando seguir la regla, ya que renuncia automágicamente a todos esos beneficios.

Espero que esto ayude.