Dos modelos de aplicaciones web

viernes, 27 de mayo de 2011

Hace casi un mes se realizó (en Portland, OR, EEUU) la JSConf 2011, y estuve leyendo sobre algunas de las presentaciones, algunas muy interesantes, ya no es novedad que éste es un momento muy especial para el mundo Javascript.

NodeConf

Un poco al margen de esta nota es destacable que a continuación de la JSConf se realizó la NodeConf, cada una de 2 días de duración, una pauta de la importancia que está cobrando Node.js, lo cual también puede verse en el impresionante crecimiento en la cantidad de modulos desarrollados por terceros, más de 20 se agregaron en los últimos 9 días).


Dos estilos

Volviendo al JSConf, quiero compilar en este artículo uno de los temas que vi emerger en varios blogs de los asistentes, y es la aparición a lo largo de la conferencia de 2 estilos distinguibles de aplicaciones web, en lo que al cliente se refiere (no voy a hablar de Asp.Net, PHP, Node.js o Ruby on Rails, sino de HTML+CSS+JS).

Si bien no tienen nombres definidos voy a nombrar estos estilos por sus rasgos más representativos, voy a hablar de aplicaciones "Progressive Enhancement" (en adelante PE) y aplicaciones "MVC", "MVVM" o "MVVMC" (en adelante MVC), describiendo sus características quedará más claro a que me refiero.


Aplicaciones "Progressive Enhancement"

El termino "Progressive Enhancement" hace referencia a una práctica muy difundida en JavaScript en la que las páginas se descargan al cliente con funcionalidad básica, una vez completada la descarga mediante Javascript, se incrementa de forma progresiva la usabilidad, y en algún caso la funcionalidad a medida que se detecta soporte en el navegador para las tecnologías requeridas.

Un ejemplo simple: imaginemos una página en la que se le solicita al usuario ingresar su ubicación geográfica para ofrecerle algún servicio. Siguiendo el principio de "Progressive Enhancement" podría estar construída de esta manera:

  1. La página llega al cliente con un simple textbox en el cual el usuario ingresa su dirección (calle y número), al hacer click en enviar el formulario se envía al server, en el server se traduce esa dirección en coordenadas geográficas invocando por ej. a la API de Google Maps. Luego se devuelve al cliente una página con la dirección normalizada a modo de confirmación.
  2. En caso de detectar un cliente de escritorio o con suficiente resolución de pantalla se agrega a la página de confirmación un mapa (como imagen estática) con la ubicación encontrada señalada, ésta imagen puede generarse con la Static API de GMaps.
  3. Si se detecta en el navegador soporte para Javascript, al completarse la descarga del formulario se agrega debajo del textbox un mapa interactivo de GMaps dónde el usuario puede seleccionar su ubicación haciendo click en el mapa.
  4. Si luego de detectarse soporte para Javascript se detecta también soporte para geo-localización (HTML5) se utiliza este servicio para obtener la ubicación actual y mostrarla como valor default en el mapa.

El resultado es que el cliente obtiene la mejor experiencia posible en base a las capacidades del navegador/dispositivo que utiliza.

Típicamente se trata de páginas que en su mínima expresión se comportan como páginas con HTML (y CSS)  que permite navegar, manipular o enviar contenido con los elementos disponibles del HTML estático (anchors y forms). Y van incrementando su usabilidad, responsividad e inclusive su funcionalidad, a medida que se detecta soporte para Javascript, manipulación del DOM, procesamiento de información del lado cliente, comunicación asincrónica con el server (AJAX) y otras técnicas soportadas por las APIs de HTML5 (como geolocalización, modo "offline" o base de datos local).

PE tiene el mismo objetivo que "Graceful Degradation" pero utiliza el camino reverso, con "Graceful Degradation" la página llega al cliente en su "máxima expresión" y se maneja de la manera más "agraciada" posible la falta de soporte del cliente presentando alternativas de menores requerimientos. A la larga la experiencia del usuario puede ser similar con ambos approaches, pero PE es a veces visto como una evolución de GD por hacer a un mejor diseño y uso eficiente de los recursos, pero ambos pueden ser convenientes según el escenario.

Finalmente cabe mencionar que PE o GD no sólo aplican a Javascript o APIs HTML5, también aplica a diferentes resoluciones de pantalla (como muestra el punto 2 del ejemplo), o al uso de estilos más sofisticados de CSS3 (gradientes, esquinas redondeadas, etc.). Dejo este tipo de PE/GD para otro momento ya que son transversales al tema de este artículo ya que aplican a tanto a las que llamé aplicaciones PE como MVC. Quedaría para otro artículo en que hablemos por ejemplo de el uso condicional de estilos usando modernizr.

La construcción de aplicaciones PE suele estar soportada por el uso extensivo de frameworks como jQuery, Prototype o MooTools (o una combinación de microframeworks). A la hora de implementar los diferentes items de "mejora" progresiva es importante respetar la buena práctica de "Feature detection over Browser Sniffing", es decir utilizar siempre la detección de soporte para una deteminada API en lugar de intentar detectar el nombre o versión del navegador (ya sea en base a window.navigator o a la existencia de cierta función). Existen algunas librerías para facilitar el uso de "Feature detection", modernizr es la más famosa (ahora se incluye por default en los proyectos Asp.Net Mvc 3).

En conclusión, todo esto no es en realidad ninguna sorpresa, todas las aplicaciones web que usamos a diario han migrado o están migrando a este estilo, el cual seguramente siga siendo predominante por mucho tiempo.


Aplicaciones MVC o MVVM

Por otro lado, existe otro estilo marcadamente diferente del anterior. Se trata de aplicaciones que implementan el patrón MVC (Model-View-Controller) o alguna variante MVVM (Model-View-ViewModel), MVVMC (Model-View-ViewModel-Controler) completamente del lado del cliente, el resultado es una arquitectura similar a la que permiten otras plataformas RIA, como Silverlight (véase Silverlight MVVM) o JavaFX pero con las ventajas de basarse únicamente en HTML+CSS+JS.

En estas aplicaciones toda la lógica de presentación se encuentra en el cliente, lo que permite utilizar como BackEnd nada más que una capa de servicios REST+JSON que se encargue de lógica de negocios, persistencia, y conectividad con otros servicios (agrego un diagrama de arquitectura más adelante).

Generalmente se trata de aplicaciones que se descargan como una única página html (single-page apps), que contiene el layout principal. Luego se realiza la carga e de algun framework JavaScript MVC (Backbone, Sproutcore, JavascriptMVC) o MVVM (Knockout.js, Batman.js).
Generalmente se encargan de coordinar el envío y recepción de datos via AJAX, y actualizar la UI (vistas) mediante el uso algún motor de templates para Javascript (jQuery.templates, EJS, mustache) o mediante la manipulación de bloques html decorados con metadata (clases css o atributos data-*), vistas "template-less".

Este última modalidad (template-less) es el caso de Batman.js, un framework MVVM cuya uso de "Convention over Configuration" le da una simplicidad increíble, les recomiendo ver alguno de los ejemplos que hay en la página oficial. Sólo les falta mejorar un poco el logo!

En general, estos frameworks permiten definir modelos de entidades, aplicar databinding bidireccional, y configurar algún manejo de persistencia (por ejemplo Batman.js permite seleccionar entre almacenamiento local (HTML5), websockets (lo que permite colaboración en tiempo real) o el uso de un adaptador para otras bases de datos).

Cada vez vemos más aplicación HTML con UI complejas (en su estructura y en su interactividad) el resultado suele ser un caótico rejunte de scripts (ya sea en files separados o embebidos) formada principalmente por una serie de métodos que manejan el input del usuario a traves eventos DOM: muchas líneas como éstas:



$('#refresh').click(function(e) {
    ...
});


$('.item-row').hover(function(e) {
    ...
});


$('#btn-send').click(function(e) {
    $.ajax({...
         success: function(data){
              $('#item-list').empty()
                   .append(...)
                   .children('.item')
                        .css({color:'red'}).end()
                   .fadeIn(function(){
                        $('#progressbar').hide();
                   });
         }
    });
});
(Nótese la clásica "pirámide" con callback asincrónico incluído)

Afortunadamente este problema es muy antigüo y como suele suceder existe un patrón que lo resuelve muy bien. El problema es simplicar la construcción de interfaces de usuario inherentemente complejas y el patrón más conocido para atacarlo es MVC y lo hace mediante la aplicación de SoC (separación de responsabilidades). Con lo cual no debería sorprender el surgimiento de éstas librerías.

A diferencia de las anteriores éstas aplicaciones están pensadas para proveer una experiencia de usuario al nivel de las aplicaciones de escritorio, pero con todas las bondades de la web, portabilidad, actualizaciones, sandboxing, etc. (hasta acá el lema de cualquier plataforma RIA) pero con la simplicidad de desarrollar sobre los estándares HTML+CSS+JS, stack que hoy en día todo desarrollador y diseñador web se ve obligado a dominar.


Escenarios

Quizás sea demasiado pronto para identificar escenarios recomendados para uno y otro (al menos para mí) pero si se puede ir pensando en los trade-offs entre un estilo y el otro. Pero antes de empezar a hacer comparaciones es importante la siguiente consideración: no se trata de modelos excluyentes, ambos pueden convivir en una aplicación (inclusive en una misma página!), en vez de en 2 modelos alternativos podríamos pensar en un gradiente como este:


En un extremo del gradiente se ubican páginas de HTML estático, cuya única forma de interacción son links y formularios "planos", sin javascript. Salvo que se trate de un web site simple (en opuesto a una web application), tendremos en el server gran parte de la lógica de presentación y de navegación, y también prácticamente toda la lógica de negocios, la "responsividad" no es su fuerte y depende de la conexión.

En el otro extremo podemos ubicar las aplicaciones puramente MVC, en las que toda la lógica de presentación se maneja del lado cliente, así como una parte de la lógica de negocios, la responsividad es óptima y no depende de la conexión, inclusive pueden trabajar "offline" de forma esporádica o permanente.

Dónde están las aplicaciones "Progressive Enhancement"? Cómo se ve en el gráfico se "mueven" adaptativamente (según las capacidades de cada navegador) en un rango del gradiente, la granularidad y la amplitud del rango dependerá de como sean construídas en base a requerimientos.

Sobre el gradiente señale algunas de las variables (que encontré más significativas) que se crecen o decrecen con este gradiente, anticipándome a lo siguiente:


Trade-offs

Portabilidad

Esta es a primera vista una ventaja evidente del primer estilo, ya que a esto apunta PE. Las aplicaciones construídas de esta manera se adaptan dinámicamente a las capacidades del navegador o dispositivo cliente.
Sin embargo es probable que éste punto se vuelva cada vez menos decisivo con el tiempo.
Las aplicaciones MVC tienden a requerir motores Javascript más poderosos y dependiendo del caso algunos features de HTML5, sin embargo ambas cosas son cada vez más fáciles de encontrar en cualquier dispositivo moderno.
En computadores personales, el único escollo son las versiones de Internet Explorer, 6, 7 y 8, que desaparecen más lento de lo que quisiéramos: http://deathtoie6.com/. Sin embargo es posible actualizarse en todas las plataformas. En WinXP sólo puede llegarse hasta IE8, pero puede instalarse Chrome y otros navegadores en sus últimas versiones.
Todos las nuevas versiones de navegadores salen a competir con rimbombantes benchmarks de sus motores Javascript (IE9 es el último en incorporarse a esta especie de "guerra fría" y lo hizo con una comparación de IE9 vs Chrome (al estilo desafío Pecsi) en una de las Keynotes del MIX2011. Y en el keynote de Google I/O 2011 también hubo una demostración en este sentido).

En los dispositivos móviles de última generación (IPad, IPhone, Android, RIM, etc.) motores Javascript modernos y soporte para HTML5 es más fácil de encontrar que cualquier plugin de tecnologías RIA (Flash, Silverlight). Inclusive ya hay herramientas para construir aplicaciones usando HTML+CSS+JS que logran el mismo "look and feel" y acceden a las mismas APIs que las aplicaciones nativas en todas estas plataformas moviles (PhoneGap, AppCelerator Titanium) y con Android es probable que dento de poco podamos dispongamos de HTML5+CSS3+JS en TVs, heladeras y lavarropas :)

Por todo esto, las ventajas en portabilidad a la hora de implementar PE empiezan a desdibujarse.

SEO

Este es punto está claramente a favor de PE y probablemente siempre lo esté. Las aplicaciones MVC simplemente no son indexables al igual que las demás tecnologías RIA, salvo que se recurra a los mismos "trucos" que se utilizan hoy en día en otras RIA, que implican en mayor o menor medida duplicar, o generar un duplicado del contenido que sea indexable.
Si SEO es importante para nosotros necesitamos que nuestro sitio pueda moverse dignamente hasta el extremo izquierdo del gradiente, sin embargo hay que tener en cuenta lo siguiente: si nuestra aplicación es SEOdependiente, hay grandes chances de que estemos hablando del tipo de website que no se beneficia mucho de una arquitectura MVC, un sitio (o la parte de un sitio!) que presenta y permite navegar a través de contenidos no es un escenario muy tentador para MVC de todas formas.

Experiencia de Usuario

Si bien con PE buscamos mejorar hasta dónde sea posible la experiencia de usuario, claramente este punto lo ganan las aplicaciones MVC, en los que la experiencia es del nivel de las aplicaciones de escritorio. Claro que es posible "mejorar progresivamente" una página hasta que las diferencias desaparezcan, pero si lo hacemos es posible que nos acerquemos al problema del siguiente punto:

Servicios REST+JSON como BackEnd



Simplicidad

Si al construir el cliente web usando MVC transformamos nuestro BackEnd en un servicio REST+JSON
 se mantiene toda la lógica de presentación en el cliente y se simplifican algunos problemas relacionados con la conservación de estado, como el manejo del sesiones, el ViewState, etc. el diseño del BackEnd se reduce a un caso trivial de SOA.

Interoperabilidad

Basándonos en un BackEnd REST+JSON podemos mantener el más alto nivel de interoperabilidad sin demasiado trabajo extra, ya que este tipo de servicio puede ser consumido fácilmente por otro tipo de aplicaciones (de escritorio (WPF), RIAs (Silverlight), procesos batch, un widget nativo para IPhone, etc, etc), y habilitando requests cross-origin (para los recursos/operaciones deseados) tenemos una API web pública que puede ser consumida desde otros sitios web.
Por lo general en aplicaciones web convencionales el agregado de una API pública implica duplicación de trabajo agreando un servicio de estas características.

Disponibilidad


Al eliminarse la dependencia del server para la renderización de contenido, mantenemos a tiro la posibilidad de implementar un modo offline que utilize datos locales (ej. HTML5 Isolated Storage, WebSQL)

Performance

Utilizando PE es posible ahorrar muchos requests, pero sobretodo se mejora la "performance percibida" (Responsividad). Pero utilizando MVC también se reduce el tráfico de red al mínimo, la separación entre datos (JSON) y HTML no sólo permite transmitir únicamente la información necesaria, sino que ahora el contenido estático (y por lo tanto cacheable en el cliente) además de imágenes, scripts (.js) y estilos (.css)  también incluye el HTML (layouts y templates)

Escalabilidad

Además de la reducción de tráfico y el uso del cache cliente, se libera al server de la tarea de renderizar html, los clientes hacen trabajar al server sólo lo necesario (para solicitar datos que no se encuentran localmente, para persistirlos, para comunicarse con otros).


Separation of Concerns o Separación de Responsabilidades

Este es la característica esencial del patrón MVC con lo cual no es extraño que incluya este punto. Si bien el título es SoC podríamos hablar más ampliamente de simplicidad y elegancia del diseño tanto del modelo de programación como de la arquitectura.
Basta con mirar la claridad que se logra en los ejemplos que diferentes frameworks MVC presentan, cualquier programador que haya trabajado en aplicaciones cuya interfaz HTML adquiere cierta complejidad habrá sentido la necesidad de un modelo superador que simplifique el código escrito.
Además llevando el patrón MVC al cliente podemos eliminar la "impedancia" que produce la división de nuestra capa de presentación entre servidor y cliente.
Esta impedancia es la misma que Asp.Net WebForms busca disminuir abstrayendo la interacción con el usuario web en un modelo de programación que se asemeja al de una aplicación WinForms (de escritorio), sin embargo quiénes hayan tenido sus luchas con el ciclo de vida y el manejo del view state, entenderán que la impedancia no desaparece.

Para terminar de ilustrar la diferencia desde el punto de vista arquitectónico en este diagrama muestro como estos dos estilos de aplicación HTML (PE y MVC) pueden impactar en la arquitectura de las aplicaciones que las soportan:

Utilicé colores anaranjados para indicar componentes que son especificos de (es decir, deben ser desarrollados para) cada aplicación.
Estos diagramas no deben tomarse como la única combinación posible, sino de un ejemplo de la forma que tomará típicamente la arquitectura de la aplicación para soportar un caso u otro.


Madurez

Este es quizás el punto que más juega en contra de los frameworks Javascript MVC existentes, las aplicaciones PE son en realidad lo más cercano a una aplicación web tradicional, es un camino muy recorrido, y esto implica las ventajes usuales:
  • Experiencias previas, sin importar el problema que encaremos, seguramente encontraremos el camino muy allanado
  • Hay muchos profesionales preparados para trabajar de esta forma y también muchos dispuestos a ayudarnos en distintas comunidades online.
  • Herramientas, muchas y muy maduras
De todas formas:
  • Las aplicaciones MVC/MVVM adquieren masa crítica muy rápidamente, probablemente ésta se convierta en la plataforma RIA de facto, no por ser la mejor de todas, los estándares en que se basa, las marcas que lo soportan, lo hacen un caso típico de profecía autocumplida
  • No se trata de un entorno totalmente desconocido, se trata de HTML+CSS+JS, es en los frameworks existentes y librerías de funcionalidades aledañas (template engines, storage, etc.) dónde está la inmadurez
  • En cuanto entornos de desarrollo:
    • La evolución de herramientas de desarrollo en los navegadores ha hecho mucho más ameno desarrollar (y sobretodo debuguear) este tipo de aplicaciones
    • En la mayoría de las IDEs existentes existe un soporte razonable para escribir Javascript, Para VisualStudio 2010 existen algunas mejoras al respecto:



Todo parece indicar que si bien las aplicaciones que llame "Progressive Enhancement" seguirán siendo las predominantes, empezaremos a ver una coexistencia entre ambos tipos de aplicaciones, y seguramente haya muchas novedades sobre frameworks Javascript MVC/MVVM/MVVM. 

Si alguno tuvo alguna experiencia en el uso de Javascript MVC en proyectos reales me encantaría que la compartan,

Saludos
Leer más...

Coding Koan - La (no tan misteriosa) senda del programador Zen

viernes, 11 de febrero de 2011

Recientemente en una nota en Code&Beyond se hablabla sobre Koans para programadores.
Los Koans son una especie secuencias de ejercicios, pensados para guiar la meditación Zen.

http://www.codeandbeyond.org/2011/02/meditacion-programatica-koans.html

Algunas personas están trasladando este concepto a la programación, estos Koans para programadores son una batería de tests unitarios inicialmente fallidos,
Un software asiste al aprendiz (un framework de unit testing, más algun plugin o pieza de software específica) para hacer pasar los tests uno por uno.
Cada test obliga a aprender algo nuevo, es una forma de aprendizaje excelente.

"Me lo contaron y lo olvidé; lo vi y lo entendí; lo hice y lo aprendí". Confucio

Los hay sobre diversos temas, y sobre diferentes lenguajes de programación en la nota hay links para varios de ellos, me pareció interesante el de JavaScript. Es un lenguaje con mala fama, y parte de eso se debe a que es muy utilizado esporádicamente por desarrolladores web, y no siempre con atención a las "buenas prácticas".

JavaScript Koans

Existe todo un movimiento por tomar JavaScript "en serio", como una serie de buenas prácticas que suelen englobarse con el nombre de "Unobstrusive Javascript".
Esto combinado algunos proyectos recientes que hacen pensar que JavaScript sea quizás el único lenguaje necesario: V8, Node.js (que tiene ahora un versión para .Net , Node.Net), Rhino, etc.
(Esto es tema para otro post!)

https://github.com/liammclennan/JavaScript-Koans#readme

Primeros pasos

Se baja el zip (Download), y después de descomprimirlo al abrir jskoans.htm se ve lo siguiente:


Nota: como vemos este Koan usa QUnit, un framework de Unit Testing para JavaScript, es por ej. el utilizado por jQuery.

Siguiendo la sugerencia, abrimos 'topics/about_asserts.js' y hacemos algunas correciones:



Actualizamos la página ...


















Exito!, vemos el resultado positivo de los tests modificados, y ahora que aprendimos lo básico sobre los Asserts, se nos presenta el próximo desafío ("About Equality"), el Koan continúa asi sucesivamente. Éste consta de 14 tópicos, algunos que a veces sorprenden como closures o prototypal inheritance.

Una forma muy efectiva y entretenida (después de todo, ambas cosas van de la mano) de aprender y enseñar. Además los koans por estar basados en Unit Tests son mucho más fáciles de mantener actualizados, lo que resulta un problema frecuente en materiales didácticos, al menos en esta industria.

Leer más...

Resolviendo un desafío en equipo

lunes, 17 de enero de 2011

En Noviembre pasado, Kinética Solutions nos hizo partícipe de una capacitación, sobre Test Driven Development (TDD), que brindó a su equipo de trabajo.

Esta capacitación se dividió en dos jornadas: la primera consistió en una charla introductoria del tema, la segunda fue un Workshop con el formato “Coding Dojo” para practicar un poco de Test Driven Development (TDD).

En este artículo les contaré la experiencia de los participantes de TercerPlaneta con el “Coding Dojo”.

¿Que es “Coding Dojo”?

Un Coding Dojo es una sesión de codificación centrada alrededor de un desafío de programación, de alcance pequeño. Todos los asistentes a esta sesión participan en la codificación para resolver el desafío planteado.

El objetivo es aprender, enseñar y mejorar nuestras habilidades de programación, compartiendo conocimiento y experiencia con otros desarrolladores de software, en un ambiente relajado.

La versión de Coding Dojo que propuso Kinetica Solutions es Randori, la misma consiste en utilizar una única computadora y un proyector. Los participantes de la sesión, en parejas, van utilizando la computadora durante una cantidad de tiempo fija y acotada, para codificar una porción de código de la solución. Una vez concluido el tiempo, dejan lugar a otra pareja de programadores para que continúen con el desafío.

Resolviendo el desafío

El desafío propuesto fue:

Llevar los puntos de un partido de tenis

sencillo, no?

Todos conocíamos cómo se llevan los puntos en un partido de tenis, con lo cual el primer paso para entender el alcance estaba dado, y así podíamos comenzar a resolver el problema

Para la dinámica del workshop se definieron 10 minutos para que la pareja de “piloto y co-piloto” se adueñen de la computadora y codifiquen un test (recordemos que estábamos haciendo TDD) y el código correspondiente para que pase el test.

Las parejas no se formaron al inicio del taller, sino que se iban formando a medida que comenzaba un nuevo período de tiempo. Rápidamente dos participantes, en forma voluntaria, se proponían para pasar a la computadora, y entre ellos decidían quien haría de piloto, haciéndose cargo del teclado y mouse, y por lo tanto el otro voluntario actuaría de co-piloto, aportando en el armado del código. Juntos decidían qué probar, mientras el resto del auditorio podía aportar ideas, pero siendo respetuosos ya que los “dueños” del código durante los 10 minutos de cada sesión, eran los “dueños temporales” de la computadora.

Una vez que se llegó a la mitad de la sesión, hicimos una Retrospectiva, con el objetivo de realizar los ajustes necesarios para completar el desafío en la siguiente mitad. Algunos cambios que surgieron fueron:

  • tener 2 minutos de “yapa” para terminar de desarrollar la idea;
  • la pareja que pasa a la computadora primero deja en claro para todos lo que va a hacer;
  • para la misma pareja, se intercambian los roles de piloto y co-piloto.

En la segunda mitad, se llevaron a cabo los cambios propuestos y se logró que todos conozcan mas y puedan participar mejor en la resolución del desafío planteado.

Moraleja

A pesar que no se completó la resolución del desafío planteado, sí se pudo cumplir con los objetivos del Coding Dojo: mejorar las habilidades de programación y hacerlo en un entorno distendido.

En particular, a los integrantes de Tercer Planeta, nos brindó la posibilidad de aprender un poco mas acerca de la dinámica detrás de TDD y participar en un workshop con el formato Coding Dojo.

Además, nos permitió compartir con nuestros colegas de Kinetica Solutions una actividad mas, la cual fue muy enriquecedora:

  • intercambiamos experiencias en la generación y uso de pruebas unitarias
  • hicimos pair programming con chicos de Kinetica
  • nos ayudó a hacer hincapié en tener claro qué codificar antes de “tirar” líneas de código
  • nos permitió interactuar con otros desarrolladores compartiendo un momento ameno, distendido y divertido
  • fue interesante codificar frente a un auditorio y recibir consejos, ayuda y opiniones
  • el espíritu que reinó durante el taller fue que todos, como un solo equipo, teníamos el objetivo de resolver el desafío.

¡Agradecemos la invitación y esperamos que se repita pronto!

Leer más...

Jornadas Anuales Versión 2010

miércoles, 24 de noviembre de 2010

Acercándonos a diciembre, todos nos encontramos planificando reuniones y despedidas.
Nadie deja de celebrar de alguna manera el cierre del año. Fiestita, happy hour, eventos de todo tipo y color. También evaluaciones de objetivos, controles de desempeño.

Nuestra empresa no escapa a la tradicional costumbre, pero dándole un toque distintivo. No nos conformamos con un simple brindis ni con el animador de turno. Tampoco queremos terminar el año sin hacer una retrospectiva del mismo.
Por eso es ya una obligación escaparnos de la vorágine laboral hacia algún punto turístico. Playa o campo, lo importante es compartir un mini break con la gente de la oficina. Queremos hacer un preview de las vacaciones y simultáneamente repasar el trabajo de los últimos meses.

Con este espíritu nos encaminamos este año hacia La Posesiva, un antiguo casco de estancia en Capilla del Señor dedicado ahora al turismo. Lo primero que se nos propuso en la charla inicial al llegar fué detenernos un poco y disfrutar del lugar, como premio a un año difícil y de muchísimo trabajo.
Empanadas, asado, alguna jineteada, ping pong y por supuesto metegol! Todo esto para lograr concentrarnos en el tarea de descansar y divertirnos.

Todo este despliegue de tiempo libre suscita más de un resquemor. No deberíamos estar evaluando los objetivos de la empresa? Cuáles fueron los puntos débiles del trabajo del año? Cómo estuvimos en comunicación?
Mejoramos en la implementación de las nuevas tecnologías? Pues bien, este año la consigna fue 'no hablar' de todo esto. Simplemente descansar, olvidarnos de las presiones diarias y pasar un buen rato.

Después de todo un día sin 'hacer' nada, la llegada de Carola Herrscher una de nuestras coach de Nuevas Miradas, parecía el momento de corte para empezar a hablar de algo serio. Reunidos el viernes a la mañana, nos propuso jugar a 'El teléfono descompuesto'. Contar una historia a un integrante, y esté debe representársela a otro. Este último a su vez re actúa lo entendido para un tercero. Finalmente el que termina debe explicar con palabras el cuento original a toda la audiencia.

Después de divertirnos un rato comprobando nuestras dotes actorales,terminamos el juego, tratando de descubrir algún mensaje o metáfora. Pero esto fué tarea para cada uno. Caro simplemente condujo. No dijo nada ...

Segundo juego : las manos en la masa!
Arcilla. Una buena hora para desarrollar capacidades creativas. Por cierto muy enterradas o inexistentes en algunos, increíbles en otros. Pero faltaba lo mejor: romper todo lo hecho! Seguir el trabajo de otro! Volver a empezar otra obra! Finalmente ... la construcción de la casa entre todos. Cada uno armó algo, todos aportamos y nos dimos cuenta de lo difícil que es armar algo coherente sin ponernos de acuerdo y planificar antes ... En fin, nuevamente Caro dijo poco, pero todos nos divertimos y no nos dimos cuenta que habíamos pasado toda la mañana trabajando.

Mientras todos jugábamos, Andrea y José trabajaban intensamente. Dedicaron un buen rato de su tiempo para charlas individuales con cada uno. La idea de estos encuentros es hacer una especie de 'evaluación de desempeño'. Con su estilo directo y sencillo, nos ayudaron a ver los logros. Que por cierto no son pocos, hacia afuera y dentro de la empresa. Con tanta asertividad, lograron que cada uno se propusiera buenas metas para el 2011 ...

Conclusiones después de estos dos días?

Qué difícil es no hacer nada 'serio' y no hablar de nada filosófico!
Es raro no evaluar, corregir ni planificar. Pero qué importante es conocer a los otros desde otra óptica. Respetar este tiempo de silencio. Darnos cuenta que en la acción conjunta está el valor, y que el ver a otros de una manera distinta enriquece al grupo y a cada uno.

Después de un año de trabajo intenso con el tema de la comunicación, la integración y profundizando en distintas metodologías de trabajo este corte 'formalmente informal' fue más que positivo.

Que es repita!!!


Leer más...

Visitando Giran

lunes, 8 de noviembre de 2010

A principios de este año fue lanzado internamente en Tercer Planeta, la iniciativa "PAI".
PAI no implica nuestra conversión a la religión Umbanda, sino que se trata de las siglas Profesionalismo, Apertura e Intercambio.
Sin entrar en demasiados detalles, cómo parte de esta iniciativa incurrimos en muy diversas acciones, por ejemplo:


PAI Mercosur


La presentación de esta iniciativa en las oficinas de Tercer Planeta se realizó a principios de este año, mientras yo me encontraba trabajando de forma remota desde Vitória, Brasil, asi que asistí via Skype a este anuncio (empanadas acá, suco de manga allá), así fue que tuve la idea de coordinar algun tipo de intercambio con una empresa de la ciudad donde me encontraba, asi fue como buscando en algunos eventos de la comunidad ágil de la región encontré una empresa que se posicionó como referente en metodologías ágiles de Espirito Santo (estado del sudeste brasilero), Giran

Turismo Ágil

Me puse en contacto con la idea de hacer una visita similar a las que hemos hecho con otras empresas cercanas, con el fin de intercambiar algunas ideas, y muy cordialmente me invitaron a visitarlos, lo que finalmente pude concretar el mes pasado.


View Larger Map

Giran es una empresa muy joven (cumplieron un año recientemente) y nació como una empresa enfocada no sólo en la práctica, sino también en la enseñanza y mentoring de metodologías ágiles, especialmente SCRUM + XP. Por lo cual mi visita, como supuse, fue muy fecunda.

Por el lado tecnológico usan en sus proyectos (y enseñan) Java, PHP y Ruby on Rails.

El primer día que los visité se encontraban en medio de un sprint bi-semanal, con lo cual pude asistir, luego de
la charla técnica de la semana, a la reunión diaria y parte del desarrollo. Me recibieron muy amablemente y son muy divertidos :), por supuesto, no sólo es un equipo ágil de geeks, además son brasileros!.

Finalmente asistí a la retrospectiva de ese sprint, el cuál resulto ser un sprint con varios imprevistos, lo que hizo más interesante mi visita :)

Me llamó la atención la ausencia total de "roces" o comentarios CYA entre miembros del equipo (esperables en un sprint accidentado), y como todos los integrantes se mostraron muy involucrados en la mejora contínua del proceso SCRUM, admirable.

De la visita me quedo con una grata experiencia y varias ideas interesantes que observé, sin duda tenemos mucho por aprender y enseñarnos, queda la puerta abierta para futuros encuentros.


Con parte del equipo de Giran en sus oficinas

Leer más...

Trabajo en background

BackgroundWorker


Durante la construcción de una aplicación es habitual encontrarnos con procesos que son muy lentos y no dan feedback al usuario. A continuación les mostramos una de las formas de resolverlo utilizando un control que nos brinda .Net a partir de su versión 2.0: el BackgroundWorker.

Caso de Uso

Una de nuestras aplicaciones tiene una pantalla donde se muestran filtros para obtener un informe que finalmente se graba en un archivo con formato Excel. Anteriormente, cuando el usuario apretaba el botón para iniciar el proceso, la pantalla se quedaba congelada hasta que la búsqueda de datos terminaba. En ese lapso de tiempo no se podía saber que estaba pasando: si se debía seguir esperando, o todo había dejado de funcionar. Aún informando “el proceso puede demorar”, después de unos instantes la aplicación comenzaba a mostrarse con el alerta de “(No Responde)”  y el usuario ya no sabía si seguir esperando, cancelar la ejecución de la aplicación, o en el peor de los casos reiniciar la computadora.

Por qué la decisión de usar el BackgroundWorker

Al comprobar que la performance de la búsqueda ya había sido optimizada desde el motor de bases de datos, llegamos a la conclusión de que debíamos hacer algo para que la aplicación no quede inutilizable mientras se genera el reporte. Sabiendo que lo más importante del reporte  es el resultado final, decidimos hacer todo el proceso de búsqueda de los datos  en un segundo plano y así lograr que la aplicación siga funcionando sin inconvenientes, incluso para realizar otras tareas que necesiten utilizar al mismo tiempo la base de datos de la que estoy esperando la respuesta para el reporte inicialmente deseado.
A pesar que no es ampliamente configurable y adaptable a todo tipo de necesidades, como podría serlo una solución que maneje varios hilos de ejecución desarrollada manualmente, el BackgroundWorker tiene una serie de ventajas muy prácticas para nuestra necesidad en particular y nos evita, entre otras cosas, planear la solución ideal para el problema y escribir “bastante” código para manejar hilos de ejecución lo cual es sumamente delicado ya que debemos tener en cuenta el ciclo de vida de cada hilo (y no perder ninguno en el camino),  la comunicación entre distintos hilos de ejecución, validar y manejar posibles errores, etc..
Todo esto sumado a que solo necesitamos realizar una única tarea indivisible, que consume mucho tiempo y no podríamos mejorar eso con más hilos de ejecución nos llevó a tomar la decisión de inclinarnos por el BackgroundWorker.

Manos a la obra

Veamos cómo en pocos pasos y sin mucho esfuerzo podemos obtener una aplicación que utilice varios hilos de ejecución.
Inicialmente nuestro código lucía así.  


image

Lo primero que debemos hacer es agregar un control BackgroudWorker en el designer del form y configurar los eventos a usar.  Básicamente en nuestro ejemplo utilizamos dos:


 BackgroundWorker, RunWorker

DoWork : Evento lanzado desde el código para realizar las tareas asincrónicas
RunWorkerCompleted : Evento lanzado por el control una vez finalizada la ejecución de las tareas asincrónicas.
Una vez hecho ésto lo único que resta hacer es reorganizar el código:



BackgroundWorker, RunWorker

Si observan con atención al hacer clic en el botón  invocamos al método RunWorkerAsync que se encarga del manejo de hilos y realización de tareas en background lanzando el evento DoWork.
Antes debemos verificar que el control no se encuentre trabajando actualmente, de esta forma evitamos un error.


BackgroundWorker, RunWorker

En el evento DoWork indicamos cuáles son las tareas que se ejecutan asincrónicamente, en nuestro caso hacemos el llamado a la base de datos.



BackgroundWorker, RunWorker

Vale aclarar que contamos con la opción de pasar como parámetro un objeto a través del RunWorkerAsync que es recibido dentro del DoWorkEventArgs. Esto puede ser de utilidad si necesitamos tener acceso al estado de objetos definidos en nuestro primer hilo de ejecución.  

Finalmente en el evento RunWorkerCompleted colocamos todas las tareas que  debemos realizar una vez que se ejecutaron todas las tareas asincrónicas. En nuestro ejemplo, como ya obtuvimos los datos debemos generar el reporte


image

Conclusión:

El BackgroundWorker nos brinda la posibilidad de que nuestras aplicaciones WinForms sean más “ágiles” y luzcan más “veloces“ en la realización de tareas que demandan demasiado tiempo, siendo además su implementación muy sencilla.
Leer más...

Intercambiando experiencias

martes, 14 de septiembre de 2010

Parte del valor agregado de la empresa es su preocupación (o mejor dicho ocupación) por ensayar cosas nuevas, siempre probando las ultimas tecnologías y metodologías.
Uno de los objetivos que nos impusimos para este año es abrir Tercer Planeta al mundo. Es decir, intentar dar a conocer más lo que ocurre acá adentro (las prácticas que utilizamos, los experimentos técnicos y los problemas con los que nos enfrentamos) y al mismo tiempo poder aprender de las experiencias de otros grupos de desarrollo. Para esto nos propusimos varios hilos de acción, entre ellos escribir mas seguido en este blog.
Otro hilo, el que nos ocupa en este post, fue armar un encuentro de intercambio de experiencias con el equipo de desarrollo de uno de nuestros clientes.
La idea en este primer encuentro fue juntarnos para que cada equipo presente dos temas que consideraba que era interesante mostrarle al otro. Después de una previa coordinación de temas y logística, encaramos el encuentro con la participación de todos los desarrolladores de cada equipo.

Desarrollo


El encuentro arrancó con un “check in” donde contamos los objetivos del encuentro. Luego cada uno se presentó, esto es importante para desarrollar cualquier charla pero en este caso también fue la oportunidad de conocer la cara detrás de los mails!
Después expusimos intercalando una presentación por equipo.
Nuestro equipo presentó dos temas:
  • Un Sprint en 3p: Armamos una presentación donde contamos las metodologías que aplicamos en un sprint de un proyecto. En la misma mostramos la implementación que hacemos de las reuniones diarias, la planificación, el desarrollo, el uso de los pizarrones, la demo y la retrospectiva entre otras prácticas aplicadas.
  • BackgroundWorker: el uso del control, ventajas y desventajas y los problemas con los que nos enfrentamos al implementarlo. Este control facilita el manejo de distintos hilos de ejecución (próximamente tendremos un artículo del blog que profundice sobre este control)
El otro equipo de desarrollo presentó:
  • Controles customizables: Una muestra de los nuevos controles DevExpress (para mas informacion ver http://www.devexpress.com/) que utilizan y las ventajas para el usuario que traen. Estos controles brindan la posibilidad de que el usuario les cambie los colores, los cambie de lugar, etc., guardando esta configuración para poder tener siempre la aplicación como cada usuario prefiere verla.
  • SpreadsheetGear: El uso de las nuevas clases de SpreadsheetGear (para mas informacion ver http://www.spreadsheetgear.com/) usada para generar reporte en Excel. También nos mostraron algunos agregados que hicieron a estas clases para poder resolver algunos pedidos de los reportes. 
  • Envío de mails: Formas de realizar el envío de mails desde una aplicación, los problemas con los que se encontraron y las configuraciones necesarias.
Todas las presentaciones contaron con momentos de debate y preguntas que sirvieron para enriquecer el intercambio. En esos momentos aprovechamos los conocimientos y experiencias de cada uno, que por suerte son muy diversos, para aportar a las presentaciones y hacer preguntas que ayuden a profundizar los temas planteados.
Al finalizar propusimos armar una retrospectiva en 3 columnas: Lo que me gusto de la charla, lo que me gustaría que pase en la próxima charla y lo que nos comprometemos a hacer para el próximo encuentro. La idea fue tomarnos diez minutos para pensar que cosas estuvieron buenas del encuentro y que cosas nos interesaría profundizar, por ejemplo: temas técnicos (como Silverlight o la velocidad en las páginas web) y otros relacionados con la dinámica de los encuentros. Al final votamos y pusimos objetivos puntuales para un próximo encuentro: proponer distintas metodologías que se pueden utilizar e intentar resolver entre todos algún problema técnico que tenga alguno de los dos equipos en un desarrollo.
En la retrospectiva tuvimos visiones bastante parecidas, varias de las cosas que salieron podríamos agruparlo en lo positivo que fue el conocer las metodologías de trabajo de cada equipo y, por otro lado, lo interesante de ver distintas miradas de un mismo problema.

Conclusión

Lo interesante del encuentro fue poder mostrar los problemas con los que nos enfrentamos y poder aprovechar las diferentes visiones para aportar soluciones.
Es muy interesante ver como trabajan los distintos equipos de desarrollo y como para un mismo problema se encuentran distintas soluciones.
Otro aspecto positivo de estos encuentros es que es muy motivante ya que ayuda a valorar el trabajo que uno hace cotidianamente y a ver otras cosas muy interesantes que uno en el trabajo del día a día no llega a poder profundizar.
También nos ayuda a conocernos más con el cliente y generar una relación de mayor confianza que mejora el trabajo diario.
Leer más...

Aprendiendo un poco más acerca de la Retrospectiva

lunes, 6 de septiembre de 2010

Recientemente leí el libro "Agile Retrospective" de Esther Derby y Lana Larsen. Me resultó interesante, sencillo de leer, lleno de conceptos claros y principalmente, con ideas y consejos para poner en práctica. Está fundamentalmente orientado hacia los que dirigen una retrospectiva, acercándoles herramientas y conocimiento para facilitar su labor.


Al libro lo podemos dividir en dos partes: la primera presenta las habilidades y consideraciones que tendría que tener aquella persona que lidere una retrospectiva; la segunda parte describe algunas actividades que se pueden llevar a cabo durante las diferentes etapas de una retrospectiva.

En este artículo dejo algunas anotaciones que me parecieron mas interesantes y útiles para remarcar, acerca de la primer parte.

Acerca de la retrospectiva

La retrospectiva es una reunión que se lleva a cabo cuando termina un hito (iteración, release, proyecto), en la cual participan los miembros del equipo. Su fin es lograr que los participantes hagan una revisión de lo que pasó, inspeccionen y adapten sus métodos de trabajo y su forma de trabajar como equipo para incrementar la calidad del producto y mejorar el trabajo y la calidad de vida de los miembros.
Algunos puntos importantes para remarcar acerca de esta reunión:
  • Tiene que aportar valor al equipo, así los participantes no piensan que es una pérdida de tiempo
  • Hay que definir su objetivo, para tener una meta a la cual llegar
  • Se tiene que establecer el tiempo de duración y respetarlo

Con respecto a quien lidere la retrospectiva, también citado como facilitador, se destaca:
  • Tiene que entender su rol y las funciones inherentes al mismo
  • Permanece neutral durante las discusiones
  • Maneja la dinámica del grupo, permitiendo que todos participen de igual forma
Acerca del equipo:

  • Identifican sus valores como equipo y los respetan
  • Establecen acuerdos de trabajo (reglas para la colaboración y la convivencia) y son responsables por hacer que todos los respeten
  • Entienden la importancia de su participación en pos de la mejora continua
  • Asumen un compromiso, al finalizar la retrospectiva, para cumplir con lo acordado






 

Estructura de una Retrospectiva

La retrospectiva puede dividirse en 5 fases o etapas:
  • Setear el estado
  • Recopilar datos
  • Profundizar
  • Decidir qué hacer
  • Finalizar la retrospectiva

Setear el estado.
En esta fase el facilitador le presenta al equipo el objetivo de la retrospectiva y la agenda para poner en conocimiento cómo van a invertir el tiempo.

La información que se recolecte lo ayudará a trabajar con el equipo en la elección de un objetivo apropiado. Lo que observe le dará las pistas acerca de qué preguntas hacer y qué problemas podría enfrentar el equipo.

Un objetivo útil ayuda a contestar la pregunta: "¿Cuál será el valor que se obtenga en el tiempo que dure la reunión?" proporcionando una razón para que las personas inviertan su tiempo en la reunión.
Si se define un objetivo amplio ayudará al equipo a que pueda reflexionar y pensar creativamente acerca de sus experiencias y descubrir los puntos de vista que sean importantes para los integrantes.

Evitar los objetivos que definan un resultado específico; por ejemplo, el objetivo "Determinar cómo persuadir a Recursos Humanos para eliminar las evaluaciones de desempeño", bloquea la consideración de otros canales de acción u otros problemas que el equipo esté enfrentando.

Algunos objetivos útiles:

  • Encontrar maneras de mejorar nuestras prácticas
  • Descubrir qué se hizo bien
  • Entender las razones detrás de los objetivos no alcanzados
  • Reconstruir relaciones dañadas
Se le puede solicitar al equipo que describa un objetivo.
En cuanto a la duración, es proporcional a la
cantidad de personas que participan de la retrospectiva y al tiempo transcurrido desde la retrospectiva anterior. Otros factores que influyen son:


  • Complejidad, en cuanto al entorno tecnológico, relaciones entre los miembros del equipo o con departamentos externos, organización del equipo
  • Nivel de conflicto o controversia (planear mas tiempo para tratar temas complicados)
Si el tiempo es extenso, guardar tiempo para recreos entre las distintas etapas de la retrospectiva. También estar atento, durante el desarrollo de la misma, si el equipo necesita descansar unos minutos.

Recopilar datos

Una vez que se conoce el objetivo, se crea una imagen compartida de lo que sucedió en el tiempo que se está evaluando, con esta imagen común, se puede evitar que los participantes analicen según sus propias opiniones y creencias.
Armar la información y eventos en forma visual, para que las personas vean fácilmente patrones y conexiones. Los hechos son una parte de la información, y la otra mitad son los sentimientos, las emociones, éstas dicen lo que es importante para las personas de los hechos y hablan acerca del equipo.

Profundizar

Ahora es el momento de preguntar "¿Por qué?" y comenzar a pensar acerca de soluciones para hacer de forma diferente. Es un momento en que el equipo piensa en conjunto.
Considerar posibilidades adicionales, no quedarse con la primer solución que aparece. Buscar las causas y efectos, y pensar más analíticamente.

Decidir qué hacer

Elegir algunas de las soluciones (2 o 3, no tienen que ser muchas) y planear qué hacer.
Muchas veces el equipo tiene una lista larga de mejoras pero esto puede ser contraproducente ya que tener demasiadas iniciativas pueden abrumar y entorpecer la habilidad para cambiar. El facilitador tiene que ayudar al equipo a elegir los ítems a los que pueden comprometerse y que tengan un efecto positivo.
Una forma de planear los experimentos y los cambios es crear historias o ítems para que puedan ser incluidos en el próximo plan de trabajo de la iteración. Esta es una forma en que se asegure que las personas se comprometan a ejecutar las tareas; sin un compromiso individual, las personas asumen que "el equipo" hará la tarea, y entonces nadie la hace.

Finalizar la retrospectiva

Al completar el plan de acción, terminar en forma clara la reunión. Decidir cómo documentar la experiencia y el plan a seguir.
Lo que se aprende le pertenece al equipo y a sus miembros. El equipo necesita adueñarse de las enseñanzas que consigue.
Antes de finalizar, tomarse unos minutos para evaluar la retrospectiva que se llevó a cabo (sería una retrospectiva de la retrospectiva).

Beneficios de esta estructura

  • Entender los diferentes puntos de vista
  • Seguir un orden natural de pensamiento
  • Tomar una visión comprensiva de los métodos del equipo y sus prácticas
  • Permite que las discusiones vayan adonde se necesita
  • Queda una acción concreta y experimentos para realizar en la próxima iteración.




Dirigiendo Retrospectivas


No se necesita ser un facilitador experto para liderar una retrospectiva, pero sí necesita contar con algunas habilidades básicas. Estas habilidades se pueden aprender, para lo cual es necesario primero entender el rol, practicar y buscar feedback para ir haciendo los cambios necesarios.

Un facilitador de retrospectiva tiene como principal responsabilidad dirigir el proceso, es decir gestionar las actividades, la dinámica de grupo y el tiempo. Él permanecerá neutral durante las discusiones, aún si tiene opiniones firmes o si son temas que le preocupan, ya que si se involucra en las discusiones perderá total atención al proceso.

Los participantes se focalizan en el contenido, discusiones, desacuerdos (pero no desagradables) y toman decisiones; apuntan a un objetivo y manejan sus propios pensamientos, sentimientos y respuestas así contribuyen positivamente a las conversaciones y al resultado.

Si el facilitador, durante la retrospectiva, considera que tiene algo importante que ofrecer, puede contribuir en la discusión, pero antes debe ceder su rol a otro miembro. Una vez ofrecido su aporte, recuperará su rol.

Actividades

En cada una de las fases se puede realizar alguna actividad para crear acuerdos de trabajo, construir una línea de eventos en el tiempo, hacer una lluvia de ideas o priorización, entre otras . Las actividades ayudan al equipo a pensar en conjunto. Será necesario introducir y explicar cada actividad, monitorear su desarrollo y sacar conclusiones al finalizarla.
Puede ser de mucha utilidad armar un guión de la actividad y practicar las instrucciones para recordar qué decir. Tener presente, que como líder de la retrospectiva, es responsable de contestar todas las preguntas acerca de la actividad y monitorearla, centrándose en el nivel de ruido del grupo, mientras trabaja, para tener una pista si las personas necesitan mas tiempo o ya finalizaron.
El sacar conclusiones de cada actividad ayudará al equipo a examinar su experiencia y extraer diferentes puntos de vista.

Manejar la Dinámica del grupo

Está relacionado con la participación de las personas durante la reunión, asegurándose que las personas que tienen algo que decir tengan la oportunidad de decirlo y asegurarse que quien tiene demasiado para decir no domine la reunión.
Otra faceta tiene que ver con estar atento al lenguaje que utilizan los participantes de la retrospectiva. Si éste tiende a culpar a otros, como sucede con el "lenguaje de vos" ("Vos rompiste el build") y con las "etiquetas" ("Vos sos inmaduro"), ésto derivará en que algunos integrantes comiencen a estar a la defensiva. Estas actitudes hieren la retrospectiva, distrayendo la atención de los problemas reales.
El facilitador tiene como función fomentar el lenguaje "Yo", este lenguaje se centra en la experiencia y observación de la persona que habla, en lugar de etiquetar a las otras personas. Al escuchar culpas o críticas, el facilitador tiene que intervenir y redireccionar la discusión.
Otro punto importante en la dinámica de grupo está relacionado con la interacción y las emociones de los miembros del equipo. A pesar que el facilitador no es responsable de las emociones de otras personas, es responsable por mantener una reunión productiva. Esto significa que tiene que estar preparado para manejar situaciones e interacciones emocionales.
En la retrospectiva, lo primordial es la interacción del equipo como un todo, no de individualidades. Esto no significa que se tengan que ignorar las emociones individuales, al contrario, significa tratar con emociones en una forma que sea de ayuda y respeto al equipo y al individuo.
Manejar el tiempo
El facilitador de una retrospectiva tiene que responder a las necesidades del grupo y prestar atención al tiempo para respetar el tiempo fijo, presentado en la agenda de la retrospectiva, en la fase Setear el estado.
Si una discusión, al cumplirse el tiempo estipulado, aún no finalizó y sigue en su punto alto, el facilitador le preguntará al grupo qué desea hacer: continuar con la discusión o seguir a la siguiente fase o actividad. Ésta decisión queda en manos del equipo, no del facilitador. Generalmente, la respuesta es clara para todos; cuando no lo es, se propone limitar la discusión en curso a un tiempo fijo o revisarla luego o en otra retrospectiva.
Dado que el facilitador tiene como responsabilidad que se llegue al objetivo de la retrospectiva (identificar y planear experimentos y mejoras), tiene que estar preparado con actividades extra de diferente duración, en caso que se requiera cambiar por una mas corta.

Manejar al facilitador

Además de manejar las actividades, la dinámica del grupo y el tiempo, cada facilitador tiene que poder manejarse a él mismo.
Estar atento a la dinámica de equipo e interpersonal puede resultar abrumador. No existe una técnica para manejar la dinámica del grupo (aunque sirve tener algunas estrategias). La clave radica en entender y manejar su propio estado emocional y sus respuestas, para poder mantenerse centrado en su responsabilidad.
Cuando las emociones están en un nivel alto, el equipo necesita a alguien que esté fuera de la confusión; esa persona es el facilitador de la retrospectiva. Por lo tanto, tiene que mantener la calma y la claridad durante toda la reunión. Él mismo sabrá si necesita unos minutos de descanso para recobrar su serenidad o para oxigenarse y, de esta forma, pensar con claridad y bajar la ansiedad y tensión. Así, una vez que logre re-centrarse, podrá utilizar alguna estrategia para manejar al grupo y cumplir con su responsabilidad. Tiene que tener siempre presente que no es quien causa las emociones y no es responsable por hacer que todos estén felices y bien.
Es muy práctico que cada facilitador encuentre un tutor, en quien confie y a quien haya visto manejar las emociones en un grupo. Él lo ayudará a ganar confianza y aprender mas opciones para manejar situaciones emocionales. También le brindará el feedback que necesita para mejorar sus habilidades como facilitador.

Opinión personal

Después de haber estado en varias retrospectivas de diferentes equipos, como observadora o participante, leer el libro me ayudó a valorar la importancia del facilitador y de entender la dinámica del grupo. Si bien en las retrospectivas no había una persona que desempeñara ese rol, creo que todos los que participamos nos hicimos responsables de hacer cumplir sus funciones, como si ello fuera nuestro "acuerdo de trabajo" implícito.
El libro me parece de gran interés para aquellos que participan de retrospectiva, no solo para los que actúen de facilitadores. Creo que es útil para entender un poco mas acerca del concepto y de la filosofía detrás de la retrospectiva, y además acerca de la dinámica de la misma y de sus participantes y como cada uno, desde su lugar, puede aportar para darle a la retrospectiva la importancia que tiene.


Leer más...