¿Cómo revisar el código que no entiendes?

25

Se me ha dado el papel de mejorar el desarrollo en nuestra empresa. Lo primero que quería comenzar era la revisión de códigos, ya que nunca antes se había hecho aquí.

Hay 3 programadores en nuestra empresa. Soy un programador web, mis lenguajes conocidos son principalmente PHP, ActionScript y JavaScript. Los otros 2 desarrolladores escriben aplicaciones internas en VB.net

Hemos estado haciendo revisiones de código durante un par de semanas. Me resulta difícil entender el código VB. Entonces, cuando dicen lo que está haciendo, en su mayor parte, solo tengo que aceptar su palabra.

Si veo algo que se ve mal, explico mi opinión y explico cómo lo abordaría en uno de los idiomas que conozco.

A veces mis sugerencias son bienvenidas, pero muchas veces me dicen cosas como "esta es la mejor manera de hacerlo en este idioma" o "que no se aplica a este idioma" o cosas similares de esa naturaleza.

Esto puede ser cierto, pero sin conocer el idioma no estoy seguro de cómo confirmar o refutar estas afirmaciones.

Sé que una posible solución sería aprender vb para poder hacer mejores revisiones de código. Realmente no tengo ningún interés en aprender vb (especialmente porque tengo una lista de otras tecnologías que estoy tratando de aprender para mis propios proyectos) y me gustaría mantener esto como último recurso, pero es una opción.

Otra idea que se me ocurrió es que ambos tienen interés en C # y yo también. Es relativo a ellos porque es .net y relativo a mí porque es más similar a los idiomas que conozco. Sin embargo, es nuevo para todos nosotros. Pensé en los beneficios de que todos colaboremos en un proyecto de C # .net y revisemos el código de los demás.

Supongo que también existe la posibilidad de contratar a un consultor para que nos brinde algunas revisiones de código.

¿Qué me recomendarías que haga en esta situación?

JD Isaacks
fuente
66
¿Le resulta difícil entender el código VB? ¿Estás seguro? déjame preguntarte eso de nuevo, ¿estás seguro? :)
Darknight
44
¿No te interesa aprender VB? ¡Entonces probablemente debería rechazar la tarea de realizar revisiones de código del código VB!
JacquesB

Respuestas:

22

Sus deseos personales de aprender otras cosas deberían quedar en segundo plano para aprender lo que realmente necesita en este momento para su trabajo. Aprende VB.net. Puede codificar eficazmente el código de revisión que no comprende cuando conoce el idioma en el que se encuentra haciendo muchas preguntas (por lo general, es una señal de que el código no está bien escrito si conoce el idioma y no puede entender qué está haciendo y por qué). Pero sin entender el código, lo mejor que puede hacer es hacer que se lo expliquen y esperar que vean cualquier error a través del proceso de explicación. No es que no haya encontrado errores en mi propio código en una revisión al hacer eso, pero no es la forma más efectiva de revisar el código. La revisión de código ahora es parte de su trabajo, hágala cargo y aprenda lo que necesita aprender para hacerlo de manera efectiva.

Mientras aprende, cuando digan bien que esa no es la forma en que lo hacemos en este idioma, haga que le muestren una fuente que dice que es una buena técnica para usar. Depende de ellos justificarte en una revisión de código, no al revés. También mejorará el idioma una vez que comience a ver esos enlaces.

HLGEM
fuente
55
+1 Para aprender lo que necesita aprender en lugar de lo que quiere aprender. Preferiblemente, aprenda ambos: aprender idiomas es algo rápido.
Orbling
1
+1: Con respecto al "haz que te muestren", la forma más amable es preguntarles si tienen algunos libros en los que se explican esos principios, para que puedas aprender también. Es lo mismo, solo que menos atacante. Y a la gente no le gusta que la ataquen.
Joris Meys
@Joris Meys, sí, puede y debe hacerlo cortésmente, pero deben presionarlos para que respondan antes de que pueda certificar que el código se aprueba si vuelven a "porque yo lo dije".
HLGEM
1
@ Jeff O: No considero que la cortesía sea siempre un privilegio. En un entorno de trabajo, también es una herramienta importante para obtener lo que desea. O para transmitir un mensaje de una manera que sea difícil de contrarrestar. Nadie puede llamarte por ser educado ...
Joris Meys
1
@Jeff O, ser cortés no significa ser un felpudo. Significa preguntar de manera profesional en un tono neutral. Puedes insistir en una respuesta sin ser grosero. La grosería nunca es apropiada en el lugar de trabajo. Siempre tendrá que trabajar con personas que no le gustan o que lo hacen enojar, pero nunca es apropiado comportarse mal con ellos. Cuando lo hace, la persona principal que está lastimando es usted mismo porque los demás perderán su respeto por usted.
HLGEM
13

En realidad, no estoy de acuerdo con todo lo anterior. Con JS / PHP / ActiopnScript, tiene una comprensión fundamental de lo que tiene un lenguaje de programación y cómo funciona. De hecho, diría que hay muchas similitudes entre VB y JS. Sin embargo, ese no es mi punto. Incluso si eres muy competente con el lenguaje, es fácil pasar por alto algo cuando tratas de seguir los procesos de pensamiento de otra persona, por lo que lo que la revisión debe hacer es proporcionar una oportunidad para que el programador explique qué ha hecho y por qué.

Una vez, un amigo describió esto como "La teoría del conserje": al explicar los detalles a alguien, incluso al conserje, el programador expone cualquier debilidad en el código a sí mismo, lo cual es, por supuesto, el objetivo final de la revisión. proceso. Sin embargo, requiere que el código se explique de manera exhaustiva y abierta (las revisiones no funcionan cuando los desarrolladores están a la defensiva).

fishywiki
fuente
44
+1 Para la teoría del conserje, a lo que generalmente me refiero como una "caja de resonancia", cualquiera que pueda escuchar y hacer preguntas es bueno, incluso si simplemente se quedan ahí de pie, ayuda.
Orbling
1
La clave es mantener a todos hablando y trabajando juntos. No ponga a su equipo a la defensiva: nada detendrá la productividad más rápido que todos los que trabajan para sí mismos.
IAbstract
7

La versión corta

  1. Recuerde que las revisiones de código son una oportunidad para que tanto el revisor como el revisor aprendan.
  2. Frase comentarios como una pregunta.
  3. No permita que la falta de conocimiento le impida proporcionar comentarios (siempre y cuando esté haciendo el n. ° 2).
  4. Evite las "revisiones de preferencias" o al menos trate de dejar en claro que son sus propias preferencias personales y que no necesariamente tienen que estar de acuerdo.
  5. Intente enviar parches en lugar de ser un "revisor del código del sillón".

La versión más larga

En primer lugar, recuerde que la revisión de código no es solo una oportunidad para que el repasado aprenda. También es una oportunidad para que el revisor aprenda también. De hecho, he oído hablar de varias organizaciones que hacen que los nuevos programadores comiencen a hacer revisiones de código para que puedan tener una idea del código.

Con esto en mente, hay un consejo de revisión de código que siempre he encontrado útil en general, pero es especialmente pertinente en su posición. Exprese sus comentarios en forma de una pregunta en lugar de una declaración. En otras palabras, en lugar de decir "¡Este código apesta!", Podrías decir "¿Por qué escribiste el código de esta manera en lugar de hacerlo ...?" Esto hace que el proceso de revisión del código sea más agradable y te permite aprender también.

Otro consejo que tengo para ti es que no dejes que tu falta de conocimiento te haga retroceder. Si ve algo que percibe como incorrecto, y recibe una respuesta manual del revisor, no retroceda (al menos no por falta de conocimiento). Recuerde, lo que hace un buen código en un idioma rara vez es diferente de lo que hace un buen código en cualquier otro idioma. Sí, ciertos idiomas tienen modismos diferentes para ayudarlo a escribir un buen código. Pero es importante darse cuenta de que esos modismos son herramientas en lugar de fines en sí mismos.

Después de todo, trate de evitar hacer "revisiones de preferencias". Esto es algo en lo que yo (y muchos otros) tengo que hacer un esfuerzo muy consciente. En otras palabras, trate de evitar hacer revisiones que estén en la línea de "Usted hizo x , pero prefiero y ". Ahora, no hay nada malo en indicar las preferencias, pero debe etiquetarlas claramente como tales y tomar nota de que la otra parte es libre de estar en desacuerdo. Esto es importante, porque la mayoría de las cosas que son diferentes de un idioma a otro entran en esta categoría.

Por último, ¿utilizan un sistema de control de versiones distribuido? Una cosa que podría ayudar es que, en lugar de simplemente señalar lo que está mal con el código, podría volver a escribir el código de la forma en que lo habría escrito, probarlo y luego enviar un parche para ello. Esto ayuda a demostrar que está realmente interesado en mejorar su código y no solo en ser un "revisor del código del sillón" y le brinda la oportunidad de aprender mejor el idioma. Además, generalmente es más fácil estar en desacuerdo con "Creo que deberías hacer esto" que con "Así es como lo habría hecho, y aquí hay un parche si estás de acuerdo". Supongo que no necesariamente necesita un DVCS para esto, pero ciertamente ayuda.

Jason Baker
fuente
Acerca de las "preferencias": Imagine que escribí el código, lo revisó y tuve que cambiarlo debido a sus preferencias. Ahora haces un pequeño cambio, lo reviso y te hago cambiar todo de nuevo debido a mis preferencias. Debería ser obvio que esto es una tontería extrema.
gnasher729
7

Has perdido el foco en el problema y has encontrado una solución pobre. Se le ha encomendado la tarea de mejorar el desarrollo y su solución es poner a una persona a cargo de la revisión del código (usted mismo) que no entienda el idioma. ¿Quién está revisando tu código? ¿Por qué no pueden revisarse entre sí hasta que aprendes el idioma?

Tiene que haber alguna otra área problemática que podría haber seleccionado para tener una mejora más inmediata. De esta manera, solo te arrojan humo y nada mejora.

Dirigir el nuevo desarrollo a un lenguaje que ninguno de ustedes entienda (C #) tomará mucho tiempo en pagar, especialmente si todos traen consigo sus malos hábitos.

Centrarse en el diseño (eso ha sido mencionado). Si tienen dificultades para mantener el código actual, busque algunas herramientas de refactorización para VB. Muchas de las prácticas básicas son las mismas.

JeffO
fuente
5

Puede ' revisar la lectura' de cosas que realmente no conoce, pero no puede revisarlas adecuadamente . Soy altamente competente en C, conozco C ++ bastante bien, pero no soñaría con revisar algo en C #.

No creo que tenga que ir tan lejos como para traer un consultor, ya que algunas empresas se especializan en ejecutar su código a través de un montón de pruebas y decirle qué podría estar mal con él.

Aún así, dependería del desarrollador individual que conozca el idioma para interpretar el resultado. Por ejemplo, si un revisor de códigos me criticara por no usar el valor de retorno de printf(), los miraría de manera extraña y cuestionaría su sobriedad, luego preguntaría "Ok, genial, ¿qué puedo hacer cuando no se puede imprimir nada en la consola? ser útil?

Lo que quizás desee considerar es hablar con sus jefes sobre cómo configurar departamentos y líderes de equipo, para que pueda ser efectivo en su dominio, mientras que otra persona es efectiva en su dominio.

Aún así, creo que podría utilizar un tercero para la auditoría. La mayoría de los programadores que valen la pena prestarán atención a las preocupaciones legítimas , incluso si descartan la mitad como falso (como lo haría en mi printf()ejemplo).

Tim Post
fuente
4

Brindar orientación sobre algo que no comprende es similar a que el ciego guíe al ciego, como usted bien sabe.

Un enfoque sería hacer uso de herramientas de pelusa como FxCop y StyleCop que abordarán el frente del análisis estático de la base del código. Esto le proporcionaría un punto de partida para debatir los informes que se generan a partir de las herramientas.

Otro enfoque sería convertir las revisiones de código en revisiones de diseño. Las revisiones de diseño con más frecuencia no descubren problemas mucho antes incluso de que se escriba el código. Si un programador tiene un diseño desde el que puede trabajar, en general es mucho más eficiente en su enfoque y los errores disminuyen debido a esto. Cuando un diseño no existe, se vuelve ad hoc en el enfoque y el código sufre con el aumento del conteo de errores. Detecte los problemas en la revisión del diseño antes de que aparezcan en la revisión del código asegurándose de que cada uno de ustedes tenga un diseño concreto para implementar; UML es tu amigo aquí y las herramientas como umlet son rápidas y rápidas de usar.

Aaron McIver
fuente
4

La mala noticia es que para participar de manera efectiva en las revisiones de código, tendrá que aprender VB. También será útil usar VB en algún tipo de proyecto (no necesariamente para la producción).

La buena noticia es que una vez que haya hecho esto, algo de lo que haya aprendido aún será útil cuando pase a C #.

Larry Coleman
fuente
99
Leer VB no es lo mismo que saber VB. Leí VB lo suficientemente bien como para reescribir el viejo código VB en Java. No (y no puedo) escribir VB. Creo que hay un término medio para aprender suficiente VB.
S.Lott
1
@ S.Lott: bien articulado y bastante aplicable a cualquiera de los dos idiomas aleatorios.
Tim Post
2
@ S. Lott: Si usted puede leer VB suficientemente bien como para volver a escribir en Java, entonces usted no sabe VB, y puede escribir en él. Puede que tenga que buscar cosas a medida que avanza, pero eso solo duraría un par de semanas.
Larry Coleman
@ Larry Coleman: Supongo que conoces a VB bastante bien. No pude escribirlo. De Verdad. Soy un programador de Python / Java y las limitaciones y rarezas de VB me confunden. Mucho. No solo estaría buscando la sintaxis. Sería bastante incapaz de escribir programas adecuados porque simplemente no parece pensar de esa manera.
S.Lott
@ S.Lott: Conozco bastante bien a VB a pesar de mis mejores esfuerzos para olvidar. Si las rarezas / limitaciones de VB son confusas para usted, ¿eso no causaría problemas al portar código a otro idioma?
Larry Coleman el
3

La idea que debe tener en todo momento al hacer una revisión por pares es:

"¡SOY EL SIGUIENTE EN MANTENER ESTE CÓDIGO!"

Debe comprenderlo lo suficientemente bien como para poder hacerlo como parte de su preparación para la revisión, y su trabajo es hacer que el programador original esté al tanto de cualquier deficiencia que lo haga más engorroso de lo necesario para comprender el código lo suficientemente bien como para mantenerlo .

Si no puede programar en VB, no puede mantener el código y no está calificado para ser el revisor inter pares.


fuente
1

No debes revisar el código que no entiendes, eso solo molestará a los desarrolladores que tienen que explicar cada cosa extraña que han hecho.

Qué puede hacer elegir / definir pautas de codificación y verificar el código con estas pautas. Cuando algo no cumple con las pautas, puede pedirle una explicación al desarrollador.

Comenzaría por elegir las pautas existentes (no conozco ningún estándar de codificación de VB.net pero google me dio:

Utilice herramientas similares a stylecop para VB .net

Analice las fuentes con NDepend (tiene reglas sobre complejidad ciclomática, longitudes, profundidades, etc.)

Cuando haya hecho eso, puede decir que el código cumple con los estándares elegidos, no dice nada acerca de que la funcionalidad sea correcta o que el código utilice los principios OOP adecuados. Pero al menos es algo.

KeesDijk
fuente
1

Una buena revisión del código trata sobre cosas que requieren que usted comprenda el lenguaje (uso apropiado del lenguaje, API y bibliotecas, estilo, nombres de variables, etc.) y sobre qué tan bien el código resuelve el problema: buenos comentarios, arquitectura adecuada, diseño relevante patrones, considera todos los casos de error, etc. Cuando comienza a hacer revisiones de código, tiende a concentrarse en el primero. Son más fáciles de ver y más fáciles de elegir. (por ejemplo, no me gustan sus nombres de variables. Debería usar nombres de estilo XXXX).

La revisión del código se vuelve más valiosa cuando hay un mayor enfoque en qué tan bien el código resuelve los problemas. Dado que ahora no puede proporcionar tanto valor en la primera área, concéntrese en hacer preguntas y ofrecer consejos sobre la solución del problema, no sobre cómo se hace.

Por supuesto, hay una superposición entre los dos. Conocer VB.NET le permitiría brindarle consejos sobre por qué cierto patrón de diseño no es una buena opción en una situación particular, por ejemplo.

Sobre todo, sé humilde en esta etapa. El proceso de cambio es difícil. Incluso si fueras un gurú de VB.NET, el cambio probablemente no sería fácil. A las personas que no han usado la revisión de código no les gusta al principio. Hacer que otros vean tu código es una experiencia difícil. Se necesita tiempo para ver el valor y la paciencia a su alrededor. Es un gran proceso cuando obtienes el buy-in, pero llevará tiempo.

Wayne Johnston
fuente
0

¿Podría cambiar el enfoque para centrarse más en las pruebas en lugar de mirar el código directamente? No estoy diciendo que abandone las revisiones de código, pero inicialmente puede tener más sentido hacer que esas aplicaciones internas tengan suficientes pruebas que puedan ayudar a decodificar algo de lo que está sucediendo. La idea aquí es que las pruebas también podrían ayudarlo a familiarizarse un poco más con algunas de las funciones. Solo veo esto como una ruta diferente a tomar. La idea aquí es que las revisiones vuelvan más tarde y se puedan hacer en un par de partes, ya que puede valer la pena tener una sesión general / inicial y luego un descanso. Ese descanso será hasta el próximo día o dos para que haya tiempo suficiente para cualquiera que quiera dormir una noche pensando en el código o algo similar antes de volver con preguntas y tener una discusión.

Por supuesto, si ya tienes pruebas, desafortunadamente esto no es tan significativo. El otro pensamiento es dar un ejemplo de dónde afirman que en VB.Net esto se hace de una manera particular, ya que eso puede ayudar a aclarar esta pregunta de una manera que podría imaginar que varía de pequeños estándares de código a parte de El corazón de cómo VB.Net fue construido en cierto sentido.

JB King
fuente
0

Incluso si aprende los conceptos básicos de VB, realizar una revisión de código sin conocer todas las características del idioma no le permitirá detectar el uso de características inseguras en el idioma.

Suponga que no sabía que la función input () en Python 2 realmente evaluó la entrada antes de devolverla, para facilitar el análisis de los tipos de entrada que no son cadenas. Entonces el código sería vulnerable a la Ejecución de Código Arbitrario, permitiendo al usuario ingresar algo como __import__('os').execl('/bin/sh', '/bin/sh')en un sistema Linux para convertir el proceso de Python en un shell. En su lugar, raw_input () debe usarse para obtener los datos de entrada no procesados.

Intentar realizar una revisión del código sin conocer todas las características del lenguaje no solo puede evitar que se dé cuenta de una mejor manera de realizar un determinado procedimiento en el idioma; También podría conducir a defectos de seguridad perjudiciales.

Arcano
fuente