Según Wikipedia, "la huella de carbono es la medida del impacto que provocan las actividades del ser humano en el medio ambiente y se determina según la cantidad de emisiones de GEI producidos, medidos en unidades de dióxido de carbono equivalente".

Las conferencias y demás eventos TIC están de moda, han florecido y cada año existen más eventos. Son muy interesantes y los tickets se venden enseguida. Decenas, cientos o miles de personas se desplazan para participar en estos eventos. Nuestra posición privilegiada nos ha permitido reflexionar, hablar de ética y poner encima de la mesa temas como la diversidad, la brecha digital o las opciones alimentarias. Aún queda mucho por hacer en ambos asuntos pero ya se está empezando a crear conciencia. Sin embargo creo que la huella de carbono es una gran desconocida. El desplazamiento de tantas personas supone emisiones de toneladas de CO2 a la atmósfera.
Y es muy fácil contrarestarla, hacer que nuestros eventos sean sostenibles y respetuosos con el medio ambiente. Es más fácil que hacer las camisetas del evento! un coste ridículo para nuestra bolsillo.

Lo primero es saber cuál es nuestro impacto. Existen multitud de calculadoras de emisiones online:

Te permiten elegir origen y destino en avión o coche y saber cuánto CO2 se emitirá. Para hacernos una idea, en el open space Socracan 2017 de Gran Canaria, donde vino gente de la Península Ibérica, Baleares, Alemania e Inglaterra, (unas 80 personas), mis cálculos fueron 56 toneladas de CO2.

Una solución consiste en reducir los viajes pero como primer paso es un salto demasiado grande. Queremos seguir asistiendo a estos eventos. La solución fácil es empezar contrarestando nuestro impacto plantando y protegiendo los árboles. Esto se llama "Carbon offset". Los árboles se comportan como atrapa-gases, retienen el CO2. Cuanto más grande el árbol más retiene. Los árboles más grandes están en lugares como el amazonas, la selva. Existen organizaciones que se dedican a comprar hectáreas en esas zonas para protegerlas de la tala, que a menudo se realiza para producción de aceite de palma y otros productos industriales. Este gesto de paso protege a la población local para que las multinacionales no les arrebaten la riqueza de su tierra. Tanto Cool Earth como MyClimate y otras tantas realizan esta labor. Disponen de calculadoras que miden cuánto cuesta plantar o proteger árboles, de modo que en función de la emisión de CO2 calculan cuánto dinero hay que donar a la causa. Volviendo al ejemplo de Socracan 2017, salian unos 1400 euros para contrarestar la huella. Entre 80 personas hubiese supuesto un coste de 17.5€ por persona. Una cantidad que cualquiera de los que asistimos podría asumir.
Tras el evento se estuvo comentando que esta donación se podría hacer a título personal pero eso lo complica todo mucho más. Es más dificil que 80 personas hagan todo el cálculo de su huella y se realicen 80 pagos, que gestionarlo a nivel de la organización. Lo comparo con hacer camisetas para el evento. Si cada persona tuviese que hacerse su camiseta para el evento, habría pocas. Pero cuando el precio del evento incluye la camiseta todo el mundo está contento de recibirla. Igual que los precios se calculan para comprar comida y hacer camisetas, mi propuesta es añadir una partida para contrarestar la huella de carbono. En el formulario de inscripción se podria animar a la gente a indicar la cantida de CO2 que supondrá su viaje usando alguna calculadora. Y como mucha gente no rellenará la información, finalmente se puede hacer una estimación a groso modo. Al menos se puede calcular lo que cuesta que vengan los ponentes de orígenes más lejanos.

Yo estaría muy contento de asistir a eventos que hacen explícito el coste de nuestro estilo de vida y trabajan de forma creativa en soluciones. El sector digital es muy creativo, tenemos todos los ingredientes para hacer cosas muy chulas, de mucho impacto social y ambiental.
Las TIC tienen cada vez mayor impacto en la sociedad, nuestras profesiones tienen mucho que ver con el futuro de la sociedad y del medio ambiente. Tenemos mucho poder y eso en mi opinión conlleva mucha responsabilidad. Podemos servir de ejemplo a otros colectivos en cuanto a la diversidad y el respeto, tanto hacia las personas como a los animales y a la naturaleza.

Y no precisamente en ese orden, pero me gustaría opinar sobre algunos aspectos que se están repitiendo en las conferencias a las que voy, ya que anualmente asisto de media a cuatro conferencias/congresos técnicos.


El inglés

He expresado opiniones sobre el inglés en las conferencias en varios foros y además he cometido errores garrafales en la organización de eventos. Como siempre aprendiendo a base de equivocarme. Me parece que lo que quería transmitir a este respecto está obsoleto, mis opiniones con el tiempo cambian a base de observar los acontecimientos.

Para cambiar lo que somos necesitamos cambiar nuestras creencias, porque somos lo que creemos.

Esto se lo he oído a un amigo mío que es artesano, un artesano tradicional. Trato de revaluar mis creencias con frecuencia, a veces demasiado para los que están cerca de mí. Todo el mundo puede cambiar de opinión.

Lo que siempre me ha motivado a facilitar la participación de ponentes y asistentes de habla no hispana en eventos organizados en el país, es la posibilidad de acceder a las fuentes de conocimiento y a la innovación de una manera más cercana más rápida. En cierta forma tiene que ver con la diversidad. Incluso ayuda a quitarse complejos de inferioridad o del tipo que sea cuando pensamos en España Vs extranjero.  Los libros técnicos que leemos suelen estar la mayoría escritos en inglés. También los lenguajes de programación, las librerías y frameworks que usamos están a menudo hechos fuera de España (aunque también los hay hechos aquí y muy buenos además). Simplemente es que el sector TIC habla inglés, hay muchísimos más programadores que hablan inglés (no necesariamente nativos) que castellanoparlantes.
Por eso me atrae conocer de primera mano y sin filtro como piensan los autores, acortando el camino del aprendizaje.
Ahora bien, no negaré que hablar en inglés me supone un esfuerzo titánico y que además no consigo expresarme ni la mitad de satisfactoriamente que cuando lo hago en mi idioma.  Mientras que hablando castellano (en realidad canario) me puedo llegar a divertir mucho como ponente, en inglés me veo apurado y bloqueado a veces. Y esto habiendo vivido un año en Irlanda, donde llegué al punto de pensar en inglés. Reconozco que a la mayoría de mis colegas le ocurre lo mismo. Creo que no podemos negar que nuestro nivel de inglés no es fluido. Pese a tener mucho que contar, si tenemos que hacerlo en inglés nos vemos limitados con respecto a nuestros colegas nativos o de países donde se han críado viendo los dibujos animados en inglés.
¿Cómo podemos entonces conseguir un buen intercambio de información y experiencia? y... ¿cómo ser buenos anfitriones cuando tenemos invitados que no hablan castellano?
Quizás en otras culturas no se preocupan tanto de ser buenos anfitriones pero a nosotros definitivamente nos gusta que nuestros huéspedes se sientan bien, esto es algo muy arraigado en nuestra cultura, ser hospitalarios.
Realmente no tengo respuestas pero lo que sí puedo contar son las vivencias en los distintos formatos de evento en los que he participado y así comparar.

Formato sólo inglés:

En mi opinión, cuando un evento TIC se cataloga de internacional el idioma oficial es el inglés. La web del evento es únicamente en inglés y las comunicaciones en redes sociales son únicamente en inglés. Esto lo convierte en atractivo para participantes de todo el mundo. Prueba de ellos son eventos que lo petan como Full Stack Fest, Lambda World o SoCraTes. De los dos primeros no puedo hablar porque no he estado, me gustaría estar en el futuro. En  el Sócrates organizado en Canarias, incluso en las conversaciones de pasillo las conversaciones entre españoles eran en inglés para que cualquiera pudiera unirse al grupo integrándose en la conversación, por lo que los extranjeros estaban encantados y se sentían como en casa todo el tiempo. Cada año están viniendo más extranjeros. Como el ambiente en Socrates es muy cordial, muy de comunidad, todo el mundo puede equivocarse sin problema, nadie va a quejarse por el inglés.
Sin embargo cuando llegaba el turno de presentar una ponencia nos veíamos en esta dificultad de expresarnos en un idioma que no es el nuestro y por tanto en desventaja. Más de la mitad de los participantes eran extranjeros porque a mucha gente de nuestro país aún le da reparo ir a un evento que es todo en inglés. Definitivamente me parece fenómeno que haya este tipo de eventos en nuestro país.

Así que tiene algunas ventajas y algunos inconvenientes.

Formato sólo en castellano:

Nos lo pasamos pipa. No hace falta hablar mucho de este formato. Nos permite aprender y compartir entre personas que vivimos a miles de km de distancia, nos permite evolucionar la comunidad. Son casi todo ventajas. El único inconveniente es que perdemos esa diversidad y esa posibilidad de ir a tomar cervezas con esos otros profesionales que no hablan castellano. Definitivamente pienso que es importante seguir haciendo eventos TIC de nivel en castellano.

En castellano pero con invitados de fuera:

En otros eventos como en la Conferencia Agile Spain (CAS) donde principalmente se habla castellano y típicamente se invitan a speakers internacionales. Mi impresión personal es que los extranjeros no pueden integrarse realmente en el ambiente y no pueden aprender de las ponencias porque no entienden el idioma. Así que vienen, dan su charla y se marchan pero no hay mucha oportunidad de hacer networking ni comunidad con ellos, no hay un intercambio de información. He preguntado a speakers de fuera sobre este formato y lo que me han dicho en varias ocasiones es que este tipo de evento no les atrae. Algunos se aburren, otros aprovechan para hacer turismo. Y al mismo tiempo para los organizadores es un estrés (al menos para mí lo fúe en su día y mucho con aquel AOS), porque quieren atender bien a estos invitados y que la gente hable con ellos. En la última edición de Software Craftsmanship Barcelona (SCBCN) me pareció que la organización se estresaba por este hecho de que los extranjeros estaban algo aislados.

La realidad es que en un evento con este formato, las conversaciones de pasillo, de café o de comida van a ser en castellano. La gente ve ridículo hablar en inglés entre castellanoparlantes y el extranjero no se ve capaz de participar.

Volviendo a SCBCN, en apoyo de la diversidad yo había propuesto mi charla en inglés porque tenía entendido que la organización las quería fomentar (desconozco si realmente era así). El día anterior al evento había dado la misma charla en Mallorca en castellano y me lo pasé genial porque pude transmitir todas las ideas que quería compartir. En cambio en Barcelona me sentí torpe, lento y no conseguí transmitir lo que quería. Cuando estaba allí me fastidió haber decidido hacer esa charla concreta en inglés. Tengo comprobado que en mi caso en inglés prefiero hacer talleres prácticos o debates, más que ponencias. Me ha servido para confirmar que preferiría que este evento fuese en castellano.

Este formato de "tracks" en inglés y "tracks" en castellano, es en mi experiencia el que peor sale. Pienso que no consigue del todo ninguno de los objetivos que comentaba arriba. Seguro que tiene sus beneficios, uno de ellos podría ser atraer a más participantes a base de meter "grandes nombres" en el cartel.  Pero no sabría decir cuánto aporta esto.

Mixto con interpretación:

Existe otra variante, que son aquellas conferencias donde hay intérpretes profesionales. Este es el caso de ExpoQA y de Tenerife Colaborativa (vale que este no es TIC). Lógicamente el precio de tener intérpretes se dispara. Pero la interacción es grande. Veo que los asistentes se animan a preguntar a los ponentes porque pueden hacerlo en su idioma. Veo que los ponentes extranjeros pueden aprender de las ponencias en castellano porque se las traducen e incluso se animan a hacer preguntas. El intérprete rompe un poco la barrera del idioma y acerca a las personas. En las conversaciones de pasillo se animan a continuar la conversación aunque sea tirando de mucho lenguaje corporal, porque ya antes ha habido un intercambio que ha servido para romper el hielo. Me refiero cuando despues del turno de preguntas se alarga la discusión fuera de la sala. Otro factor que ayuda al intercambio es que consiguen un buen número de ponentes extranjeros, con lo cual tiene más gente con quien conversar.

Conclusiones sobre el inglés:

Actualmente es importante que haya eventos donde solo se hable inglés y eventos donde solo se hable castellano. Cubren objetivos diferentes. En el caso de los eventos mixtos, siempre que se pueda es ideal que haya intérpretes y que tanto la web como la comunicación en redes sociales sea desde el minuto 0 en ambos idiomas. Cuando se quiera que asista mucha gente del extranjero, evitar tener la web y comunicaciones en castellano porque disuade a los extranjeros que no quieren arriesgarse a sentirse aislados.


La comida:

Como algunos saben he elegido una alimentación vegana, no como lácteos, huevos, carne ni pescado, nada que venga de animal. Cada día hay más gente como yo pero también hay gente que no tolera la lactosa, el gluten, el marisco o los frutos secos. Personas que podrían ponerse gravemente enfermas si toman estos alimentos. Afortunadamente la conciencia social con el tema de los alérgenos y las elecciones a la hora de comer está creciendo. Tanto en SCBCN, como en JSDayES, como CAS mis buenos amigos de la organización han puesto energía y cariño para que todo el mundo estuviese a gusto con la comida. Algunos me han escrito personalmente para ocuparse de este asunto y pedir opinión sobre el menú. Sobre lo que "puedo" comer y lo que no. Lo agradezco verdaderamente, sé que es de corazón. Sin embargo la forma en que se está organizando la comida no es la adecuada. Me explico.

El acto de comer juntos es mucho más importante de lo que podría parecer. Como animales sociales que somos, la suerte de poder comer y hacerlo juntos tiene un impacto profundo a la hora de hacer comunidad. Realmente influye en las relaciones entre las personas. La comida en una conferencia debe estar organizada de tal manera que la gente no se tenga que preocupar de ella, sino que disfrute comiendo y conversando. La comida no debe destacar. Es muy difícil, lo sé. Cuento mis experiencias:

Cuando se ha encargado al catering menús diferentes para vegetarianos/veganos, lo que ha ocurrido es:

  • Como asistente tienes que acordarte de avisarles de que eres vegetariano/vegano o que tienes alguna intolerancia.
  • A veces los que elegimos este menú tenemos que ir a comer a un sitio específico donde está nuestra opción. Esto te excluye del gran grupo. No comes con esa persona con la que venías hablando de camino al comedor sino que comes con otro vegetariano/vegano al que quizás nunca has visto. Puede ser una buena oportunidad para conocer gente, eso sí.
  • A la persona con la que venías le tienes que explicar que debes ir a comer a otro lado. Si decide acompañarte se encuentra con que el número de menús vegatarianos es limitado y no quiere coger por si acaso deja sin comida a alguien.
  • Acabas dedicando una parte del break de comida a explicar por millonésima vez tu elección a la hora de comer. En realidad solo te gustaría seguir charlando de tus temas profesionales y comer sin hablar de la comida. Personalmente no me importa responder a preguntas inteligentes y sinceras acerca de mi elección. Las bromas de siempre a veces sí pueden caer pesadas. Entiendo que para los alérgicos o que tienen intolerancias alimentarias puede resultar realmente pesado hablar de eso cada vez.
  •  Si las diferentes opciones están unas al lado de otras, tienes a una o varias personas de la organización nerviosas y pendientes de que se vayan a comer los contados menús vegetarianos/veganos que hay. Incluso a veces han ido a buscarme para decirme que fuese rápido a comer, no fuese que me quedase sin comida. Me pesa que los organizadores no puedan relajarse y comer como cualquier otro.
  • A menudo la opción vegetariana/vegana suele estar currada y tener buen aspecto, por lo que mucha gente que no es vegetariana/vegana quiere probar, pero como los menús están contados les dicen que no es posible. Se quedan con los dientes largos.

En definitiva se está haciendo una distinción que es inecesaria. Una vez reconocemos todos estos problemas, una solución que he visto en otros sitios es dejar de separar a la gente por lo que come. Que se haga invisible la opción que cada uno elige. Que todos los platos de comida lleven una leyenda con los alérgenos que tiene, con esos iconitos que dicen si contiene carne, pescado, huevos, lactosa, marisco, frutos secos, apio... y que haya sufientes platos para que todo el mundo encuentre lo que come. Para esto, un tercio de la comida podrian ser platos veganos, otro tercio sin gluten y el tercio restante platos con carne.  A la gente que come carne no le suele importar que haya una comida donde no llega a comer carne y come de otro plato. Lo importante es que el plato no ponga "vegano" porque eso causa rechazo, a alguna gente le asquea. Simplemente que indique los ingredientes que lleva. Lo importante es que esté rico. Nadie se queda sin comer al final. Si se diese el caso de que se han acabado los platos vegetarianos/veganos porque a la gente le han gustado mucho, lo entendería, no habría problema.

En la CAS2015 de Madrid fue bastante bien. Es cierto que tenía que preguntar a los del catering qué ingredientes había en algunos platos, pero muchos eran evidentes. En la mesa siempre había pinchos vegetarianos/veganos, otros con carne, etc... podemos hablar de que el sitio donde comíamos era pequeño para todos y que la comida vegetariana/vegana que hubo no estaba muy rica pero comimos sin mas incidencias. Con algo más de calidad en la comida y más espacio, hubiese sido perfecto. En varias conferencias del extranjero a las que he ido, la comida era tipo buffet o servida en grandes mesas con sus etiquetas. Los platos vegetarianos/veganos estaban riquísimos y la gente no vegetariana los comía con gusto. Estaba todo en el mismo lugar así que uno símplemente iba cogiendo lo que le apetecía y la comida no era un tema de conversación.

Entiendo que esto puede encarecer el precio de la comida, aunque no necesariamente. Y también entiendo que las empresas de catering ofrezcan lo de siempre. Ellos no van a ser quién tome la iniciativa de cambar su oferta sino que la van cambiando en base a la demanda del consumidor. Es el consumidor quien puede ir cambiando la tendencia.


La diversidad:

Pensé que iba a hablar de la integración de la mujer en el sector TIC en este post, de equilibrar el porcentaje de mujeres y hombres en las conferencias, pero es un tema que se merece un post propio. Este ya me ha quedado larguísimo. Mientras tanto te invito a escuchar el episodio Women in tech del podcast Code on the rocks, que me encantó.

Fui parte de JSDayEs 2016

Este año tuve la suerte de que envié una propuesta el JSDayEs y la aceptaron. Sobre nuestra experiencia desarrollando con ES6, el nuevo standard. Dejo aquí el video de la charla dentro de la playlist de videos del evento.

Olvidé decir algunas cosas durante la charla, la más importante fue que con ES6 ya desparece la necesidad de usar el patrón IIFE que siempre resulta complejo de entender. Lo puse luego en las slides pero no lo dije durante la charla, estuve un poquito espeso.

En un evento con tanto nivel técnico, y yo que no me considero ningún gurú de JavaScript, el listón estaba muy alto. Sobretodo después de la apertura de Enrique Amodeo que ya con tantos años de experiencia a sus espaldas y tanto conocimiento, las ve venir de lejos. La charla de Enrique fue de las que más me aportó. Como para verla de nuevo tranquilamente. El viernes por la tarde estuve muy poquito en el open space porque estuvimos grabando parte del episodio 2 de NMNL por fuera del google campus. Así que llegué ya practicamente para las cañas y la cena. Estuvo genial el networking y la cena. Conocí gente super interesante (no diré nombres para no olvidarme a nadie) y lo pasamos estupendamente. La organización del evento fue brillante, recuerdo especialmente la apertura con Alex Fernandez corriendo por el recinto, saltando por encima de la gente y la producción de video que se curraron. Todo muy muy currado. El sitio por supuesto estupendo. Y en el desayuno y comida del sábado hubo opcion vegana para comer, que esto muy pocas veces pasa y termino comiendo pan y papas fritas con suerte. Muchos pequeños detalles que hicieron del evento uno grande. Algunas charlas como iban a ser grabadas preferí perdermelas para charlar con gente que estaba en la zona de descanso. A menudo cuando las charlas van a ser grabadas y se que no va a faltar público y que no van a ser interactivas, prefiero verlas grabadas en casa y aprovechar el evento para hablar con la gente. Y ahora que las he visto todas en vídeo pues debo decir que me han gustado todas. Estupendo que la duración de las charlas fuera cortita. Como posible punto de mejora se me ocurre quizás haber dejado alguna hora sin charla, sino para puro networking. Gracias a JSDay he establecido nuevas relaciones profesionales con personas muy afines en cuanto a valores y principios. Me permitió conocer más a gente del equipo de Kairós DS que ahora somos partners y debo decir que conocernos allí ayudó a tomar la decisión de asociarnos. O séa que no puedo pedirle más al evento. Simplemente que se repita. Agradecer y felicitar a la organización un pedazo de evento con un curro impresionante y una ejecución brillante.

Te ayudo a presentar

Vienes al AOS2016? Vamos a coincidir quizás en otro open space? Si nunca has presentado una sesión pero tienes algo que te gustaría compartir con la comunidad y te cuesta un poco arrancar y dar el paso, yo me ofrezco a echarte una mano. Te puedo ayudar a preparar el discursito de presentación de la sesión para que la gente entienda bien la temática y el formato y obtenga votos. Podemos salir juntos a contar la idea. Luego tambien podemos facilitar la sesión juntos (siempre y cuando salga votada), pero necesitaríamos prepararla un poquito antes del evento sobre todo si es un tema que yo desconozco. Sería una especie de "coaching" para facilitar o ser ponente en una sesión. Lo que haría es darte feedback sobre el material y el enfoque, en base a mi experiencia.
He dado muchas charlas y facilitado bastantes sesiones ya en open spaces y en otros formatos de evento. Mi experiencia puede ayudarte a ganar confianza y sentir que no estas sola, o solo. No hay ningún peligro, es un entorno controlado.

Esta idea la he copiado de Lisa Crispin que en su iniciativa de fomentar que haya más mujeres en el sector TIC, invita a ponentes femeninas que nunca han presentado en una conferencia, a presentar con ella.

Simplemente mándame un email, un tweet o un DM y buscamos la forma de preparar de la sesión.

Nos vemos en Santiago!

Así fue mi paso por Fon

Hace unos meses tuve la suerte de ser contratado por Fon para impartir un curso de TDD a uno de sus equipos de desarrollo en Madrid. Una oficina chulísima y un equipo entregado que prestó atención máxima desdel el minuto 1.

IMG_20151202_112556

Fon es una empresa de la que he oído hablar practicamente desde sus orígenes porque sonaba mucho en el mundillo geek desde siempre. Tenían fama de hacer las cosas bien. Así que tenía ganas de visitarles y ver qué se contaban hoy en día donde el Wifi ya no parece tan importante. Sin embargo me contaron que lo están petando con el roaming wifi en varios países.

Lo único que me faltó para que hubiese salido todo del 10 es conocer a Daniel Brandi que justamente esa semana estaba en un evento en Londres y no nos pudimos ver. Me sorprendió gratamente que muchos de los participantes en el curso ya me conocían y se habían preparado preguntas para sacarle el máximo partido a esos dos intensos días de formación.

IMG_20151202_112633

Agradezco especialmente a Joan Fisbein la atención, el apoyo prestado y las agradables conversaciones durante la comida.

Parece que el curso cambió la forma en que el equipo ve los tests, tanto en calidad como en cantidad. La gente se dió cuenta que la cobertura no es un objetivo en sí mismo sino que lo importante es crear unos tests mantenibles que mantengan un buen compromiso entre seguridad y mantenibilidad.
Las conversaciones fueron muy interesantes y la gente muy maja.

Además en este curso pudo venir conmigo nuestro aprendiz Miguel A. Viera y facilitar alguno de los ejercicios en el segundo día. Miguel se quedó alucinado con la oficina.

IMG_20151201_121617

Ahora mismo Fon está buscando desarrolladores Java senior. Es un buen momento para enviarles un CV si estas buscando nuevos retos.

Ni Monos Ni Lagartos, Episodio 2:

No tenía ni idea de qué era esto de "Ni monos ni lagartos" NMNL, (más allá de la pegatina de Autentia del mono con el lagarto en la cabeza con atajos de teclado de Vim) porque cuando Isabel Rodriguez me llamó para decirme que habían pensado en mí para el segundo episodio, el primero todavía no se había emitido. Así que pense... bueno serán un par de preguntillas rápidas al estilo de otras entrevistas cortas que he hecho con Autentia. Pero después me dijo que vendrían a buscarme al aeropuerto con las cámaras y a rodar en el coche y en lo alto de no se qué puente de Madrid y pensé se les ha ido la pelota..., qué molón! me apunto!
Creo que el hecho de que pensaran en mi como protagonista de un episodio de NMNL fue que iba a impartir un taller de Refactoring en Autentia. Es lo bueno que tiene recordarle a la gente que estas ahi, que pueden contar contigo.

NMNL es algo así como "el Salvados" del mundo IT 🙂 un programa donde entrevistan a personas que ellos creen que son relevantes dentro del sector.

En este viaje me acompañaba mi hermana Raquel de tan sólo 18 años en su primera visita a Madrid y le sorprendió mucho la noticia del video, no sabía ni qué ropa ponerse. Hubo algunas preguntas sobre ella durante el rodaje pero luego quedaron fuera de los videos porque la verdad es que tres días rodando juntos no caben en los videos!
El primer día rodamos en el aeropuerto, en el coche y en la oficina de Autentia. Desde el principio me sentí super cómodo con la cálida acogida y la profesionalidad del super equipo de Autentia Media: Isabel, Alba, Leti y Sonia. Nos trataron de maravilla tanto a mí como a Raquel.
Si alguna vez tienes la suerte de que te propongan protagonizar un episodio de NMNL, no lo dudes, es una experiencia única. No importan los nervios porque no es un directo, las tomas se repiten las veces que haga falta y luego en la edición muchas cosas se dejan fuera. El equipo de Autentia se lo curra para que parezcas un gran orador, cortando pedacitos por aquí y por allá.

El segundo día rodamos en La Gatoteca, un fabuloso refugio felino en el centro de Madrid. Fue la parte de preguntas personales donde pude responder a muchas de las preguntas típicas que la gente me hace cuando vamos a comer juntos, por ejemplo preguntas sobre el veganismo o sobre nuestro pequeño refugio felino. Estuve tan agusto rodeado de gatos y tan inspirado gracias a la ayuda de Alba y del resto del equipo que grabamos mucho más de lo que cabe en un episodio de 20 minutos, que es aproximádamente lo que dura el programa. Así que en la producción han tenido el detallazo de sacar otro video, con la entrevista personal entera:

La parte más personal de la entrevista

Agradezco especialmente a La Gatoteca el gran gesto que tuvieron con nosotros al reservarnos la planta baja practicamente durante toda la mañana. Confiaron totalmente en nosotros y nos facilitaron la grabación además de ser amables y explicarnos de primera mano como funciona. Si estas en Madrid y piensas en adoptar un gatito, no dejes de visitar La Gatoteca (y si es una pareja mejor, así se dan compañía! los gatos mejor adoptarlos en pares). Es un sitio estupendo incluso para comprobar si sigues teniendo aquella alergia que te había disuadido de acoger animales!

Ese día como de costumbre tenía varias reuniones en distintos puntos de la ciudad y además la conferencia JSDay que empezaba por la tarde. En la Gatoteca estuvimos durante la mañana. Por la tarde rodamos por fuera de Campus Madrid en una plazoleta, la parte profesional de la entrevista. Mientras yo mantuve una reunión de negocio, Raquel pudo quedarse con las chicas a comer y así aprender un montón de cosas sobre cómo trabajan, cosa que a su edad es una información muy valiosa. De hecho ibamos buscando que en este viaje conociera diferentes profesionales para ir haciendose una idea de posibles oficios a aprender.

En esta entrevista hubo un pedacito donde pude hablar de nuestra experiencia en DAG (Domingo Alonso Group), el cliente que nos ha ayudado en gran medida a convertirnos en Codesai. Para una convención interna de DAG, Autentia tuvo el detalle de producir otro vídeo más, que contenía exactamente esta parte:

Hablando de DAG (Domingo Alonso Group):

Un buen pedazo de la tarde se nos fue rodando, por lo que llegué tarde al JSDay, cosa que espero que me perdonen los organizadores. Haré un post sobre el evento muy pronto, porque estuvo genial.

Se nos ocurrió la idea improvisada de que parte de mis compañeros de equipo participasen en NMNL pero como no hubo aviso con suficiente tiempo, la mayoría se había marchado de Madrid aprovechando el puente. Modesto fue el único que pudo venir a grabar a Campus Madrid pese a que era el cumple de su hija y que estaba muy cansado tras una semana intensa. Si lo hubíese sabido con antelación quizás podriamos haber estado 5 personas del equipo, pero no me lo imaginaba. Este fue el motivo de que me saliese de la sala en medio de algunas confernecias del JSDay.

El montaje final de NMNL Episodio 2, me ha parecido un montaje y una producción de una calidad enorme.

Todo el feedback sobre las entrevistas es bievenido.

Mando un fuerte abrazo a todo el equipo de Autentia por su apoyo y dedicación, sin la cual nada de esto sería posible.

El feedback que he recibido de personas cercanas es que se hace corto, que pasa muy rápido. Esta es una gran señal.

Event bubbling in C#

How to propagate an event from a low level class to a top level one:

  1.  
  2. public class TopLevel{
  3. public bool Bubbled { get; private set; }
  4. private MiddleLevel observable;
  5. public TopLevel(MiddleLevel observable){
  6. this.observable = observable;
  7. observable.Triggered += (s, e) => {
  8. Bubbled = true;
  9. };
  10. }
  11. }
  12. public class MiddleLevel{
  13. public event EventHandler Triggered;
  14. private BottomLevel observable;
  15. public MiddleLevel(BottomLevel observable){
  16. this.observable = observable;
  17. //One may be tempted to bubble like this:
  18. //observable.Triggered += Triggered;
  19. //However, Triggered is null unless there is already
  20. //a subscriber. This is a better approach:
  21.  
  22. observable.Triggered += (s, e) => {
  23. Triggered(s, e);
  24. };
  25. }
  26. }
  27. public class BottomLevel{
  28. public event EventHandler Triggered;
  29.  
  30. public void DoSomething(){
  31. Triggered(this, EventArgs.Empty);
  32. }
  33. }
  34.  
  35. [TestFixture]
  36. public class TestingEventBubbling {
  37. [Test]
  38. public void Bubbling(){
  39. var bottom = new BottomLevel();
  40. var middle = new MiddleLevel(bottom);
  41. var top = new TopLevel(middle);
  42.  
  43. bottom.DoSomething();
  44.  
  45. top.Bubbled.Should().BeTrue();
  46. }
  47. }
  48.  

Events can only be raised from within the declaring type. Unfortunately they can't be be passed in as arguments to methods. Only += and -= operators are allowed out of the declaring type. One way to stub out the event could be through inheritance:

  1.  
  2. public class BottomLevel{
  3. public virtual event EventHandler Triggered;
  4.  
  5. public void DoSomething(){
  6. Triggered(this, EventArgs.Empty);
  7. }
  8. }
  9.  
  10. public class StubbedBottomLevel : BottomLevel {
  11. public override event EventHandler Triggered;
  12.  
  13. public void RaiseEvent(){
  14. Triggered(this, EventArgs.Empty);
  15. }
  16. }
  17.  
  18. [TestFixture]
  19. public class TestingEventBubbling {
  20. [Test]
  21. public void BubblingWithStub(){
  22. var bottom = new StubbedBottomLevel();
  23. var middle = new MiddleLevel(bottom);
  24. var top = new TopLevel(middle);
  25.  
  26. bottom.RaiseEvent();
  27. //bottom.DoSomething(); will not throw the event!
  28.  
  29. top.Bubbled.Should().BeTrue();
  30. }
  31.  

But declaring the event as virtual and then overriding it, is very tricky: replacing the call to RaiseEvent to DoSomething, makes the test fail! Looks like events where not designed to be overridden. A better approach:

  1.  
  2. public class BottomLevel{
  3. public event EventHandler Triggered;
  4.  
  5. public virtual void DoSomething(){
  6. //SomeLogic would go here...
  7. Raise(EventArgs.Empty);
  8. }
  9. protected virtual void Raise(EventArgs args){
  10. Triggered(this, args);
  11. }
  12. }
  13.  
  14. public class StubbedBottomLevel : BottomLevel {
  15. public override void DoSomething(){
  16. Raise(EventArgs.Empty);
  17. }
  18. }
  19.  

I don't really know whether they are the best practices to be honest, and certainly there is a lot for me to learn but these are principles and practices that work well for us in the development of a complex native Windows App (Windows 8.1+) using C# and the MVVM pattern.

Files in my example (namespace + classname) :

  • Example.Views.App.xaml.cs            (Main app class)
  • Example.Views.Vehicle.xaml           (View)
  • Example.Views.Vehicle.xaml.cs       (View's Codebehind)
  • Example.ViewModels.Vehicle.cs     (View model)
  • Example.Domain.Vehicle.cs             (Domain model)
  • Example.ViewModels.AppState.cs   (In-memory app state)
  • Example.Views.NavigationService.cs (Our custom navigator)
  • Example.Views.NavigationParameters.cs (Bag of parameters to be sent to the target view)
  • Example.Domain.EventBus.cs         (Our custom
    pub-sub implementation, a singleton)

Page navigation is performed by the framework:

  1. ((Frame)Window.Current.Content).Navigate(
  2. typeof(Vehicle), vehicleId);

The first parameter is the type of the target Page and the second is an "object" intended to send any custom parameter. Such parameter is received as an argument of OnNavigatedTo method in the target page.
The code above is used to navigate from App.xaml.cs (Main page) to Vehicle (Page).

The NavigationService is an indirection level that sends the ViewModel to the View as the context object. It's used pretty much like Frame.Navigate:

  1. NavigationService.Navigate<Vehicle>(Window.Current, vehicleId);

Implementation (NavigationService.cs):

  1. public static void Navigate<T>(Window w, object context){
  2. ((Frame) w.Context).Navigate(typeof(T),
  3. new NavigationParameters{
  4. ViewModel = GetViewModel<T>(),
  5. Context = context ?? GetContext<T>()
  6. });
  7. }
  8.  
  9. private static object GetViewModel<T>(){
  10. if (typeof (T) == typeof(Vehicle)){
  11. return Factory.CreateVehicleViewModel();
  12. }
  13. ...
  14. throw new NotImplementedException("Can't navigate to such page");
  15. }
  16.  

This is how the view model is received in Vehicle's codebehind (Vehicle.xaml.cs):

  1. protected override async void OnNavigatedTo(NavigationEventArgs e){
  2. var navigationParams = e.Parameter as NavigationParameters;
  3. var vm = navigationParams.ViewModel as ViewModels.Vehicle;
  4. vm.SubscribeToEventBus(); // in case vm is a listener
  5. await vm.Initialize(); // in case of some initialization
  6. DataContext = vm; // set the DataContext at the very end
  7. }
  8.  
  9. protected override void OnNavigatedFrom(NavigationEventArgs e){
  10. if (ViewModel != null){
  11. ViewModel.UnsubscribeFromEventBus(); // release the reference
  12. }
  13. }
  14.  

Principles applied in the code snippet above:

  • DataContext is set in the last step of the method, not before. DataContext is set either in the codebehind or in xaml, but not in both places at the same time. If the DataContext is set in the xaml (DataContext="SomeProperty") and also in the codebehind, you can't guarantee which data will be finally set, race conditions could happen.
  • Pages and UI controls in general must not contain state. Avoid any field in the codebehind holding a reference to the view model. This is to prevent race conditions. We rather create a getter instead:
    1. protected ViewModels.Vehicle Vehicle {
    2. get { return DataContext as ViewModels.Vehicle }
    3. };
  • Avoid subscribing the codebehind to the EventBus, use the view model as the listener. Life cycle of the pages is controlled by the framework - this is specially important when caching pages via NavigationCacheMode="Required". Sending a reference to the EventBus will prevent the garbage collector from cleaning up the Page instance.

Avoid global statics: Although there is a single instance of AppState class - is a global singleton, we inject it into every view model that requires read or write access rather than having direct static references. The Factory knows the AppState singleton and injects it to the viewmodels. Although two different views may require the same data, we try not to store everything in the AppState but rather cache the service methods retrieving the required data and then injecting the same instance service to both viewmodels. The amount of data kept in the AppState should be minimal, basically it should contain identifiers that view models understand in order to pull data from the services. Sometimes it contains more data to avoid time consuming transformations or calculations, that's fine, it's a trade off.

Custom controls: We ended up having our own custom pages, inheriting the Page control to remove duplication from initialization process. One of such inheritors is generic: CachedPage, where T is the type of ViewModel. However in xaml you can't define a page inheriting from a generic class. To work around this minor issue we create an intermediate empty class:

  1. public class CachedVehiclePage : CachedPage<Vehicle>{}

Then in xaml we can set the type of our page to be CachedVehiclePage.

Nested user controls: When a Page contains a user control, the DataContext of that user control is the same than the Page's one. Neither the codebehind or the xaml of user control should overwrite the DataContext. The DataContext should not be set programmatically it's just inherited from the parent container. Otherwise there could be race conditions and memory leaks.

Data binding: We don't bind domain models directly to the GUI. The main reason is that double way binding requires public setters. Sometimes we create a bindable object that wraps the domain model exposing only ome properties. But we often create custom bindable objects from the domain model for the specific purposes of the view.

I'll update this post with more stuff that is working well for us.

 

 

In my experience a code review must have a goal. Some common goals are:

  • Telling others how you solved a common problem.
  • Warning others about certain perils (i.e race conditions, coupling...)
  • Asking concrete questions. Implementation or design questions.

When you expose some code to your colleagues in a meeting room, you should know exactly what you want to get from that activity. You want to learn, to tech or to warn others basically. Otherwise, if you just open up some code and ask your colleagues what's their opinion about the code, then everyone will say something. Exactly like watching a football match with friends, everyone has his/her opinion on how the coach should manage the team, how players should play... no matter how good the team play, there will be always someone opinionated bullshit. The code review will be frustrating and not very productive.

Remember to prepare a list of questions or tips to tell others, together with the code you want to share, before going to the code review.

I visited Scytl

In October 2015, just two months before the Spanish elections I was lucky to visit Scytl and work there as a consultant for a week. Thanks to my good friends Manu Martin (@ManuCervello) and Alvaro Garcia (@alvarobiz) who are currently working in there as agile coach and developer respectively. I met a different team each day of the week, it was quite challenging and interesting.

tdd-course.jpg-largeMore often than not, when I visit companies, I get to see a significant amount of coding horrors and technical debt. So I was curious about Scytl because I knew they were going to collect and count my vote together with other 30 million more two months later. They were the IT company designated to  collect and count the votes in the Spanish elections - among many other things like the website with the reports...
I must say that I really liked what I saw, they are brilliant security experts, very professional. Citizens' vote was absolutely private and secure. I was confident that my decision as voter was secure, that I could trust their software. It's a very good feeling... software one can trust finally!

And yes, two months later they did a fantastic job, and they even broke the voting count speed record. Congratulations!

One of the teams I worked with was exactly the one in charge of collecting the votes. They had really good architecture and design questions for me. It was a challenge. Their chosen solution was very smart, I liked its simplicity. There was a lot of pressure on this team and I explained how important it is to have some slack time in order to step back for a little while and rethink decisions. Too much pressure is harmful in my experience, the best ideas come up when the brain is relaxed.

I also worked with the team in charge of counting votes and I got to see the D'hondt algorithm, something totally new for a democracy illiterate like me. We had a very nice mob programming session with the whole team in the meeting room. People were skeptical about mob programming at first but they quickly grasped its benefits, it was a way to find out team conventions for example.

On the third or forth day I also spent the day with the mob, this time with another team. The focus was on refactoring and unit testing strategies apart from a code review. We had the chance to explore together some of the new features of Java 8 too. I emphasized the importance of learning the IDE's shortcuts and the automatic refactorings it provides - it was IntelliJ in this case. Nice to code with young people willing to learn and improve.

I emphasized the fact that communication among co-located teams is more effective face to face. Pairing for a while to integrate a new feature from the other team or some API change, feels nicer than sending emails back and forth. Dog fooding among teams could help improve collaboration given that some teams act as a kind of "customer" to others.

There was also a session with a group to discuss about values, principles, professionalism and motivation. An exchange of opinions and points of view. Unexpected and very enriching.

I didn't know that teams are multicultural with people from distinct nationalities. English is the official spoken language. Although my English is not too bad for a quick chat, I had some trouble understanding and communicating with some people from other cultures.  It reminded me of how tough it could be to work with people from other cultures, specially when English is not the native spoken language of none of us.

Scytl's people were excellent hosts, very welcoming and friendly. Thank you for a remarkable week!