Y de repente nos dimos cuenta de que las aplicaciones de una sola página eran demasiado pesadas para los teléfonos móviles y necesitábamos abordar esto. Y la gente estaba acostumbrada a tener sitios web rápidos, así que de repente, cuando tenías que esperar minutos para que algo se cargara, simplemente no funcionaba. Y esto llevó al surgimiento de Jamstack, donde necesitábamos algo que fuera rápido y ligero en contraste con las grandes aplicaciones de una sola página que tardaban minutos o incluso decenas de minutos y megabytes en cargarse.
Necesitábamos abordar el elefante que intenta ser exprimido por una pajita. Fue el nacimiento de los primeros meta frameworks como Next, Nuxt o Gatsby o los populares hoy en día Remix, Quik y Astro que aportan algo nuevo, donde finalmente teníamos páginas que se cargaban rápidamente, donde verías los resultados de inmediato. Desafortunadamente, todo esto se hizo a expensas de la experiencia del desarrollador. Para tener sitios web rápidos para los usuarios, teníamos que hacer un trabajo pesado en nuestras propias máquinas, por lo que nuestros procesos de compilación se volvieron extremadamente lentos. Y no solo esto frustraba a los desarrolladores, sino que cuando consideramos que la mayoría de las CI y CD ahora se realiza en la nube, si nuestros procesos de compilación eran lentos, eso también significaba que nuestros compilaciones mensuales en la nube eran cada vez más altas.
Era hora de abordar la segunda parte de la lentitud, por lo que ahora los sitios web eran lentos pero necesitábamos trabajar rápido, pero necesitábamos acelerar nuestra experiencia del desarrollador. Esto llevó a los monorepos. Para entender qué hacen exactamente los monorepos, consideremos primero nuestra aplicación web típica de hoy en día. Nuestra aplicación generalmente consta de una aplicación de front-end construida con el framework elegido, y luego tenemos algún back-end que no es un back-end monolítico, sino que tiene una arquitectura de microservicios detrás, y luego tienes algunos componentes de interfaz de usuario. Ahora, lo que sucede ocasionalmente es que uno de los desarrolladores que trabaja en el back-end cambia ligeramente un método en uno de los servicios, cambiando así un contrato, y simplemente olvida informar al mantenedor del front-end, y de repente tu sitio web está roto, todos te están señalando con el dedo y no tienes idea de qué sucedió porque no tocaste ese código.
Hay algunos intentos torpes de resolver esto exportando constantemente contratos desde el back-end, convirtiéndolos a TypeScript e importándolos en tus aplicaciones de front-end para tener siempre información actualizada, pero esto requiere intervención manual y cuando se trata del factor humano, dado suficiente tiempo, eventualmente fallará. Y además de eso, hay un problema de sincronización porque si algo cambia en el back-end, tienes que implementarlo al mismo tiempo en el front-end, y hay mucha coordinación y malabarismo involucrado. Además de eso, tu aplicación puede no ser la única. Puede haber dos aplicaciones adicionales, una dedicada a móviles y un portal de administración dedicado tal vez construido con una tecnología completamente diferente que también se comparte entre diferentes aplicaciones.
Ahora, lo que quieres hacer es que cada vez que uno de estos cambie, cada parte del sistema que se haya visto afectada por él sea notificada de inmediato. Ahora, en un enfoque de poli-repo típico, lo que sucede es que, por ejemplo, si cambias la utilidad, tendrías que publicar una nueva versión, luego actualizar las dependencias en la aplicación de la página de inicio y el portal de administración, y luego probar si esto funciona. Si no funciona, tienes que volver atrás, hacer una corrección en la utilidad y publicar una nueva versión. Por supuesto, esto se puede resolver con, por ejemplo, enlaces SIEM o algún repositorio local, pero requiere mucha coordinación, muchas cosas que debes mantener y además de eso, esto no escala bien.
Ahora, ¿no sería bueno si simplemente pudieran hablar entre sí? Entonces, cada vez que algo cambie, todo el ecosistema ya sabe qué sucedió. Y esto es lo que sucede con la colocación. La colocación significa que todos estos proyectos están en el mismo repositorio. Entonces, cada vez que uno de estos cambia, todos los proyectos pueden verlo de inmediato porque están juntos, por lo que no es necesario publicar una nueva versión, no es necesario ningún despliegue o cualquier otro ritual. Ahora, tener las cosas colocadas también nos ayuda a identificar ciertas funciones que se pueden, por ejemplo, reutilizar. Entonces, si tienes alguna función sofisticada de administración como esta en tu código, puedes decirle fácilmente a tus colegas: `Oye, tengo esta increíble función, tal vez quieras usarla en tu proyecto también`. Y ellos pueden verlo y decir: `Sí, increíble, también necesitamos esto para el teléfono móvil`. Y puedes extraer esto fácilmente en una biblioteca y compartirla con todos los demás en el repositorio. Y cuando la gente piensa en los monorepos, esto es lo que generalmente piensan, que se trata solo de la colocación. Pero no se trata solo de la colocación.
Comments