sábado, 17 de abril de 2010

Code Kata

Es un hecho conocido que hay grandes diferencias de productividad entre un programador y otro.  Según algunos estudios los mejores programadores son entre 10 y 20 veces más productivos que los peores. Otros estudios hablan incluso de una diferencia mayor, sobre todo teniendo en cuenta que hay programadores que tienen productividad negativa
(ver http://www.pyxisinc.com/NNPP_Article.pdf).

Si esta diferencia se debiera solo a motivos de talento personal no podríamos hacer nada al respecto. Sin embargo, todos los buenosprogramadores atribuyen buena parte de su éxito a ciertas habilidades y hábitos que fueron adquiridos por ellos en algún momento y que les permitieron potenciar su talento natural.  Kent Beck (el autor de jUnit) afirma "Yo no soy un programador sobresaliente, soy un buen programador con hábitos sobresalientes".

Se tiende a pensar que estos hábitos se adquieren a través de la experiencia en el trabajo diario. Sin embargo las presiones y conflictos de un proyecto de software hacen que sea un pésimo lugar para aprender cosas nuevas. Para que un entorno facilite el aprendizaje es necesario que sea aceptable cometer errores, y esto no es así cuando estamos desarrollando software para alguien que nos paga por eso. Cuando tenemos presiones, tendemos a ser cautelosos y hacer las cosas como las hemos hecho antes, lo que causa que no aprendamos nada.

Además sería injusto para nuestros clientes utilizarlos de conejitos de India para probar nuevas técnicas o metodologías.  Dave Thomas dice al respecto: "En desarrollo de software aprendemos en el trabajo y por lo tanto nos equivocamos en el trabajo. Hay que buscar una manera de separar el aprendizaje del trabajo profesional. Necesitamos ensayos".
Por lo tanto, si queremos mejorar nuestras habilidades, hay que encontrar un espacio distinto al trabajo diario para hacerlo.

Esta idea es el origen de los Code Kata. Este concepto fue copiado de las artes marciales en las cuales una kata es un conjunto de movimientos que los estudiantes repiten hasta internalizarlos y lograr realizarlos de manera automática.  Las katas se hacen sin oponentes y su único objetivo es mejorar la técnica.  Es algo asi como, si recuerdan la pelicula Karate Kid,  cuando el señor Miyagi mandaba a Daniel-san a pulir los autos para mejorar su técnica de defensa...

Como es un Code Kata? Es un ejercicio corto (entre 30 minutos y una hora), que se intenta resolver tantas veces como sea necesario. Lo importante no es encontrar una solución sino la forma en que la buscamos. Esto es exactamente lo contrario de lo que pasa en el trabajo diario, donde lo fundamental es lograr una solución.

Después de cada intento buscamos feedback y analizamos posibles mejoras en nuestra forma de resolverlo. No buscamos solo mejores soluciones al problema sino mejoras en nuestro método de resolución. La manera óptima de conseguir feedback sería que otra persona nos observara y nos indicara las cosas que le parece que podríamos mejorar (este es el rol del sensei en las katas de artes marciales). Como esto es dificil de conseguir, otra posibilidad es utilizar algún software que capture la pantalla mientras resolvemos el problema de manera de poder después nosotros mismos buscar oportunidades de mejora.

Hace un tiempo hice un experimento con esta técnica, tomando como ejercicio escribir de cero un ABM simple en Rails . Repetí 18 veces la kata y cada vez capturé la pantalla mientras lo hacía y busqué oportunidades de mejora. Fue un ejercicio fantástico y fui mejorando muchos aspectos, desde cuestiones de entorno y herramientas hasta aprendizaje de nuevas librerías, pasando por profundizar el conocimiento del framework. En definitiva pude hacer una instrospección de como estaba haciendo mi trabajo y mejorar las cosas que no me gustaban.

Para tener una idea de cuanto fui mejorando, la primera vez que hice el ejercicio me llevó 45 minutos, mientras que la última pude hacerlo en menos de 15, comenzando desde cero cada vez,  logrando al mismo tiempo mejores resultados.

En definitiva, creo que es una técnica muy importante. Para aquellos que quieran probarla les recomiendo esta página de Dave Thomas donde
hay una lista de 21 ejercicios propuestos:

1 comentario:

  1. Muy bueno el concepto de los katas, me resulta dificil ver que los programadores "mediocres" usen tiempo "propio" (mas alla del trabajo) para practicar estos ejercicios. Se requiere una pasion por programar y solucionar problemas.

    Sigan adelante con el blog, que los temas son muy interesantes,

    Saludos a ambos.

    ResponderEliminar