Cierre de cuatrimestre 2023-2 en MeMo2 @ FIUBA

Terminamos el cuatrimestre y me alegra tener la sensación de que seguimos mejorando. Continuamos con el horario matutino de 8 a 11, excelente. Y mantuvimos el mismo porcentaje de clases presenciales/virtuales.

Como siempre hicimos un par de ajustes respecto del cuatrimestre anterior, algunos de ellos basados en el feedback de los alumnos y otros surgidos del equipo docente.

  • Uno de los ajustes más importantes fue ser más explícitos sobre la «programación colaborativa» (mob y pair programming), por momentos pedimos explícitamente que no programen en solitario. Esto generó cierta «incomodidad» entre algunos alumnos por verse obligados a coordinar horarios con sus compañeros para hacer algunas tareas. Pero creemos que el resultado fue muy positivo ya que percibimos que se trabaron menos con cuestiones técnicas lo que les permitió terminar las tareas en menos tiempo y con menos grado de «frustración».
  • Una novedad fue que para los trabajos grupales, agregamos un facilitador «externo» para las retrospectivas al final de cada iteración iteración. O sea: cada grupo ya tenia un docente en el rol de Product Owner y a eso agregamos un segundo docente que solo se sumaba para facilitar las retrospectivas.
  • Otro de los ajustes, no tan visible para los alumnos, tuvo que ver con la infraestructura que utilizamos para el trabajo final debido a algunos cambios en Okteto. Básicamente dejamos de utilizar Okteto y directamente pusimos (casi) todo a correr en nuestro propio cluster Kubernetes en Digital Ocean.
  • También pusimos un poco más de foco en las cuestiones relacionadas a la operación o mejor dicho lo que suele llamarse «build for operations»
  • Finalmente, estrenamos un nuevo trabajo final que nos trajo renovados desafíos para el equipo docente.

Tanto en la retrospectiva final como en la encuesta de cierre, tuvimos feedback muy positivo de los alumnos. Comparto algunos números de la encuesta:

  • La encuesta fue contestada por la totalidad de los alumnos que completaron el curso (11)
  • La evaluación general de la materia (en promedio) dio 9.0, lo cual es mayor que el cuatrimestre anterior (8,8).
  • Respecto del porcentaje de clases presenciales/virtuales, 10 alumnos lo consideraron apropiado mientras que solo 1 hubiera preferido más virtualidad.
  • Las otras dimensiones de evaluación de la materia también resultaron muy positivas: claridad de los docentes: 4,7/5; Conocimientos de los docentes: 5 /5; Dinámica de las clase: 4,6/5; Materiales de estudio: 4/5.
  • La dedicación semanal a la materia extra clase dio un promedio de 8,7 lo cual me parece puede estar un poco distorsionado por la últimas semanas en las que los alumnos trabajaron en el trabajo final.
  • El NPS nos dio 63 (esta es una métrica que puede tomar valores en el rango -100 +100)

Algunos otros números del cuatrimestre:

  • Comenzamos la materia con 13 alumnos dos de los cuales abandonaron aproximadamente a mitad de cuatrimestre. Finalmente completaron la cursada 11 alumnos. Luego todos aprobaron el final.
  • Tuvimos 40 tareas individuales que incluyeron: lecturas, videos, cuestionarios y ejercicios de programación
  • Tuvimos 1 tarea para trabajar en parejas y dos trabajos grupales con grupos 3 o 4 alumnos
  • La calificación promedio de aprobación fue 7,1

Resulta curioso que si bien los números de la encuesta dieron mejor que el cuatrimestre anterior, la calificaciones fueron más bajas, un fenómeno para analizar.

Respecto de la dedicación, el análisis de la información reportada por los alumnos nos indica que:

  • La dedicación promedio extra-clase por persona sin considerar los trabajos grupales fue de 65 horas
  • La dedicación promedio extra-clase por persona para los trabajos grupales fue tp1: 6 horas y tp2: 14 horas
  • En términos generales la dedicación extra-clase promedio por persona a lo largo de toda la materia fue de 7,7 horas semanales.

Ingeniería de Software Continua: Fin de primer cuatrimeste & Inscripción 2024

La semana pasada completamos el primer cuatrimestre de la Diplomatura en Ingeniería de Software Continua. Dictamos dos materias: «Diseño y Evolución de Arquitecturas de Software» e «Ingeniería de Software Moderna» las cuales tuvieron 12 alumnos, un muy buen número para la dinámica de clases que diseñamos. El feedback de los participantes fue muy positivo y desde el equipo docente también quedamos muy contentos.

Para ser preciso debo decir que no yo dicté ninguna materia, sino que cuando digo dictamos lo hago desde mi rol de coordinador de la carrera.

El dictado del segundo cuatrimestre comenzará en Abril 2024 con otras dos materias: «Operación y Gestión de Servicios de Software con DevOps» y «Continuous Delivery«, esta última está a mi cargo. Dada la flexibilidad con la armamos el plan de estudio, los interesados en hacer la carrera pueden sumarse en este segundo cuatrimestre y luego completar el diploma en la segunda mitad de 2024. Más aún, si alguien no quiere hacer la carrera completa sino alguna materia puntual, también es posible. Para despejar estas dudas y cualquier otra que los potenciales interesados puedan tener, este miércoles 13 a las 12:00 horas (hora Argentina, gmt-3) estaremos dando una charla informativa (online). Los interesados en participar pueden completar este formulario para que les pasemos los datos de conexión.

Sobre las poco conocidas Pruebas end-to-EDGE

Tengo la sensación que este tipo de pruebas no es muy conocido y al mismo tiempo es un tipo de prueba que me parece fundamental para poder trabajar en un esquema de entrega continua. Paso a explicar.

En la actualidad es muy común que una aplicación tenga dependencias que no están bajo nuestro control, típicamente alguna API de un servicio externo. Ejemplos típicos podrían incluir un servicio de pagos o un proveedor de información climática. Esos servicios externos pueden ser parte de nuestra misma organización o no, pero en ambos casos el punto en común es que no tenemos control sobre ellos.

Muchas veces esta dependencia resulta un impedimento para poder testear nuestra aplicación y aquí está el punto clave a la hora de querer implementar una estrategia de entrega continua. Si queremos trabajar en un esquema de entrega continua tenemos que poder testear (casi) todo nuestro código sin depender de la disponibilidad del servicio externo.

En una prueba end-to-end testeamos todo nuestro código incluida la interacción con las dependencias externas.

En una prueba end-to-EDGE testeamos todo nuestro código sin «tocar» las dependencias externas. Esto lo hacemos utilizando «un doble de prueba» de la dependencia. Una forma de implementar esto es usando una herramienta tipo Wiremock.

Cabe destacar aquí, que en estos tests end-to-edge, nuestra aplicación «no sabe» que está interactuando con un doble de prueba, pues lo único que hace es tirar un request sin saber quién está del otro lado. Al mismo tiempo como ese doble de prueba está bajo nuestro control, tenemos la posibilidad de generar respuestas que nos permitan ejercitar distintos escenarios, algo que muchas veces no es posible con las pruebas end-to-end, pues en la prueba end-to-end no tenemos control sobre esa api/depedencia externa. ¿Cómo haríamos para probar el comportamiento de nuestra aplicación cuando esa api/dependencia externa falla? ¿Llamamos al dueño de la api/dependencia externa y le decimos que la apague un rato para poder probar el escenario de error? No parece factible, lo que debemos hacer no es una prueba end-to-end, sino una prueba end-to-edge que utilice nuestro doble de prueba en lugar de la api/dependencia externa real.

Una última consideración, si vamos a hacer pruebas end-to-edge utilizando un doble de prueba de la api/dependencia externa, debemos entonces también tener alguna prueba de integración que verifique la correcta interacción con la api/dependencia externa, pues sin eso corremos el riesgo de que la api/dependencia externa cambie y nosotros no nos enteremos pues confiamos en la corrección de nuestro doble de prueba que podría quedar desactualizado. Esas pruebas de integración con la api/dependencia externa no es necesario que sean pruebas end-to-end, sino que basta con que sean pruebas puntuales del componente/conector que encapsula la interacción con esa api/dependencia externa. Finalmente es importante que esas pruebas de integración se ejecuten periódicamente aún cuando no haya cambios en nuestro código, pues puede que se produzcan cambios en el api/dependencia externa y no nos avisen.

Para intentar clarificar varias de estas ideas he grabado una par de videos explicando esto con gráficos y código.

Cierre de cuatrimestre @ UNTreF

La semana pasada completamos un nuevo curso de la materia Ingeniería de Software en UNTreF. Tuvimos 6 alumnos, todos completaron la cursada y 5 de ellos promocionaron la materia.

Debido al cambio de plan de estudio, este cuatrimestre fue el último en la modalidad actual pero a pesar de eso también hicimos algunas innovaciones en esta edición. Resulta que a partir del próximo año la materia se dicta en el contexto del nuevo plan de estudio en el cual es un materia de tercer año y no de quinto año como fue hasta el momento.

En lo personal creo que fue uno de los mejores cuatrimestres que tuvimos y creo que en gran medida fue por el grupo de alumnos. A diferencia de otros cuatrimestres creo que se generó una muy buena onda tanto en la relación entre los alumnos como también en la relación docente-alumno.

Como de costumbre trabajamos sobre el JobVacancy pero agregamos una innovación creando una capa de presentación complementaria representada por un Bot de Telegram. La introducción de este componente trajo un conjunto nuevo de complejidades que nos permitieron aplicar algunas prácticas más allá de las habituales (logs centralizados, monitoreo, gestión multipipeline, etc.)

En la retrospectiva de cierre los alumnos destacaron 3 cuestiones:

  1. Didáctica de la materia 🙂
  2. Contenidos de la materia 🙂
  3. Alta carga de trabajo (y agrego yo, carga continua de trabajo) 😐

Podcast: Agilidad Técnica

Hace un par de días salió publicado un episodio del podcast La Revolución Ágil en el que estuve participando. El episodio fue grabado hace un par de meses y es básicamente una charla uno a uno con Camilo Velasquez, host del del podcast.

Previo a esta publicación tuvimos cierto desencuentro respecto del título con el que saldría publicado el episodio. El título original que había puesto Camilo me generaba cierta incomodidad pues a mi parecer transmitia una idea de «rivalidad» entre técnicos y agilistas. El título final, «Agilidad Técnica», me parece mas apropiado pero igualmente a mi parecer tiene cierta redundancia ya la verdadera agilidad implica el uso de ciertas prácticas técnicas (test-automation, CI/CD, etc).

Más allá de la cuestión del título, creo que la charla estuvo muy buena y creo que trae muchas cuestiones interesantes para aquellos agilistas que trabajan con equipos de entrega de software y que no tienen formación técnica.

Varias de las cuestiones que menciono en la charla son parte de mi Taller de Prácticas Técnicas para Scrum Master.

Agradezco a Camilo por invitación y lo felicito por iniciativa ya que al margen de este episodio hay otros episodios super interesantes. En lo personal me gustaron mucho los episodios 7 y 13 con Hiroshi y Alistair respectivamente.

Build for Operations: Mensajes de Log

Con el auge de las iniciativas DevOps/SRE resultan cada vez más importantes ciertos aspectos de cómo desarrollamos software, pues ciertas propiedades del software desarrollado pueden tener un impacto muy importante en la operación del software. Este conjunto de propiedades que van mucho más allá de la arquitectura bien podrían caracterizarse como «factores de operabilidad» o como las denomina James Shore «Build for Operations». Aquí tenemos cuestiones tales como: Threat Modeling, Configuration, Logging, Secrets y Monitoreo entre otras.

Desde hace ya un tiempo vengo incorporando algunas de estas cuestiones en mis materias y es por ello que he decidido inaugurar una nueva serie de videos titulada «Build for Operations» para ir cubriendo estos temas. Aquí les comparto el primer video de la serie: «Manejo de Logs»

Testing sin Testers, una mirada distinta al control de calidad

Tradicionalmente la actividad de control de calidad, usualmente denominada testing, ha sido llevada a cabo por personal con el rol específico de tester. Asimismo es una actividad que en muchos contextos se realiza de forma manual e incluso en algunas organizaciones de una forma no sistematizada y completamente ad-hoc.

Si bien las iniciativas Agile/DevOps han propuesto algunos cambios significativos en la forma de realizar el testing, muchas organizaciones siguen sufriendo estragos con el control de calidad en parte por seguir estrategias contrarias en esencia a lo propuesto por estas iniciativas.

Es por esto que mañana, jueves 16 a las 11:30 hs., estaré disertando sobre este tema en el contexto de las Jornadas de Calidad de Software y Agilidad organizadas por la Universidad Nacional de Misiones y que se realizarán en formato mixto presencial-online. Los interesados pueden registrarse aquí.

En mi disertación repasaré los puntos centrales del movimiento Agile/DevOps en lo referente al testing, compartiré varias experiencias de implementación que me han resultado efectivas y daré algunos consejos para quienes quieran aventurarse al cambio.

Sobre las Pruebas de Integración

En mi opinión no hay una definición única sobre qué es una prueba de integración. En términos muy generales suele asumirse que prueba de integración verifica la integración de dos (o más) componentes. La cuestión (o diferencia) radica en qué son esos componentes.

Algunos (¿la mayoría?) considera que esos dos componentes son componentes de nuestra propia autoría, por ejemplo: tengo dos clases desarrolladas por mi con algún tipo de dependencia entre ellas, claseA y claseB, entonces mi prueba de integración busca verificar la correcta interacción de esas dos clases entre sí.

Otros, donde me cuento yo, pensamos más en línea con la propuesta de Freeman. En este caso uno de los componentes en la prueba de integración no está bajo nuestro control, o sea: no lo desarrollamos nosotros. Esto hace que el foco de la prueba de integración pase por verificar la interacción del código que está bajo nuestro control con código que no lo está. Un caso típico es cuando nuestra aplicación debe interactuar con una aplicación/servicio/api externo como ser una API REST desarrollada por otro equipo/organización. En este caso, no tiene ningun sentido utiliza mocks (dobles de prueba) porque justamente lo que quiero verificar es la interacción con ese sistema externo, entonces de nada sirve reemplazar ese sistema externo con un doble de prueba.

#DetrásDeEscena: Prácticas Técnicas para Scrum Masters

La semana pasada grabamos con mi colega Martín Alaimo una conversión «Detrás de Escena» sobre varios temas de «Agilidad Técnica» que son parte de mi Taller de Prácticas Técnicas para Scrum Masters.

Me resultó muy interesante la charla, Martín es un gran entrevistador, hablamos de varias cuestiones más allá de lo que sugiere el título.

Comparto aquí la grabación y aprovecho para mencionar que en noviembre estaré dictando una nueva edición de este taller enfocado en Scrum Masters y facilitadores de equipos que quieran profundizar en las cuestiones que mencioné en la charla la Martín.

Impresiones a mitad de cuatrimestre

Ya estamos promediando el cuatrimestre y tanto en la materia de fiuba como en la untref ya hicimos la retro de mitad de curso. Tengo la sensación que en ambos casos las materias vienen fluyendo muy bien. Digo esto en base a dos cuestiones: lo hablado en las retrospectivas y también el desempeño de los alumnos.

Un factor fundamental en esto creo que es el tamaño del curso. En ambos casos estamos hablando de cursos chicos lo cual nos permite hacer un seguimiento bastante personalizado de los alumnos: feedback constante y detallado.

Curiosamente, a diferencia de cuatrimestres anteriores, no hubo en las retrospectivas mención a la carga de trabajo ni a las tecnologías utilizadas. Hasta ahora era típico que los alumnos hicieran mención a utilizar otro stack de tecnologías y alguna «queja» a la carga de trabajo. Pero este cuatrimestre no ocurrió. Tal vez porque son dos cuestiones que explicamos bien explícitamente al comienzo de cada curso.

En el caso de fiuba hicimos 3 actividades en la retrospectiva. La primera un chequeo de «realidad vs. expectativas». Les pedimos a los alumnos que indicaran si lo que efectivamente encontraron en la materia era mejor, igual o peor de lo que esperaban inicialmente.

Luego, en la segunda actividad pedimos feedback sobre distintos aspectos de la materia.

Finalmente, en la tercera actividad, hicimos un clásico keep-fix-try donde obtuvimos feedback más específico.