¿Cómo rechazar una revisión de código que crees que es innecesaria?

89

Estoy en una posición en la que me han pedido que revise un código que soluciona un problema que no creo que exista.

El programa de reparación, que tiene más experiencia que yo, insiste en que su solución es necesaria, pero para mí no parece ser más que un sofisma de C ++. Parte de nuestro proceso de implementación es una revisión de código, y como el segundo ingeniero más importante en una pequeña empresa, se espera que revise los cambios.

Creo que los revisores son tan responsables de los cambios de código como el codificador original, y no estoy dispuesto a aceptar la responsabilidad de este cambio. ¿Cómo rechazarías esta crítica?

James
fuente
113
Me parece obvio. Usted señala en la revisión que el código es una masturbación intelectual en C ++ cuyo propósito es solucionar un problema que no existe. Y luego, como parte del proceso de revisión, rechaza el código.
user16764
86
No uses las palabras "masturbación intelectual" cuando la rechaces. Si usa esa redacción, lo antagonizará, y él no verá lo que tiene que decir como una crítica técnica potencialmente correcta, lo verá como un ataque personal. Puede ser exactamente una masturbación intelectual, pero puedes estar absolutamente seguro de que él no lo ve de esa manera.
Michael Shaw
15
James: eliminé la emoción de tu pregunta para permitir que la comunidad se concentre en tu pregunta central. Como otros señalan, el uso de terminología cargada en su revisión solo agravará lo que claramente es una situación delicada.
8
C y C ++ están llenos de cosas que parecen funcionar pero que en realidad son comportamientos indefinidos. UB es un defecto real, incluso si no puede escribir una prueba que muestre que no funciona como debería. Por ejemplo, muchos compiladores usan UB como una oportunidad de optimización, suponiendo que el caso que está indefinido nunca sucede. Por ejemplo, si solía size > size+1verificar el desbordamiento en un entero con signo, el compilador simplemente puede reemplazar esta expresión con false, ya que el desbordamiento de enteros con signo no está definido. Ver blog.llvm.org/2011/05/…
CodesInChaos
55
@MichaelShaw "lo verá como un ataque personal". que me parece la redacción de la pregunta, un ataque personal a un desarrollador más veterano con el que OP tiene una opinión diferente que ahora puede "ganar" porque se le ha puesto en una posición de poder.
Jwenting

Respuestas:

274

Solicite un caso de prueba que falle sin el cambio que tiene éxito con el cambio.

Si él no puede producir uno, lo usas como justificación.

Si puede producir uno, debe explicar por qué la prueba no es válida.

Craig
fuente
245
O tal vez si él puede producir uno, usted vuelve a examinar sus suposiciones y considera que podría haber tenido razón después de todo. Presumiblemente, el objetivo del ejercicio es mejorar el código, no ganar el debate.
Caleb el
99
El hecho de que no puedas escribir un examen no significa que no esté roto. Un comportamiento indefinido que por lo general pasa a trabajar como se esperaba (C y C ++ están llenos de eso), las condiciones de carrera, el potencial de reordenamiento debido a un modelo de memoria débil ...
CodesInChaos
29
Además, ¿qué pasa con la refactorización estándar? ¿Cómo se escribe una prueba reprobatoria para un trabajo de refactorización?
Mike Weller
62
"Pídale que demuestre por qué es necesario ..." Tal vez pídale que le enseñe por qué es necesario.
Mike Sherrill 'Cat Recall'
8
@RhysW: suposición errónea. El código existente, con la condición de carrera, tampoco se puede probar a ese respecto. Entonces, el nuevo código es teóricamente mejor y empíricamente equivalente. Su suposición solo se mantiene si el antiguo código es empíricamente mejor.
MSalters
152

Los revisores deben ser objetivos.

Está claro que has formado una opinión sobre el código en cuestión antes de siquiera haberlo revisado, y parece que tú y el fijador han replanteado posiciones. Si es así, entonces tendrá dificultades para aparecer como objetivo y un momento aún más difícil para ser objetivo. Nada de eso ayuda al proceso, y puede ser que lo mejor y más objetivo que puede hacer es retirarse con el argumento de que está demasiado cerca del problema.

Considere un enfoque de equipo.

Si no es posible eliminarse, tal vez pueda hacer que otros ingenieros revisen el código al mismo tiempo. O estarán de acuerdo con usted en que el código debe ser rechazado o no. Si están de acuerdo con usted, entonces ya no será solo usted frente al reparador, y podrá establecer un caso más sólido en el que el equipo analizó la solución objetivamente y decidió no aceptarla. Por otro lado, si deciden aceptar la solución, esa también será una decisión del equipo. No es necesario decir que debe participar con una mente tan abierta como sea posible y que no debe tratar de influir en las opiniones de los otros miembros del equipo con otra cosa que no sea una discusión racional. Importante: si después hay un mal resultado, no arrojes al equipo debajo del autobús diciendo "Bueno, yo siempre decía que era un código incorrecto, pero los demás miembros del equipo me superaban en número ".

Los rechazos son una parte natural del proceso de revisión del código.

El proceso de revisión del código no está ahí para las correcciones de sellos de goma de personas más mayores; está ahí para proteger y mejorar la calidad del código. No hay nada de malo en rechazar una solución siempre que lo haga por la razón correcta, es decir, que la solución no mejore el código. Si, después de una revisión abierta del código, todavía siente que la solución no reduce el riesgo y / o la magnitud de un problema demostrable, entonces debe rechazarlo. No es personal, solo tu sincera opinión. Si el reparador no está de acuerdo, también está bien, y en ese momento se convierte en un problema para la administración. Solo asegúrese de ser honesto, abierto y profesional.

La responsabilidad corta en ambos sentidos.

Dijiste que no quieres ser responsable de este cambio, aparentemente porque no crees que haya un problema. Sin embargo, es necesario darse cuenta de que si se equivoca y no es un problema, entonces puede llegar a ser responsable de rechazar el código que habría evitado el problema.

Toma nota.

Mantener un registro escrito del proceso de revisión lo ayudará a mantener sus datos correctos. Escriba sus pensamientos y preocupaciones mientras revisa, describe y los resultados de cualquier prueba que pueda realizar para medir el supuesto problema y la solución, etc. Si el problema se intensifica, tendrá un registro de lo que ha hecho para respaldar su posición. Si el asunto vuelve a surgir en el futuro (probablemente lo hará si el fijador está conectado a su propia vista), tendrá algo para refrescar su memoria.

Caleb
fuente
24
+1 esto es mucho más útil que la respuesta aceptada
Simon Bergot
2
Seguro. La respuesta aceptada es específica para un caso, claramente no tan general y bien pensada como este.
Florian Margaine
40

Escriba sus razones de rechazo y defensas para posibles contraargumentos. Luego discuta racionalmente con el fijador y, si es necesario, escale a la administración.

Si tiene suficiente documentación (incluidas listas de códigos, resultados de pruebas y argumentos objetivos ), estará bien cubierto.

Causará alguna mala voluntad con el fijador, así que asegúrese de que el problema valga la pena (es decir, ¿la no reparación causa daño?)

Además, si el reparador está relacionado de alguna manera con los propietarios, olvide esta respuesta.

Dan Pichelman
fuente
99
Yo votaría dos veces solo por la última parte de su respuesta. Respuesta muy solida.
31

Recientemente en las noticias de LinkedIn, había un artículo sobre la resolución de conflictos en el lugar de trabajo y ser humilde, en lugar de parecer arrogante. Lamentablemente, no puedo encontrar el enlace ahora, pero la esencia general era tratar de formular preguntas de una manera no conflictiva. Por favor, no entiendas esto como si dijera que eres arrogante, es solo la forma en que se escribió el artículo.

De todos modos, decirle al programador sénior que está equivocado en su suposición solo lo llevará a tomar un enfoque defensivo y atacarlo nuevamente en su respuesta. Sin embargo, si plantea la pregunta de por qué cree que existe el problema, desde el punto de vista de su falta de comprensión, es probable que esté más abierto a discutir el asunto.

Entonces, en lugar de decir "El problema no existe, así que no debería tener que revisar esto", tal vez pregunte algo como "Para revisar esto correctamente, necesito entender el problema. ¿Puede explicarlo a su ¿punto de vista?"

Como ejemplo, el artículo describió una prueba realizada a niños donde un adulto sostenía un cubo cuyas caras eran todas de un color, excepto la que estaba frente al adulto. Cuando se les preguntó a los niños qué color estaba viendo la cara del adulto, los menores de 5 años casi siempre decían el color que podían ver, ya que no podían comprender que el adulto pudiera tener una visión diferente a la suya.

El caballero oscuro
fuente
8
Excelente punto, pero no entiendo cómo se relaciona el ejemplo en la parte inferior (no pretendo que no esté relacionado, por supuesto, solo señalo mi falta de comprensión de la relación).
ugoren
8
@ugoren Ja, ja, me gusta lo que hiciste allí!
TheDarkKnight
1
@ugoren la relación es 'a menos que pueda ver la imagen completa, no forme opiniones concretas'
RhysW
2
Siempre me gusta el enfoque humilde, rechazaría el cambio sobre la base de que no lo entiendo y, por lo tanto, no estoy calificado para darle el visto bueno.
PhilDin
2
@PhilDin Hay humildad y luego hay gente que dice que no estás calificado para el trabajo. Si está en posición de revisar el código, creo que las personas que lo pusieron en esa posición esperan que esté lo suficientemente calificado para hacerlo.
Andy
9

C / C ++ puede estar lleno de comportamientos indefinidos. Por un lado, es malo, ya que puede conducir a comportamientos inesperados. Por otro lado, permite una optimización agresiva y, por lo general, cuando usa C / C ++ le interesa la velocidad.

Escribir un caso de prueba que se rompa puede ser difícil; puede involucrar una arquitectura extraña o un compilador que ya no existe. También puede parecer que en cualquier arquitectura sensata "no debería causar ningún problema".

Sin embargo, en un momento u otro cambiará la plataforma (por ejemplo, si desea volverse móvil para portar a ARM o desea acelerar las cosas y usar GPU). En este punto, las cosas pueden comenzar a romperse y deberá depurarlo. Puede ser tan trivial como actualizar el compilador a una versión más nueva (y es posible que lo desee / lo necesite).

El código problemático fue:

int d[16];

int SATD (void)
{
   int satd = 0, dd, k;
   for (dd=d[k=0]; k<16; dd=d[++k]) {
     satd += (dd < 0 ? -dd : dd);
   }
   return satd;
 }

Durante la última iteración d[++k] => d[++15] => d[16]se accede. Como generalmente el siguiente elemento era la memoria legal (en términos de paginación, no el modelo de memoria C), incluso los compiladores triviales no producían ningún ejecutable con comportamiento extraño. La única forma de escribir el caso de prueba era encontrar una plataforma con exactamente el mismo modelo de memoria que C (probablemente VM).

Sin embargo, se ve gcc 4.8 prerelase que d[++k]se ejecuta en cada bucle. De lo k < 16contrario, el acceso sería ilegal y la legalidad del programa alimentado al compilador es parte del contrato. Entonces, la condición del bucle siempre es verdadera dados los supuestos, por lo que es un bucle infinito. Esto puede sonar extraño, pero era una optimización perfectamente legal: la emisión system("dd if=/dev/zero of=/dev/sda"); system("format c:")también sería el reemplazo correcto del bucle. Hay formas más sutiles de elegir exhibir comportamientos. Por ejemplo, durante la conferencia sobre memoria transaccional , recuerdo que el presentador intentó varias veces obtener un valor incorrecto cuando 2 hilos aumentaron el mismo valor.

Sin embargo, C / C ++, a diferencia de algunos lenguajes, está estandarizado, por lo que dicha disputa se puede hacer con referencia a la fuente objetiva:

  • Si cree que esto no es un problema, intente probarlo utilizando el estándar C / C ++ (es decir, que conduce a un valor y comportamiento definidos)
  • Si piensa que esto es un problema, pídale que lo pruebe usando el estándar C / C ++ (es decir, que conduce a un valor o comportamiento indefinido)

En general, si su equipo está escribiendo en C / C ++, es útil tener a mano el estándar, incluso los expertos del equipo pueden encontrar algo extraño allí de vez en cuando.

Maciej Piechotka
fuente
4

Esto suena más como un problema con la política de su equipo que con esta revisión específica. Cuando trabajé en una gran tienda de software en un equipo de 9 personas, un crítico absoluto tenía poder de veto sobre el código, y este era un estándar que todos respetamos. Éramos bastante talentosos e inteligentes, a saber. "maduro", pero más en el sentido de "no infantil" que "experimentado" - que nuestro líder de equipo podría esperar razonablemente que siempre podamos llegar a un acuerdo sin tener que recurrir a argumentos en un período de tiempo prudente.

Simplemente en función de su idioma en su publicación, podría advertirle que parece que va a abordar esta situación de una manera que podría conducir a un argumento descentralizado. Tal vez sea "masturbación intelectual", pero probablemente haya una razón por la que él o ella lo hizo, y la carga para usted será encontrar una forma más simple de resolver ese problema, y ​​si no existe, documente en el comentario por qué el código masturbatorio era, de hecho, necesario.

djechlin
fuente
1
"... pero probablemente hay una razón por la que lo hizo ..." - Esa es una gran suposición que estás haciendo. Y también se está perdiendo el punto de que la Pregunta establece que (en opinión del OP) no existe ningún problema. Seguramente, la responsabilidad debe recaer en la persona que propone una "solución" para demostrar que hay un problema real que solucionar. No tiene sentido proponer una "solución más simple" a un problema que no existe.
Stephen C
44
@StephenC sí, y mantengo la opinión de que el OP debería dar el beneficio de la duda en este caso. O de lo contrario va a ser una revisión realmente conflictiva.
djechlin
3

Haga que el remitente muestre pruebas de que su código soluciona su problema. Si él puede probar y mostrarle pruebas, entonces usted es el que está equivocado y debería dejar de quejarse y lidiar con eso. Si no puede mostrar pruebas para respaldar su reclamo, hay un problema y mostrar pruebas de que su parche soluciona el problema, entonces lo enviaría de vuelta a la mesa de dibujo.

Por supuesto, podría haber una política interna sensible en torno a esto. Pero esta es la forma en que iría (deliciosamente).

SnakeDoc
fuente