martes, 25 de enero de 2011

Code Katas - la práctica hace al Maestro (videos)

Kata.jpg

Tomando como inspiración la forma en que los músicos ensayan para mejorar su técnica, o más directamente la manera en que se realizan las prácticas en las artes marciales, efectuando ejercicios repetitivos hasta dominar por completo ciertos movimientos, lo que permite empezar a componerlos, Dave Thomas (uno de los Pragmatic Programmers), comenzó a popularizar el concepto de Code Katas. Para quienes quieran saber la historia completa de la génesis Dave la cuenta completa en este post.

Con el tiempo, el concepto de Code Kata trascendió a Dave y fue adoptado por mucha gente dentro de la comunidad, con variantes en la manera de encararlo, pero compartiendo una intención común.

En forma simplificada, la idea de un Kata de código es similar a su predecesor en Karate (y no es exactamente lo mismo, pero Dave tomó la idea general, no intentó que sea un calco de las artes marciales). Se trata de realizar prácticas frecuentemente sobre una serie de movimientos (en código, ejercicios determinados).

Esta idea de la práctica constante tiene que ver con ideas como las de Peter Norvig en su clásico "Aprende a programar en 10 años" (traducción al español de Carlos Rueda).

Uno de los más clásicos es la calculadora de strings. La idea es hacer un programa que resuelva expresiones como "42 * 8" o "(66 / 3) -7". El ejercicio implica un mínimo de parsing para separar los operadores y operandos, y manejar un stack para los paréntesis. Obviamente no hay una respuesta única, e incluso la resolución puede variar mucho si el ejercicio se resuelve en Java, en Haskell o en Cobol.

La diferencia con realizar el ejercicio una sola vez, es que en los Katas vamos a resolver ese mismo ejercicio (y otros) muchas veces. Es realmente como ensayar un tema musical. Cada vez sale mejor, pero todas las veces la experiencia es levemente diferente. También podemos aprovechar la familiaridad con el ejercicio en si para probar diferentes técnicas.

Por ejemplo, podemos tomar otro Kata, como el clásico FizzBuzz, que en varios lados utilizan como primer filtro en las entrevistas a programadores, y realizarlo la primera vez a los tumbos, luego utilizando pruebas unitarias, luego con TDD, luego sin usar el mouse, luego cambiar de lenguaje, etc. Este es un ejercicio bastante corto que permite incluso ser resuelto varias veces seguidas durante el lapso de una hora o dos.

Extrañamente, mucha gente no encuentra sentido a este tipo de práctica, y sin embargo puede pasar horas y horas tratando de tocar Escalera al Cielo de Led Zeppelin (sin ser buen guitarrista, para empezar). Lo importante es poner el mismo tipo de intención en estos ejercicios, tratar de mejorar nuestra técnica, optimizar el flujo de trabajo de nuestra IDE o editor, la legibilidad del código, etc.

Definitivamente, quienes trabajamos en esta industria bastante tiempo sabemos que los años pasados de experiencia no equivalen a "experiencia valiosa". Este tipo de actividades nos mantiene afinados. Y afortunadamente hay entusiastas que nos acompañan, como en CodingKata.org o la reciente iniciativa en español 12 meses, 12 katas.

Casualmente de este último les comparto un ejemplo en video, de la calculadora de strings en Ruby (utilizando RSpec para las especificaciones/pruebas) por Eric Minio. Recuerden, la solución de Eric no es más que una de muchas posibles. La gracia es ver cómo lo hace él y hacerlo nosotros con nuestras propias ideas, técnicas y herramientas.

Noten que los katas no necesitan ser ejercicios menores y simples. Como comprobación de la hipótesis del título de este post, baste ver como el Maestro Angel "Java" López se ejercita continuamente con sus particulares katas (compiladores, intérpretes, utilitarios), todos disponibles en su repositorio de katas en Google Code.

Como comparación final, les dejo otra versión del Kata de la calculadora de Strings, pero escrita en Clojure por Tom Crayford.

String Calculator Kata from Tom Crayford on Vimeo.

7 comentarios:

  1. Muy bueno Martín. Yo me pregunto porque no nos enseñan a programar así en la facultad o el colegio.

    Estoy haciendo un experimiento, de enseñar o más bien ayudar a un amigo a programar. Primero leimos el tutorial de ruby y practicamos con la consola. Después hicimos con TDD y pair programming un kata de nros romanos.

    A él le gustó mucho la dinámica, en poco menos de 2 horas aprendió algo, pero además la pasó bien, de hecho tenía ganas de seguir.

    Creo que este tipo de cosas, combinadas con pair programing, no solo mejoran la técnica, sino que tienen un efecto en las personas que es muy positivo.

    ResponderEliminar
  2. Es cuestión de empezar. Mientras más seamos los que enseñamos estas prácticas, más probable es que empiecen a incorporarse a la curricula oficial.

    Yo tengo en mente empezar a dar cursos cortos de programación para chicos de secundaria (en los colegios o en el MUG) para que sepan de qué se trata y para que sepan lo que es importante aprender si quieren dedicarse. Si alguien más le interesa, me avisa y tratamos de organizarnos.

    ResponderEliminar
  3. Sería muy bueno participar de algo así. Abrazo!

    ResponderEliminar
  4. Muy interesante tu propuesta, Martín.

    saludos!

    ResponderEliminar
  5. Me parece muy interesante esto de los Katas de código, le envio por mail el enlace a mi profesor de programación a ver que tal le parece.

    ResponderEliminar
  6. Aitor soy Carlos, tras la semana blanca se harán sencillos ejercicios como el que se detalla y poco a poco más complejos.
    Cómo dice Martín TODO ES EMPEZAR. De ahí ya dependerá tu interés y nivel, la programacion en Java es inacabable! siempre hay más y más. Yo aun no se nada que no se puedar hacer con Java.

    ResponderEliminar
  7. Esto superó cualquier expectativa:
    http://rubymonk.com

    ResponderEliminar