version control - with - Revisión de Código vs. Check In a menudo?
what''s git (14)
¿No hay código o no hay código en el enlace sin revisión? Creo que usar bifurcaciones (¡afortunadamente no está usando VSS!) Podría funcionar: es decir, solo los cambios de troncales necesitan una revisión por pares.
Siguiendo el artículo de Jeff sobre el check-in a menudo , algunos comentaristas no pudieron resistirse a escupir "¡Bienvenido a la tierra obvia!" tipo de comentarios. Eso es comprensible, en la mayoría de las situaciones es obvio que el check-in tan pronto como se termine algo antes de pasar a la siguiente función es el camino a seguir.
Pero, ¿qué pasa con los lugares con políticas de revisión de código obligatorias fuertemente obligadas? Pedirle a un compañero de trabajo una revisión cada 30 minutos es un asesino de productividad.
Me interesaría una solución, o al menos un posible compromiso que nos permita hacer ambas cosas sin afectar la productividad del equipo.
¿Qué tal si emparejas el programa? Entonces la teoría es que no necesitará una revisión por pares. La programación de pares es la revisión por pares
Algunos sistemas de control de revisión lo hacen fácil (aquellos con una estrategia descentralizada). He experimentado con el uso de varias capas intermedias locales en un servidor de subversión de la compañía.
Utilicé svk para mantener un repositorio de subversión local al que me pueda comprometer a menudo, luego envío cambios (individualmente o como una única confirmación combinada) al repositorio principal.
svk mirror
svk pull
svk push
Esto funciona bastante bien, pero el desarrollo en svk parece ser esporádico.
Empecé a probar lo mismo usando git . He hecho un clon local, pero todavía tengo que ser lo suficientemente valiente como para intentar impulsar las confirmaciones locales. Estoy seguro de que es posible sin embargo.
git svn clone
git svn fetch
git svn dcommit
Con este repositorio privado y local, puede hacer todo lo que quiera y luego agrupar o seleccionar cuidadosamente los cambios para enviarlos al repositorio principal. (O cree un parche que pueda ser revisado por pares).
Lo mejor de ambos mundos, tal vez? No es probable que estas herramientas alternativas de control de revisiones ganen tracción en el trabajo, pero son realmente útiles para las confirmaciones locales o para poder comprometerse cuando el repositorio de trabajo es inaccesible (estoy fuera de línea, viajando, etc.) y aún así sincronizar con el repositorio padre.
Depende de la estrategia de ramificación que use. Si su repositorio está trabajando en la bifurcación de la versión, el tronco está destinado a ser inestable, pero tal vez su política provenga de alguna experiencia realmente mala en el pasado. Si está realizando una bifurcación de funciones, puede tener una regla que diga que no se fusione nuevamente al enlace troncal sin revisión por pares. Hacer diffs en ese punto debería ser bastante eficiente para revisar con un colega y debería eliminar el cuello de botella.
Pero cambiar tu estrategia de ramificación no es poca cosa. Buena pregunta...
En la mayoría de los casos, lo que está en el control de la fuente no es lo que se va a liberar inminentemente al cliente. Por lo tanto, realizaría las revisiones una vez que se haya registrado la función completa, lo que le permitirá editar y / o retrotraer según sea necesario más adelante.
Eso es una tontería. Incluso si requiere la revisión del código no significa que no se pueda registrar. ¡Para eso sirve el control del código fuente! Especialmente si la revisión tiene un cuello de botella, el procesamiento por lotes es el único camino a seguir.
Hacemos revisiones de código en un nivel de historia (tienda ágil aquí) así que una vez que haya terminado una tarea relacionada con una historia, haga una revisión de código y luego regístrese.
Hay muchas buenas respuestas. La mayoría tiende a proponer una rama de características para cada desarrollador que requiera una revisión para fusionarse en el enlace troncal. Sin embargo, esto reduce el control de la fuente a una tecnología de respaldo en lugar de algo que hace que los códigos entre varios programadores se puedan compartir fácilmente tan pronto como se escriben.
Como mencionó flubba, la mejor solución probablemente requeriría cambiar la estrategia de bifurcación a la más apropiada para el equipo, pero me temo que la inercia en nuestra compañía es tan fuerte que esto me exigirá gastar muchos puntos de influencia, probablemente sin éxito. .
Haré mi mejor esfuerzo.
Mi compañía sigue procesos algo dispares entre divisiones. Uno de ellos (que recientemente me fui) adoptó la programación de los pares y los comentarios de los comentarios dicen que el código fue "revisado por pares". Sin embargo, el producto en el que se está trabajando es algo maduro y el proceso de desarrollo puede tolerar una productividad más lenta.
La división en la que actualmente trabajo sigue al check-in temprano, el modelo de check-in a menudo. Estamos desarrollando un nuevo producto con relativamente pocos ingenieros. Cada uno de nosotros monitorea el check-in a través de notificaciones por correo electrónico y revisa las partes interesantes de forma ad-hoc. Sin embargo, mi equipo actual está bastante experimentado y creo que podemos escapar sin revisiones formales debido a la calidad de los ingenieros que trabajan en el proyecto.
Para responder a su pregunta, como sugirió el afiche anterior, la programación de pares es probablemente el mejor compromiso. Personalmente, prefiero reunir un buen equipo y dejar que ingresen el código lo más rápido posible. (En mi opinión, el "sin código en el repositorio sin revisión" es un intento de la gerencia para aumentar la calidad sin contratar ingenieros de calidad. Por favor, tómenlo con un grano de sal, estoy un poco hastiado por mi empleador actual. )
No sé si hay una solución a tu problema. Para mí, parece que tu situación cae en el campo de concentración agil. Parece que su productividad ya está paralizada si ni siquiera puede registrar (por ejemplo) un cheque nulo para arreglar un bloqueo sin que alguien lo mire por usted.
No todos los sistemas de control de fuentes lo facilitan, pero he utilizado este proceso cuando trabajo en un proyecto grande:
- Cada desarrollador obtiene su propia transmisión.
- Los desarrolladores entregan funciones completadas de su transmisión a una secuencia de integración principal después de la revisión del código.
- Los desarrolladores actualizan su flujo de la secuencia de integración con frecuencia.
El uso de transmisiones de desarrollador significa que los desarrolladores pueden permanecer visibles y tener copias de seguridad de su trabajo en el sistema. Es relativamente fácil colaborar con alguien más; simplemente pueden consultar su transmisión. Al crear una nueva rama de desarrollador por función / defecto, puede aislar los cambios con bastante facilidad: digamos que debe dejar de trabajar en una nueva función para solucionar un error urgente.
Prefiero mantener un tronco y una rama estables para los lanzamientos, volviendo a unirme al tronco después de la producción. Las etiquetas se usan para indicar la disponibilidad del código y PODRÍAN emparejarse con una estrategia de revisión de código. Las versiones de SIT / UAT obtienen su propia etiqueta especial.
En el equipo en el que actualmente soy parte, solo 3 de nosotros escribimos, por lo que las evaluaciones entre pares son constantes y brutalmente entretenidas, educativas y honestas. No soy alguien que se apegue emocionalmente al código que he escrito, así que me encanta una buena reseña. He aprendido mucho en un corto período de tiempo de ellos. Dicho esto, no son necesarios; en cierto modo suceden orgánicamente.
Si se requieren evaluaciones por pares, no hay razón para suspender los registros. Simplemente haga una etiqueta que indique que la revisión ha tenido lugar y que sea responsabilidad del revisor aplicar esa etiqueta al código una vez que haya pasado la revisión.
@Coincoin: no estoy de acuerdo en que las sucursales individuales reduzcan el control de la fuente a una tecnología de respaldo. Creo que las copias de seguridad son una de las razones para usar el control de fuente, pero hay más valor del control de fuente en una rama individual:
- Puedo hacer pequeños pasos, documentarlos cuidadosamente mientras voy, incluso si no están listos para el horario de máxima audiencia.
- Comprender cómo llegamos aquí es posible, especialmente cuando los pasos son muy pequeños.
- Al observar los cambios desde la sucursal compartida, puede ver los grandes pasos, luego acceder a la sucursal individual para ver los pequeños pasos que llegaron allí.
Aún así, la regla de "si no está comprometida, no existe" todavía se cumple, y es más generalizada: "si no está comprometida / fusionada a la rama compartida, no existe".
Estoy de acuerdo con aquellos que dicen que el check-in a menudo es una gran práctica, y que la programación de pares es la solución para eliminar la latencia de las revisiones de código.
Tratando de resumir las respuestas, es posible:
utilice una estrategia de ramificación adecuada en cualquier SVC:
- caja personal de caja
- checkin a menudo
- revise todos los cambios
- fusionar todo el código revisado de nuevo en el tronco (ver este ejemplo )
pros: SVC neutral
Corns: la fusión puede ser dolorosa en algunas implementaciones de SVC (buena visión general de la opinión de Linus Torwald ). La rama personal debe estar sincronizada con los cambios en el tronco.
- use métodos específicos de SVC:
SVC distribuido
- crear una copia local "rama de desarrollador"
- checkin a menudo al repositorio local
- exponer a público (para revisión) feature-complete changesets
- fusionar los cambios revisados al repositorio remoto
pros: beneficio de SVC incluso fuera de línea, escalas bien.
callos: gran curva de aprendizaje, es fácil olvidar algunas líneas de comandos si no se usan a diario.
- SVC centralizado con la función apropiada de "etiqueta". Vea esta discusión y este resumen - puede necesitar alguna aclaración
Por cierto, ¿no deberíamos considerar hacer una respuesta agregada todo el tiempo? tnx.