jueves, 3 de junio de 2010

Como transformarnos en mejores programadores leyendo código

En un post anterior hablamos sobre las diferencias de capacidad entre programadores y sobre como podemos transformarnos en mejores programadores mediante la repetición de ejercicios a los que llamamos Katas.

En realidad esto es solo posible si tenemos claro hacia donde queremos ir, ya que el efecto de la mera repetición de ejercicios es solo la fijación de los conceptos e ideas que estamos practicando. Si nuestros hábitos son malos, al repetirlos y fijarlos estaríamos empeorando en vez de mejorando.
Una excelente manera de descubrir ideas para aprender es la lectura de código fuente. Así como la gente que lee mucho generalmente tiene buena ortografía y vocabulario, el leer mucho código mejora nuestra forma de programar.

Por supuesto, esta idea no es nueva. Cuando estaba aprendiendo a programar en Basic en la escuela secundaria compraba unas revistas de programación donde venían juegos para correr en mi MSX (si, ya se, soy un dinosaurio). Pero estos programas no venían en diskette, venían en forma de listados de código fuente BASIC que uno debía transcribir en la máquina para poder usar el juego. La verdad es que era un bajón, pero también era manera buenísima de aprender el lenguaje e incluso de hacer tus primeras experiencias de debugging, buscando los errores que podías haber introducido al tipear el código.

Yendo un poco más atrás todavía, el mismo Bill Gates recomienda esta idea como la mejor manera de aprender a programar y dice que el aprendió mucho robando listados de tachos de basura.


Lo bueno es que ahora ya no es necesario copiar programas de revistas viejas o buscar listados en tachos de basura para encontrar código del que aprender ya que tenemos disponibles miles de proyectos open-source en prácticamente todos los lenguajes y tecnologías existentes.

¿Que tipo de cosas podemos aprender así? En primer lugar muchos proyectos open-source hacen uso de algoritmos avanzados cuyo conocimiento puede cambiar nuestra forma de atacar ciertos problemas. Como ejemplo se puede pensar en los algoritmos de comparación de versiones de archivos de los programas de manejo de versiones como Subversion o Git, o los algoritmos de base de datos en MySQL o SQLite o los algoritmos de encriptación en los proyectos de Apache, por citar unos pocos.


Por otro lado, leer código en un lenguaje que no dominamos nos permite entender los "giros idiomáticos" de ese lenguaje. Por ejemplo, el siguiente es código Ruby válido para recorrer un vector:

v = [1,2,3,4]
0.upto(v.length) do |x|
  print v[x]
end

Pero la manera idiomatica de hacerlo es la siguiente:

v = [1,2,3,4]
v.each do |elem|
  print elem
end

El primer ejemplo es la típica manera en que un programador proveniente de otro lenguaje recorrería un vector mientras que la segunda es una manera más propia e Ruby (y más linda, debo decir). Leyendo código de programadores expertos en el lenguaje que queremos aprender podemos evitar caer en el clásico error de escribir Fortran en cualquier lenguaje. También es posible que nos encontremos con cosas que ni siquiera nos imaginábamos que se podían hacer.

Otra fuente de mejoras importante es enfocarse en los aspectos malos del código que estamos leyendo. Si nos cuesta entender una parte del código podemos intentar refactorizarlo para que sea más claro. Si quedamos muy contentos con nuestro cambio podemos incluso enviarle un patch a los dueños del proyecto open-source.

Una variante de esta técnica es no limitarse a leer el código si no buscar algún reporte de error del proyecto e intentar corregirlo. Es importante que al hacer la corrección imitemos lo más posible el estilo del código existente, ya que la idea no es solo corregir el bug si no mejorar nuestro estilo de programación.

Además de mejorar nuestra forma de programar es muy importante acostumbrarse a leer código desconocido ya que los programadores pasamos muchísimo más tiempo leyendo código que escribiendolo. Cuanto más efectivos seamos entendiendo código ajeno, más productivos vamos a ser.

En un futuro post vamos a mostrar el análisis de un pequeño plugin de jQuery y todo lo que se puede aprender de el.

1 comentario:

  1. Comparto 100% el concepto del post. No sólo hay que leer código elegante para aprender, sino como decís al final, es importante leer código desconocido: a veces se aprende tanto de lo que no está bueno como de lo que es ejemplo de lo bueno.
    Entre mis notas tenía guardada una cita que tiene que ver con ésto. La comparto:

    "The software business is one of the few places we teach people to write
    before we teach them to read. That’s really a mistake." — Tom Love

    ResponderEliminar