JavaScript para Millennials y Pre-Millennials

Se considera Millennials a aquellos nacidos entre comienzos de los 80 y mediados de los 90. Los millennials y pre-millennials que se dedicaron a la programación trabajaron en una web distinta. Muchos vivimos en la web 1.0.

No había programadores de front. Yo creo que no había una «división» tan marcada de programadores. Recuedo los «duelos» Java vs. Net, pero al margen de eso creo que había «programadores web» y «programadores a secas».

No había estándares web, cada navegador se comportaba distinto al interpretar el código js/css/html.

Tal vez como consecuencia de lo anterior, había «engendros» (como Applets y ActiveX) que corrían dentro del navegador pero que estaban programados server-side y no es que uno escribiera código Java que luego era traducido a js/css/html, sino que los navegadores tenían complementos que les permitían ejecutar binarios (jar, dlls, etc). Pero igualmente era raro, porque estos complementos tampoco corrían en todos los navegadores. Yo hablo de esto en pasado pero sin duda hay soluciones de este tipo que aún hoy están en funcionamiento.

Tampoco había la variedad de navegadores que tenemos hoy en día.

Y finalmente, nadie tomaba JavaScript muy seriamente, nadie se dedicaba a JavaScript. Un programador que hacía web trabajaba con Php, Asp, Perl, Java o incluso C++ (haciendo los denominados CGIs) y si por alguna razón necesitaba utilizar JavaScript lo googleable en el momento que lo necesitaba. Como el soporte de JavaScript ofrecido por los navegadores no era estándar, tampoco se podía hacer demasiado en JavaScript (técnicamente se podía pero era muy costoso y terminaba siendo insano).

Creo que muchos de esta generación intentamos por un tiempo escaparle a JavaScript. De hecho algunos aún siguen intentando escapar. Más aún, algunos vendors insistieron mucho tiempo en proveer soluciones para que el programador no tenga que tocar JavaScript. Soluciones como las provistas por Microsoft con las primeras versiones de ASP.NET iban aún más allá, posibilitaban al programador trabajar exclusivamente con C# sin tener que meterse con las tecnologías web y dejar en manos de la plataforma la generación del código (js/css/html) que finalmente se ejecutaba en el navegador. Menciono a Microsoft porque ahí está el grueso de mi experiencia, pero otros vendors siguieron estrategias análogas. Y menciono explícitamente «las primeras versiones de ASP.NET» porque creo que en un punto el propio Microsoft tomó conciencia de las limitaciones de ese enfoque y cambió el rumbo. Ya desde hace años Microsoft viene apostando al desarrollo client-side dándole un gran impulso a TypeScript.

Personalmente me rendí a JavaScript hace varios años pero los proyectos en los que estuve involucrado me mantuvieron lejos del navegador. Profundicé mi conocimiento de JavaScript a partir de algunas cosillas que hice con Node y alguna otra cosilla que hice principalmente con Angular.

Como ya mencioné en algún post anterior, hoy por hoy estoy metiéndome muy de lleno en el mundo de desarrollo JavaScript client-side y es por ello que en los próximos días/meses iré compartiendo recursos de lo que vaya aprendiendo. En general estarán enfocados desde la perspectiva pre-millennials ya que esa es mi procedencia.

Creo que hay mucho material de JavaScript/Frontend dando vueltas por la web pero mi sensación es que la gran mayoría es material introductorio y enfocado en programadores que están dando sus primeros pasos en la profesión. Al mismo tiempo la mayoría del material que veo es para el escenario de creación de aplicaciones desde cero, lo cual tiene mucho sentido pero hay también una parte de la población que tenemos que lidiar con aplicaciones existentes y para esos escenarios creo que no abunda el material. Esta percepción motiva en gran medida mi intención de compartir lo que vaya descubriendo.

Continuará…

JavaScript: sensaciones 2022

Nuestra aplicación Django de 2014 tiene un componente de código JavaScript (client-side) construido a la vieja usanza, con pruebas y modularizado, pero a la viaja usanza. Las pruebas estan escritas en Jasmine/Karma y la modularización está hecha en base «namespaces«. El bundle productivo es generado por Django.

A partir de ciertas necesidades de evolución funcional y de mejorar la experiencia de usuario decidimos llevar la parte visual de nuestro componente a React. Alguien podría preguntarse porqué React y no algún otro como Vue o Angular. La elección está basada en dos cuestiones. En primer lugar no queremos hacer una SPA, sino simplemente reemplazar componente dentro de un sitio existente. Este es uno de los escenarios explícitamente atacados por React a punto tal que ya en el tutorial inicial nos muestra como hacerlo. El otro tema es que en breve tendremos que rehacer nuestra aplicación mobile para lo cual apuntamos a React Native así que encarar este componente con React nos resultó una conveniente primera aproximación al mundo React.

A la pasada, aprovechamos y, decidimos actualizar el stack del proyecto. En primer lugar decidimos quedarnos en JavaScript (en lugar de pasar TypeScript) al mismo tiempo elegimos NPM + WebPack + Babel. También pasamos de Jasmine a Jest para los tests.

Uuuufffff. Durísimo. Si bien yo ya estaba familiarizado con lenguaje JavaScript (sintáxis, características del lenguaje, etc) estaba bastante ajeno a las cuestiones de tooling (frameworks, gestor de paquetes, bundlers, transpilers, linters, etc, etc) y meterme con estas cuestiones me ha resultado bastante desgastante. Al mismo tiempo si bien había hecho algún proyectito menor con JavaScript «moderno», en esos casos había comenzado desde cero utilizando un stack preconfigurado donde ya de entrada tenemos todo el tooling cableado. Pero en este caso teníamos una base de código existente y tuvimos que ir haciendo nosotros mismos la elección y cableado de todo el tooling. La parte positiva de esto es que nos permitió entender ciertas cuestiones con un nivel de detalle tal que al usar el stack prearmado uno ni se entera.

La cantidad de opciones existente y el vértigo de evolución de las herramientas JavaScript creo que no tiene igual en otros lenguajes. Esto lleva a que las posibilidades combinación de herramientas sea realmente muy grande y a la hora de tener que buscar información de un stack específico, todo sea más trabajoso. Esto queda muy en evidencia cuando lo comparamos con otros lenguajes donde las opciones son mucho más acotadas. Personalmente vengo muy acostumbrado del mundo .Net/C# donde en general hay una forma de hacer las cosas, si bien en ocasiones existen alternativas la comunidad ha decantado claramente hacía ciertas opciones que se han convertido en un estándar de facto. En el medio de toda esta movida fui a dar con la página stateofjs.com que realizada una encuesta y provee un interesante informe sobre la evolución del uso de las herramientas en el mundo JavaScript que confirma en cierto modo mi sensación de vértigo.

En fin, el proyecto ya está encaminado y en siguientes post iré compartiendo como hemos resulto distintas cuestiones particulares.

Reflexiones de 6 meses de trabajo con Django

Hace unos 6 meses comencé a trabajar en un proyecto Python/Django. Si bien yo ya tenía cierta familiaridad con Python, nunca había trabajando con Django, la mayoría de las cosas que había hecho a nivel profesional tenían que ver con scripts para automatizar tareas de deployment.

Para ser justo, me parece que antes de compartir mis reflexiones debo explicar algunas cuestiones de contexto que pueden tener cierta influencia en mis percepciones.

  • El primer punto es importante: no estuve trabajando en un proyecto nuevo, sino en una aplicación existente. Más concretamente una aplicación creada hace ya varios años con Python 2.7 y Django 1.4.
  • La aplicación tiene una cantidad no despreciable de código JavaScript, no React, no Angular, JavaScript puro, «vanilla JavaScript» condimentado apenas con jQuery. Esto es un punto no menor, porque parte del tiempo lo he pasado trabajando con código JavaScript en lugar de Python.
  • La aplicación cuenta con unos 1000 test automatizados del código python y también tiene tests automatizadas de parte del código JavaScript.
  • Esta aplicación Django es la parte central de un ecosistemas de aplicaciones, la mayoría de ellas también construidas con Python pero no necesariamente con Django.
  • Finalmente el último detalle contextual es que las funcionalidades en las que estuve trabajando tuvieron que ver con cuestiones «algorítmicas/lógica de negocio», o sea, no tuve que modificar el modelo de datos.

Aclarado el contexto ahora sí mis percepciones. Definitivamente Django es a Python lo que Rails es Ruby con todo lo bueno y lo malo que eso pueda implicar. Django es un framework orientado a la creación de sistemas de información (CRUD) y como tal ofrece muchas facilidades para con relativamente poco código resolver muchas de las cuestiones planteadas por este tipo de aplicaciones: validaciones, persistencia de datos, envío de mails, autenticación, manejo de usuarios, sistema de backoffice/admin, etc. Todo esto complementado con una funcionalidad de scaffolding que genera una porción importante de nuestro código.

Todas estas facilidades que provee Django no son «gratis», tienen un costo asociado el cual implica que la aplicación tiene cierta estructura que en ocasiones puede ser un dolor de cabeza. En este sentido un punto que me resulta particularmente molesto es el grado de acoplamiento con la base de datos que dificulta la escritura de pruebas unitarias ya que al momento de escribir pruebas que utilicen las entidades de negocio (lo que Django llama models) es necesario tener una conexión con la base de datos. Otra cuestión que me resulta muy molesta es la convención de utilizar «pocos archivos pero muy grandes», ejemplo: en vez de tener un archivo por cada clase, un archivo por cada controller, etc, la propuesta es tener un archivo models con todas las clases de entidades, un archivo views con todos los controllers, etc, etc.

Por otro lado hay dos cuestiones que me resultan fantásticas: el debugger de línea de comando (que en realidad es un funcionalidad de Python, no de Django) y el Django shell, que al igual que el Rails console, nos permite manipular de forma interactiva los objetos de nuestra aplicación.

Otra cuestión, en este tipo de frameworks, es el manejo de la persistencia. Al igual que Rails, la persistencia está implementada al estilo ActiveRecord. Esto es que cada entidad/model hereda de una clase base provista por el framework la cual nos provee todo un conjunto de métodos para «llevar y traer» objetos de la base de datos y de esta forma no tenemos que lidiar con la escritura de SQL.

Finalmente el último punto que quiero mencionar es la sensación (y resalto que es una sensación) de que Django «nos lleva a hacer aplicaciones grandes» en contraposición con las tendencias actuales de micro-servicios. Ojo, no digo que el frameworks nos obligue a hacer aplicaciones grandes, sino que algunas de las funcionalidades que provee (como la posibilidad de tener varias aplicaciones dentro de un mismo proyecto) resulta muy tentador para seguir trabajando dentro del mismo proyecto/artefacto en lugar de crear un nuevo proyecto independiente.

En fin, si bien hay cuestiones que no me gustan nada, hay algunas otras que están muy bien.

Recomendación de libros de «autoayuda»

En esta ocasión voy a referirme a un conjunto de libros que en algún momento (y por puro prejuicio) los habria categorizado como libros de «autoayuda» sin siquiera tener en claro que implica «autoayuda». El punto es que más allá de la categoría son libros que me han resultado muy útiles e interesantes.

El primero de estos libros que quiero mencionar lo leí allá por 2008: Los 7 hábitos de la gente altamente efectiva. Ya en aquel momento este libro era un best seller. Tanto es así que a pesar de que originalmente está en inglés, también ha sido traducido a varios idiomas. De hecho, yo lo leí en castellano. Su autor, Stephen Covey, ha escrito varios libros más en relación a esta misma temática. A partir de este libro fue que empecé a trabajar la formación de ciertos hábitos en mi materia de Ingeniería de Software.

Otro libro que también leí por aquella época es el ya clásico de Francesco Cirillo: «The Pomodoro Technique«. Esta técnica ha cobrado tal popularidad que se han generado una importante cantidad de recursos relacionados entre los que se incluyen varios videos, apps y cursos. Personalmente esta técnica me ha ayudado mucho a enfocar mi trabajo y suelo recomendarla a mis alumnos y colegas. De hecho recuerdo que en la época que dictaba Ingeniería de Software en UNQ, esta era una de las lecturas obligatorias de la materia (mientras escribo estas líneas creo que debería incluir esta lectura en mi materia de UBA).

Finalmente esta semana terminé de leer el libro «Atomic Habits» de James Clear. Este lo compré a comienzos de 2020 a partir de una mención que hizo en Twitter mi colega @hhiroshi. El libro me gustó mucho por varias cuestiones. Encontré justificación «teórica» para varias cuestiones que suelo hacer. También encontré muchas cuestiones para experimentar. Muchos de los capítulos comienzan con anécdotas/historias que hacen muy llevadera la lectura. Un tema no menor en relación con la lectura es la extensión de los capítulos, tienen una extensión tal que permite completar un capítulo en unos 15 minutos (al menos a mi ritmo de lectura). El tema de la generación de hábitos me parece fundamental para trabajar de forma más efectiva. El tener incorporadas ciertas tareas como hábitos hace que uno pueda ejecutar esas tareas de forma «automática» sin necesidad de poner energía/atención extra y de esa forma poder ahorrar esa energía/atención para dedicarla a otras cuestiones de mayor prioridad/valor. Este libro ofrece todo un marco teórico junto con técnicas concretas para generar hábitos y también para eliminar hábitos.

Balance 2021

Se fue el segundo año de pandemia, pero a diferencia del anterior, este año ya estaba planeado para trabajar en forma remota. Y así fue, solo fui a la universidad para la clase de cierre de Ingeniería de Software @UNTreF y solo fui a la oficina 2 días para una reunión de planificación estratégica y para el almuerzo de fin de año.

Mi tiempo total de trabajo (en términos de horas facturables) este año fue radicalmente menor que el año anterior. A su vez, este año por primera vez en mi carrera tuve una dedicación pareja de trabajo en industria y trabajo en academia.

Dedicación Industria vs. Academia

Dentro de mi trabajo en la industria gran parte fue dedicada a cuestiones de capacitación. Lo referente al trabajo de consultoría fue principalmente relacionado a cuestiones de DevOps/Automatización de Pruebas/Infra/Deployment.

Dedicación de actividades de industria

En lo que respecta a las actividades de academia lo principal fue el dictado de mis materias pero adicionalmente a eso hice otra actividades como:

  • Dirección / Evaluación de trabajos finales de carrera
  • Evaluación de pares para la CONEAU
  • Revisión de artículos como miembro del comité de programa del track de educación de ICSE.

En lo que respecta a participación en conferencias este año participé en muy pocas. Sinceramente las conferencias en formato virtual no me resultan atractivas. Presenté sesiones en XP, Agiles Latam, Agile Brazil y Agiles en Español.

En lo que respecta a publicaciones apenas hice dos publicaciones pero ambas resultaron muy interesantes. Publiqué un reporte de experiencia en la conferencia XP y publiqué mi primer artículo en un journal: nuestro artículo final del proyecto Helena «What Makes Agile Software Development Agile» fue publicado en el journal IEEE Transactions on Software Engineering.

Workshop Software Engineering Education for the Next Generation

He sido invitado a ser parte del comité del programa del workshop «Software Engineering Education for the Next Generation» y como tal estoy colaborando en la difusión.


Un detalle importante a mencionar es que se trata de un workshop académico, o sea: no es típico de taller que podemos encontrar en el contexto de una conferencia de industria como podría ser Nerdearla o la RubyConf. Sino que se trata de un workshop en el contexto de una conferencia académica, en este caso particular la conferencia es ICSE (International Conference on Software Engineering). En este tipo de workshops se presentan artículos que son previamente evaluados por pares (los miembros del comité del programa) y luego se trabaja colaborativamente sobre las temáticas planteadas en los artículos.


Esta es la cuarta edición del edición del workshop, yo participé como autor en 2017 y personalmente creo que es un espacio interesante para participar y publicar:

  • Al ser un espacio en formato workshop, además de la exposición de los artículos, hay un espacio interactivo de intercambio, colaboración, debate y hasta co-creación de contenido/materiales
  • La convocatoria (CFP) incluye obviamente trabajos de investigación pero también reportes de experiencia y artículos de posicionamiento (position papers).
  • Es parte de ICSE, lo cual le da una gran exposición, pero al mismo tiempo, al ser un workshop «la vara de entrada» no es tan exigente como en el track de educación de ICSE.
  • Debido a las condiciones de pandemia, esta edición se realizará en formato virtual, con lo cual no hace falta viajar para participar.
  • El deadline para el envió de artículos es el 14 de enero, se que es poco tiempo para escribir algo desde cero, pero tal vez quien algo escrito a medias y esta pueda ser una buena opción para redondear y publicar.

Notas sobre Clean Architecture

Apenas Bob Martin publicó su libro Clean Architecture allá por 2017, leí el índice y me pareció que ya conocía todos los temas tratados. Sin embargo, hace un par de meses, sin haber cambiado de opinión decidí igualmente leerlo. Ayer lo terminé.

Efectivamente considero que el libro no me trajo nada nuevo a mi. O sea, he leído mucho sobre arquitectura de software y tal vez por eso no encontré nada revelador. Sin embargo creo que el libro puede resultar muy valioso para muchos lectores porque de hecho creo que es un muy buen resumen de temas con un enfoque muy concreto y pragmático. Spoiler: la idea central de Clean Architecture es lo que hace unos 20 años Alistair Cockburn bautizó inicialmente como Ports & Adapters y más tarde como Hexagonal Architecture.

Si bien los temas los conocía, algo que encontré muy valioso son algunas explicaciones y argumentos.

Me gustó mucho el capítulo «Clean Embedded Architecture» en el cual trata sobre arquitectura de sistemas embebidos.

También me gustó la «desmitificación» sobre «los micro-servicios».

Una perlita interesante son los capítulos «The Database is a Detail», «The Web is a detail» y «Frameworks are details». Me parece que la posición del autor es demasiado extrema pero igualmente vale la pena leerlos.

Una cuestión que parece importante y que no he visto de forma tan explícita en otros libros es que los principios de diseño «son universales», si bien muchos de ellos han sido popularizados en relación con la programación orientada a objetos, los mismos pueden aplicarse tanto a programas desarrollados en C (que no tiene objetos) como a APIs y Servicios.

En fin, el libro me gusto y lo recomiendo sobre todos para aquellos que no esten muy familiarizados con cuestiones de diseño de software.

Cierre de 2021 en MeMo2 @ FIUBA

Y se nos fue un cuatrimestre más en modalidad virtual. Ya el cuarto. Personalmente estoy muy contento debido principalmente a 3 cuestiones, paso a enumerar en orden aleatorio.

Una de las cuestiones destacadas es que me parece que logramos transmitir de forma efectiva la propuesta de Desarrollo Guiado por Pruebas (TDD ourside-in). Este es un tema que venimos dando desde que comenzamos a dictar la materia pero que creo que este cuatrimestre en particular logramos transmitir esta técnica de forma efectiva. Digo esto basado en ciertas charlas que se dieron con los alumnos, en los trabajos realizados y en el resultado de una actividad de relevamiento que hicimos en clase que se puede apreciar en la figura 1.

Figura 1. Resultado de la actividad de relevamiento de TDD

Otra cuestión destacada son ciertos ajustes internos en la dinámica del TP2. La forma en que presentamos el problema, el mecanismo de seguimiento y tutoría que implementamos para guiar a los alumnos y un conjunto de checklist que implementamos como herramientas de soporte para los docentes. Creo que esto nos permitió mejorar la experiencia de docentes y alumnos en el desarrollo del TP2.

Finalmente, un objetivo que nos habíamos propuesto a partir del feedback del cuatrimestre anterior, fue disminuir la carga de trabajo del TP2. Este objetivo lo logramos con éxito aun cuando esa carga de trabajo es importante, este cuatrimestre fue menor que el cuatrimestre anterior.

Creo que directa o indirectamente todas estas mejoras se reflejan en los resultados de la encuesta final del curso:

  • Evaluación general de la materia: 9.1 / 10
  • Dedicación semanal extra-clase: 9.1 horas
  • Materiales de estudio: 4.1 / 5
  • Claridad de los docentes: 4.5 / 5
  • Conocimientos de los docentes: 4.6 / 5
  • Dinámica de las clases 4.5 / 5
  • Nota promedio de aprobación: 8
  • Conformidad con nota de aprobación: 4.7 / 5
  • Net Promoter Score: 79 (métrica que puede oscilar entre -100 y +100)

De estas 10 métricas, 9 tienen mejores valores que el cuatrimestre anterior. Al mismo tiempo la Evaluación general de la materia tiene un máximo histórico (9.1 vs. el máximo anterior de 8.9). El otro valor record es el NPS que marca 79 vs. el máximo anterior de 42.
Un punto a mencionar es que no todos los alumnos contestaron la encuesta (tenemos 19 respuestas sobre un total de 26 alumnos), este es un tema recurrente, como la encuesta es anónima y como la hacemos una vez terminada la materia no hemos encontrado un mecanismo para asegurar que todos los alumnos la completen. Pero dado que este es tema recurrente de todos los cuatrimestres creemos que la igualmente la encuesta sigue siendo un elemento válido para medir el curso.

Finalmente, para dar un poco más de contexto comparto algunos otros números del curso:

  • Cantidad de inscriptos: 30
  • Abandonos: 4
  • Aprobados: 26
  • Tareas individuales: 42
  • Trabajos grupales: 2
  • Visitas de la industria: 1

Percepciones de mis alumnos sobre TDD y otras prácticas de desarrollo

En MeMo2 estudiamos diversas prácticas de desarrollo que luego pedimos a los alumnos utilizar durante el desarrollo de los trabajos grupales. En la clase de ayer, a punto ya de terminar el cuatrimestre, hicimos una muy breve actividad para relevar cómo les resultó el uso de esas prácticas.

Nos centramos en 3 prácticas concretas: Test-Driven Development (outside-in style), Mob-Programming y Trunk-Based Development. Para cada una de estas prácticas les pedimos que se ubiquen en lo que seria un «cuadro cartesiano» donde un eje horizontal representa cuánto utilizaron la práctica y el eje vertical representa el grado de confort/utilidad que sintieron con esa práctica.

En el caso de Mob-Programming las respuestas estuvieron bastante dispersas y sin extremos.

Pero para Trunk-Based Development y Test-Driven Development las respuestas resultaron mucho más categóricas: la gran mayoría indicó haber utilizado mucho lás prácticas con un grado positivo de confort/utilidad.

Personalmente estoy muy contento con estos resultados, que los alumnos perciban utilidad en lo que enseñamos resulta muy reconfortante. La gran duda (habitual en el ámbito académico) es cuanto finalmente terminan «comprando» estas prácticas los alumnos, o sea: fuera del contexto de la materia ¿seguirán utilizando estas prácticas?…..

Sobre la enseñanza de la Ingeniería de Software

La materia que dicto (tanto en UBA como en UNTReF) es Ingeniería de Software, pero dado que la «Ingeniería de Software» es un rótulo tan amplio, no basta con decir eso para transmitir qué es lo que realmente estudiamos.

Razonablemente alguien podría pensar que toda materia nombrada como «Ingeniería de Software» debería cubrir los temas descriptos en el Software Engineering Body of Knowledge (SWEBoK). Esto es lo que intentamos hacer en las materias Ingeniería de Software 1 y 2 (conocidas informalmente como memo1 y memo2) de la Licenciatura en Análisis de Sistemas de la UBA. Pero esto muchas veces no es así.

En algunas casas de estudio la materia «Ingeniería de Software» solo cubre una parte de esos temas del SWEBoK. Un caso de esto parece ser la materia Ingeniería de Software de la carrera de Licenciatura en Ciencias de la Computación de la UBA, la cual está muy enfocada en cuestiones de diseño y programación orientada a objetos y sin tratar varios temas de SWEBoK.

También está el caso de algunas carreras que no tienen ninguna materia llamada Ingeniería de Software, sino que cuentan con materias particulares para las distintas disciplinas que componen la Ingeniería de Software (análisis, diseño, programación, testing, etc). Este es el caso de la carrera Ingeniería en Informática de la UBA.

También tenemos el caso carreras que cuentan con materias específicas para algunas de las distintas disciplinas de la Ingeniería de Software y al mismo tiempo tienen una materia Ingeniería de Software que cubre los temas restantes de la Ingeniería de Software que no cubre ninguna materia particular como ser muchas veces las cuestiones de proceso, trabajo en equipo y metodologías de desarrollo. Este el caso de la carrera Ingeniería en Computación de UNTreF.

Más allá de todas estas variantes, hay una cuestión que quiero destacar respecto de la forma en que dictamos las materias MeMo1 y MeMo2 en UBA. Ambas materias pretenden cubrir todas las disciplinas de la Ingeniería de Software, en ambas materias se estudia desde requerimientos hasta puesta en marcha pero con mayor profundidad en distintos temas. MeMo1 tiene un mayor foco en las cuestiones iniciales de los proyectos, como ser visión, requisitos, etc, pero aún así trata cuestiones de metodología, arquitectura, etc. Y un punto central: se hace implementación, o sea, los alumnos tienen que programar y poner lo que programan en un ambiente «símil producción». Esto me parece que es fundamental para cerrar el «feedback loop», recién al poner nuestra aplicación en producción sabemos cuán bueno ha sido nuestro trabajo en requisitos y demás tareas de la ciclo de desarrollo. Por otro lado en MeMo2 también cubrimos todo el ciclo pero con un mayor foco en ciertas cuestiones que MeMo1 toca de forma más superficial. En particular en MeMo2 ponemos mucho foco en proceso de desarrollo, el ciclo de BDD/TDD, CI/CD, Configuration Management y dinámica de equipo.