Nonsense

A veces me gusta imprimir algo de código en papel. A veces por interés mío y a veces a petición de alguien. Imprimir el código no es el objetivo, claro, eso sería un derroche de papel. El objetivo es hacer una actividad que he comentado en Twitter antes y que he llamado “revisión de código”. Sin embargo, después de algún comentario dudo si ese es el nombre más apropiado.

Últimamente cuando se dice “revisión de código” (“code review” para los que lo prefieran) la mayoría suele pensar en algo como esto:

Es decir, dos cosas concretas: un cambio y comentarios. Se piensa en comentar detalles muy concretos (generalmente ligados a una determinada línea o bloque de código) y se piense en herramientas de control de cambios, como Git, por ejemplo. Algunos otros piensan en otra revisión de código, una revisión automatizada del código, es decir, algo más cercano a un análisis estático del código. Esto otro a veces tiene comentarios muy concretos (“aquí se puede producir un desbordamiento”) y otros muy genéricos (“la complejidad ciclomática de esto es como el infierno”).

En ambos casos (revisiones de cambios o análisis atomático) son actividades francamente aburridas. Sí, aburridas. Son muy mecánicas y, sobre todo, muy limitadas.

Lo que yo hago en papel es un poco diferente y ninguna de las dos opciones anteriores es aplicable

  • Tengo una pieza de software, inicialmente desconocida para mi. El tamaño no es excesivamente grande. En este caso digamos que son unas 600+ líneas de código en unos 20 ficheros. Tiene una docena de tests y funciona.
  • Como digo no he visto nunca el código y sólo tengo una descripción aproximada de para qué sirve y apenas nada de cómo hace lo que hace.
  • Mi objetivo es: 1. Conocer/entender el código, 2. Revisarlo para encontrar posibles problemas, 3. Devolver mis apreciaciones al autor.

Hay varias razones que hacen que herramientas que consisten en “comentar sobre una pull request” no sean apropiadas. En primer lugar ni siquiera hay un cambio. Lo que se revisa es el estado actual de la pieza de software. No sólo eso sino que el alcance es relativamente grande (600 y pico líneas) para que tenga sentido comentar este if o esa asignación. Y desde luego ver todo el código así sin más, no ofrece ninguna ayuda a la exploración del código.

Una herramienta automática tampoco es interesante en este caso. No sólo no me va a proporcionar ninguna comprensión del código que la herramienta lo revise, sino que existen familias enteras de “problemas” (digamos mejor aspectos interesantes) que este tipo de herramientas no es capaz de tratar.

Lo que yo hago es un proceso que suele empezar pintando un montón de flechas desde unos puntos del código a otros puntos del código. Es decir, una parte de la actividad es explorar el código y hacer un mapa. Es la propia actividad de pintar este “mapa” lo que me permite aprender a moverme por ese código y a la vez lo que me permite encontrar determinados aspectos interesantes. Estos son aspectos, muchas veces, de arquitectura, de organización del código. Los caminos del mapa me hacen ver que para ir de A a B siempre tengo que pasar por C o que todo el mundo pasa por X para ir a cualquier otro sitio. Me permiten ver las relaciones de unas partes con otras. Dependencias, cohesión, encapsulación… Incluso más aún, puedo ver ciertos niveles de complejidad que muchas veces no pueden asociarse de forma precisa a una determinada línea de código. También puedo ver patrones que se repiten en diferentes zonas del mapa…

En fin, no sé, siempre he pensado que esto era algo normal. Igual es que los demás no necesitan hacer esto. A mi, la verdad, me ayuda. Me permite ver cosas que de otro modo se me hacen mucho más difíciles de ver.

De hecho, creo que es francamente difícil que una herramienta digital pueda sustituir la facilidad con la que un puñado de rotuladores de colores y unos folios me permiten hacer todo esto. Alguna vez lo he hecho con una tableta gráfica y… bueno, podría ser aceptable, pero tiene la pega de que termino teniendo que usar un programa de dibujo. No hay ninguna herramienta específica para hacer algo así, que yo conozca. En papel puedo anotar de forma completamente libre. Puedo dibujar flechas, resaltar, tachar, poner círculos, escribir, recuadrar… Lo único que no puedo hacer, y me encantaría, es mover trozos de código de un lado a otro del papel. Puedo mover papeles enteros, eso sí, y alguna vez he probado a recortar trozos y pegarlos, pero ya se hace más complicado. Ahí una herramienta digital sí que tiene una gran ventaja.

source-code-review.jpg