Inteligencia Artificial en la Enseñanza de la Programación: nuestro estudio formal

Hasta el momento evité escribir sobre cuestiones de Inteligencia Artificial en parte porque me pareció que había demasiada gente hablando del tema, algunos incluso hablando con muchas imprecisiones (por no decir «tirando fruta») pero también porque yo mismo no quería tirar fruta. A pesar de estar trabajando profesionalmente en iniciativas de IA desde 2023 sentí que mi conocimiento era muy superficial.

Pero ya desde un tiempo la IA comenzó a meterse en mis cursos y eso nos obligó a tomar el tema. Es por eso que a comienzos de este año junto a Diego Marcet y Gonza Cozzi (miembros de mi equipo docente en UNTreF) nos pusimos a estudiar formalmente el tema. En concreto comenzamos estudiando el uso de la IA en la enseñanza de la programación. Hicimos una revisión de papers y encuestamos a docentes de programación. Esta iniciativa quedó plasmada en un artículo que enviamos al Simposio Argentino de Educación en Informática y que estaremos presentando en Agosto en el contexto de las Jornadas Argentinas de Informática.

Algunos de los hallazgos que hicimos fueron:

  • La mayoría de los docentes (~70 %) ya utiliza herramientas basadas en IA en sus tareas docentes.
  • Al mismo tiempo (más del 70 %), la gran mayoría cree que la incorporación de IA en sus cursos requiere de un cambio significativo en la forma en que dictan sus cursos.
  • Más del 90% de los encuestados reportaron que sus alumnos ya utilizan herramientas basadas en IA

Más allá de todo lo anterior, y que en un punto era esperable, lo que más nos llamó la atención fue la diferencia de opinión cuando preguntamos si consideraban positiva o negativa la irrupción de IA en la educación, el siguiente histograma muestra la consolidación de las respuestas.

Este artículo representa el primer paso de nuestra iniciativa de estudio del uso de la IA en la enseñanza. Nuestro siguiente paso es trabajar con practicantes, con lo cual si hay algún desarrollador leyendo esto y utilizando IA (co-pilot, cursor, etc) y le interesa participar de un estudio, no deje de contactarme.

Ingeniería de Software en la UBA

La UBA es una institución muy grande, tiene 13 facultades y más de 300 mil estudiantes. Los temas de Ingeniería de Software se estudian en más de una facultad.

Al mismo tiempo se da que la Ingeniería de Software es un cuerpo de conocimiento bastante amplio y diverso, incluye cuestiones de proceso y metodología como también cuestiones de arquitectura, programación y verificación. Y en los últimos años, algunos autores, también han incluido cuestiones de despliegue y operación.

Me animo a decir que la Facultad de Ingeniería (fiuba) es la facultad de la UBA que más cuestiones de Ingeniería de Software cubre. En fiuba hay temas de Ingeniería de Software que se ven en forma transversal a lo largo de distintas materias, cuestiones de programación, verificación, versionado, etc. Al mismo tiempo hay un núcleo de 3 materias específicas de Ingeniería de Software: Ingeniería de Software 1(IS1), Ingeniería de Software 2(IS2) y Gestión del Desarrollo de Sistemas Informáticos(GDS). Finalmente hay materias electivas enfocadas en áreas específicas de la Ingeniería de Software como ser Arquitectura de Software y Estándares de Calidad y Modelos de Referencia, entre otras. En lo personal creo que esta oferta da a los estudiantes una muy buena formación de cara a su ejercicio profesional como Ingenieros de Software. Quienes gusten curiosear pueden ver los contenidos mínimos de estas tres materias en el plan de estudios.

El reciente cambio en el plan de estudio de la carrera de Ingeniería Informática generó un reordenamiento de cursos que llevó varios cuatrimestre. Finalmente, este primer cuatrimestre de 2025, las materias del área de Ingeniería de Software quedaron organizadas en 8 cursos: 3 de IS1, 3 de GDS y 2 de IS2. A continuación resumo algunos datos de cada curso que pueden resultar útiles para futuros estudiantes.

Comparto también las páginas públicas de los cursos (no todos tienen):

Una particularidad interesante es que las 3 materias del núcleo de Ingeniería de Software apuntan a cubrir (en mayor o menor medida dependiendo del curso) todo el ciclo de desarrollo de software. En cierto modo, esto queda evidenciado en que en 7 de los 8 cursos hay que programar.
Destaco este hecho porque en algunas carreras/instituciones e incluso en las versiones anteriores de los planes de fiuba, cada materia cubría solo una etapa del ciclo de desarrollo, lo cual denotaba un enfoque «secuencial» bastante distintos del ejercicio de la profesión. En el enfoque actual, más punta a punta e iterativo, se abordan las distintas etapas reiteradamente en las distintas materias pero con distinto foco y nivel de profundidad.

Cierre de cuatrimestre 2025-1c @FIUBA

Se fue el primero de 2025 y no fue fácil. Los últimos cuatrimestres veníamos viendo una mejora en diversos aspectos que lamentablemente no continuaron este cuatrimestre.

Por un lado la evaluación del curso por parte de los alumnos fue peor que lo que venía siendo en los últimos cuatrimestres: veníamos alrededor de nueve y con una dispersión mínima (todas evaluaciones 8,9 y 10), ahora tuvimos un evaluación de 8 con mucha dispersión (4, 6, 7, 8, 9 y 10).

Al mismo tiempo el desempeño de los alumnos fue también «más bajo», la nota promedio de evaluación que había sido de 7,3 ahora fue 6,9.

No tenemos una explicación certera de esta situación pero hay ciertos hechos que pueden haber influido:

  • Tuvimos una cantidad record de alumnos
  • Uno de los ayudantes colaboradores abandonó a mitad del cuatrimestre y eso nos trajo ciertas complicaciones
  • El reciente cambio del plan de estudio produjo, entre otras cuestiones, cambios de correlatividades lo cual a su vez produjo cambios en el perfil de los alumnos.

Al margen de los fríos números, en las encuestas nos encontramos con comentarios diversos casi todos muy positivos:

  • «Excelente materia. Top materias que he cursado. He visto cosas que me sirvieron para reafirmar conceptos y que también me sirvieron en el ámbito laboral»
  • «La dinamica que proponen da un golpe de realidad y un efoque en la integracion de los temas ya vistos de la carrera que me parece muy valioso. Ademas, para mi, los temas que tratan son clave para diferenciarse dentro del ambito laboral»
  • «Muy buenas las clases presenciales, muy dinámicas y las actividades ayudaron a entender mejor los temas de una manera divertida.»
  • «Pagás deuda técnica de materias anteriores»

Por otro lado, en la retrospectiva surgieron cuestiones habituales: la carga de trabajo, uso de otro lenguaje, más presencialidad, menos presencialidad. Pero algo que destacó fueron un par de menciones referentes al feedback y las devoluciones/correcciones. Aunque suene curioso, este es uno de los puntos en los que se expresa la falta de presupuesto: cuando la cantidad de docentes es menor a la apropiada cada docente debe dedicar más tiempo, eso hace que las devoluciones sean menos profundas y cuidadas. Según pudimos hablarlo, algunos alumnos sintieron que el feedback tenía una «carga negativa», de hecho alguien dijo literalmente «feedback duro, no cándido». Frases del tipo «este código no pasa de algo1» o «no se cómo llegaron hasta acá» no serían raras en mí. Reconozco que no son frases alentadoras pero tampoco me parecen tan duras. Por momentos pienso que puede haber alguna cuestión generacional, en mi época de estudiante recuerdo profesores con comentarios bastante menos corteses y en general nadie hacía problema por ello. Pero los tiempos cambian y uno debe adaptarse, en ello vengo trabajando. Sin embargo me queda la duda si no vamos a terminar formando «ingenieros de cristal».

Anécdotas del aula: ¿»miedo» a los finales?

Luego de más de 20 años de docencia se me ocurrió empezar a compartir algunas de las situaciones «curiosas» que vivo con mis alumnos que me llevan (no siempre) a reflexionar, #anecdotasDelAula. Aquí va la primera.

Desde que empecé a tomar final oral en mi curso de Ingeniería de Software, los alumnos sugieren/piden recurrentemente que no tome final. La imagen que acompaña este post surgió en una actividad de cierre de curso que hice la semana pasada con mis alumnos de fiuba, no fue la única ni tampoco la primera.

No tengo claro si se debe a una situación de «molestia» pues en cierto modo implica estudiar un poco más o si adicionalmente hay cierto «miedo» a rendir oral.

En lo personal decidí tomar final oral principalmente por dos cuestiones. Por un lado para «forzar» a que los alumnos vean ciertas cuestiones/materiales de índole más conceptual/teórica que no ponemos en práctica durante el curso. Por otro lado creo que un ingeniero tiene que poder mantener una conversación técnica y explicar ciertos conceptos, justamente el final oral es una oportunidad para que los alumnos practiquen dicha habilidad. Adicionalmente a esto, creo que un examen oral es también una instancia de aprendizaje (o al menos eso lo que yo intento).

La dificultad del trabajo final de Ingeniería de Software 2 @fiuba

El trabajo final de la materia consiste en resolver una problemática de negocio a partir de la implementación de una solución basada en software. Hasta aquí puede sonar como tantos otros trabajos de una materia de una carrera de sistemas. Pero en nuestro caso hay un par de cuestione (que tal vez tampoco son tan novedosas) que a los alumnos les cuestan bastante.

La primera cuestión es que no hay «un enunciado» ni una lista de funcionalidades, hay un «cliente» (rol ocupado por uno de los miembros del equipo docente) con un problema de negocio, los alumnos deben relevar el problema y plantear un proyecto para solucionarlo. Son los alumnos los que tienen que identificar las funcionalidades, darles forma de stories validarlas con el cliente, diseñar, codear, testear e implementar. Parece una desafío usual en una carrera de sistemas pero a pesar de eso muchos alumnos no saben por dónde empezar. Incluso cuando se supone que en materias anteriores ya vieron técnicas para lidiar con relevamiento y modelado de dominio.

Otra cuestión es que el proyecto deben desarrollarlo en 3 semanas, con iteraciones semanales al estilo XP. Eso implica planificar el trabajo a alto nivel (release plan) y también semana a semana, ejecutar dando visibilidad en un esquema de entrega continua y al final de la semana revisar lo realizado tanto a nivel producto como a nivel proceso. Insistimos en que el trabajo sea time-boxed lo cual implica que en caso de retrasos negocien/gestionen alcance. No hay problema en que no logren completar el plan de la semana siempre y cuando lo gestionen. No puede ocurrir que prometan X y luego caigan sorpresivamente a la revisión con menos de X. Seguir este proceso les cuesta muchísimo, en parte porque no tienen práctica en planificación, es un tema que tal vez vieron en alguna materia anterior pero casi sin práctica. Lo otro que suele constarles mucho es la negociación/gestión del alcance. En general si planifican X, hacen lo imposible por cumplir con X cuando muchas veces sería mucho más conveniente gestionar un recorte de alcance o simplemente avisar el cliente que no llegarán a cumplir con el plan. Incluso en ocasiones dejan de lado las buenas prácticas (modularización, testing, convenciones, etc, etc) lo cual no hace más que aumentar/generar deuda técnica que deberán pagar en el corto plazo.

Una de las cuestiones más novedosas para los alumnos es tener que lidiar con dos ambientes cloud, uno de pruebas y otro de producción. Esto en general no lo han hecho en ninguna materia. Esto por momentos se convierte en un gran desafío cuando algo les funciona localmente pero no en los ambientes cloud. Si bien les damos la infraestructura pre-armada y acceso a un log centralizado, muchas olvidan escribir mensajes de log con cual es como si estuvieran a ciegas. Esta cuestión de «build for operations» es uno de los temas de la materia y no esperamos que traigan conocimientos previos.

Finalmente lo que más me llama la atención es cuando los alumnos no aplican los conceptos que hemos estudiado durante toda la materia. El trabajo final juega un rol de trabajo integrador, previo a eso los alumnos trabajan en tareas individuales donde ponen en práctica diversos conceptos. Luego en el trabajo final deben volver a aplicar los conceptos ya estudiados pero ahora en un problema más complejo y trabajando en grupo. Una y otra vez vemos grupos que parecen haberse olvidado por completo de todo lo estudiado.

Historia de dos presupuestos

En los últimos meses me contactaron para presupuestar dos proyectos en distintos contextos. Fueron dos casos radicalmente distintos a lo que suelen ser mis presupuestos.

En un caso el contacto llegó por medio de un colega que me recomendó. Resulta que la organización que me contacto estaba buscando una persona con perfil de «arquitecto» para trabajar en un proyecto de 3 meses que consistía en armar una especificación técnica/funcional para con eso salir a buscar un proveedor que se encargara de desarrollar un software acorde a la especificación. ¡Recorcholis! tres meses para armar una especificación y que luego otra organización construya acorde. Sinceramente me interesaba trabajar con la organización así que apenas terminaron de contarme la idea les dije: «no creo funcione» y a continuación les ofrecí mi ayuda para armar un plan con mejores probabilidades de éxito. Creo que no lo convencí pues no me han vuelto a llamar 🤷‍♂️.

El otro caso fue bastante distinto me contactaron unos colegas de confianza, con quienes ya he trabajado, para armar una propuesta para un servicio de mentoring/capacitación/acompañamiento. Si bien es el tipo de trabajo que realizo habitualmente en este caso la propuesta era para un trabajo de +4 meses. En general mis propuestas, al menos inicialmente, son bastante más acotadas, unas 10 o 20 horas y luego vamos viendo y extendiendo si resulta necesario. De todas formas, en este caso parece que la propuesta ya está en proceso de aprobación, en un par de semanas les cuento ✌️.

Estimación y Planificación en contextos de Entrega Continua

Cuando una organización y/o equipo pretende comenzar a trabajar en un esquema de entrega continua, se pone un esfuerzo casi exclusivo en cuestiones de automatización lo cual en muchos casos no resulta bien.

Trabajar en un esquema de entrega continua requiere automatización pero también algunas otras cuestiones que son incluso necesarias para poder automatizar. La automatización en un contexto de entrega continua incluye principalmente la automatización de pruebas y de despliegues. Ahora bien, para automatizar pruebas y despliegues es necesario tomar ciertas «precauciones» en términos de arquitectura y diseño. Pero eso no es todo, si queremos trabajar en un esquema de entrega continua, entonces nuestro trabajo de planificación debe estar en línea con ello.

Es muy difícil (por no decir imposible) trabajar en un esquema de entrega continua si cada story/funcionalidad lleva semanas de desarrollo. Es clave que podamos particionar las stories/funcionalidades de forma tal de poder completarlas en un par días. Al mismo tiempo, la entrega continua implica, como su nombre lo indica, entregar continuamente, o sea: (casi) todos los días. Si cada story/funcionalidad lleva semanas, entonces es posible que nuestras entregas sean cada un par de semanas. En cierto modo es como un efecto en cadena: cuando más grandes las stories, más tiempo insume su desarrollo y más tiempo insume su pruebas y más tiempo insume su despliegue y más riesgos enfrentamos, etc, etc.

Desde otras perspectiva, ocurre que cuanto más diferimos la entrega, mayor relevancia toman nuestras estimaciones. Si hacemos esperar a nuestros usuarios/clientes, aumentamos su «ansiedad» y su necesidad de saber cuanto más tendrán que esperar.

Por otro lado, si trabajamos en pequeños incrementos habilitamos la entrega más rápida y continua, lo cual nos saca presión de estimación. Al mismo tiempo, las técnicas y dinámicas de estimación no son precisamente las mismas de cuando pretendemos hacer entregas frecuentes/continuas que cuando apuntamos a entregas esporádicas a mediano y largo plazo.

En línea con todo esto, estoy armando un taller muy práctico sobre diversas técnicas para estimar y planificar en contextos de Entrega Continua. Aún no tengo fecha, pero los potenciales interesados pueden escribirme para que los mantenga al tanto.

Libro Recomendado: Getting Real

Hace un par de días que terminé de leer Getting Real. Me parece que no es un libro demasiado conocido a pesar de tener casi 20 años. Yo lo tenía en mi lista de pendientes desde hace un tiempo porque uno de sus autores es David Heinemeier Hansson (conocido como «DHH», creador de Ruby on Rails).

La lectura me resultó muy amena, en parte por sus capítulos cortos (1 o 2 páginas) y en parte por ser contenido muy práctico: en cierto modo cada capítulo es un consejo sobre algún tema concreto sobre el desarrollo de productos web.

Creo que este libro es una lectura obligatoria para todo aquel que pretenda crear productos online/digitales.

Debo admitir que no estoy de acuerdo con todo lo que dice pero sí estoy totalmente de acuerdo con la mayoría de las cuestiones que plantea.

Es importante destacar que varias de las cuestiones que proponen los autores son, a mi parecer», de aplicación «universal» pero algunas otras claramente aplican puntualmente a escenarios de «startups».

Libro recomendado: Joy of Agility, how to solve problems and succeed sooner

Compré este libro pura y exclusivamente por el autor: Joshua Kerievsky. Su libro «Refactoring to Patterns» me resultó excelente. Luego tuve la oportunidad de conocerlo personalmente allá por 2009 y desde entonces lo sigo. En general coincido con las ideas que comparte y por eso cuando vi este nuevo libro, «Joy of Agility», no dude en comprarlo.

Lo empecé a leer e inicialmente pensé que no me gustaría. Me parecía que era como muy filosófico, poco práctico, medio humo. Pero a pesar de esa sensación inicial seguí leyendo.

Lo terminé de leer hace unos días y debo decir que me gustó. Algo que me ayudó mucho a la lectura es que los capítulos son cortos, apenas dos páginas en muchos casos.

En cierto modo el libro es como un compendio de «anécdotas con moraleja». Cada capítulo cuenta una de estas anécdotas y termina con una moraleja/consejo que obviamente está relacionada a la agilidad.

Las anécdotas me resultaron muy entretenidas y muchas de ellas también muy útiles y de aplicación directa a mis tareas cotidianas.

Ojo, no es un para todo el mundo, si esperas ver código y demás nerdeadas, no es por acá. Pero si te consideras: agilista, coach, facilitador, agente de cambio o similar, entonces no dejes de leerlo.

Nuevo Stream de Desarrollo de Software

Con los miembros del equipo de la materia de Ingeniería de Software de UNTreF, Diego Marcet y Gonzalo Cozzi, decidimos hacer un experimento: un stream.

Vamos reunirnos una vez por semana a desarrollar una aplicación de punta a punta aplicando las prácticas de desarrollo que habitualmente enseñamos en nuestra materia y lo vamos a hacer mientras los transmitimos por YouTube. La idea no es solo mostrar código sino también tener las discusiones/decisiones que típicamente surgen en cualquier equipo de desarrollo.

En principio vamos a hacer una transmisión por semana por YouTube, los días miércoles en el horario de 19:00 a 21:00 (hora argentina, GMT-3) comenzando la semana próxima, el miércoles 26 de marzo.

Hablaremos (e implementaremos) de BDD, TDD, Integración Continua, Trunk-Based Development, Pair-Programming, Feature Flags, Infra as Code, Continuous Delivery, DevOps, Patrones, Arquitectura, Calidad y mucho más.

Los interesados nos vemos aquí en el miércoles próximo, pasen y vean.