Alternativa a Heroku: fly.io

Hace un tiempo escribí sobre Render como alternativa a Heroku. Luego de eso mi colega LucasM me recomendó probar fly.io y así lo hice.

Me gustó. Aún no termino de entender completamente cómo funcionan algunas cuestiones, lo pude hacer andar. No es que me funciona de casualidad, lo hice andar tal como indica la documentación, pero por esa «manía de control», hay algunas cuestiones «internas y/o de bajo nivel» que quisiera entender mejor.

Una condición importante que teníamos al buscar alternativas a Heroku era que la plataforma ofreciera una opción gratuita sin necesidad de poner una tarjeta de crédito. Fly.oi cumple con esto, pero hay una pequeña «trampita»: hay que crear la cuenta de fly.io asociándola a GitHub. Según entiendo esto es porque fly.io busca verificar la identidad del usuario y eso lo hace a partir de la tarjeta de crédito o bien confiando en Github. Así que si no quieren poner una tarjeta de crédito, asegurense de crear su cuenta de fly.io a partir de su cuenta de GitHub (ver imagen adjunta).

La experiencia de usuario que provee fly.io es muy similar a la de Heroku: se crea una aplicación, se la conecta con un repo y listo. No exploré si es posible disparar automáticamente un deploy ante cada commit porque no es nuestro caso de uso. Lo que hacemos es disparamos los deploy explícitamente usando la herramienta de línea de comando de fly.

Hasta donde investigué la plataforma termina corriendo un contenedor docker: si el repositorio de código fuente es de algunos de los frameworks soportados (rails, django, etc), fly genera un Dockerfile automáticamente y buildea la imagen al momento del deploy. También es posible proveer un Dockerfile propio que fly se encargará de builder, lo cual da la posibilidad de ir más allá de los frameworks/lenguajes soportados nativamente. Finalmente también es posible proveer una imagen ya buildeada.

La plataforma también provee servicio storage (basado en PostgreSQL y Redis entre otros) y la posibilidad de usar custom domains incluso en la modalidad gratuita.

A probarlo.

MeMo2: clases por la mañana

Desde un inicio las clases de MeMo2 las veníamos dictando en el horario de 19:00 a 22:00, pero este primer cuatrimestre de 2023 vamos a cambiar de horario de las clases, serán de 8:00 a 11:00 de la mañana.

Hace ya un tiempo que yo venía pensando en dar las clases por la mañana a modo de experimento para ver si lográbamos una mejor dinámica, ocurre que muchas veces a las 19:00 los alumnos (y también los docentes) llegan cansados, después de trabajar o de haber realizado otras actividades, lo cual impacta negativamente en el nivel de atención y participación en clase. Tengo la creencia que dando la clase por la mañana, todos estaremos más fresco y la clases tendrán un mejor flujo.

A esta idea que yo ya venía barajando se sumo una situación de fuerza mayor nos impide seguir con el horario habitual en este primer cuatrimestre de 2023 y eso resultó en el empujoncito que necesitábamos para finalmente concretar el experimento de las clases matutinas.

Para despejar las dudas que puedan tener potenciales, este viernes 24 a las 8:30 haremos un Meet explicando la dinámica de cursada (presencialidad, asistencia, dedicación, etc, etc).

Los interesados en participar, deben completar este formulario, para que les enviemos el link de acceso al Meet.

Alternativa a Heroku: Render

A fines de 2022 Heroku cambió su modelo de suscripciones y descontinuó su oferta gratuita que muchos veníamos utilizando. Yo tenia alguna que otra aplicación de juguete pero principalmente venia utilizando Heroku en mis materias para que los alumnos puedan desplegar las aplicaciones que construyen durante la cursada. Si bien es cierto que con estos planes Heroku incluye una oferta para estudiantes la misma no se ajusta a nuestras restricciones pues exige una tarjeta de crédito para poder acceder a la oferta.

Este cambio de Heroku nos obligó a buscar alternativas considerando nuestras restricciones:

  • La plataforma/servicio debe ser gratuito y adicionalmente no debe pedir tarjeta de crédito (hay varias plataformas que a pesar de ofrecer opciones gratuitas piden igualmente una tarjeta de crédito para hacer una validación del usuario)
  • Debe soportar nuestro stack tecnológico, básicamente necesitamos poder correr una aplicación web construida en Ruby y con una base de datos PostgreSQL.

Estas restricciones nos obligaron a descartar algunas opciones interesantes como Vercel (no soporta nuestro stack).

Finalmente hemos decido utilizar Render que cumple con nuestras restricciones y que de acuerdo a la pruebas que hicimos parece que se ajusta bien a nuestras necesidades funcionales.

Mi colega Hérnan hizo un video orientativo para nuestros alumnos mostrando como desplegar en Render una aplicación web Ruby+PostgreSQL.

Nueva materia: Ingeniería de Software Continua

Durante el primer cuatrimestre de este 2023 estaré dictando esta materia en calidad de Profesor Invitado en la carrera de Ciencias de la Computación en la Facultad de Ciencias Exactas y Naturales de la UBA.

La materia será una variante reducida MeMo2 con algunos agregados. Será reducida porque las materias dictadas en esta modalidad tiene una duración de medio cuatrimestre (8 semanas).

El temario tentativo es:

  • Ingeniería de Software Continua: fundamentos.
  • Principios Lean & El movimiento DevOps.
  • Flujos de valor en el proceso de entrega de software.
  • Tipos y Estrategias de testing.
  • Software Configuration Management de segunda generación.
  • Desarrollo guiado por pruebas de aceptación.
  • Integración, Entrega y Despliegue continuos.
  • Delivery Pipelines & Estrategias de despliegue.
  • Gestión de Ambientes.
  • Modelos de infraestructura & Infraestructura como Código.
  • Roles y Modelo de Equipo.
  • Técnicas de trabajo colaborativo.
  • Gestión del proyectos vs. Gestión de Producto.
  • Operaciones y el enfoque SRE.

Digo tentativo porque aún me falta terminar de bajarlo a detalle de implementación y es posible que no llegue a cubrir la totalidad. de los puntos.

En términos de dinámica de cursada mi idea es utilizar la misma que en MeMo2 lo cual implica:

  • cursada híbrida (algunas clases presenciales y otras clases virtuales).
  • un enfoque muy «hands-on»
  • una carga de trabajo extra-clase de unas 6 horas semanales a lo largo de todo el curso.
  • stack tecnológico basado en Ruby, GitLab y Kubernetes
  • herramientas colaborativas para soporte de la cursada: GoogleGroups, CanvasLms, Discord y Google Meet

Dado el alto grado de interacción con los estudiantes, la materia está planteada con un cupo de 16 vacantes.

A comienzos de marzo tengo una reunión con personal de la facultad donde espero tener más «detalles de implementación».

Pensamiento final: mientras escribo estas línea se me ocurre que esta materia podría dictarla como materia optativa en otra institución o incluso como un curso privado, si llega a haber algún interesado no dude en contactarme.

Libro: Código Sostenible

Hace un par de días terminé de leer este libro escrito por Carlos Blé. Me pareció muy bueno y me gustó mucho.

El libro es un muy buen compendio de buenas prácticas de programación y diseño. Reúne temas ya tratados en otras publicaciones y agrega temas que personalmente nunca había visto en un libro. En cada tema, más allá de la explicación y algún ejemplo, se suma la opinión de Carlos, siempre pragmática, constructiva y basada en la experiencia.

El libro está escrito en castellano, lo cual también suma puntos, ya que no tengo presente otros libros de esta temática escritos en castellano. Un punto a mi parecer negativo es que los ejemplos de código están en inglés, lo cual me resultó molesto por tener que cambiar de idioma entre el código y la prosa, pero es un tema menor.

Varios de los temas que cubre el libro son temas de MeMo2, o mejor dicho, son temas que nos gustaría que los alumnos de MeMo2 ya tengan asimilados. Lamentablemente no siempre los tienen asimilados y por ello nos vendría muy bien contar con este libro como recurso de estudio. La editorial del libro (Savvily) tiene un acuerdo para que los estudiantes puedan acceder gratuitamente a sus libros, pero dada la burocracia de UBA, veo muy difícil que se logre firmar el acuerdo. De todas formas, no pierdo la esperanza.

Al igual que Code Complete y The Pragmatic Programmer, este libro tiene contenido que todo programador debería conocer.

Agradezco a Carlos por haber escrito este libro pues lo considero un gran aporte a la comunidad IT de habla castellana.

Cierre de cuatrimestre 2022-2 en MeMo2@fiuba

Bien. Muy bien. Mucho mejor de lo esperado. En la previa teníamos record de inscriptos y el desafió de un cambio importante en el equipo: la salida de EmilioG (que teniendo un cargo de ayudante hacía la veces de JTP) y varios colaboradores. Motivados por estas dos cuestiones y el feedback de los alumnos de cuatrimestres anteriores decidimos realizar algunos cambios en la materia (algo ya había adelanto yo en este otro post)

En resumidas cuentas los cambios más relevantes que implementamos fueron:

  • La primera parte de la materia fue principalmente presencial mientras que la segunda parte fue principalmente virtual. Esto permitió que los alumnos se conozcan cara a cara para formar los equipos de trabajo y luego con los equipos ya armados pasamos a modalidad virtual.
  • Bajamos prioridad a algunos temas para dar más profundidad a otros. En este sentido despriorizamos cuestiones como escalamiento de equipo y principios Lean (cuestiones que verán posiblemente en AdminProd y/o EvaPro) y arquitectura de software (hay una materia entera dedicada a ello). Al mismo tiempo pusimos más foco en el proceso de BDD/TDD/CI/CD y «programación colectiva» (pair-mob programming).
  • También agregamos un ejercicio para trabajar de a pares antes de la conformación de los equipos de proyecto
  • Empezamos a tomar examen final, hasta el momento el mecanismo de evaluación estaba basado exclusivamente en el desempeño de los alumnos en las tareas realizadas durante la cursada (incluyendo tareas individuales y grupales). Pero en los últimos años tuvimos algunos casos en los que en verdad dudamos que algunos alumnos realmente hubieran entendido ciertos conceptos. Para mitigar/minimizar estas situaciones (gente que apruebe la materia sin tener en claro algunos conceptos importantes) es que agregamos el examen final

En lo personal quedé muy conforme con la forma de fluir de la materia. Desde la coordinación de la materia todo resultó muy fluido, no fue necesario «correr» con ningún tema. Preparamos las clases y las consignas con suficiente antelación y no tuvimos la soga al cuello con ninguna corrección. Al mismo tiempo creo que encontramos un mix justo de presencialidad/virtualidad.

El feedback de los alumnos también fue muy positivo, tanto en las retrospectiva como en la encuesta final del curso. No hubo tantos reclamos respecto de la carga de trabajo de la materia, si bien fue un tema mencionado, fue mucho más discreto que en ocasiones previas. Con la encuesta de la materia se dieron algunas situaciones particulares:

  • La encuesta fue contestada por 23 de los 24 alumnos que completaron la materia (record)
  • La evaluación general de la materia (en promedio) dio: 9,1 lo cual iguala el máximo histórico de la materia pero con una particularidad adicional: un desvío mínimo, todas las evaluaciones fueron 8, 9 y 10, o sea que nadie calificó la materia con menos de 8.
  • Las otras dimensiones de evaluación de la materia también resultaron muy positivas (algunas incluso con valores record): claridad de los docentes: 4,7/5; Conocimientos de los docentes: 4,9 /5; Dinámica de las clase: 4,7/5; Materiales de estudio: 4,4/5.
  • El NPS, que anteriormente nos había dado 38, ahora nos dio 61 (esta es una métrica que puede tomar valores en el rango -100 +100, con lo cual un 60 es muy bueno)

De la restrospectiva final identifiqué las siguientes acciones concretas para trabajar:

  • Revisar/editar los videos sobre infraestructura pues tienen contenidos que se sueperponen
  • Crear una base de conocimiento con los problemas recurrentes que se encuentran los alumnos al programar con Ruby/Padrino
  • Revisar el timelime de ejercicios/correcciones
  • Hacer una explicación más detallada de la configuración & funcionamiento del pipeline y la infra de los trabajos finales

Algunos otros números:

  • De los más de 30 inscriptos iniciales, solo 24 completaron la cursada
  • La nota promedio de aprobación de cursada fue 7,9
  • Tuvimos 38 tareas individuales, 1 tarea en parejas y 2 trabajos prácticos
  • En términos de dedicación extra clase, en promedio por alumno, fue de un total de 112 horas (53 de tareas individuales/en pareja, 12 horas de tp1 y 47 horas de tp2) repartidas en 15 semanas (que fue la duración de este cuatrimestre para nosotros). Esto nos da unas 7 horas de dedicación semanal extra clase por alumno a lo largo de todo el cuatrimestre.
  • Hasta el momento tuvimos 2 fechas de examen final en las cuales se presentaron 17 estudiantes de los cuales 15 fueron aprobados.

Temas centrales de la enseñanza de la Ingeniería de Software

La facultad de Ingeniería de Universidad de Buenos ofrece dos carreras en el área de sistemas: Ingeniería en Informática y Licenciatura en Análisis de Sistemas. Son dos carreras distintas en el sentido que la licenciatura no es un paso intermedio de la ingeniería. Pero obviamente hay ciertas materias que son «compartidas» por ambas carreras, típicamente las materias de algoritmia, estructura de datos, sistemas operativos y algunas materias de ciencia básica.

En mí época de alumno (allá por comienzos del siglo) ambas carreras compartían dos materias de ingeniería de software que se llamaban: Análisis de Información y Técnicas de Diseño. Tal como los nombres lo sugieren, una estaba centrada en cuestiones de requisitos y la otra en cuestiones de diseño y ambas se cursaban secuencialmente. En el año 2015 la licenciatura modificó su plan de estudio y entre otras cuestiones cambio estas materias reemplazándolas por Métodos y Modelos de la Ingeniería de Software 1 y 2 (comúnmente conocidas como MeMo1 y MeMo2). Por su parte la ingeniería continua aún hoy en día con las mismas dos materias que cursé yo hace 20 años.

Las dos nuevas materias introducidas por la licenciatura están pensadas en línea con la forma en que se desarrolla el software actualmente: de manera iterativa e incremental. Esto implica que en ambas materias se estudia «lo mismo» con distinto pero con distinto foco/profundidad. Ambas materias cubren las distintas actividades del desarrollo de software (requisitos, análisis, diseño, gestión, programación, prueba, etc, etc).

La primera materia (MeMo1) tiene más foco en las primeras actividades del proceso de desarrollo pero cubriendo también cuestiones de diseño, programación y despliegue. La segunda materia (MeMo2) tiene más foco en las cuestiones «del tramo final» incluyendo programación testing, gestión de ambientes y despliegues. Obviamente que hay cierta superposición teórica de temas y es intencional: cuestiones que en una materia tal vez se ven en solo teoría en la otra se ven en la práctica.

A partir de la iniciativa de la Facultad de Ingeniería de rehacer los planes de estudio de todas las carreras, junto a Carlos Fontela y Sergio Villagra comenzamos a trabajar en un propuesta para la enseñanza de la Ingeniería de Software de cara a determinar una estrategia unificada para las 2 carreras. Dado que ambas carreras tienen un perfil distinto, el desafío estaba en determinar el núcleo mínimo común para ambas carreras permitiendo que luego cada carrera acorde a su perfil pueda profundizar contenidos/materias adicionales según considere necesario. En lo que resta de este artículo voy a compartir algunos de los puntos que me parecen más importantes de la propuesta en la que trabajamos.

Antes de hablar de potenciales materias y sus contenidos, hay 2 premisas que tomamos como puntos de partida:

  1. Hay contenidos de ingeniería de software que deben ser abordados en forma temprana y transversalmente en todo el plan de estudio. Ejemplos de esto son prueba unitaria automatizada y versionado.
  2. La ingeniería de software debe cubrir todo el proceso de desarrollo, desde la formulación de la idea hasta la puesta en producción. Lo primero es algo muy aceptado y muy presente en la bibliografía, podríamos incluso llamarlo Ingeniería de Requisitos. Lo segundo es algo un poco más polémico y menos habitual en la academia pues incluye cuestiones como despliegues, ambientes, infraestructura y hasta algunas cuestiones operación, lo que comúnmente se engloba bajo el término «DevOps».

Continuará….

Enseñando prácticas DevOps

La semana pasada presenté en la conferencia ARGENCON 2022, IEEE Biennial Congress of Argentina un artículo formal (experience report) que describe la forma en que abordamos las cuestiones relacionadas a DevOps en el contexto de MeMo2

Este artículo junto con los publicados por Sergio Villagra (Teaching software engineering: an active learning experience) y Carlos Fontela (Learning Communication Skills in Software Development Management Courses: An Active Learning Experience), resume de forma bastante acabada el núcleo de Ingeniería de Software de la carrera de Licenciatura en Análisis de Sistemas de Universidad de Buenos Aires. En un par de semanas el artículo estará disponible en IEEE Explore.

Clases virtuales condicionadas

Luego de 2 años de clases obligadas en modalidad virtual, la mayoría de los alumnos siguen prefiriendo esa modalidad. De mi lado docente, si bien la virtualidad me resulta en cierto modo más cómoda (no tengo que trasladarme hasta la universidad) hay ciertas cuestiones que me resultan mucho más incómodas y que en el balance me llevan a elegir la presencialidad en varias casos.

Concretamente me genera una gran incomodidad dar clases virtuales para una audiencia «ausente»: gente con cámara apagada (o sin cámara) y con nula participación durante la clase. La participación «verbal» puede que no cambie en un esquema virtual o presencial (hay gente que incluso estando en el aula física, no aporta ni una palabra durante toda la clase), pero a pesar de eso, el poder ver las caras ofrece al menos cierto grado de feedback infinitamente más rico que una foto de perfil.

Es por eso que para este segundo cuatrimestre 2022 de MeMo2 vamos a regular la virtualidad acorde a la participación de los alumnos. Si los alumnos quieren clases virtuales entonces deben tener sus cámaras encendidas. En la medida que la mayoría de las cámaras permanezcan apagadas vamos a optar por más clases presenciales. Según la planificación que hicimos tenemos 6 clases que si o si serán presenciales y otras 2 que si o si serán virtuales. El resto de las clases, tenemos la flexibilidad de poder darlas en cualquiera de las dos modalidades.

Cambios en MeMo2 @ FIUBA

Para este segundo cuatrimestre de 2022 estamos considerando realizar varios cambios en la dinámica de la materia.

En primer lugar tenemos un cambio importante en el equipo docente. Emilio Gutter quien venía desempeñando funciones de JTP ya no estará en la materia. Su lugar lo tomará, al menos parcialmente, Hernán de la Fuente, ex-alumno de la materia, miembro del equipo hace ya varios años y muy próximo a graduarse. También tenemos algunos otras bajas, no todas ellas cubiertas, con lo cual el tamaño del equipo se verá disminuído.

Por otro lado vamos a cambiar el orden de algunos temas y la forma en que los damos. Vamos a mantener una modalidad híbrida en la apuntamos a realizar cambios significativos en la dinámica de las clases presenciales.

También tenemos la intención de «reenfocar» algunas cuestiones, concretamente vamos a quitar un poco de relevancia al modelado de objetos/clases para poner más foco en el proceso de construcción (BDD/TDD) y el trabajo en equipo. Esto implica que algunos de los ejercicio individuales de programación pasarán a ser ejercicios en grupales.

Finalmente el último cambio es tal vez el de mayor impacto, vamos a cambiar el mecanismo de evaluación. Hasta el momento no tomábamos parciales ni final. La evaluación de los alumnos era constante a partir de las distintas tareas semanales y proyecto de TP. La idea es mantener eso pero adicionalmente agregar una instancia de evaluación al final de la materia donde cada alumno individualmente tenga que desarrollar «en vivo» una funcionalidad sobre su proyecto. Cuando digo en vivo me refiero a una sesión tipo pairing, donde el alumno acompañado por un docente desarrolla una funcionalidad de acuerdo al proceso y técnicas estudiadas en la materia. Esto no debería representar ningún desafío para los alumnos ya que es lo que hacemos durante la materia. ¿Entonces por qué lo vamos a hacer? Porque tenemos la sospecha de que al trabajar en equipo no todos los miembros asimilan los conceptos, como que algunos «delegan» en sus compañeros.