¿Es efectivo revisar el código en un idioma que no conozco?

108

Soy un desarrollador experimentado, pero no he hecho muchas revisiones de código. Me piden que revise el código escrito en Python pero no sé Python.

¿Tiene algún sentido revisar el código en un idioma que no conozco?

Heather Smith
fuente
62
Tangencialmente, considere ir a CodeReview.SE y echar un vistazo a la etiqueta python. Mirando solo la pregunta, considere qué consejo le daría al código y luego vea si eso está representado en las respuestas.
14
Suena como una excelente manera de aprender más sobre Python. Cuestione cualquier cosa que parezca graciosa: parte de ella será que no comprende el idioma y otras serán artículos legítimos de revisión de código.
Dan Pichelman
99
@RobbieDee ¡Absolutamente! Explicar su código a alguien a menudo vale la pena, incluso si es solo un oso de peluche .
Kilian Foth
34
Dices que se te pide que lo hagas. La persona que le pregunta cree que está realizando esta tarea agregará valor a su organización. Si quieres saber cuál es la naturaleza de ese valor, pregúntale a esa persona , ¡no a extraños en Internet! No sabemos lo que sucede dentro de la cabeza de esa persona. Quizás el código es de tan baja calidad que incluso los novatos pueden encontrar problemas. Quizás el código sea de tan alta calidad que aprenderá buenos hábitos de él. ¿Quién puede decir? Alguien piensa que es de valor; pregúntale a esa persona cuál es el valor.
Eric Lippert

Respuestas:

120

¿Algún sentido? Si. Incluso si no sabe nada sobre la semántica de un lenguaje de programación, aún puede leer caracteres y notar un formato inconsistente, comentarios faltantes, identificadores mal elegidos, duplicación obvia, etc.

¿Mucho sentido o suficiente sentido para pagar el costo de su tiempo ? No estoy seguro. Esto depende de su posición, la importancia de las revisiones de código en el flujo de trabajo de su equipo y varios otros factores que no podemos cuantificar lo suficientemente bien.

Kilian Foth
fuente
50
Hacer algunas revisiones de código es una excelente manera de conocer un módulo, un marco o incluso un idioma, por lo que podría valer la pena de todos modos (y tal vez te insinúen ...). Sin embargo, no firmaría una revisión así, no sin tener a alguien que esté familiarizado con el idioma y el código para que lo revisen.
Ordous
8
Además, si tiene un buen conocimiento del dominio y el código está razonablemente bien nombrado / comentado, aún puede detectar funcionalidades incorrectas / mal entendidas / faltantes en un alto nivel (aunque no puede detectar errores debido a problemas de sintaxis)
Dan
44
Como un extraño, incluso es más probable que detecte errores de poste de la cerca, o errores al aplicar la cantidad correcta de signos iguales, y ese tipo de cosas.
KlaymenDK
2
@KlaymenDK Las asignaciones en contextos booleanos son (al menos típicamente) errores de sintaxis en Python. Los errores de Fencepost son menos probables ya que Python bien escrito casi nunca lo hace trabajar directamente con índices de matriz / lista. (Incluso cuando lo hace, generalmente es con enumerate). Creo que su comentario es un gran ejemplo de por qué tratar de revisar un idioma con el que no está familiarizado debería ser educativo para usted.
jpmc26
1
@Mawg: tiendo a decir que para eso están las pruebas automatizadas. Incluso con un conocimiento experto del lenguaje, es difícil decir si el código cumplirá o no con las especificaciones de diseño con solo mirarlo / sin ejecutarlo y observar el resultado (a menos que la especificación de diseño sea tan detallada que sea esencialmente código en sí mismo) . Los aspectos que enumera la respuesta cubren muchas (aunque no todas) razones válidas para realizar revisiones de código. Una revisión de código generalmente no incluye la ejecución del código que se está revisando.
Aroth
59

Como colaborador habitual en Code Review Stack Exchange , me encuentro con muchas preguntas que padecen problemas independientes del idioma, por ejemplo:

  • Formateo, sangría
  • Alcance
  • Bucles
  • Operaciones tipo

Y la lista continúa. Sin embargo, aunque no necesito saber el idioma, aún puedo revisar esos problemas / puntos.

Algunos de nuestros principales usuarios tienen las mejores respuestas en idiomas que no usan activamente o no conocen. Incluso dos de mis diez principales están en idiomas que no conozco ni puedo compilar / ejecutar en mi máquina.

Incluso diría que sería lo mismo que revisar el pseudocódigo de alguien. Siempre que pueda observar y comentar cosas relevantes para las cosas que entiende, estará bien y será relevante.

Pluma
fuente
2
Incluso escribí una respuesta a un programa PHP. No es la mejor respuesta, pero aún mantengo que la declaración original del bucle es fea.
Hosch250
44
Aprendí C # a través de una combinación de revisión, escritura y revisión de lo que escribí.
RubberDuck
55
Si no conoce Python, es poco probable que aprecie la importancia de la sangría en el idioma ...
Floris
2
Con respecto a 2/10 de sus principales respuestas en idiomas que no conoce. ¿Quién puede decir que los votantes saben algo de ellos tampoco?
Martin Smith
Si bien no sé los idiomas, aún verifico mis declaraciones, y si me equivoco ... Confía en mí, me enteraría de eso
Quill
44

Consejos generales

Aquí está el resultado final, en mi opinión:

  • Si no conoce el idioma lo suficientemente bien como para conocer las características y los modismos comunes , probablemente no contribuirá mucho a la revisión.
  • Si desea aprender las características y expresiones idiomáticas del idioma, puede participar en la revisión. Su enfoque debe ser observar los modismos y hacer preguntas sobre patrones y organización que no tienen sentido para usted. Esto puede ayudar a identificar áreas problemáticas, pero solo en el sentido de que podría obligar al desarrollador a defender lo que ha hecho. Haga sus preguntas de una manera que deje espacio para su brecha en el conocimiento. Tenga en cuenta que esto puede terminar siendo un costo neto en la revisión en sí, pero ese costo es una inversión en su conocimiento.
  • Su capacidad de contribuir hasta que se haya familiarizado con las características, modismos y estándares del lenguaje será limitada. No esperaría que esto cambie hasta que haya escrito una cantidad significativa de código en el idioma.

Consideraciones y ejemplos específicos de Python

Para la situación específica de no conocer Python, sería especialmente cuidadoso con esto. Python tiene muchas expresiones idiomáticas y prácticas estándar que terminan haciendo que Python se vea muy diferente de lo que cabría esperar en otros idiomas. (De hecho, creo que las cosas que enfatiza Python han hecho que mi código se vea mejor en otros idiomas, y no al revés). Más allá de PEP8 tiene un buen ejemplo de cómo puede extrañar completamente la mentalidad que Python fomenta.

Veamos un ejemplo simple. Toma este código:

f = open('/home/me/something.txt')
try:
    content = f.read()
finally:
    f.close()

¿Ves el problema con este código? Si no ha trabajado con Python, probablemente no lo haga. El problema es que hay un gran estilo preferido en Python que hace exactamente lo mismo:

with open('/home/me/something.txt') as f:
    content = f.read()

Este es un administrador de contexto. ¿Sabes para qué son buenos? ¿Sabes cuándo sería apropiado usar uno? ¿Sabes cuándo sería apropiado crear el tuyo? ¿No? Entonces probablemente no estés listo para revisar Python.

Veamos otro ejemplo.

def add_fifty(other_list):
   result = list()
   for i in other_list:
       result.append(i + 50)
   return result

x = range(10)
y = add_fifty(x)

¿Ves el problema? El problema es que este método es completamente innecesario . Probablemente debería usar una comprensión en el lugar, cuando la operación es así de simple:

x = range(10)
y = [i + 50 for i in x]

Si no viste eso, no estás familiarizado con las características y modismos de Python.

jpmc26
fuente
1
En su último ejemplo, si vi el código final, probablemente tendría alguna idea de lo que podría hacer (sin conocer Python) y podría comenzar a preguntarme si puedo hacer algo similar en mi idioma favorito, que nunca antes había considerado.
gnasher729
1
@ gnasher729 "De hecho, creo que las cosas que enfatiza Python han hecho que mi código se vea mejor en otros idiomas, y no al revés". =) Lo único que sé en otros idiomas que sería remotamente similar es .NET's LINQ y Java 8's Stream s. Ruby podría tener algo, y estoy seguro de que los lenguajes funcionales se acercan a algo. Sin embargo, mi punto con el ejemplo es que quizás ni siquiera sepas hacer eso si no estás familiarizado con Python, por lo que ni siquiera sabrías desafiar la versión "mala".
jpmc26
@x = 1 .. 10; @y = mapa {$ _ + 50} @x;
tubería
2
La revisión de código se trata más de errores lógicos que de implementar una sintaxis oscura (para programadores externos) en un lenguaje particular. Se trata de encontrar errores lógicos, como implementar un algoritmo completamente incorrecto (como usar la división cuando debería ser una suma). Entonces el código no estará exactamente a la altura de las especificaciones. Eso no es importante siempre que la salida resultante sea correcta. Por lo menos, si le preocupan optimizaciones particulares como esta, una revisión del código del equipo sería aún mejor.
phyrfox
3
@phyrfox Eso simplemente no es cierto. Se pueden encontrar errores lógicos, pero la revisión del código también se refiere (o principalmente) a las mejores prácticas, seguridad, rendimiento, confiabilidad, legibilidad / mantenibilidad, etc. Antes de que se revise algo, realmente debería haberse probado. La definición de revisión de código de StackExchange es bastante acertada, en mi opinión . En Python, los ejemplos que he mencionado no son "pequeñas optimizaciones". Un desarrollador de Python que no usa estos patrones es muy inexperto, atrasada o incompetente. Estos son elementos básicos del lenguaje.
jpmc26
21

Es posible que le hayan pedido que revise el código de Python precisamente porque no conoce Python . Hay una teoría de gestión que dice que es útil tener un "tonto" en un equipo. No te estoy llamando mal nombre :) La idea es que un equipo puede sufrir de pensamiento grupal y desarrollar visión de túnel. Una forma de salir de esto es incluir a alguien en el equipo que los otros miembros del equipo considerarían un "tonto", es decir, alguien que no conoce el tema. Hará preguntas para informarse, y las preguntas vendrán desde un punto de vista que los otros miembros del equipo probablemente nunca consideraron.

No conoce Python, por lo que lo que puede parecer común para los codificadores de Python puede parecerle extraño. Puede sugerir una mejora que el equipo nunca consideró.

usuario2023861
fuente
1
Esta fue mi respuesta. Solo agregaría eso, en cualquier día con cualquier rutina de Python y cualquier grupo de gurús de Python ... ese código es GARBAGE.
dwoz
Y a menudo, el simple acto de explicar algo a "un tonto" provocará el "¡Doh!" momento de un "experto" cuando de repente se dan cuenta de que el código no está haciendo lo que debe hacer, o pierde algún caso clave. También es una forma decente de comenzar a difundir el conocimiento.
TripeHound
21

La revisión de código no se trata de buscar variables con ortografía no válida y formato incorrecto. Si usa la revisión de código para encontrar esas cosas, deje de perder el tiempo y use una herramienta.

La revisión de código se trata de mejorar el diseño y detectar errores comunes por parte de programadores novatos.

Como programo en C ++ y no conozco Python lo suficientemente bien, no me atrevería a revisar el código de Python. Sin embargo, podría ayudar con una revisión del código Java.

No dijo en qué idioma programa, pero no veo en qué puede contribuir en una revisión de código, si no conoce el idioma en el que está programado.

BЈовић
fuente
23
¿Realmente, tienes una herramienta que puede distinguir las variables mal nombradas de las buenas? Estaría realmente interesado en ver uno.
Davor Ždralo
1
@ DavorŽdralo De buenas a primeras sé que Java tiene Checkstyle. Las herramientas de análisis estático más formales son comunes para muchos idiomas, y hacer que impongan un estándar de codificación suele ser la menor de sus funciones.
Shaz
99
Tengo la sensación de que hay una pequeña diferencia entre las definiciones de Revisión de Código aquí, me recuerda un poco esta pregunta sobre CR Meta: ¿Qué ES una Revisión de Código? . No excluiría algo específico y diría "La revisión de código NO se trata de XYZ". También parece que estás diciendo que los programadores experimentados no necesitan revisar su código, algo con lo que no estoy de acuerdo.
Simon Forsberg el
3
@SimonForsberg Eso no es lo que estoy diciendo. Incluso los programadores senior pueden aprender algo en una buena revisión de código. Pero si los únicos comentarios son "has escrito mal una variable aquí", muchos comentarios, están perdiendo el tiempo.
B 14овић
2
@ BЈовић No, no es lo peor que puedes encontrar, pero está bastante cerca de "la cosa más pequeña encontrada que todavía vale la pena".
Vatine
11

Las revisiones de código (además de buscar fallas) son una buena introducción de un miembro del equipo a otros para agregar o cambiar el código. Si eres un desarrollador experimentado , deberías poder leer lo suficiente para comprender en su mayoría lo que está sucediendo.

Mire una revisión del código desde el punto de vista del líder de un equipo: hay alguien allí que entiende lo que la aplicación debería estar haciendo (lógica de negocios), hay alguien allí que entiende que el código está haciendo (lógica de implementación), y posiblemente varias otras personas. Hay quienes necesitan tener una idea de cómo encaja todo eso.

Adam Zuckerman
fuente
7

Definitivamente no deberías ser el único revisor, pero hay muchas buenas razones para que seas uno de los revisores. No conocer el idioma no es un gran obstáculo para muchas preguntas que deben responderse en una revisión de código. Como ejemplo, soy uno de los 20 principales respondedores en la etiqueta C # en este sitio, y no he compilado hello world en C #.

Algunos conocimientos que puede compartir sin conocer el idioma:

  • Conocimiento del dominio.
  • Diseño general orientado a objetos.
  • Prácticas generales de programación: nomenclatura, claridad, etc.

También es una buena manera de ponerse al día con un nuevo producto. Me acabo de unir a un nuevo equipo, donde sé que los idiomas se usan bastante bien, pero no conozco el dominio. Participar en las revisiones de código me ha ayudado a conocer mejor el lado del dominio, aunque todavía no he podido contribuir mucho en ese sentido.

En su caso, será una buena manera de aprender las expresiones idiomáticas de un nuevo idioma, ya que verá los comentarios que dejan otros críticos. Este es el tipo de cosas que son muy difíciles de aprender de otra manera, porque a su intérprete no le importa si su código es pitónico o no.

Karl Bielefeldt
fuente
5

Esta podría ser una situación de ganar-ganar. Me atrevería a decir que podrías ser un crítico especialmente valioso porque eres una virgen de Python que no ha sido contaminada por la Maldición del Conocimiento .

Piénselo de esta manera: si el código es lo suficientemente claro como para que incluso una virgen de Python pueda entenderlo, entonces debe ser un buen código. Las partes que tiene problemas para comprender podrían ser candidatos para volver a trabajar o para comentar mejor.

Obviamente, también sería beneficioso para usted, ya que estaría aprendiendo un nuevo idioma a medida que avanza. (Con suerte, el código que se le proporciona es un buen ejemplo para aprender). Esta disposición debería funcionar particularmente bien para Python, un lenguaje que tiene la reputación de ser "pseudocódigo ejecutable". Si eres un desarrollador experimentado, entonces no deberías tener muchas dificultades para comprender la esencia de un programa Python.

La advertencia sería que no se espera que detecte errores que surgen de problemas específicos del idioma . Pero la búsqueda de errores no es el único propósito de las revisiones de código. Por lo menos, estaría participando en la transferencia de conocimiento simplemente al saber qué tipo de cosas suceden en el código de su colega.

200_success
fuente
2

Una vez me pidieron que auditara un proyecto que estaba llevando a cabo un subcontratista y parecía tener serios problemas de rendimiento. Rápidamente establecí que el factor crítico era un solo módulo Perl. Nunca me había encontrado con Perl antes y no teníamos a nadie en la organización que lo supiera, así que empecé a tratar de entenderlo yo mismo. Nunca llegué a comprender los detalles, pero estaba muy claro que el algoritmo que estaba usando tenía un tamaño de datos cuadrático y esta fue la causa de todos los problemas. Entonces, sí, leer el código en un idioma que no comprende completamente puede ser productivo. La ventaja es que aprendes nuevos trucos mientras lo haces.

Michael Kay
fuente
1

Algunas observaciones:

1) Si eres un desarrollador experimentado, elegirás Python (o al menos todo lo que necesites saber), solo trabajando con él. Será un caso de "aprender haciendo". Al principio será difícil, pero será más fácil a medida que aprendas el idioma. Piense en esto como una oportunidad para aprender otro idioma (las personas a menudo aprenden idiomas "extranjeros" a través de la "inmersión").

2) Hay una cantidad de personas valiosas en los sitios de SE que no son "técnicas", pero que tienen experiencia en gramática, comunicaciones y lógica. Dichas personas aportan un "ojo nuevo" a los sujetos y hacen una serie de arreglos "obvios" que otros extrañan, porque están demasiado "atados" en el material. Se le está consultando presumiblemente por sus habilidades no "técnicas" (es decir, no Python), como la lógica y la comprensión general de la programación.

Y si no ha realizado muchas revisiones de código, casi cualquier experiencia de revisión de código lo ayudará como desarrollador. Esto parece una buena combinación entre tus habilidades y necesidades y las del equipo.

Tom Au
fuente
1
Me pregunto si revisar el código constituye "aprender haciendo" en un grado significativo. Quizás mi experiencia de revisión es diferente a la suya, pero rara vez hay una escritura significativa o sustancial de código, y casi nunca se ejecuta.
Nombre de pantalla esotérico
@EsotericScreenName: creo que depende de la cantidad de comentarios que reciba de alguien que escribió o conoce el código. También es más probable que esté en un área de dominio en la que está trabajando con otro idioma, lo que lo hace más relevante que el ejemplo de código típico. La mayoría de los ejemplos de codificación solo muestran cómo hacer pequeños fragmentos de una tachuela y rara vez se muestran como parte de un proyecto grande.
JeffO
0

Eso depende de cuál sea el objetivo de la revisión; es decir, lo que quieres decir con efectivo .

Es probable que aún pueda detectar algunos problemas. Si eres todo lo que tienen que revisar y solo esperan que echar un vistazo sobre esto ayude a algunos y posiblemente atrape algo, entonces seguro. Muchos conceptos de estructura son similares entre idiomas. Uno especialmente es poder revisar los comentarios. Debe comentarse lo suficientemente bien como para que un programador que no sea de ese lenguaje en particular aún pueda tener una buena idea de lo que está sucediendo. Si no ... entonces puedes decirles dónde faltan sus comentarios. Si está tan bien comentado ... entonces debería poder revisar un poco de su estructura solo a través de las anotaciones de lo que está sucediendo en lugar de leer realmente el código de lo que está sucediendo.

Pero es probable que no detecte muchos otros problemas. Por lo tanto, si pretenden que su revisión sea una determinación exhaustiva de si este es un programa bien hecho / viable, se sentirán decepcionados.

El hecho de que ese resultado valga o no el tiempo de hacerlo depende en gran medida del proyecto.

Jimbo Jonny
fuente