process - ejemplos - etiqueta meta
¿Cómo se maneja uno de los cambios de código de puerta trasera? (4)
Guión
Reconozco (algo vergonzosamente) que no solo he sido testigo de esta práctica en particular, sino que también me he comprometido. Mi nombre es Jeff y he probado un proceso de calidad para salirse con la mía. El escenario al que me refiero es esto.
El ingeniero A quiere hacer algo de cierta manera, pero el ingeniero B ya lo ha implementado. En lugar de trabajar dentro del marco definido por la implementación del Ingeniero B, el Ingeniero A lo reescribe para que coincida con su propia manera y luego encuentra un revisor adecuadamente débil (o alguna otra falla del proceso) para asegurar que se cumplan sus cambios.
Esto, por supuesto, tiene un efecto dominó donde el Ingeniero B descubre el subterfugio y procede a encontrar una manera de volver a instaurar su enfoque original por medios igualmente nefastos, y así comienza el conflicto.
Soluciones
Hay muchas soluciones potenciales para este escenario, como tener una sola persona responsable de asignar revisores o programación de pares, pero no estoy seguro de que realmente puedan detener al ingeniero determinado. Tampoco creo que no sea el mejor plan contratar ingenieros, porque con frecuencia son los ingenieros con las mejores capacidades los que tienden a este comportamiento desdeñoso de "mi solución es claramente mejor que la de ellos".
En general, esto es un efecto secundario en los procesos ágiles en los que la fase de diseño detallado se ve borrosa con la implementación, de modo que la revisión también es la aprobación del diseño. Esta es obviamente una área importante donde el problema también podría ser abordado.
Pregunta
¿Qué enfoques para un proceso de calidad mitigan esto? ¿Tiene alguna experiencia para contar que arroje luz sobre qué hacer o qué no hacer? ¿Cuáles fueron las consecuencias (buenas, malas, inexistentes)?
Debo añadir que estoy preguntando porque estamos tratando de combatir este problema en nuestro propio proyecto, por lo tanto, preguntamos aquí.
1) Un fuerte documento de estándares de codificación que también incluye patrones de código.
2) Un equipo que discute las cosas juntas para acordar un camino común en lugar de implementar una agresión pasiva contra sus compañeros de trabajo.
3) Un equipo que está dispuesto a escuchar a otras personas, en lugar de que cada miembro piense a su manera, es el mejor.
4) Aplazar a la antigüedad dentro de un equipo una vez que se toma una decisión. Esto es difícil si el miembro sénior no implementa personalmente (3).
No he visto ninguna correlación positiva entre buenos ingenieros y un comportamiento antisocial como ese. La mayoría de los buenos programadores y arquitectos que conocí fueron buenos comunicadores que adquirieron sus habilidades aprendiendo de otras personas. La programación es un esfuerzo de equipo. Alguien así debe ser muy productivo para compensar el impacto negativo que tienen en los otros programadores
No creo que esto sea un efecto secundario de ágil. Puedo ver que esto suceda en las implementaciones ágiles fallidas, pero en mi experiencia los equipos ágiles son mejores para trabajar juntos y son más conscientes de lo que todos están haciendo. Las iteraciones cortas y los comentarios rápidos sobre el rendimiento del equipo suelen hacer que el comportamiento contraproducente sea tan visible.
La clave para resolver problemas como este es la comunicación. Las personas en un equipo deben estar al tanto de lo que otras personas en el equipo están haciendo para poder funcionar como un equipo.
Mantenga un tamaño de equipo razonable. Los equipos grandes causan dificultades de comunicación. Dividir los equipos que son demasiado grandes en equipos más pequeños que tienen sus propias responsabilidades.
Tenga reuniones diarias de pie donde las personas compartan lo que hicieron ayer, lo que planean hacer hoy y los problemas que tienen. Esto puede evitar que las personas implementen cambios de diseño en secreto.
Asegúrate de que las personas estén ubicadas. Hacer que las personas se sienten juntas y trabajen juntas las hace más proclives a buscar soluciones juntas.
Por supuesto, pueden ocurrir problemas como este, pero si esto sucede a menudo puede ser un indicador de otros problemas dentro de un equipo.
Un enfoque que he visto es nombrar ''Guardianes'': desarrolladores bastante experimentados, cada uno de los cuales es responsable del estado final de un módulo particular de funcionalidad.
En caso de una disputa de implementación, la última palabra va al módulo Guardian.
A menudo, la función de Guardian se extiende a trabajos más complejos, como arquitectura, control de calidad, etc.
He visto este comportamiento en algunos escenarios:
El ingeniero B dejó un desastre y el ingeniero A lo está limpiando.
El ingeniero A piensa que el ingeniero B dejó un desastre y ella lo está limpiando.
El ingeniero A no es lo suficientemente fuerte como para leer y comprender la solución existente, por lo que la reescribe de una manera que tenga sentido para él. Leer código y entenderlo es más difícil que escribir código.
El equipo no se enfoca en un enfoque de "no dejar rastro" para el desarrollo: toque tan pocas clases, métodos y estructuras de control como sea posible para corregir un error o modificar una característica, ya que cada cambio tiene un efecto secundario potencial. Los ingenieros tienen demasiado espacio para fideos.
Usted resuelve cada escenario de manera diferente:
¿Todos los ingenieros están constantemente reescribiendo el código de una persona? Mira de cerca y determina si el ingeniero A está luchando. Quizás ella no esté al día. Tal vez ella está creando problemas. Si es así, trabaje con ella para ponerse al día. Si eso falla, ella tiene que irse para el beneficio del equipo.
Este es el problema del ego que mencionaste en los comentarios de JeeBee . Las otras respuestas aquí dan buenas sugerencias para reducir el problema. Si persisten los problemas del ego, diría que el equipo tiene un enfoque equivocado. El punto debe ser hacer tanto en el menor tiempo posible con la menor cantidad de errores posible. Constantemente reescribir el código de otro ingeniero no está contribuyendo a ese esfuerzo.
Aliente al equipo a responder estas preguntas antes de realizar un cambio: ¿Mi solución es realmente mucho mejor? ¿Realmente entiendo lo que el otro ingeniero estaba tratando de hacer o simplemente soy flojo y lo reescribo de una manera que tiene sentido para mí? Si es objetivamente mejor, ¿por qué sé que el Ingeniero B va a volver aquí y cambiarlo?
¿Un ingeniero está constantemente reescribiendo el código de todos? Mira de cerca y determina si está luchando. Si es así, trabaje con él para ponerse al día. Si eso falla, tiene que irse para el beneficio del equipo.
He sido bendecido de trabajar con grandes equipos, por lo que en mi experiencia, este es el problema más común. Lo resolvimos admitiendo primero que teníamos un problema (tal vez desarrolle un programa de doce pasos para noodles). Los grandes ingenieros / desarrolladores son noodlers. Arrancan cosas y las vuelven a armar. Su primer instinto, incluso cuando revisan su propio código, es desgarrarlo y hacerlo mejor. Esto es excelente durante la fase de diseño y descubrimiento, pero es peligroso más adelante en el ciclo de desarrollo. Entonces, admite que eres un noodler. Cada vez que extraes lo último del control de la fuente, resiste tu instinto feroz. Pregúntese qué es lo menos que puede hacer para resolver un problema. Haga que todos en el equipo se comprometan con un enfoque de desarrollo "sin dejar rastro".
Sin embargo, no apagues tu noodler interno para siempre. Si le resulta cada vez más difícil resistirse a su impulso de fideos en una parte particular de la aplicación, podría ser el momento de una importante refacturación. Elabore un plan y preséntelo al grupo. Si es una buena idea, probablemente estén de acuerdo.