¿Las revisiones de código realmente funcionan en Agile verdadero?

13

Así que comencé a trabajar para un gran grupo, uno de esos con 3 letras en el nombre, y están tratando de volverse ágiles, pero tienen toneladas de procesos, que no creo que sean ágiles.

El que más me ha enredado son las revisiones de código. Mi último trabajo fue con una startup que diría que es el equipo de desarrollo más ágil que he visto, en el que he estado y / o he oído hablar.

De todos modos, mi argumento es que las revisiones de código son una pérdida de tiempo en el desarrollo iterativo o ágil donde la UX / UI es extrema / intensa (piense en la perfección de Apple / Steve Jobs). ¿Quizás alguien aquí pueda ayudarme a entender antes de que me despidan?

Aquí está mi proceso de desarrollo y el de mi última puesta en marcha ... muy ágil.

Hacemos el trabajo de las características iniciales para ordenar la tarea de desarrollo / todos. Nos burlaríamos de un par de versiones y las presentaríamos a los usuarios, al equipo y al marketing para obtener comentarios. Luego hacemos otra iteración de maqueta para obtener una ronda de los mismos interesados ​​anteriores. Luego dividimos el trabajo y comenzamos. Tenemos hitos y fechas para cumplir, pero seguimos desconectando. No tenemos revisiones de código durante nada de esto. Varias veces durante las semanas de nuestro desarrollo, tenemos sesiones con los interesados ​​nuevamente para ver si aún están de acuerdo en que las características / funciones / UX / UI siguen siendo adecuadas y están en el objetivo.

A medida que nos acercamos al final del ciclo de iteración de 8 semanas, el control de calidad comienza a probar, luego se dirige a los usuarios alfa y finalmente a los usuarios beta. Pero durante la fase alfa y beta, los desarrolladores revisan las nuevas características y las características más antiguas y realizan cambios iterativos diarios u horarios en la interfaz de usuario para mejorar la experiencia de usuario. Por lo tanto, una característica que se estaba desarrollando en esta versión, podría terminar cambiando 3 veces más en las últimas cuatro semanas para mejorarla y perfeccionarla o agregar algunas características pequeñas (por ejemplo, hacer que el componente sea un poco más elegante o más inteligente). A veces, los cambios pueden ser superficiales, lo que significa que no se cambian ni modifican las operaciones CRUD, pero todas las IU solo cambian.

Entonces, con este tipo de proceso de desarrollo, extremadamente ágil, ¿las revisiones de código no serían una pérdida de tiempo? Lo que significa que si otro desarrollador o dos revisaron mi código, pero ese código cambia 3 veces más antes de que salga por la puerta, debido a todas las mejoras de UI / UX, ¿no estamos perdiendo el tiempo las primeras 3 veces que lo revisaron? código ya que ese código / componente / UI fue desechado?

Nunca tuvimos muchos problemas de calidad con este proceso y sí, si un desarrollador dejaba todo el conocimiento salía por la puerta, pero siempre encontramos desarrolladores inteligentes para recogerlo y tomar el control.

Y sí, tenemos muchos probadores porque pueden tener que volver a probar cosas 3 o 4 veces. Además, no se obsesione con preguntar por qué cambia toda la UI / UX ... así es como se hacen las cosas ... y por eso la aplicación gana toneladas de premios por UI / UX y los usuarios matarán por aplicación El proceso de pensamiento es si puedo mejorar incluso un 2% en algo porque tengo una hora extra y luego hacerlo. Los usuarios estarán más felices, lo que significa más $ o usuarios. Y sí, nuestros usuarios están de acuerdo con que la aplicación cambie continuamente porque así se ha hecho desde el primer día para que no la vean como mala o negativa.

Espero que esta publicación no sea pomposa, pero no puedo ver cómo las Revisiones de Código no son un desperdicio. Tal vez el 2% de todo nuestro código en el código revisado tiene errores. En cada versión podemos encontrar 3 errores a través de la revisión de código. ¿Entonces termina siendo 40 horas de revisión de código por desarrollador por lanzamiento (4 x 40 = 160 horas) para encontrar de 3 a 5 errores? Las posibilidades son del 50% de esos 3 a 5 errores habrían sido recogidos por QA de todos modos. ¿No sería mejor pasar esas 40 horas por desarrollador agregando una nueva característica o mejorando las existentes?

usuario25702
fuente
@DeadMG: Experiencia del usuario
Steven A. Lowe
44
@ user25702: el proceso que describe no suena como Agile, suena como RUP / espiral. Específicamente "Varias veces durante las semanas de nuestro desarrollo tenemos sesiones con los interesados ​​nuevamente para ver si aún están de acuerdo en que las características / funciones / UX / UI siguen siendo adecuadas y están en el objetivo". es anti-ágil; las funciones se congelan durante una iteración para evitar los problemas de objetivo móvil asociados con los enfoques RUP / espiral. En cuanto a su pregunta nominal, no veo mucho valor en las revisiones de código aquí si y solo si está seguro de que QA habría encontrado los errores.
Steven A. Lowe
1
Las iteraciones de 8 semanas no son ágiles y definitivamente no son "extremadamente ágiles".
Martin Wickman
Algunos PM piensan que las iteraciones significan que tenemos un par de iteraciones cortas al principio y un par de iteraciones largas en el medio, seguidas de tantas iteraciones cortas al final como sea necesario. El problema es que esto interfiere con el ritmo de batalla del desarrollo de software y la capacidad de detectar errores temprano. La iteración de 8 semanas sería una de esas iteraciones intermedias. Estoy de acuerdo en que esto no es ágil.
Berin Loritsch
Si desea discutir las revisiones de código, le recomiendo que tome algunas estadísticas. Documente el tiempo necesario para las revisiones de código (en horas hombre totales), la cantidad de errores / problemas descubiertos en ellos, junto con la gravedad del problema. Resultó que para mi equipo pasamos al menos 16 horas hombre por revisión, encontramos en promedio 2-3 errores, todos de naturaleza cosmética. Fue fácil argumentar a favor de una metodología de prueba primero para reemplazar las revisiones de pares frente a esos números.
Berin Loritsch

Respuestas:

13

Hay algunas cosas que las revisiones de código pueden hacer por usted, y algunas cosas que no pueden hacer. Los argumentos a favor de las revisiones de código:

  • Propiedad colectiva
  • Encontrar errores (QC)
  • Aplicar estilo consistente (QA)
  • Mentoring

Muchos procesos ágiles los abordan de diferentes maneras:

  • Propiedad colectiva: todos en el equipo son responsables del proyecto, lo que significa que todos estarán atentos al código en cualquier momento.
  • Gratis para refactorizar: esto lleva las revisiones de código al siguiente nivel y permite que cualquier persona del equipo realice la refactorización según sea necesario.
  • Pruebas unitarias (QC): las pruebas unitarias son más eficientes y menos propensas a errores humanos que la inspección visual. De hecho, todavía tengo que encontrar un medio más eficiente.
  • Programación de pares (QA): se encarga de la tutoría y proporciona consejos de refactorización temprana a medida que se escribe el código. Esto también sigue siendo un tema controvertido, pero creo que ayuda a la hora de aumentar un nuevo desarrollador. También es un buen momento para hacer cumplir los estándares de codificación.

En esencia, hay otras vías para ocuparse de las ganancias potenciales que normalmente tendría haciendo revisiones por pares. Mi experiencia personal con las revisiones por pares es que son mecanismos muy ineficientes y no son efectivos para encontrar errores o fallas de diseño más grandes. Sin embargo, tienen su lugar en algunos equipos, y en proyectos en los que no es factible ágil (por cualquier razón), son bastante necesarios.

Berin Loritsch
fuente
3
Parece haber cierta información errónea en la respuesta actual. La propiedad colectiva no significa "todas las miradas en todos los códigos todo el tiempo". La refactorización no tiene nada que ver con la detección de defectos. Las pruebas unitarias y la inspección tienen diferentes propósitos y, de hecho, cada una puede descubrir diferentes tipos de defectos (ejemplos en otras respuestas). La programación de pares, aunque es una forma de revisión, no es un verdadero reemplazo para, por ejemplo, la inspección Fagan. Su experiencia personal parece atípica, especialmente en relación con los errores de diseño: ¿qué tipo de revisiones realizó? ¿Cómo midió la eficiencia de las revisiones?
Michael
1
Tiempo que realiza la revisión frente a los defectos encontrados y su gravedad. Comparamos eso con las mismas métricas contra las pruebas unitarias. Los problemas descubiertos durante la revisión del código casi siempre estaban relacionados con el formato del código, y tardaron más en realizarse. El mismo tiempo dedicado a hacer pruebas unitarias descubrió problemas reales y no tardó más en prepararse y hacerlo.
Berin Loritsch
"Propiedad colectiva": En mi experiencia, esto a menudo es una ilusión: los revisores a menudo critican los pequeños detalles y no ven el panorama general en el código escrito por otros. Luego, cuando se trata de modificar ese código, realmente no lo entienden y (1) no se atreven a cambiarlo, o (2) lo reescriben ampliamente para que puedan entenderlo. El enfoque (2) a menudo tiene dos efectos secundarios: (A) introducen errores y (B) el desarrollador original ya no comprende el código.
Giorgio
El punto B muestra que a menudo lo que sucede no es la propiedad colectiva sino la propiedad individual que cambia de un desarrollador a otro todo el tiempo. De esta manera, cada miembro del equipo sabe a grandes rasgos lo que hace el código y cómo está organizado, pero nadie lo entiende realmente. Una verdadera propiedad de código colectivo requeriría mucho más tiempo y discusión sobre el código para obtener una comprensión común, pero a menudo esta vez simplemente no está disponible.
Giorgio
11

¿Las revisiones de código son solo para encontrar errores? Parece que piensas que es verdad y yo no.

Yo diría que las revisiones de código pueden ser más acerca de la propiedad colectiva del código, asegurando que el conocimiento esté en múltiples cabezas y preparando a otros para heredar el código que podría ser para nuevas características y errores. Me gustan las revisiones de código como una forma de controlar y equilibrar un poco el sistema, ya que nunca se sabe cuándo alguien puede tener una idea de dónde se puede volver a escribir algo para mantener las convenciones.

JB King
fuente
4

La programación de pares es la respuesta XP a las revisiones de código. Esencialmente, cada línea de código se revisa a medida que se escribe. Son revisiones de código llevadas al extremo.

Dave
fuente
77
Yo discutiría fuertemente con esto. Claro, está siendo revisado por dos personas, pero esas personas generalmente están en la misma página mientras se escribe el código. Una revisión de código es alguien con un estado mental completamente diferente que mira su código y encuentra "doh! Se olvidó de manejar ese tipo de problemas". XP realmente no ayuda con eso.
Billy ONeal
4

Las revisiones y pruebas de código a menudo no detectan el mismo tipo de errores, y es probable que los errores detectados por la revisión de código sean más fáciles de corregir, ya que se conoce la ubicación del error.

No puede saber si el código está libre de errores solo porque pasa la prueba sin que se haya registrado ninguno. "Las pruebas solo pueden probar la presencia de errores, no la ausencia". (Dijkstra?)

La revisión de código también mantiene el estilo de código igual, y es capaz de encontrar lugares donde el código no es bueno pero funciona por ahora. Ahorra costos de mantenimiento en el futuro.

Además, las demandas de una gran corporación y una startup son diferentes. Las startups normalmente fallan y tienen que moverse rápido. Las grandes corporaciones obtienen mucho más valor al hacer las cosas bien en lugar de lo más rápido posible. Es muy posible que prefieras trabajar en startups que en grandes empresas, pero esa no es una razón para intentar imponer estrategias de startup donde no encajan.

David Thornley
fuente
2

¿Tus revisiones de código solo muestran cambios en la UI / UX? Yo diría que no es una revisión de código, es una prueba de usabilidad. Las revisiones de código tienen mucho más que ver con los problemas que los usuarios / evaluadores / negocios / lo que sea que nunca vean, porque están en el código. La pista está ahí en el nombre.

Ahora estaré de acuerdo con usted en que hay una línea que se trazará en alguna parte. ¿Revisas 4 iteraciones del mismo cambio de UI? ¿O pasas por 4 iteraciones de eso, y cada una de ellas hace que el código sea menos mantenible? Diría que intente medir ambos enfoques y encuentre el equilibrio adecuado para su equipo, pero no abandone las revisiones de código por completo.

Incluso si una revisión de código nunca presenta un problema, tiene un beneficio que rara vez se nota hasta que no está allí: dos desarrolladores examinan cada pieza de código, por lo que dos desarrolladores saben cuál fue el cambio y qué se pretendía lograr. . Entonces, uno de ellos se enferma al día siguiente y está fuera durante una semana, el otro puede recoger cualquier trabajo urgente que estaban haciendo.

pdr
fuente
1

Tiendo a estar de acuerdo en que la propiedad y el emparejamiento de código colectivo junto con TDD y CI son los antídotos ágiles para las sesiones formales de revisión de código.

Incluso bajo UP / Spiral no era un gran admirador de un paso específico del proceso que era la "revisión de código" porque me pareció que los tipos de problemas que probablemente encontrarían se encontrarían más tarde de lo que podrían ser si se invirtiera la misma energía en algún momento inicial colaboración y alguna automatización simple.

Sentí que porque había: - alguna revisión compartida del diseño (generalmente expresada en UML al menos en una pizarra) significaba problemas de diseño a gran escala o un mal uso de las API, etc. antes de que se escribiera mucho código. - FxCop, CheckStyle, FindBugs (o similar) que se ejecutan junto con compilaciones de integración continua automatizada para detectar nombres, estilismo, visibilidad, duplicación de código, etc.

Pudimos fallar antes y obtener comentarios más rápido de lo que hubiera producido un hábito de revisión de código aguas abajo.

No digo que sea una pérdida de tiempo sentarse y echar un vistazo a su base de código de vez en cuando, pero hacer que la revisión del código sea un paso decisivo para llamar a hacer algo parece que crea mucho trabajo en progreso que podría haber sido evitado con una mejor inspección / colaboración aguas arriba.

mmeyer
fuente
0

Uno de los objetivos principales que espero de las revisiones de código es aumentar la facilidad de mantenimiento del código. Las revisiones de código deberían ayudar a todos a escribir un código claro que cumpla razonablemente con los buenos estándares de codificación. La mayoría de los códigos requieren mucho mantenimiento, especialmente en grandes empresas. La recuperación de la inversión para el código mantenible debe comenzar antes de que se lance el código, y continuar después.

Las revisiones de código en sí mismas nunca deberían dar lugar a cambios en el código. Si la revisión del código indica que se requieren cambios, la implementación del cambio dará como resultado un cambio en el código.

El estado del código puede cambiar como resultado de la revisión, pero eso debería ser irrelevante para los problemas que menciona.

Si la revisión del código resulta en múltiples cambios de código, entonces algo se rompe en su proceso de desarrollo. Dado el número de probadores que tiene, puede lanzarlo por la pared y dejar que los probadores encuentren la mentalidad del problema.

Las cosas deberían ir a los probadores en estado completo. Se debe automatizar la mayor parte de las pruebas posibles, de modo que los evaluadores no vuelvan a realizar las mismas pruebas una y otra vez.

UI / UX requiere algo de tiempo de prueba, pero contar con expertos en diseño / desarrollo en el front end debería reducir eso. También requiere una cara delante de la pantalla. Sin embargo, en todas las aplicaciones con las que he trabajado, era una porción relativamente pequeña del código.

El costo de implementar cambios (incluidas las correcciones de errores) generalmente aumenta en cada etapa que atraviesa. Encontrar errores en el desarrollo es generalmente más barato que corregirlos después de probarlos.

BillThor
fuente