sábado, 19 de septiembre de 2009

Refactoring como estrategia de construcción

Hace unos años me encontré con un libro muy interesante: Refactoring to Patterns de Joshua Kerievsky

Si bien este libro presenta un catálogo de escenarios o casos sobre los que es un código poco sano se refactoriza a un patrón de diseño, lo más interesante para mi es el enfoque con el que se trata el tema. Cuando construimos software muchas veces no se tiene claro cual es el alcance. Las metodologías ágiles, XP, asumen esto como una regla del juego y se organizan en función del cambio. Una frase muy conocida al respecto es "Lo único constante en el desarrollo de software es el cambio".

El libro introduce 2 ideas que dan claridad al problema de diseñar una aplicación: la sobre ingeniería, que vendría a ser como matar un mosquito con un misil tele dirigido, y la sub ingeniería, donde el problema radica en que la complejidad del código pasa a ser una limitación importante a la hora de modificar una aplicación. De alguna manera, diseñar implica encontrar un equilibrio entre estos dos caminos para lidiar con la complejidad y el cambio. Por lo que es necesario diseñar a lo largo de todo el proyecto.

Qué es refactorizar?

Refactorizar es mejorar el diseño de un código existente. Y también una estrategia de construcción muy eficaz. Podemos comenzar a construir una aplicación, de la manera más simple posible, y refactorizarla a medida que entendemos mejor su contexto y alcance. Esta idea, tomada del mundo XP, fue para mi en un proyecto pasado, una estrategía que resultó clave para llegar a buen puerto. Por lo general no se encuentra el diseño adecuado en el primer intento. De hecho, es bueno darse un tiempo para probar una idea y aprender.

Para qué Refactorizar?
  • Para simplificar el código y responder mejor a los cambios.
  • Para aprender a lidiar con la complejidad en un entorno cambiante.
  • Para hacer el esfuerzo justo.
  • Para potenciar al equipo, es muy didactico refactorizar de a pares, mejora los skills de programación de todos.
  • Para simplificar. Lo simple es mágico, todo es más fácil cuando es más simple.
Cuando refactorizar?

Esta es quizás la pregunta más difícil de responder, ya que depende del caso. Si se refactoriza demasiado tarde, puede ser muy costoso. Demasiado temprano, puede ser que todavía no conocemos suficiente del problema. Pero hay ciertas cosas que podemos oler, que nos dan una idea sobre piezas de la aplicación que no son sanas:
  • Esto es difícil de entender (complejo).
  • Siempre lleva mucho tiempo modificar esto (rígido ante cambios).
  • Cuando tocamos esto, surgen bugs que no detectamos.
  • Es difícil de testear.
Una lista de cosas que huelen mal en el código:

Refactorizar es como invertir en la salud de la aplicación. Tiene un efecto que mejora las condiciones de éxito. Una buena práctica es ir agregando los casos encontrados al backlog y priorizarlos junto como un ítem más en función de las necesidades del negocio.

Cómo refactorizar?

Hay muchas técnicas que ayudan a hacer refactoring efectivamente, como TDD, inyección de dependencias, patrones de diseño, herramientas de refactoring (resharper, eclipse), catálogo de refactoring, etc. Además es importante entender porqué el código no es sano y cómo lo mejoraremos, invirtiendo el esfuerzo justo.

Un enfoque muy interesante del libro, es que para evaluar la solución de refactoring, propone distintos puntos de vista.
  • Comunicación: De que manera el código comunica lo que hace.
  • Duplicación: La duplicación hace que sea más fácil cometer errores. El código duplicado es más difícil de mantener => evitar la duplicación.
  • Simplicidad: Cómo se puede hacer más simple? Para esto es muy importante encontrar el patrón de diseño adecuado.
Se me ocurren otros puntos de vista que se podrían agregar:
  • Testeabilidad: Que tan fácil es de testear?
  • Flexibilidad: Que tan fácil es de cambiar?
  • Esfuerzo: Como llevaría menos esfuerzo?
Más links en delicious

saludos!

lunes, 14 de septiembre de 2009

Grupo Estudio Patrones Diseño

Hace unos años tuve la inquietud de compartir con otros lo que había aprendido acerca de patrones de diseño. Lo primero que pensé fue que no quería hacerlo de manera convencional, es decir, una persona expone un tema y el resto escucha pasivamente. Asi que buscando información sobre como enseñar efectivamente, encontré este link muy interesante que explica cual es la dinámica de un grupo de estudio:

Bien cierto es que uno aprende más cuando lee, escucha, hace y habla, que cuando solo escucha.

Básicamente en un grupo de estudio se forma por gente con interés sobre un tema, de distintos niveles de conocimiento (la diversidad es un factor importante que mejora el aprendizaje del grupo). Un moderador organiza las sesiones (por ej. semanales), comparte con el grupo un material de lectura que todos deben leer previamente antes de asistir y luego durante el transcurso de cada sesión plantea al grupo preguntas abiertas. En este punto la diversidad es importante, porque permite que los que menos saben aprendan y aporten preguntas al grupo. Y los que más saben, que aprendan mientas comparte su conocimiento.

Las preguntas abiertas no son cualquier clase de pregunta. Son preguntas que nos hacen pensar y nos ayudan a tener un mejor conocimiento del tema. Por ejemplo "cuantos patrones de diseño hay?" no es una pregunta abierta. Una pregunta abierta sería algo como "qué patrones de diseño aplican el principio encapsular lo que varía?". Las preguntas abiertas invitan a la reflexión y al debate.

Lo siguiente que tuve que buscar fue un buen material de lectura, que sea fácil de leer y que requiera poco tiempo. Por suerte me encontré con este libro, que tiene una muy buena pedagogía para enseñar:

Finalmente, armar una agenta orientativa sobre los temas a tratar en cada sesión. Comparto los grupos en los que participé:

Algo que creo fue valioso es usar la primera sesión para explicar la dinámica del grupo de estudio, presentar el material, los objetivos y sensar las expectativas de los participantes. Como este tipo de capacitación requiere participación activa, es muy importante aprovechar la 1ra sesión para romper el hielo. En nuestro caso hicimos un juego donde 2 equipos debían construir una casa con rastis. Luego agregar una ventana. Y finalmente explicar que patrón de diseño de casas hubieran aplicado al construir la casa para luego agregar una ventana más eficientemente. Más allá de la analogía con la construcción de software, que puede ser cuestionable, sirvió para introducir el concepto de qué es un patrón y para crear un ambiente que favorezca la participación.

No menos importante fue la última sesión, donde como ejercicio integrador jugamos al pattern poker:

En está última cada participante dio su valioso feedback sobre el grupo de estudio e hicimos el cierre del grupo de estudio.

viernes, 11 de septiembre de 2009

Creatividad y trabajo en equipo

La creatividad es un concepto que está muy ligado al trabajo en equipo, ya que es en las personas donde reside la chispa capaz de crear la idea buscada.

Si bien a nivel individual podemos encontrar personas creativas y con ingenio, el verdadero potencial creativo existe en el equipo. La idea de una persona, por más insensata o incompleta que sea, puede ser el disparador de una nueva idea en otra persona. Es en este mecanismo donde se esconde el gran potencial de trabajar en equipo para resolver problemas con creatividad.

Un aspecto clave para que el equipo funcione de manera creativa, es el de generar las condiciones de éxito necesarias. En este punto creo que lo más importante es generar el espacio de comodidad, distención y respeto, en donde cada uno pueda decir lo que sea, sin ningún tipo de miedo, verguenza o prejuicio. Esto que parece tan simple, muchas veces no es fácil de lograr. Pero hay varias maneras de conseguirlo, como ejercicios de integración, jugar juegos para romper el hielo, etc.

Generalmene conviene empezar plantenado el problema sin demasiadas restricciones y luego generar en equipo un gran abanico de posibilidades. En un primer momento evitamos las restricciones para no limitar ninguna idea tempranamente. En esta fábrica de ideas, es fundamental el respeto entre los compañeros, hablar 1 por vez y escuchar con atención lo que cada uno tiene para decir. Este simple ritual mejora las condiciones de éxito de las que hablamos anteriormente. El juego es uno de los mejores disparadores de ideas, por lo que jugar es una actividad muy recomendable en cualquier proceso creativo.

Luego de generar el abanico de soluciones, es tiempo de bajar a tierra, agregar las restricciones, volver a refinar y combinar las ideas para generar nuevas soluciones. Si bien hay varias técnicas para hacer esto, la herramienta más poderosa es la pregunta. Muchas veces, resolver un problema de manera simple pasa por hacer las preguntas correctas. A esta altura, si durante el desarrollo de la actividad se generó participación, compromiso y ganas, el equipo va contestando y generando las preguntas casi naturalmente.

Estas son algunas técnicas que pueden servir para llegar a una posible solución.

Encontrar las restricciones auto impuestas / romper las reglas

Como personas estamos limitados por nuestra manera de ver las cosas. Nuestra educación / cultura nos dió un marco desde el cual vemos todo. Sin darnos cuenta, podemos caer en la trampa de una restricción impuesta por nosotros mismos. Quizás el ejemplo más famoso de esto sea la teoría de la relatividad de Einstein. Durante años la física clásica explicó los muchos de los fenómenos que vemos. Para nosotros es muy intuitivo pensar que el tiempo fluye siempre de la misma manera. Einstein, al romper esta regla, descubrió una nueva dimensión de soluciones que le permitió explicar fenómenos que hasta el momento eran inexplicables.

Los chicos, al tener mentes menos formadas y más libres, son grandes mentes creativas!

Preguntar, preguntar y preguntar

La pregunta nos permite llegar a zonas oscuras de soluciones que no podemos ver. Por lo que explorar estas zonas es un buen ejercicio para encontrar nuevas soluciones. Incluso puede llegar a ser muy divertido, si se aplica una buena dinámica.

Cada integrante puede tomar un rol y preguntar desde distintos puntos de vista. Un libro que resume muy bien esta técnica es "6 sombreros para pensar".

Otras preguntas que ayudan a encontrar nuevas ideas:
Que pasaría si..?
Y si pasara esto?
Y si en vez de A, pasara B?

Jugar con las dimensiones del problema

A veces pasa que un problema sin solución aparente, tiene solución cuando se consideran nuevos factores o dimensiones. Por ejemplo, el problema de las 3 lamparitas no parece tener solución. Hasta que agregamos nuevas dimensiones como la temperatura por calentamiento, la vida útil del filamento, etc. Lo mismo podemos hacer quitando dimensiones.

Pensar fuera del cuadrante / pensamiento lateral

Otras veces la solución está fuera de nuestra área de foco o dirección de pensamiento. Por ejemplo una posible solución para el problema del tráfico en la ciudad puede ser que en lugar de crear carilles exclusivos o mejorar la sincronización de los semáforos, simplemente la gente pueda trabajar desde su casa.

Cambiar la herramienta

No se si alguna vez escucharon la frase "Para el hombre que tiene sólo un martillo cualquier cosa es clavo". Sin darnos cuenta las herramientas que usamos para resolver problemas nos limitan en el abanico de posibles soluciones.


Resolver problemas con creatividad puede transformarse en una actividad muy sana y gratificante. Descubrí el encanto por este juego gracias a los profesores Juan Ramonet, Silvia Ramos y Diego Sadras que me enseñaron muchas de estas herramientas en una excelente materia que dan en la UBA. Una materia sobre la que sigo aprendiendo y practicando.

jueves, 10 de septiembre de 2009

Fin de semana con PilasBA

Este fin de semana fue algo atípico. La semana pasada me enteré graciar a @juancarloslucas sobre un evento Pilas BA. Lo primero que pensé fue "que bueno, van a empezar a reciclar pilas en Buenos Aires". Luego por otros tweets vi que era algo relacionado con emprendedores, asi que los busqué en google y me encontré en su sitio con 2 palabras clave para mi curiosidad: innovación y responsabilidad social. Un evento para emprendedores, con una dinámica de aprendizaje ágil y orientado a esta problemática, no me lo puedo perder. Asi que sin dudar ni preguntar mucho, me inscribí.

Uno de los compañeros del evento, escribió un buen post con todo lo que hicimos:

Más allá del evento, que me sirvió mucho para derribar mitos, motivarme y establecer contactos, me gustaría destacar algunas particularidades, relacionadas con el grupo de personas.

Lo primero es la diversidad, tuvimos la suerte de contar con gente de distintas provincias y paises. De distintas profesiones, edades y experiencia. Con distintas habilidades. Sin embargo, en toda esa diversidad encontré, y luego otros me comentaron lo mismo, un factor común. Ganas de aprender, de conocer nuevas personas, de participar. Algunos ya tenían un emprendimiento propio. Otros estaban creándolo, o tenían la idea, o la inquietud.

Esa fue una primera impresión... Pero luego de participar en actividades y entablar conversaciones, poco a poco empezábamos a entrar en confianza. Y descubrí gente con ganas de innovar, de espíritu inquieto, interesados por la responsabilidad social en un sentido amplio. Descontentos con algo pero con la idea de que se puede hacer mejor, que hay otras muchas maneras. Y esto lo vi en varios campos (educación, software, negocios, etc.). Con muchos me sentí identificado por poder hablar libremente de ideas locas, como buscar maneras de mejorar el medio ambiente y la comunidad, o mejorar la educación en las escuelas. Cada uno trajo sus ideas, algunas nacidas desde adentro, otras vistas con un lente de otro color. Diversidad y potencial, otras palabras clave que detonan mi curiosidad.