Leyendo código fuente

Sería chevere si uno pudiera leer un programa de computador tal como se lee un libro: en linea recta del principio al fin. Esto casi nunca es posible porque los programas no suelen estar organizados linealmente. Lo que hay, frecuentemente, es un manojo de archivos regados en directorios. Casi siempre me cuesta trabajo encontrar que pedazos del programa hay que leer, y en que orden, para entender globalmente su funcionamiento.

Las diferentes técnicas que he usado son:

  • Si hay suerte, el autor del programa ha escrito un archivo donde explica la estructura del programa y la responsabilidad de cada modulo. Eso da una idea de qué pedazos hay que leer, según lo que uno quiera entender del sistema. Si la documentación es suficientemente buena, el problema está mas o menos resuelto.
  • Mirar el sistema de “build” del programa (el Makefile, el archivo ant, .asd etc) e intentar deducir algo de la estructura del mismo.
  • Mirar los directorios en los que estan repartidos los archivos para deducir algo de la estructura.
  • Leer “de arriba a abajo”. Comenzar leyendo la función que arranca el programa (el “main”) e intentar identificar las funciones de alto nivel. Luego intentar leer “hacia abajo”, haciendo diagramas que muestran como se encadenan las funciones.
  • Si es un programa “orientado a objetos”, a medida que se lee el programa de arriba a abajo, se va haciendo el diagrama de clases.

Lamentablemente, salvo por los programas cuya estructura está bien documentada, la lectura de un programa escrito por otra persona tiene mucho de una actividad a ciegas.

Sospecho, por su nombre, que la técnica de literate programming de Knuth produce programas que se pueden leer como un libro. Nunca he intentado practicarla ni he leido programas escritos así. Que alguién me confirme.

P.S. Muchas veces el problema es que uno esta haciendo dos cosas al tiempo: intentando entender un programa e intentando aprender el idioma en el que esta escrito, es decir la manera particular en la que el autor del programa usa el lenguaje de programación subyacente. (Esto es mucho menos problematico cuando uno es mucho mas familiar con el lenguaje de programación y conoce estilos mas comunes con los que se usa.)

3 Comments

  1. dersteppenwolf
    April 12, 2010 #

    Tiene toda la razón…

    por ejemplo para entender el código de http://geonetwork-opensource.org/
    (dado que la documentación para desarrolladores es bastante limitada… y los comentarios en el código prácticamente son inexistentes)
    tuve que aplicar la técnica la a que ud. llama “Leer “de arriba a abajo””…

    por fortuna las herramientas de “edición y búsqueda de código” que posee eclipse proveen alguna ayuda… (como por ejemplo ir a la definición del método, buscar texto en todos los directorios, etc…)..
    no es lo más óptimo.. pero ayuda bastante…

    otra cosa que dificulta bastante el entender un programa de otro es cuando se mezclan múltiples tecnologías y frameworks en un solo proyecto…
    (en el caso de geonetwork terminamos revisando múltiples herramientas que no conocíamos… una tarea intelectualmente interesante… pero costosa en tiempo.. )

    mm… y falta el caso de un amigo… alguna vez tuvo que modificar un programa hecho en RPG en los años 80… por “fortuna” los comentarios del código estaban en alemán (como podrá imaginar.. nadie sabía alemán en esa oficina bogotana…resultado:.. a leer el código fuente línea a línea… )

    saludos

  2. Alejo
    May 21, 2010 #

    Interesante. Qué piensa de estrategias como esta: http://azul.freaks-unidos.net/xc ? Ahí la página web *es* el programa…

Leave a Reply

Powered by WordPress. Designed by Woo Themes