¿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.