Developer Journey: Monorepos vs Polyrepos

This ad is not shown to multipass and full ticket holders
JSNation US
JSNation US 2025
November 17 - 20, 2025
New York, US & Online
See JS stars in the US biggest planetarium
Learn More
In partnership with Focus Reactive
Upcoming event
JSNation US 2025
JSNation US 2025
November 17 - 20, 2025. New York, US & Online
Learn more
Bookmark
Rate this content

Construir un monorepo es como volar una nave espacial: muchas personas trabajan juntas para asegurarse de que las cosas no se incendien.
En esta charla repasaremos herramientas, técnicas y mejores prácticas para ayudarnos a apagar incendios y mantener el rumbo a lo largo de nuestro viaje intergaláctico.

Descargo de responsabilidad: ¡asistir a esta charla probablemente no te califique para volar naves espaciales! 

This talk has been presented at JSNation US 2024, check out the latest edition of this JavaScript Conference.

Max Kless
Max Kless
28 min
21 Nov, 2024

Comments

Sign in or register to post your comment.
Video Summary and Transcription
Hola a todos. Me gustaría comenzar contándoles una historia sobre un tipo llamado Dan. Es mecánico y su trabajo es reparar naves espaciales. Dan es una metáfora de todos nosotros, los desarrolladores. Hablemos de monorepos, como probablemente habrás adivinado por el título. Comenzaré hablando de polyrepos, lo que hacen bien, pero también dónde fallan. Luego hablaré sobre monorepos y qué problemas resuelven, así como por qué necesitas buenas herramientas de monorepo, especialmente a gran escala. Un Monorepo es un único repositorio que contiene múltiples proyectos distintos con relaciones bien definidas. Permite a los equipos trabajar juntos de manera unificada. Los monorepos ayudan con la velocidad, la seguridad y la movilidad. Los monorepos se pueden adoptar de manera incremental y buenas herramientas pueden ayudar con la ejecución de pruebas. El tiempo de CI ahora está acoplado al tamaño del cambio realizado, en lugar del tamaño del monorepo. Al generar un gráfico de tareas a partir del gráfico del proyecto, podemos optimizar el proceso de construcción paralelizando y programando tareas. NX ofrece una solución distribuyendo tareas a través de múltiples agentes, permitiendo la optimización del tiempo y el costo. Visita monorepo.tools o nx.dev para aprender más y lograr enfoque y satisfacción como Dan.

1. Introducción a Monorepos

Short description:

Hola a todos. Me gustaría comenzar contándoles una historia sobre un tipo llamado Dan. Es mecánico y su trabajo es reparar naves espaciales. Dan es una metáfora de todos nosotros, los desarrolladores. Hablemos de monorepos, como probablemente habrán adivinado por el título. Comenzaré hablando sobre polyrepos, lo que hacen bien, pero también dónde fallan. Luego hablaré sobre monorepos y qué problemas resuelven, así como por qué necesitas buenas herramientas de monorepo, especialmente a gran escala. Cada nave espacial es una analogía de un repositorio. Esta es una forma perfectamente lógica de organizar una flota de naves espaciales. En el mundo del código, llamaría a este enfoque un polyrepo. Lo que estamos tratando de lograr y por qué esta es una forma tan popular de desarrollar software es la autonomía del equipo que se obtiene. Tienen libertad tecnológica.

Hola a todos. Me gustaría comenzar contándoles una historia sobre un tipo llamado Dan. Así que este es Dan aquí mismo. Es mecánico y su trabajo es reparar naves espaciales. Así que puedes verlo aquí sentado en este bar del puerto espacial, ya sabes, está bebiendo una cerveza que es técnicamente derivada de hongos. Pero solo está sentado, ya sabes, está disfrutando, lo está pasando bien.

Y Dan es realmente una metáfora de todos nosotros, los desarrolladores. Y como cualquier desarrollador durante el día, Dan pasará de ser cautelosamente optimista a caer en un pozo de desesperación y depresión absoluta. Pero saldrá del otro lado sintiéndose como si hubiera entendido todo y está en la cima del mundo.

Mi nombre es Max y personalmente he pasado por ese ciclo de desilusión y comprensión muchas veces en mi vida. Y espero poder hacerlo un poco más fácil para ustedes hoy. Así que hablemos de monorepos, como probablemente habrán adivinado por el título. Y trabajo en una empresa llamada NX donde construimos herramientas de monorepo. Y también trabajo dentro de un monorepo todo el día, todos los días. Así que esa es mi perspectiva al respecto.

Solo para darles una idea de a qué se enfrentan, voy a comenzar hablando sobre polyrepos, lo que hacen bien, pero también dónde fallan. Luego hablaré sobre monorepos y qué problemas resuelven, así como por qué necesitas buenas herramientas de monorepo especialmente a gran escala. Así que en esta charla, cada nave espacial es una analogía de un repositorio. Así que en su primer día de trabajo, Dan se une a una flota de naves espaciales, de hecho. Ya sabes, hay algunas al frente, están luchando contra piratas espaciales, están explorando, están haciendo cosas geniales de personaje principal. Hay algunas en el medio, transportando tripulación, manejando reparaciones y similares. Y luego hay algunos barcos en la parte trasera de la flota, ya sabes, manejando suministros con el hogar y las comunicaciones. Así que todos estos barcos, tienen sus responsabilidades individuales, pero también están todos conectados de alguna manera.

Y diría que esta es una forma perfectamente lógica de organizar una flota de naves espaciales. Y también tiene sentido en el mundo del código. En el mundo del código, llamaría a este enfoque un polyrepo. Donde cada equipo o proyecto tiene su propio repositorio alojado en GitHub o similar. Y lo que estamos tratando de lograr y por qué esta es una forma tan popular de desarrollar software es la autonomía del equipo que se obtiene. Así que cada equipo tiene expertos en su dominio y para sus proyectos, ¿verdad? Y son libres de tomar decisiones. Por ejemplo, tienen libertad tecnológica.

2. Challenges of Sharing Code

Short description:

En este caso, hay dos aplicaciones de React y una aplicación de Angular. Comparten algo de código con TypeScript, y hay un backend escrito en Kotlin. Los polyrepos ofrecen autonomía de equipo, libertad tecnológica y una arquitectura claramente separada. Sin embargo, hay desafíos cuando los equipos quieren compartir código. Crear repositorios separados para el código compartido implica mucho trabajo adicional que los desarrolladores preferirían evitar.

En este caso, hay dos aplicaciones de React y una aplicación de Angular. Comparten algo de código con TypeScript, y hay un backend escrito en Kotlin. Debido a que esto está estructurado tan bien, en realidad es mucho más fácil obtener una visión general y comprender lo que está haciendo todo tu sistema y cómo está estructurado, en lugar de tener solo una gran bola de barro sin una estructura interna discernible.

Así que, para resumir, diría que los polyrepos son geniales. Porque ofrecen autonomía de equipo, libertad tecnológica y una arquitectura claramente separada. Pero si los polyrepos son tan geniales, entonces ¿por qué estoy aquí? ¿Por qué estoy dando esta charla a muchos repos, verdad?

Bueno, digamos que la página de inicio y el equipo de la aplicación web quieren compartir algo de código. Quieren compartir algunos hooks de React. ¿Cómo hacemos esto? Bueno, crearían un repositorio para esos hooks. Tendrían que configurar la publicación, construcción, linting, pruebas, pipeline de CI. Tienen que hacer PRs a los repos para consumir esa biblioteca, y luego tal vez pasar por esos pasos un par de veces para iterar hasta que todo funcione. Como puedes imaginar, eso es mucho trabajo adicional. Es mucho trabajo por el que los desarrolladores no quieren pasar.

3. Issues with Polyrepos

Short description:

La duplicación de código y las inconsistencias surgen cuando los equipos copian código entre repositorios separados. Actualizar bibliotecas se vuelve arriesgado cuando los equipos están en diferentes versiones, lo que lleva a posibles errores. Las dependencias incompatibles pueden causar problemas tanto en los sistemas front-end como back-end. El aislamiento y el miedo a romper el equilibrio dificultan la colaboración. Los polyrepos sufren de un intercambio de código ineficiente y una gestión de dependencias compleja. La experiencia de Dan lo llevó a descubrir el enfoque Monorepo.

Así que dirán, ya sabes, solo esta vez copiaré este código. Estará bien. Y, por supuesto, no es solo una vez. Sucede todo el tiempo. Y ahora ese código vive en rondas completamente separadas. Si un equipo encuentra y corrige un error, el otro equipo podría ni siquiera saber que existe. Así que con el tiempo, las inconsistencias y los errores comienzan a infiltrarse en tu sistema a través de la duplicación de código.

Y como puedes imaginar, esto no escala bien, ¿verdad? La gente va a estar en diferentes versiones de bibliotecas con miedo de actualizar porque actualizar siempre es un riesgo. Pero incluso si solo miramos la parte del front-end, digamos que una de esas actualizaciones requirió una actualización a una versión de React. Mientras todos comenzaron con versiones sincronizadas, ya sabes, la vida se interpone. Algunas personas tienen bloqueadores. Algunas personas realmente necesitan actualizar para solucionar algún problema o error. Y mientras todos comenzaron con versiones sincronizadas, con el tiempo, emergen. En este sistema, no hay nada que impida a alguien importar un componente de React 17 en una aplicación de React 15. Y quién sabe qué podría pasar cuando hagas eso. Esos podrían funcionar perfectamente bien, o podrían romperse más tarde de las maneras más espectaculares incluso de las maneras más sutiles.

Lo mismo ocurre con las relaciones front-end y back-end. Digamos que los equipos de front-end y back-end, acuerdan alguna interfaz compartida que usan para comunicarse. Si el equipo de back-end cambia eso sin coordinar bien y sin comunicarse con los equipos de front-end, podrían simplemente romperlos completamente en producción. Así que necesitas alguna forma de manejar eso, banderas de características, APIs de versión, cosas así. Así que lo que esto resulta, en última instancia, es este tipo de estado constante de miedo donde todos están en sus pequeñas islas, con miedo de actualizar y romper su equilibrio cuidadosamente elaborado. Así que mientras la autonomía del equipo es genial, viene con el costo, en este caso, de aislamiento. Y el aislamiento perjudica la colaboración.

Para resumir, los polyrepos tienen problemas debido al intercambio de código ineficiente, alta duplicación de código, gestión de dependencias compleja, todo lo cual resulta en última instancia en aislamiento. Así que Dan ha pasado por todo esto. Está en el fondo del pozo del que te hablaba antes. Y ha terminado. Acaba de pasar semanas tratando de coordinar entre diferentes equipos y solucionando problemas que no deberían haber estado allí, pasando horas en reuniones. Y está tratando de ahogar sus penas, y puedo relacionarme. Pero luego descubre un nuevo enfoque, el Monorepo.

4. The Monorepo Approach

Short description:

Un Monorepo es un único repositorio que contiene múltiples proyectos distintos con relaciones bien definidas. Permite a los equipos trabajar juntos de manera unificada. El enfoque Monorepo tiene numerosos beneficios.

Así que en lugar de tener esta flota de naves espaciales, todas en realidad trabajan juntas en una gran nave espacial. Todavía hay tripulaciones que pueden actuar de manera autónoma, pero todas trabajan juntas en una nave espacial.

Y aunque eso pueda parecer un enfoque abrumador al principio, en realidad tiene muchos beneficios, que vamos a aprender junto con Dan. ¡Hola! Bien, antes de profundizar demasiado en esto, quiero alinearme sobre lo que realmente es un Monorepo. Me gusta esta definición, que dice, un Monorepo es un único repositorio que contiene múltiples proyectos distintos con relaciones bien definidas. Es un poco complicado, así que vamos a profundizar en ello.

El primero tiene sentido, ¿verdad? Múltiples proyectos distintos. Si solo tienes un repositorio con un proyecto en él, eso no es un Monorepo. Eso probablemente sea un monolito de algún tipo sin una estructura interna discernible. Así que necesitas múltiples proyectos. Pero incluso si solo pones tres aplicaciones en una carpeta, eso no es un Monorepo. Eso es solo co-ubicación. Necesitas esas relaciones bien definidas. Así que tan pronto como comienzas a desglosar piezas de tu código, definiendo cómo estas diferentes piezas dependen unas de otras, se relacionan entre sí, entonces tienes un Monorepo. Y viene con muchos beneficios. Vamos a profundizar en ello.

5. Benefits of Atomic Changes and Consistent Tooling

Short description:

En un Monorepo, compartir código se vuelve más fácil, lo que lleva a una disminución en la duplicación de código, errores e inconsistencias. Tener todo en un solo repositorio permite un tooling consistente y la fácil adición de nuevos proyectos.

Lo primero de lo que quiero hablar es de los cambios atómicos. ¿Recuerdas todo lo que estaba involucrado en compartir algo de código en la configuración de PolyRepo? Tienes que configurar un repo, linting, testing, publicación, hacer PRs, hacer más PRs, configurar CI, todo eso. Es mucho trabajo extra.

La gente no quiere pasar por eso. Sin embargo, en un Monorepo, puedes simplemente hacer un cambio en una biblioteca. Y debido a que todas esas aplicaciones importan directamente de esa carpeta, simplemente consumen esos cambios de inmediato.

Así que eso significa que puedes hacer un solo PR que realice todos los cambios necesarios en todo el sistema. Luego puedes probar todos esos cambios juntos. Así que eso significa que para cualquier commit dado en un Monorepo, puedes asegurarte de que todo tu sistema esté en un estado donde todo funcione junto. No más lidiar con versiones y lanzar algo esperando que funcione. Así que esto hace que compartir código sea mucho más fácil. Vimos todo lo que se requería antes. Ahora puedes simplemente crear una biblioteca, importarla, y eso es todo.

Y eso significa que la duplicación de código disminuirá mucho. La gente nunca tuvo algo en contra de compartir código. Solo que el trabajo extra era tan alto que no lo hacían. Si lo haces fácil para ellos, lo harán con gusto. Así que la duplicación de código disminuirá, al igual que el número de errores e inconsistencias en tu base de código. Porque todo está en un solo repositorio, puedes definir realmente el nivel raíz de React y TypeScript u otras versiones. Así que eso significa que cada aplicación puede usar la misma versión. Ya no tienes que preocuparte por esas extrañas inconsistencias.

Si importas una aplicación de React 15 en un componente de React 70, esto hace que sea mucho más fácil agregar nuevos proyectos también al monorepo. Toda la infraestructura ya está ahí. Todas las dependencias, la tubería de CI, sabes cómo construir y publicar, lint y test y todo. Simplemente pones la nueva aplicación allí, importas de algún código compartido y comienzas de inmediato.

6. Benefits of Monorepos and Collaboration

Short description:

Los monorepos ayudan con la velocidad, seguridad y movilidad. Los Commits Atómicos permiten cambios más rápidos y aseguran la fiabilidad del sistema. Se requiere colaboración, pero los monorepos proporcionan control sobre el código y las herramientas. Los monorepos no son una cuestión de todo o nada.

Esto me lleva a mi siguiente punto, que es el tooling consistente. Como puedes imaginar, en el mundo de Polyrepo, cada uno encuentra sus propias soluciones a los problemas, ¿verdad? Eso es bueno. Queremos la autonomía del equipo. Pero ciertas cosas podrían estandarizarse. Si podemos lograr que ciertos equipos o todos los equipos estén de acuerdo en una forma compartida de construir, publicar, probar, hacer linting de su código, entonces la carga mental para los desarrolladores en cada uno de esos equipos disminuye considerablemente.

Puedo ir a cualquier equipo y entenderé cómo se construye su código, cómo trabajar en su proyecto. Y eso significa que con gusto iré y contribuiré en toda la pila, así como los desarrolladores tendrán una experiencia de desarrollo consistente dondequiera que trabajen. Así que para resumir, diría que los monorepos ayudan con tres grandes cosas, velocidad, seguridad y movilidad. Y todas esas cosas de las que acabo de hablar, contribuyen aquí de varias maneras. No voy a repasarlas todas. Pero tomemos solo los Commits Atómicos como ejemplo. Porque puedo hacer cambios con un solo PR en toda la pila, ya no tengo que coordinar lanzamientos, esperar a que las prioridades de otros equipos se alineen con las mías. Puedo hacer todos los cambios en un solo PR, lo cual es mucho más rápido. Así que la velocidad aumenta. Porque puedo probar todo en ese único PR juntos, puedo asegurarme de que todo el sistema esté en un estado válido. Así que la fiabilidad y seguridad de mi código aumentarán. Y porque es tan fácil hacer un cambio que afecta a proyectos en toda la pila, la gente será mucho más propensa a hacerlo, y la movilidad de los desarrolladores aumentará. Así que los monorepos son geniales. Y espero que todos estén de acuerdo conmigo en eso.

Pero quiero hacer una pequeña advertencia, que es si tus equipos se odian entre sí, no les gustará trabajar juntos en un monorepo. Y eso tiene sentido, ¿verdad? Pero lo que a menudo preocupa a la gente en un monorepo es estar demasiado acoplado a otros equipos, especialmente si no les gustan. Eso es en realidad un malentendido en muchos casos. En un monorepo, aún puedes tener control total sobre quién contribuye a tu código, qué herramientas usas, cuándo lo despliegas. Pero hay una validez en este punto, en esta preocupación. Se requiere un cierto nivel de colaboración básica. ¿Verdad? ¿Necesitamos estar de acuerdo en la misma herramienta de monorepo? Por una vez, probablemente necesites estar de acuerdo en el mismo proveedor de CI. Y si tus equipos se odian, eso podría no suceder. Sin embargo, si tus equipos se odian, probablemente tengas un problema de organización y de personas, no un problema tecnológico, y no puedo ayudarte con eso. Pero me permite hacer un punto muy importante, que es que los monorepos no son una cuestión de todo o nada. La mayoría de ustedes probablemente no son Google.

7. Monorepo Adoption and Test Tooling

Short description:

Los monorepos pueden adoptarse de manera incremental. Usa herramientas como NX como ejemplo. Ejecutar pruebas en monorepos puede consumir tiempo, pero un buen tooling puede ayudar. Al analizar importaciones, archivos y configuración, Enix construye un gráfico de proyecto para determinar las áreas afectadas. La configuración de CI se simplifica con Enix.

Necesitas juntar todo en un gigantesco monorepo. Nosotros mismos, construimos herramientas de monorepo, ¿verdad? Sin embargo, tenemos múltiples monorepos. Está el repositorio de NX para código abierto y plugins y similares. Está el repositorio de NX Cloud para infraestructura y código cerrado. Y luego está el repositorio de NX Console, que es de código abierto. Probablemente podría estar en el repositorio de NX Open Source, pero no es necesario. Tiene versiones independientes, diferentes equipos trabajan en él, así que está bien mantenerlo allí. Así que lo mismo se aplica para ti. Lo más probable es que puedas comenzar a adoptar monorepos de manera incremental, agrupar lo que tenga sentido para ti, y no dejes que nadie más te diga cómo organizar tu código.

Hola. Así que para esta siguiente sección sobre tooling, voy a usar NX como ejemplo. Pero hay muchas otras herramientas de monorepo por ahí, y te animo a que vayas a monorepo.tools, que es un sitio web con información donde puedes aprender todo sobre monorepos y las herramientas para construirlos. Y todos esos autores de esas herramientas, colaboraron en el sitio. Así que es una comparación tan justa e imparcial como puede ser. Hola.

Bien. Así que voy a hacer una afirmación audaz, que es que ejecutar pruebas lleva tiempo. Bien, tal vez no sea la opinión tan candente que pensé que sería, pero es cierto, ¿verdad? Así que si ponemos más y más proyectos en nuestro monorepo, y hay más y más pruebas en nuestro monorepo, ¿no significa eso que el tiempo para probar, especialmente en CI, aumentará y aumentará y aumentará? Bueno, sí, pero también no, porque un buen tooling puede ayudar. Así que a través del análisis de tus importaciones, y tus archivos, y tu configuración, Enix puede construir este gráfico de proyecto de tu proyecto de tu espacio de trabajo. Puedes ver un ejemplo que me gusta usar aquí. Hay una aplicación de carrito y una aplicación de producto que probablemente trabajan juntas en alguna configuración de federación de módulos micro-frontend. Y hay algunas bibliotecas que comparten, y hay algunas bibliotecas que son solo para ellas. Así que a través de esto, en realidad se vuelve muy fácil para Enix ver qué está afectado por un cierto cambio. Bien. Así que hago un cambio en la página de detalles de productos, y Enix dirá que necesitaremos volver a probar, construir y lint, no, no lint, reconstruir y volver a probar la aplicación de productos, así como volver a ejecutar y probar la aplicación de productos para asegurarnos de que todo sigue funcionando. Pero no hay forma de que haya podido romper la aplicación de carrito porque no hay un camino en este gráfico desde la aplicación de carrito hasta la página de detalles del producto. Esto hace que CI sea mucho más simple también. En lugar de una larga lista de pasos, podemos simplemente decir, Enix, por favor vuelve a probar, lint, construir, ejecutar y probar todo lo que esté afectado por este cambio. Eso es todo. Esa es tu configuración de CI ahora.

8. CI and Computation Cache

Short description:

El tiempo de CI ahora está vinculado al tamaño del cambio realizado, en lugar del tamaño del monorepo. Nx añade una caché de computación, permitiendo una recuperación rápida de compilaciones previamente calculadas. Esta caché puede ser compartida a través de una organización, asegurando que el trabajo nunca se duplique. Las bibliotecas en un monorepo permiten decisiones más granulares en cálculos o hashing.

Con esto, hemos desvinculado efectivamente el tiempo que lleva ejecutar tus pruebas, ejecutar CI, del tamaño de tu monorepo. Y en su lugar, lo hemos vinculado al tamaño del cambio que estás haciendo. Así que si estás haciendo un gran cambio que afecta a muchos proyectos en el monorepo, tu CI va a tardar más. Pero si haces solo un pequeño cambio que afecta solo a un pequeño subconjunto de proyectos, será muy rápido, sin importar cuán grande sea el resto del repositorio.

Entonces, ¿cómo más podemos hacer esto más rápido? Digamos que queremos ejecutar una compilación usando npm run build-dash-dashproduction. Hay muchas cosas que intervienen en definir cuál será la salida de esa compilación, ¿verdad? Archivos fuente, archivos de configuración, parámetros de 10S, como dash-dash production, dependencias generales. Y todos estos se toman juntos, se realiza algún cálculo y obtenemos una salida. En este caso, un archivo HTML en el paquete de JavaScript.

Así que Nx añade una caché de computación a esto. Y cómo funciona es así. Cuando ejecutamos la compilación, calculamos un hash. Y luego ponemos ese hash junto con las salidas en la caché de computación. Pero la próxima vez que quiera ejecutar la compilación, primero puedo calcular el hash, lo cual es muy barato. Y luego, si existe en la caché, puedo simplemente recuperarlo, lo que significa que mi compilación pasa de minutos a milisegundos. Y lo increíble es que esta caché puede ser compartida en toda tu organización. Así que en una gran organización, alguien siempre está trabajando, ¿verdad? Ya sea tu colega al otro lado del mundo, o tu pipeline de CI ejecutando pruebas nocturnas. Eso significa que si me desconecto por la mañana, y quiero ejecutar mi compilación, lo más probable es que alguien ya lo haya hecho por mí. Así que puedo simplemente recuperar de la caché, comenzar mi día de inmediato. Y esto es realmente poderoso porque significa que en ese Xmonorepo, con la caché de computación compartida, nunca se hace el trabajo dos veces. Nunca. Nunca. Nunca. Eso explica por qué es tan importante estructurar las cosas en bibliotecas también. No son solo tu unidad fundamental de arquitectura, también están ahí para permitir que Nx tome decisiones mucho más granulares cuando se trata de hacer cálculos efectivos o hashing. Nunca. Nunca. Nunca.

9. Optimizing CI and Task Distribution

Short description:

En el caso promedio, eliminamos trabajo innecesario y utilizamos caché. Sin embargo, en el peor de los casos, cuando un cambio afecta a una gran parte del monorepo, necesitamos técnicas y herramientas para asegurar tiempos de CI razonables. Al generar un gráfico de tareas a partir del gráfico del proyecto, podemos optimizar el proceso de construcción paralelizando y programando tareas. Sin embargo, hay un límite para la paralelización, ya que los flujos de trabajo tienen núcleos limitados. Para superar esto, distribuimos tareas entre múltiples agentes, evitando ineficiencia y respetando las dependencias de tareas.

Así que en el peor de los casos, ya hemos podido eliminar, no lo siento, en el caso promedio, ya hemos podido eliminar mucho trabajo solo haciendo lo necesario con el hecho de que y almacenando en caché siempre que sea posible. Pero siempre habrá el peor de los casos donde hacemos un cambio en algún lugar profundo en el gráfico del proyecto que afecta a una gran parte del Mondorepo, o incluso a todo él. Y necesitamos algunas técnicas y algunas herramientas para asegurarnos de que nuestros tiempos de CI y todo siga siendo razonable. Ese es el caso. Si hago un cambio central y CI tarda tres días, eso es irrazonable, y la gente no puede trabajar con eso.

Entonces, ¿cómo hacemos eso? A través de este gráfico del proyecto, un X también puede generar un gráfico de tareas. Aquí hay un ejemplo de nuestra extensión de VS Code. Puedes ver que para construirlo, primero necesitamos construir la UI generada, necesitamos construir el servidor de lenguaje, y luego combinamos todo eso y construimos la extensión de VS Code en sí misma. Y con este gráfico de tareas, un X realmente puede hacer optimizaciones inteligentes al construir esto. Sabemos qué podemos paralelizar, sabemos en qué orden se deben ejecutar las cosas, y luego podemos programar todos esos trabajos antes de finalmente construir la extensión de VS Code en sí misma. Como puedes ver, esto ya es mucho más rápido que si simplemente ejecutáramos todo secuencialmente, ¿verdad? Pero hay un límite a lo que la paralelización puede hacer. Los flujos de trabajo tienen un número limitado de núcleos, no es una opinión controvertida de mi parte, y si comenzamos a paralelizar más y más cosas y ejecutarlas juntas, eventualmente comenzará a ralentizarse y hay un límite a la cantidad de trabajo que podemos hacer.

Así que necesitamos una manera de dividir estas cosas en múltiples agentes, distribuirlas. Así que hacemos eso. Tomemos nuestro ejemplo nuevamente, ejecutando build, lint, test, y pruebas netainn para todo. Está afectado en nuestro cambio. Y si es un cambio bastante grande, eso podría ser muchas tareas que necesitan ser ejecutadas. Así que una forma ingenua de dividir esto sería decir, construyamos cosas en un agente, probemos cosas en otro agente, etc. Pero esto es realmente ineficiente porque como puedes ver, mientras el agente tres está construyendo y construyendo y construyendo, los otros agentes solo están inactivos, desperdiciando dinero, tiempo, recursos. Y hay otra razón por la que esto realmente no funciona. Recuerda el gráfico de tareas, ¿verdad? Estos tienen dependencias entre sí.

10. Optimizing Task Distribution and CI

Short description:

Para ejecutar pruebas de extremo a extremo de manera eficiente respetando las dependencias y los requisitos de las máquinas, NX ofrece una solución distribuyendo tareas entre múltiples agentes. El gráfico de tareas asegura el orden correcto de ejecución, y la caché de computación distribuida permite reproducir compilaciones desde diferentes agentes. Esta flexibilidad en la configuración permite la optimización de tiempo y costo, con la capacidad de especificar el tiempo de ejecución objetivo de CI. Para grandes monorepos, este enfoque es crucial para evitar tiempos de espera inviables para volver a probar. Visita monorepo.tools o nx.dev para aprender más y lograr enfoque y satisfacción como Dan.

Así que, por ejemplo, para construir las pruebas de extremo a extremo, necesito primero, para ejecutar las pruebas de extremo a extremo, necesito primero construir en esa misma máquina porque las pruebas de extremo a extremo necesitan construir artefactos de salida de esa máquina. Así que de repente hemos creado este problema realmente complejo donde necesitamos asegurarnos de que las cosas estén en el orden correcto mientras también respetamos esas dependencias de salida, en qué máquinas deben ejecutarse, mientras también tratamos de asegurarnos de que todo se ejecute de la manera más eficiente posible y ahorre tiempo.

Bueno, NX simplemente resuelve esa complejidad por ti. Puedes decirle, por favor distribuye todas estas tareas entre cuatro agentes y lo hará por ti. Porque tenemos el gráfico de tareas, sabemos en qué orden deben ejecutarse las cosas. Y porque tenemos la caché de computación distribuida, podemos desestimar completamente esa otra limitación de decir que las pruebas de extremo a extremo deben construirse y ejecutarse en la misma máquina que la compilación. El agente uno puede ejecutar las pruebas de extremo a extremo y cuando llegue el momento, puede simplemente reproducir la compilación desde la caché aunque se haya ejecutado en el agente cuatro. Y te permite saber la diferencia si se ejecutó en sí mismo o en otra máquina. Esto es realmente poderoso. Y porque es tan simple de configurar, puedes empezar a experimentar con ello. Puedes decir, tal vez quiero ahorrar un poco más de tiempo. Usemos seis agentes. Ajusto un solo número en la parte superior y mi tiempo de CI disminuye. O tal vez estás diciendo, esto en realidad no es tan crítico en cuanto al tiempo. Puedo esperar un poco más y ahorrar algo de dinero. Solo uso dos agentes. Y hoy en día, hay un modelo que construimos donde toma tu cambio. Puedes especificar el número objetivo de minutos que quieres que tu CI se ejecute. Puedes decir, quiero que mi CI tome 25 minutos. Entonces NX determinará para un cierto cambio cuántos agentes va a necesitar. Y esto es algo que no vas a poder evitar a cierta escala. Si tienes un gran monorepo, siempre habrá esos peores casos cuando tengas que volver a probar todo. Y si tienes que esperar tres días para que eso se haga, entonces simplemente no es factible.

Así que después de aprender todo esto, Dan está feliz. Puedes ver que se ve contento. Se ve enfocado en su trabajo. No está bebiendo por una vez, que es lo que realmente lo hemos visto hacer. Y si quieres estar enfocado y contento como Dan y conseguir esa línea de mandíbula también, tal vez, te recomiendo que vayas a monorepo.tools para aprender todo sobre monorepos. O puedes simplemente confiar en mi opinión imparcial e ir a nx.dev y leer nuestra documentación. Así que ahora que Dan está feliz, eso significa que yo estoy feliz. Y espero que todos ustedes hayan aprendido algo. Y ahora todo lo que queda por decir es gracias.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Escalando con Remix y Micro Frontends
Remix Conf Europe 2022Remix Conf Europe 2022
23 min
Escalando con Remix y Micro Frontends
Top Content
This talk discusses the usage of Microfrontends in Remix and introduces the Tiny Frontend library. Kazoo, a used car buying platform, follows a domain-driven design approach and encountered issues with granular slicing. Tiny Frontend aims to solve the slicing problem and promotes type safety and compatibility of shared dependencies. The speaker demonstrates how Tiny Frontend works with server-side rendering and how Remix can consume and update components without redeploying the app. The talk also explores the usage of micro frontends and the future support for Webpack Module Federation in Remix.
Enrutamiento en React 18 y más allá
React Summit 2022React Summit 2022
20 min
Enrutamiento en React 18 y más allá
Top Content
Routing in React 18 brings a native app-like user experience and allows applications to transition between different environments. React Router and Next.js have different approaches to routing, with React Router using component-based routing and Next.js using file system-based routing. React server components provide the primitives to address the disadvantages of multipage applications while maintaining the same user experience. Improving navigation and routing in React involves including loading UI, pre-rendering parts of the screen, and using server components for more performant experiences. Next.js and Remix are moving towards a converging solution by combining component-based routing with file system routing.
Sistemas de Diseño: Caminando la Línea Entre Flexibilidad y Consistencia
React Advanced 2021React Advanced 2021
47 min
Sistemas de Diseño: Caminando la Línea Entre Flexibilidad y Consistencia
Top Content
The Talk discusses the balance between flexibility and consistency in design systems. It explores the API design of the ActionList component and the customization options it offers. The use of component-based APIs and composability is emphasized for flexibility and customization. The Talk also touches on the ActionMenu component and the concept of building for people. The Q&A session covers topics such as component inclusion in design systems, API complexity, and the decision between creating a custom design system or using a component library.
Entendiendo la Arquitectura Fiber de React
React Advanced 2022React Advanced 2022
29 min
Entendiendo la Arquitectura Fiber de React
Top Content
This Talk explores React's internal jargon, specifically fiber, which is an internal unit of work for rendering and committing. Fibers facilitate efficient updates to elements and play a crucial role in the reconciliation process. The work loop, complete work, and commit phase are essential steps in the rendering process. Understanding React's internals can help with optimizing code and pull request reviews. React 18 introduces the work loop sync and async functions for concurrent features and prioritization. Fiber brings benefits like async rendering and the ability to discard work-in-progress trees, improving user experience.
Thinking Like an Architect
Node Congress 2025Node Congress 2025
31 min
Thinking Like an Architect
Top Content
In modern software development, architecture is more than just selecting the right tech stack; it involves decision-making, trade-offs, and considering the context of the business and organization. Understanding the problem space and focusing on users' needs are essential. Architectural flexibility is key, adapting the level of granularity and choosing between different approaches. Holistic thinking, long-term vision, and domain understanding are crucial for making better decisions. Effective communication, inclusion, and documentation are core skills for architects. Democratizing communication, prioritizing value, and embracing adaptive architectures are key to success.
Componentes de Full Stack
Remix Conf Europe 2022Remix Conf Europe 2022
37 min
Componentes de Full Stack
Top Content
RemixConf EU discussed full stack components and their benefits, such as marrying the backend and UI in the same file. The talk demonstrated the implementation of a combo box with search functionality using Remix and the Downshift library. It also highlighted the ease of creating resource routes in Remix and the importance of code organization and maintainability in full stack components. The speaker expressed gratitude towards the audience and discussed the future of Remix, including its acquisition by Shopify and the potential for collaboration with Hydrogen.

Workshops on related topic

Domina los Patrones de JavaScript
JSNation 2024JSNation 2024
145 min
Domina los Patrones de JavaScript
Top Content
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Durante esta masterclass, los participantes revisarán los patrones esenciales de JavaScript que todo desarrollador debería conocer. A través de ejercicios prácticos, ejemplos del mundo real y discusiones interactivas, los asistentes profundizarán su comprensión de las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables. Al final de la masterclass, los participantes ganarán una nueva confianza en su capacidad para escribir código JavaScript de alta calidad que resista el paso del tiempo.
Puntos Cubiertos:
1. Introducción a los Patrones de JavaScript2. Patrones Fundamentales3. Patrones de Creación de Objetos4. Patrones de Comportamiento5. Patrones Arquitectónicos6. Ejercicios Prácticos y Estudios de Caso
Cómo Ayudará a los Desarrolladores:
- Obtener una comprensión profunda de los patrones de JavaScript y sus aplicaciones en escenarios del mundo real- Aprender las mejores prácticas para organizar el código, resolver desafíos comunes y diseñar arquitecturas escalables- Mejorar las habilidades de resolución de problemas y la legibilidad del código- Mejorar la colaboración y la comunicación dentro de los equipos de desarrollo- Acelerar el crecimiento de la carrera y las oportunidades de avance en la industria del software
IA a demanda: IA sin servidor
DevOps.js Conf 2024DevOps.js Conf 2024
163 min
IA a demanda: IA sin servidor
Top Content
Featured WorkshopFree
Nathan Disidore
Nathan Disidore
En esta masterclass, discutimos los méritos de la arquitectura sin servidor y cómo se puede aplicar al espacio de la IA. Exploraremos opciones para construir aplicaciones RAG sin servidor para un enfoque más lambda-esque a la IA. A continuación, nos pondremos manos a la obra y construiremos una aplicación CRUD de muestra que te permite almacenar información y consultarla utilizando un LLM con Workers AI, Vectorize, D1 y Cloudflare Workers.
React Patterns Made Simple
React Day Berlin 2024React Day Berlin 2024
62 min
React Patterns Made Simple
Top Content
Featured Workshop
Adrian Hajdin
Adrian Hajdin
Aprende patrones de React ampliamente utilizados, incluyendo HOCs, Compound Components, Provider Patterns, Functions as Child, y Portals, para escribir código más limpio y eficiente y crear aplicaciones escalables y mantenibles.Visión general En esta masterclass, los espectadores aprenderán sobre patrones clave de React que pueden hacer su código más eficiente, legible y mantenible. Presentaremos cada patrón, explicaremos cómo funciona y demostraremos ejemplos prácticos. Al final de la sesión, los participantes tendrán una comprensión sólida de cómo usar estos patrones en sus proyectos.Objetivos de aprendizajeHOCs Compound Components Provider Patterns Functions as Child Portals Modularidad Mantenibilidad Aplicación en el mundo real.
Construyendo una Aplicación de Shopify con React & Node
React Summit Remote Edition 2021React Summit Remote Edition 2021
87 min
Construyendo una Aplicación de Shopify con React & Node
Top Content
Workshop
Jennifer Gray
Hanna Chen
2 authors
Los comerciantes de Shopify tienen un conjunto diverso de necesidades, y los desarrolladores tienen una oportunidad única para satisfacer esas necesidades construyendo aplicaciones. Construir una aplicación puede ser un trabajo duro, pero Shopify ha creado un conjunto de herramientas y recursos para ayudarte a construir una experiencia de aplicación sin problemas lo más rápido posible. Obtén experiencia práctica construyendo una aplicación integrada de Shopify utilizando el CLI de la aplicación Shopify, Polaris y Shopify App Bridge.Te mostraremos cómo crear una aplicación que acceda a la información de una tienda de desarrollo y pueda ejecutarse en tu entorno local.
Construye una sala de chat con Appwrite y React
JSNation 2022JSNation 2022
41 min
Construye una sala de chat con Appwrite y React
Workshop
Wess Cope
Wess Cope
Las API/Backends son difíciles y necesitamos websockets. Utilizarás VS Code como tu editor, Parcel.js, Chakra-ui, React, React Icons y Appwrite. Al final de este masterclass, tendrás los conocimientos para construir una aplicación en tiempo real utilizando Appwrite y sin necesidad de desarrollar una API. ¡Sigue los pasos y tendrás una increíble aplicación de chat para presumir!