¿Deberían sus mejores programadores tener que verificar el código de todos los demás en el control de fuente?


29

Una de las diferencias entre svn y git es la capacidad de controlar el acceso al repositorio. ¡Es difícil comparar los dos porque hay una diferencia de perspectiva sobre quién debería poder realizar cambios!

Esta pregunta trata sobre el uso de git como un repositorio centralizado para un equipo en una empresa en algún lugar. Suponga que los miembros del equipo tienen diferentes niveles de habilidad, como lo son en la mayoría de las empresas.

Git parece suponer que solo sus mejores programadores (los más productivos y experimentados) son de confianza para verificar el código. Si ese es el caso, se está tomando el tiempo de escribir el código para revisar el código de otras personas con el fin de registrarlo. ¿Vale la pena? Realmente quiero enfocar esta pregunta en cuál es el mejor uso del tiempo de su mejor programador, no en las mejores prácticas de control de versiones en general . Un corolario podría ser: ¿renuncian los buenos programadores si una parte importante de su trabajo es revisar el código de otras personas? Creo que ambas preguntas se reducen a: ¿vale la pena el examen de la productividad?


55
Definir "mejor programador"? ¿Mejor en qué? Siguiendo reglas arbitrarias? Cranking código? ¿Escribir código de defecto cero?
Timo Geusch

3
Lo siento, todavía estoy tratando de entender el concepto de revisar código no controlado (es decir, no registrado) ... seguramente uno de los beneficios clave de usar un SCS es que la revisión se puede hacer contra un control conocido / controlado iteración del código?
Andrew

2
@Andrew con gitcualquier desarrollador puede tener su propio repositorio (en su computadora personal) y un repositorio personal público (el que está en un servidor, detrás apache) al que solo puede agregar cambios. La diferencia es que solo el repositorio principal de desarrolladores es el "bendecido", del que todos deberían pagar. El código de pago principal de los repositorios públicos del desarrollador y los combina con su repositorio público. Ambos tienen iteración conocida / controlada, así como control de origen en todo momento.
Hubert Kario

32
"Git parece suponer que solo sus mejores programadores (más productivos y experimentados) son confiables para verificar el código" es una presunción incorrecta. Git se puede configurar como quieras. El modelo de "solicitud de extracción" es solo unidireccional: ideal para proyectos de código abierto con un gran número potencial de contribuyentes desconocidos. En la mayoría de los entornos comerciales, el modelo de "solicitud de extracción" sería una bandera roja, que indica procesos y procedimientos deficientes de SDLC y QC.
mattnz

44
Creo que @mattnz es correcto aquí. Esto es solo el resultado de una fuerte influencia de código abierto en git donde hay un equipo de desarrollo central que controla el estado del repositorio, pero otros también pueden contribuir.
Steven Evers

Respuestas:


53

Dado que no está claro en su pregunta, solo quiero señalar que un flujo de trabajo de gatekeeper no es necesario con git. Es popular entre los proyectos de código abierto debido a la gran cantidad de colaboradores no confiables, pero no tiene tanto sentido dentro de una organización. Tiene la opción de dar acceso push a todos si lo desea.

Lo que la gente descuida en este análisis es que los buenos programadores pasan mucho tiempo lidiando con el código roto de otros programadores de todos modos. Si todos tienen acceso push, entonces la construcción se romperá, y los mejores programadores tienden a ser los que con frecuencia integran y rastrean a los culpables cuando las cosas se rompen.

Lo que pasa cuando todos tienen acceso push es que cuando algo se rompe, todos los que tiran obtienen una construcción rota hasta que se revierte o repara el compromiso ofensivo. Con un flujo de trabajo de gatekeeper, solo se ve afectado el gatekeeper. En otras palabras, solo afecta a uno de sus mejores programadores en lugar de a todos.

Podría resultar que la calidad de su código es bastante alta y la relación costo-beneficio de un controlador de acceso todavía no lo vale, pero no descuide los costos familiares. El hecho de que esté acostumbrado a esa pérdida de productividad no significa que no se incurra.

Además, no olvide explorar opciones híbridas. Con git es muy fácil configurar un repositorio al que cualquiera pueda presionar, y luego tener un guardián como un desarrollador senior, un probador o incluso un servidor de integración continua automatizada decidir si un cambio lo convierte en un segundo repositorio más estable y cuándo. De esa manera puedes obtener lo mejor de ambos mundos.


10
+1: Para ... Los buenos programadores pasan mucho tiempo lidiando con el código roto de otros programadores de todos modos.
Jim G.

3
+1 La mejor respuesta. Especialmente señalando que un desarrollador que comete un error de creación de bloques afecta negativamente a todos.
Evan Plaice

En esa situación, resultó que los dos mejores programadores se utilizaron a tiempo completo para revisar y corregir el código de otras personas. Seguro que la calidad del código en el VCS era buena, pero la moral de estos dos disminuyó más rápido que una descarga de inodoro. Lo que comenzó como una idea aparentemente buena se convirtió en una pesadilla cuando estos dos salieron corriendo a lugares donde podían realizar, por ejemplo, tareas más creativas.
Newtopian

1
Ese es un buen punto, @Newtopian. Los lugares donde he visto este éxito tienen más de un modelo de microservicio, y solo un equipo de scrum tiene acceso a cualquier microservicio dado, pero la responsabilidad se extiende por todo el sistema. Si no tiene al menos un par de programadores experimentados por equipo scrum, sus prácticas de contratación deben mejorar.
Karl Bielefeldt

40

He trabajado en un trabajo donde los registros se limitaron solo a los líderes del equipo (y los líderes del equipo no pudieron registrar su propio código). Esto sirvió como nuestro mecanismo para hacer cumplir las revisiones de código, en gran parte debido a una serie de incidentes en los que se cometieron malas confirmaciones en la base de código incluso alrededor de registros cerrados y análisis estático.

Por un lado, hizo su trabajo. Se encontraron varias confirmaciones erróneas antes de ingresar a la base de código (y se olvidaron de inmediato durante una semana más o menos hasta que alguien se topó con ellas). Esto causó menos interrupciones en la base de código. Además, podría retrasar algunas cosas de formato / estructura antes de que se convirtieran en deuda tecnológica; atrapar algunos errores antes de que se conviertan en errores. Y me dio una gran sensación de lo que estaba haciendo mi equipo.

Por otro lado, me hizo entrar espontáneamente en rabia asesina cuando mi cambio de 3 líneas tardó 4 horas en comprometerse debido a que tenía que rastrear otra pista y hacer que cometieran el compromiso. Me empujó a hacer confirmaciones mucho menos frecuentes que las mejores prácticas, y ocasionalmente ocasionó problemas al tratar de rastrear los cambios en el desarrollador que los realizó.

Generalmente no lo recomendaría, excepto en los entornos más necesitados. Hacer las revisiones y los compromisos no fue tan malo en realidad. Sin embargo, tener mi propio proceso dependiente de los caprichos de los demás fue exasperante. Si no puede confiar en que sus desarrolladores verifiquen el código, obtenga mejores desarrolladores.


8
@HubertKario: si sus mejores desarrolladores pasan tiempo haciendo revisiones de código y el resto se bloquea de manera efectiva hasta que se complete, no veo demasiada diferencia práctica.
Telastyn

66
¿Cómo se bloquean? Crea un parche (confirmación local), lo envía en sentido ascendente y sigue trabajando en un nuevo widget (crea nuevas confirmaciones locales). Si su cambio se aplica literalmente, solo necesita finalizar la compra y fusionar el repositorio del cliente potencial. Si no se aplicó literalmente, aún puede cambiar el nombre de su trabajo posterior. Si el cambio es realmente crítico, puede publicarlo en su propio repositorio público y decirle a la gente que lo revise desde allí o simplemente enviarles parches. En este caso git, detectará que ya se realizó un cambio y simplemente omitirá la aplicación del parche ascendente específico.
Hubert Kario

9
La última línea en esta pregunta es realmente el punto completo en mis ojos. Un desarrollador en el que no se confía será ineficaz en el mejor de los casos y detestará su trabajo en el peor. No contrates personas en las que no confiarás. De todos modos, está desperdiciando dinero inútilmente en personas a las que no permitirás hacer el trabajo por el que les estás pagando.
Jimmy Hoffa

1
@HubertKario: sabes mejor que yo. El entorno en el que me encontraba hacía que fuera molesto hacer malabares con las diferentes ramas / conjuntos de cambios.
Telastyn

55
@Telastyn No sé si se supone que debo interpretar tu respuesta tan literalmente como lo hice, pero otra desventaja sería que el historial de anotaciones / culpas estaría mal. Si encontraste algún código que no entendías, terminarías preguntándole al revisor que lo cometió, no al programador que lo escribió.
Daniel Kaplan

28

No. Cualquiera debería poder comprometerse.

Si tiene problemas con errores cometidos, no es la política de control de la fuente lo que está mal. Son los desarrolladores los que no se aseguran de que lo que él / ella comete funcione. Entonces, lo que debe hacer es definir pautas claras sobre qué comprometerse y cuándo.

Otra gran cosa se llama pruebas unitarias;)

Sin embargo, hay una alternativa.

a) Si utiliza el control de versión distribuido, puede crear repositorios principales en los que solo se pueden realizar solicitudes de extracción. De esa manera, todos los desarrolladores pueden obtener versiones de su propio código mientras usted obtiene el control de la rama principal.

b) En Subversion y similares, puede usar ramas donde cada desarrollador tiene que crear parches para llevarlo a la rama principal.


1
Esta. Si se compromete sin pruebas de unidad y construcción, tener un requisito de revisión de código es un vendaje imperfecto.
Brian Knoblauch

sí. Por eso mencioné las alternativas. Revisiones de código es mejor que nada. No poder versionar el código es un dolor al que ningún desarrollador debe estar expuesto.
jgauffin

2
Las pruebas unitarias no ayudan si están escritas con el mismo <inserte aquí sus 4 letras favoritas> como el código de la unidad.
ott--

@BrianKnoblauch: se podría argumentar que lo contrario también es cierto. Idealmente, deberías tener ambos.
Doc Brown

@ ott-- Acabo de escuchar una historia sobre un desarrollador que se fue después de cometer un horrible desastre y comentar todos los Afirmaciones en las pruebas de su unidad. Las pruebas tienen éxito por defecto, ¡así que tardó un tiempo en notar el problema!
Alex

8

Debería echar un vistazo a proyectos como Gerrit, que permite a todos los desarrolladores insertar su código en la rama de 'revisión' y una vez que los desarrolladores principales / líderes estén contentos con estos cambios, pueden llevarlos a master / release.

Si no están contentos, pueden dejar comentarios junto a una línea de código, solicitar un parche actualizado, etc.

De esta manera, cualquier persona con un cambio pendiente puede sacarlo tan pronto como esté listo y solo las personas calificadas (con los privilegios de +2 correctos en Gerrit) podrán enviar ese código a prueba y luego a producción.


2
Utilizamos gerrit con gran éxito. Resuelve todos los problemas con los que el OP tiene un problema e incluso algunos que no sabe que tiene.
mattnz

8

No, es un mal uso de tu mejor talento. Imagine una compañía editorial que toma a sus autores más exitosos y les hace editar; mala idea.

Debería haber revisiones de código, pero eso no significa que siempre sea un Sr. revisando el código de un jr. Eventualmente, se debe esperar que todos en el equipo lleguen al nivel en el que puedan contribuir con código con una orientación mínima. Pasan por los tres niveles de confianza:

  1. Ninguno: quiero ver cada línea de código antes de que lo registres.
  2. Algunos: déjame saber lo que estás haciendo y te enviaré comentarios
  3. La mayoría: vaya a hacer su trabajo y solo pida ayuda cuando sea necesario.

Ventajas de liberar tu talento:

  • centrarse en el diseño
  • participación en el establecimiento de estándares de codificación y estrategias de aplicación (sin hacerlo manualmente todos ellos)
  • abordar los difíciles problemas de codificación
  • Proporcionar tutoría (sin haber aprobado cada línea de código)

Hay desarrolladores interesados ​​en una ruta de administración que prefieren no codificar todo el día; deja a los demás solos.


1
+1. Deje que el equipo revise al equipo: tanto el revisor como el revisado pueden obtener ganancias, incluso si el revisor tiene menos experiencia que el revisado. Y puede hacer toda la revisión DESPUÉS del check-in. En mi opinión, si evita que las personas se registren, su productividad disminuirá (a pesar de su motivación).
Andy

5

¿Vale la pena el comentario sobre la productividad?

Depende del "equilibrio" del equipo y de cómo se configuran las revisiones. Ambos son asuntos de gestión y trabajo en equipo, ninguna cantidad de magia tecnológica de control de versiones (centralizada o distribuida) puede tener una influencia sustancial en eso.

Si se hace mal , el impacto en la productividad, por supuesto, matará cualquier beneficio de la revisión; Sin embargo, la respuesta no es descartar la idea de las revisiones, sino descubrir cómo hacerlo correctamente .

Un enfoque para averiguar si sus comentarios están bien es utilizar la herramienta de seguimiento de problemas para rastrear el tiempo dedicado a las revisiones (algunas herramientas de revisión de código también lo permiten). Si descubre que las revisiones están tomando bastante tiempo, invierta un poco de esfuerzo para encontrar las razones y las formas de mejorar las cosas. Además, no estaría de más tener una relación 1: 1 regular con los miembros del equipo para descubrir posibles problemas con las revisiones de código.


Si los "mejores" programadores del equipo se ven obligados a pasar horas cavando en la basura incomprensible producida por los codificadores de mierda, la solución es despedir a los fabricantes de basura, no recurrir a la tecnología VCS.

  • En uno de los proyectos anteriores, me asignaron revisar los cambios de código realizados por un miembro del equipo con un rendimiento inferior permanente, en un componente que tardó casi una hora en crear y ejecutar pruebas. Comencé a leer los diferenciales y cuando noté un cambio no disponible, simplemente terminé la revisión, publiqué los comentarios necesarios y le pedí a la gerencia que se asegurara de que las solicitudes de revisión adicionales reciban una confirmación por escrito de que su código se compila. No hubo "solicitudes de revisión" desde entonces y pronto se fue.

Por otro lado, cuando el equipo está razonablemente equilibrado, las revisiones de código son divertidas y educativas. En mi proyecto anterior, teníamos un requisito para la revisión del código al 100% y no tomó mucho tiempo ni fue una distracción. Se descubrieron errores a través de la revisión, y hubo debates sobre el estilo de codificación y las opciones de diseño, pero eso se sintió simplemente ... normal .


Si los cambios en el código se bloquean durante días ... semanas desde el control de calidad para la prueba "debido a las revisiones", estudiar los trucos de VCS sería la forma menos probable de resolver este problema. En cambio, uno centraría mejor su esfuerzo en descubrir problemas en la forma en que se organiza el proceso de revisión.

  • - Oh, la integración de este cambio se retrasó mucho porque el crítico se enfermó repentinamente, qué desgracia.
    - ¡Hola! Diablos, ¿alguna vez pensaste en tener revisores de respaldo para tratar casos como ese?

4

Sí. Pero solo si está hablando del control de fuente distribuida. Con centralizado, depende.

Si solo hay pocos programadores, lleva poco tiempo. Ciertamente menos que las correcciones que se necesitarán para eliminar errores y deudas técnicas más adelante.

Si hay muchos programadores, puede delegar la tarea de revisión de código real a los tenientes y hacer que el desarrollador principal realice sus cambios (casi) sin lugar a dudas. Funciona para el kernel de Linux, no creo que haya proyectos de software más grandes ...

Nuevamente, si el proyecto es pequeño, el líder verá rápidamente quién da un buen código y quién produce un mal código. Rápidamente verá que J.Random escribe un código bueno que solo necesita verificar las decisiones arquitectónicas, mientras que el interno escribe un código malo que debe revisarse línea por línea antes de fusionarse. La retroalimentación generada de esta manera reducirá la carga de mantenimiento en el futuro y brindará experiencia de primera mano sobre lo que el pasante realmente aprenda y deba mantenerse en compañía. Obtener y fusionar una rama de otro gitrepositorio lleva literalmente una (dos) docenas de segundos, por lo general, leer los títulos de los mensajes de confirmación llevará más tiempo, por lo que después de saber en quién se puede confiar para escribir un buen código, fusionar el código de otras personas no es un problema.


2

La revisión de código no requiere necesariamente la atención de sus mejores programadores. En mi opinión, debería ser algo informal. Solo una segunda opinión o un segundo par de ojos en un código de un no novato antes de que se registre en producción. Ayuda a mitigar los descuidos importantes, al tiempo que ayuda a las personas a mejorar la codificación como oficio al exponerse a otras perspectivas de desarrollo.

Una especie de lite de programación de pares menos desagradable. En otras palabras, no debería tomar mucho tiempo y no debería tener que esperar a alguien por horas. Cualquier cosa en su proceso de desarrollo que implique que las personas esperen cosas es un desperdicio de dinero y paralizante para el impulso / la moral, en mi opinión.

Si la revisión del código pretendiera detener el 99.5% de los errores antes de que ingresaran a su base de código, en primer lugar, no tendría sentido un control de versiones sofisticado. Dicho esto, git es intimidante al principio, pero el uso general básico no es tan complicado y es altamente configurable. Debería poder detenerse durante unas horas para enseñar a todos cómo usarlo. Todos se comprometen. Todos menos los novatos más novatos revisan hasta que demuestran experiencia en algo.


0

Mientras los cambios que se envíen hayan sido revisados ​​por los 'mejores programadores', a cualquiera se le debería permitir enviar el código. La única persona que debería tener la capacidad de imponer el control en un repositorio es el ingeniero de lanzamiento, si esa persona existe.

Personalmente, estaría muy enojado si tuviera que revisar el código de otras personas.

Alguna entrada en su edición: No, no deberían. Las revisiones son un mal necesario, hacen más bien que mal y los buenos programadores lo apreciarán. Tal vez haya reticencias a participar en las revisiones porque no les gusta la idea de que los 'programadores menores' critiquen su código. Eso es muy malo. Serían mucho más propensos a dejar de fumar si la línea de código tiene errores constantemente y, en cambio, pasan su tiempo limpiando después de los envíos a medias de otras personas.


0

Sí, la reseña merece la pena. No estoy seguro de que haya un impacto en la productividad si el proceso de revisión es proporcional por las siguientes razones:

  • Mantiene a los programadores honestos: si sabe que se revisará, las personas tomarán menos atajos
  • Ayuda a los nuevos programadores a aprender de programadores con más experiencia.
  • Ayuda a transferir conocimiento específico del dominio
  • La revisión es otra puerta donde se pueden encontrar y solucionar errores y posibles problemas.

Al no permitir que todos los programadores usen el control de fuente, pierden la capacidad de rastrear cambios, deshacer errores y ver un historial razonable de cambios. No estoy seguro de que quieras que solo tus "mejores" programadores puedan registrarse en git.

Dicho esto, creo que es razonable que tengas a alguien que esté a cargo de ciertas ramas clave, como una rama de lanzamiento. En este caso, me imagino que todos pueden usar el repositorio git, pero solo ciertas personas se fusionan en la rama de lanzamiento. No estoy seguro de que haya una manera de aplicar esto en git, pero debería ser posible hacerlo mediante el proceso y simplemente verificando que nadie más se haya registrado.

La fusión en la rama de lanzamiento podría ser realizada por los "mejores" programadores, o más probablemente por personas competentes después de que se haya realizado una revisión suficiente.


1
-1: Mantiene a los programadores honestos: si sabe que se revisará, la gente tomará menos atajos. - Hmm ... me preocuparía la introducción del riesgo moral. Es decir, los desarrolladores pueden volverse perezosos o descuidados porque saben que un desarrollador más experimentado siempre se responsabilizará de su código en forma de revisión de código.
Jim G.

1
El revisor no se hace responsable del código en absoluto, sino que da consejos e instrucciones sobre problemas con el código. El desarrollador original debe solucionar los problemas y sigue siendo responsable del código.
Steve

-1

Por qué los buenos programadores renuncian si una parte importante de su trabajo es revisar el código de otras personas?

Si no disfrutan del trabajo y se ven obligados a realizar esta actividad, entonces SÍ. Es muy probable que suceda. Como encontrar el próximo trabajo interesante para un buen desarrollador no es un gran desafío hoy en día.

¿Deberían sus mejores programadores tener que verificar el código de todos los demás en el control de fuente?

Absolutamente no. Es sin duda una pérdida de tiempo, a excepción de alguna lógica crítica que debe estar en estado sólido .

Sin embargo, los desarrolladores junior o con experiencia probablemente deberían estar en un período de prueba para la calidad del código , solo para estar seguros y asegurarse de que su código siga las pautas de desarrollo del equipo, al menos durante un par de semanas antes de obtener el privilegio de comprometerse.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.