City Building Game @ UNTreF

El martes pasado en mi curso de Ingeniería de Software hicimos este juego como actividad para poner en práctica un proceso «Scrum-like». Este juego fue diseñado por mis colegas Alejandra Alfonso y Emilio Gutter.

En general veníamos usando el juego del Pajarraco Scrumero porque teníamos grupos chicos (no más de 10 alumnos), pero este cuatrimestre tenemos 30 alumnos y nos pareció que el City Building escalaba mejor que el Pajarraco. Y creo que no nos equivocamos. Si bien en alguna conferencia hemos hecho el Pajarraco con unas ~80 personas, en ese caso contábamos con muchos materiales y varios facilitadores. El Pajarraco requiere de materiales muy específicos (ladrillitos tipo Rasti) mientras que el City Building básicamente requiere de elementos de librería (tijeras, papel y pegamento) que son más fáciles de conseguir.

Lamentablemente Emilio y Alejandra no hay publicado el juego aún. Sin embargo cuando le comenté a Emilio que estaba escribiendo este post, me prometió en breve publicar todos los detalles del juego, así que los interesados pueden contactarlo directamente a él.

Cierro con algunas modificaciones que hicimos al guión original del juego:

  1. Descartamos el papel glase, lo reemplazamos por papeles de colores (tipo los de taquitos de oficina), hojas blancas y lápices.
  2. De la mano de lo anterior agregamos un nuevo rol a los equipos: el pintor.
  3. Solo 4 minutos de iteración nos pareció muy poco, creemos que sería mejor hacer iteraciones de 5 o 6 minutos.
  4. Redujimos el número de tijeras por equipo, creemos que salvo el cortador de círculos, los otros cortadores se pueden arreglar para cortar «a mano».

Sobre el ascenso y la caída de Agile, una opinión más

Me acerqué a agile allá por 2003. A diferencia de mucha otra gente, no me acerqué via Scrum sino via XP. Comencé a aplicarlo en proyectos hacia 2005. Pero no fue hasta 2008 que empecé a ver crecer el movimiento más allá de mi entorno. Conferencias, Meet-ups, Cursos, Certificaciones y oportunidades laborales.

Eso llamado «Agile» parecía funcionar, generaba interés, gente y empresas con ganas de «comprar». Una demanda creciente, una oportunidad de negocio. Un negocio. Y la demanda de agile no paraba de crecer. Y creció en diversas dimensiones. Por un lado agile traspasó las áreas de IT (donde inicialmente había surgido) y por otro lado gente de otras disciplinas se metió en IT. Agile coaches y Scrum Masters eran demandados por todos lados. Con esa demanda también florecieron aquellos vendiendo formación de Agile coaches y Scrum Masters. Alguno estuvieron mucho más preocupados por la venta que por la formación. Y Agile coaches y Scrum Master comenzaron a aparecer por todos lados. El agile industrial complex (Martin Fowler dixit)en su máxima expresión. Un fenómeno del cual fui (¿soy?) parte.

En un momento la torta comenzó a escasear, la tortilla se dió vuelta. Agile comenzó a perder credibilidad, a ser «mala palabra» para algunos y «puro cuento» para otros. Y los puestos de Agile Coaches y Scrum Master quedaron el ojo de la tormenta. Alguien le llamó «la crisis de la agilidad».

No sé en qué va a terminar esto, solo puedo decir que de los 3 equipos con los que trabajé en lo que va del año, el que mejor desempeño tiene es precisamente el que no tiene una persona exclusiva en el rol de scrum-master/coach 🤷‍♂️

FIUBA: un graduado aportando valor a la sociedad

Hace unas semanas completó su trabajo final de carrera, el ahora Licenciado en Sistemas, Joaquin Casal. Tuve el honor de ser tu tutor a lo largo del desarrollo de su trabajo. Conozco a Joaquín desde hace varios años, fue alumno de MeMo2 y luego de completar la materia se sumó al equipo docente.

El objetivo del trabajo de Joaquín fue desarrollar una aplicación para la fundación Hemocentro. El trabajo fue un desarrollo punta a punta en el sentido de que incluyó desde el análisis hasta la construcción y puesta en producción.

En lo personal estoy muy conforme contento y conforme con el trabajo realizado por Joaquín, ha sido un honor poder colaborar con él. La aplicación desarrollada quedó funcionando operativamente, resolviendo un problema de una organización concreta y ejecutándose en la plataforma Azure.

Para quienes que quieran darle una mirada todo el proyecto está disponible bajo licencia de código abierto en Github.

El trabajo final de carrera suele ser un desafío para los alumnos. De hecho resulta curioso que muchas veces el desafío pasa más por encontrar el tema más que por llevarlo adelante. En ocasiones los alumnos terminan haciendo un desarrollo, que al igual que suele ocurrir con cualquier TP, sirve para aprobar pero luego no tiene ningún uso ni impacto, no agrega valor a nadie. Es por ello quiero que destacar el trabajo realizado por Joaquín porque más allá de haberse recibido, implementó una solución que agregar valor a una organización de la sociedad civil. ¡Felicitaciones Joaco!

Cierro con algunos números del trabajo:

  • Horas trabajadas: 260
  • Duración calendario: 8 meses
  • Cantidad de iteraciones/semanas: 33
  • Cantidad de historias de usuario resueltas: 86
  • Cantidad de tests automatizados: 422
  • Cobertura: 90%

Foto realizada al final de la presentación del trabajo: Joaquín, yo y las usuarias (Natalia y Paula).

Diplomatura en Ingeniería de Software Continua: charla informativa 2024-2

Ya está abierta la inscripción para la Diplomatura en Ingeniería de Software Continua que dictamos en UNtreF junto a Diego Fontdevila, Carlos Fontela, Andrés Diaz Pace, Diego Marcet y Federico Casuscelli.

En estos días estamos completando la primera cohorte de graduados (nos falta cerrar notas de una de las materias) pero al margen de ese detalle ya hemos tenido muy buen feedback de los estudiantes y estamos trabajando en algunas mejoras de cara a la nueva cohorte que comenzará en septiembre.

Como de costumbre vamos a hacer una charla informativa para contar sobre los contenidos, forma de cursada, etc y atender consultas de los potenciales alumnos. Dicha charla será este miércoles 31 de Julio a las 9:30 hs hora argentina (aclaro que es hora argentina por que al ser una carrera 100% online ya nos ha pasado de tener estudiantes de diversos paises).

Los interesados en participar de la charla informativa pueden completar este formulario y les enviaremos el link de acceso.

La materia faltante en la universidad

Una problemática cotidiana de los sistemas de software es el mantenimiento y evolución de los mismos. Es común encontrar en los planes de estudio diversas técnicas para aplicar durante el desarrollo inicial del software de cara a facilitar su futuro mantenimiento y evolución.

Pero es poco habitual para los estudiantes tener que lidiar con el mantenimiento y evolución de código existente. Más aún, es poco habitual que los alumnos tengan que trabajar con código ajeno. No me refiero a tener que utilizar componentes desarrollados por otros sino a tener que modificar código escrito por otros.

Las técnicas para mantener y evolucionar código ajeno no son necesariamente las mismas que las que se utilizan para facilitar el futuro mantenimiento y evolución. Más aún, esas técnicas son tanto de índole técnico como también de índole de gestión.

Algunas de estas cuestiones intentamos cubrir en MeMo2@fiuba. Justamente cada vez que doy estos temas vuelvo sobre esta idea de tener una materia exclusivamente centrada en «código legacy».

Al mismo tiempo creo que estudiar estas técnicas requiere de aplicación práctica, no basta con estudiarlas teóricamente. Esto es lo que me lleva a pensar que es necesario una materia para lidiar con esta problemática.

No estoy seguro que sea una materia para estudiar en un carrera de grado, por el simple hecho de que me parece necesario que antes de abordar estos temas, los estudiantes dominen cuestiones Ingeniería de Software y también (sobre todo) tengan cierta experiencia de aplicación en «mundo real».

Cierre de cuatrimestre 2024-1 en MeMo2@fiuba

Terminó el cuatrimestre y es tiempo de análisis. Fue un cuatrimestre un poco más intenso que lo habitual, en parte por la cantidad de alumnos (tuvimos el doble de alumnos que el cuatrimestre anterior) y en parte por el perfil de los alumnos (distinto al habitual).

Comenzamos el cuatrimestre con 24 alumnos, 3 de los cuales abandonaron antes de la semana 7. Al momento de comenzar el TP2 tuvimos una baja más. De los 20 alumnos que comenzaron el TP2, 18 aprobaron la cursada de la materia.

Tuvimos 38 tareas individuales que incluyeron:

  • 7 cuestionarios
  • 8 ejercicios de programación
  • 12 videos
  • 9 lecturas
  • 2 tareas nivelación / setup

Usamos la misma infraestructura que el cuatrimestre pasado, varios servicios de suscripción gratuita/académica (gitlab, render, neon, etc) y pagamos por algunos otros, concretamente invertimos unos 40 dólares en un pequeño cluster de Kubernetes en Digital Ocean.

Si bien aún no hicimos la retrospectiva del equipo docente, creo que en general estamos conformes con el resultado. También creo que el cambio del perfil de los alumnos va a requerir algunos cambios en la materia, principalmente dedicar un más tiempo a algunos temas (modelado y arquitectura) y generar nuevos materiales de estudio.

Comparto algunos números de la encuesta de cierre de la materia:

  • La encuesta fue contestada por 17 alumnos (sobre 20 que completaron el curso)
  • La evaluación general de la materia en promedio dio 9.0 (igual que el cuatrimestre anterior)
  • Respecto del porcentaje de clases presenciales/virtuales, 14 alumnos lo consideraron apropiado mientras que 2 alumnos hubieran preferido más presencialidad y 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/5.
  • La dedicación semanal a la materia extra-clase dio un promedio de 8,9 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 70 (esta es una métrica que puede tomar valores en el rango -100 +100)

Algunos otros puntos para destacar de este cuatrimestre:

  • Creo que logramos mantener la dinámica y calidad del curso a pesar del incremento de la cantidad de alumnos y su cambio de perfil.
  • Tuvimos muy buen feedback de las clases presenciales.
  • En el feedback libre de la encuesta de cierre un alumno escribió: «La materia es interesante, le da un enfoque serio a algo que durante la carrera había considerado chamuyo/humo.«

Desafíos y recomendaciones para la enseñanza de TDD

Recientemente nos notificaron de la aceptación de este artículo para ser presentado en el track de educación de la conferencia CLEI 2024.

Este artículo es resultado de un trabajo de investigación de varios meses. El mismo consistió en entrevistar diversos expertos, docentes y entrenadores de TDD para entender los principales desafíos y recomendaciones para su enseñanza. Una vez realizadas las entrevistas aplicamos una técnica llamada análisis temático para extraer, analizar y sumarizar lo dicho por los entrevistados.

Los 3 desafios más mencionados fueron:

  • La falta de conocimiento previo (por ejemplo separación de incumbencias)
  • La dificultad para hacer el cambio de mindset (test last -> test first)
  • La complejidad técnica (por ejemplo al tener que lidiar la UI)

Al mismo tiempo las 3 recomendaciones más importantes fueron:

  • Que los estudiantes hagan mucha práctica
  • Que el docente/entrenador sea un practicante
  • Explicar los beneficios

Más allá de los 6 puntos mencionados, el trabajo de investigación nos dejó varias cuestiones para profundizar. Entre ellas un punto que en un punto puede resultar llamativo: el lenguaje de programación utilizado para enseñar no parecer ser una cuestión relevante. Al mismo tiempo más de un entrevistado hizo referencia al uso de Gherkin.

Si alguien está interesado en leer el artículo completo puede contactarme aquí.

¿Diseño decente?

Hacer un buen diseño no es trivial, más aún: tampoco es trivial decir si un diseño es bueno. ¿Qué es un buen diseño? Alguien podría decir que un buen diseño es un diseño «escalable», pero que pasa si la escalabilidad no es uno de lo requisitos del problema. Creo que muchas veces se persiguen propiedades sin considerar las necesidades. En este sentido creo que una primera propiedad de un buen diseño es que resuelva el problema en cuestión.En línea con esto podríamos decir que un «mal diseño» es uno que no resuelve el problema en cuestión.

Mmmm, esto tampoco cierra. «Diseño bueno» o «diseño malo», no creo que sea una cuestión tan binaria: «bueno o malo». Pero si creo que la evaluación del diseño debe ser en función del problema que queremos resolver. Intento resaltar esto con un ejemplo concreto: puedo hacer un diseño super purista, que cumple con N propiedades, pero luego resulta no factible de ser implementado :-(. Entonces un diseño que no se implementa ya perdió. Nota al margen: creo que esto refleja la diferencia entre «la ciencia teórica» y la ingeniería.

Típicamente los problemas que tenemos que resolver tienen múltiples dimensiones representadas por: a) funcionalidades, el qué, lo que software debe hacer y 2) propiedades, atributos de calidad, el cómo, que influyen en el cómo resolvemos el problema, o sea: lo revolvemos de una forma que resulta mantenible, extensible, performante, etc, etc. A partir de esto creo que no es conveniente una evaluación «binaria» (bueno/malo), sino es que es mejor hablar en un continuo, una gama de grises entre el bueno y el malo.

Es en este grupo de propiedades que definen la solución hay una que destaca por ser de presencia «universal», o sea, que en general es requerida en toda solución: la mantenibilidad. Raro son los casos en los que resolvemos una problema de una y nunca más tenemos que tocar su código. En general nos aproximamos a la solución en forma iterativa y eso no lleva a volver una y otra vez sobre el código previamente escrito. Es ahí donde la mantenibilidad tiene un impacto decisivo en el costo (y los riesgos) de trabajar sobre código previamente escrito. Desde mi perspectiva la mantenibilidad implica: que el código sea legible, fácil de entender, que sea testeable (y que tenga pruebas), que revele su intención, que esté documentado, etc, etc.

Aquí es donde entra mi idea de «diseño decente», es un diseño que puede tener algunos puntos flojos pero que resuelve la dimensión funcional del problema y respeta ciertas premisas de mantenibilidad y testeabilidad de forma tal que nos lleva a generar una implementación que concretamente:

  1. Respeta las convenciones del lenguaje de programación (fácilmente verificable con un linter)
  2. Mantiene una clara separación entre el código de la lógica «de negocio» y el código de entrada/salida (infraestructura)
  3. Tiene pruebas automatizadas

Traigo esta idea de «diseño decente» porque es justamente lo que intento enseñar a mis alumnos.

Y un día un alumno uso ChatGPT y desaprobó

Ya desde el año pasado empecé a encontrarme con alumnos usando ChatGPT para resolver ciertas cuestiones de las materias que curso. Las situaciones que he visto son diversas.

En algunos casos alumnos ha usado chatGPT para resolver problemas técnicos (hacer troubleshooting), en algunos otros para resolver cuestiones de algoritmia y en otros para contestar preguntas teóricas. Asimismo en algunos casos los propios alumnos lo han dicho mientras que en otros casos lo descubrió algún miembro del equipo docente. En todos estos casos no tuvimos inconvenientes.

Pero esta semana nos encontramos con una nueva situación. Dimos a los alumnos un cuestionario online sobre un tema que veníamos trabajando desde hace varias semanas. Los alumnos tuvieron material de lectura, videos, actividades en clase y también oportunidades de aplicación en un TP. Luego de todo esto les dimos el cuestionario que tenia preguntas de tipo selección múltiple y también preguntas a desarrollar. Fue precisamente en estas preguntas de desarrollo donde encontramos respuestas distintas a lo esperado. Hablando con el grupo docente sobre esta situación, un docente descubrió que la respuesta había sido generada por ChatGPT. El alumno resultó desaprobado, pero no por haber usado ChatGPT sino por haber dado una respuesta incorrecta.

Esto me llevó a reflexionar de cara a aclarar algunas ideas pues el uso de herramientas de Inteligencia Artificial será cada vez más común y me parece importante sentar posición y dar visibilidad a los alumnos. Sinceramente no veo problema en que los alumnos usen ChatGTP (o herramientas por el estilo) ya sea para mejorar la redacción, resolver problemas técnicos o incluso contestar preguntas teóricas. La cuestión será, como casi siempre, ser criterioso. No tomar como infalibles las respuestas obtenidas, analizarlas críticamente y verificar su corrección. Adicionalmente la «calidad» de las respuesta obtenidas dependerá en gran medida de que las preguntas sean las apropiadas, con lo cual quienes quieran utilizar estas herramientas tendrán que aprender a utilizarlas con cierta «destreza».

Cambios en el perfil de alumnos de MeMo2 @ FIUBA

En MeMo2@fiuba comenzamos la primera clase con 24 alumnos, al poco tiempo solo teníamos 22 y en este momento tenemos 21. Una curiosidad de este cuatrimestre es que nos ha cambiado de forma sensible el perfil de los alumnos:

  • Tradicionalmente la mayoría de los alumnos que llegaba a la materia tenia un promedio de edad de 25 años pero este cuatrimestre el promedio de edad es 23 años.
  • Al mismo tiempo vemos un cambio en la condición laboral de los alumnos, históricamente la mitad de los alumnos llegaba con alguna experiencia laboral en sistemas (en 2019 el 70% de los alumnos ya estaba trabajando en la actividad, mientras que en 2021 ese número fue de 76%). Este cuatrimestre el 83% de los alumnos no tiene experiencia laboral en sistemas.

Estas dos cuestiones impactan diversos aspectos del curso: los alumnos al ser más jóvenes tienen menos «maduración» de la vida universitaria lo cual a su vez impacta en sus hábitos de organización y estudio. Al mismo tiempo al tener menos experiencia laboral, se encuentran menos «duchos» en cuestiones de programación y sobre todo en cuestiones de troubleshooting. Estas cuestiones las confirmamos en las métricas del curso: por un lado vemos que la resolución de los ejercicios de programación les lleva más de lo habitual (saben concretamente cuanto les lleva pues les pedimos que lo reporten al completar las tareas) y al mismo tiempo vemos que el desempeño es inferior (lo cual se refleja en las calificaciones). Para equipo docente esto impacta en que aumenta la cantidad de alumnos que se inscriben en curso y al mismo tiempo aumenta el esfuerzo que los docentes deben dedicar, no solo porque hay más alumnos sino porque esos alumnos requieren más atención/asistencia/seguimiento.

Este cambio en el perfil de alumnos creemos que se debe principalmente a dos cuestiones:

  • Por un lado, el horario de cursada: el año pasado cambiamos el horario del curso, veníamos dictando el curso durante la tarde/noche (de 19 a 22) y pasamos a la mañana (de 8 a 11)
  • Por otro lado, el cambio de plan de estudio: en el nuevo plan de ingeniería informática la materia se mantiene en el octavo cuatrimestre pero requiere de una combinación distinta de correlatividades que a mi parecer es más flexible.

La cuestión es que el perfil de alumnos cambió y eso nos está llevando a hacer algunos ajustes en la dinámica del curso.

PD: he estado ausente de este espacio por tiempo record. Pasé de publicar 1 o 2 artículos por semanas a no publicar nada durante 6 semanas. Resulta que comenzó el cuatrimestre y las dos materias que tengo a mi cargo sumadas a un cliente de mi actividad privada, redujeron mucho mi tiempo disponible para escribir. En fin, I ‘am back.