Ahora, nos reservamos el derecho de mantener algunos de ellos por razones específicas, pero hablaré de eso más adelante. Tecnológicamente hablando, estamos utilizando TypeScript en su totalidad. Estamos utilizando VUEX, y se ha vuelto bastante cargado con el tiempo. Tenemos una docena aproximadamente de módulos. Ya no se sienten muy bien diseñados, porque hemos sido una startup durante un buen período, por lo que hemos estado agregando iterativamente sin una dirección asombrosa. Ya sabes, las startups cometen errores.
Porque estamos utilizando... Bueno, primero, decidimos utilizar componentes de clase de Vue. Esto fue muy temprano en el ciclo de desarrollo del producto, hace unos tres años y medio más o menos, y decidimos seguir con eso porque, en primer lugar, no teníamos muchos ingenieros frontend. Muchos de nosotros éramos full-stack y las clases eran algo con lo que estábamos más familiarizados. Parecía ser la forma de hacerlo en ese momento, y en ese momento también parecía ser un enfoque que tenía un mejor soporte de TypeScript debido a los decoradores de clase y los decoradores de clase de VueX, que también usamos como biblioteca. Pero sí, esa fue una decisión tomada en ese momento.
Para las pruebas, por supuesto, usamos Jest con Vue Test Utils, y tenemos una configuración de storybook, que utilizamos como catálogo de componentes, pero no dentro del contexto de escribir pruebas ni nada por el estilo. Por lo tanto, claramente, para migrar a Vue 3, el problema número uno es el hecho de que utilizamos componentes de clase. Eso significa que hay más trabajo para migrar un componente que con la API de opciones, y eso significa que desde el principio no podemos comenzar con la configuración de Vite para la compilación frontend en Vite porque los componentes de clase no se ejecutan realmente en Vite o en Vue 3. Ahora, en este momento, según tengo entendido, hay algunas PR en revisión para los componentes de clase de Vue y las bibliotecas de clase de VueX, potencialmente incluso un candidato a versión o algo así, donde se agregará este soporte. Por lo tanto, es posible que para cuando terminemos la migración, también sea posible ejecutar componentes de clase en Vite, pero aún así estamos cambiando a la API de Composición simplemente porque es un nuevo estándar y preferimos utilizar el estándar en lugar de una alternativa de terceros. Bueno, eso es lo que hacemos ahora.
Nuestra lista de objetivos para considerar que esta migración está completa es cambiar todos los componentes a la API de Composición, al menos aquellos que vamos a mantener, y tal vez algunos más, y nuevamente, hablaré de eso un poco más adelante, cambiar de UX a Binia, porque es el nuevo estándar, hacer que nuestra aplicación y el storybook se ejecuten en Vite, y hacer que Jest cambie a Vitest, lo que significa que también utiliza la misma configuración de Vite, lo cual es una gran ventaja con Vitest o Jest.
Entonces, necesitamos una estrategia para esto, y desde el principio decidimos que un gran esfuerzo único no es una buena idea. No podemos hacer un gran esfuerzo de simplemente migrar, migrar, migrar hasta que terminemos, y luego pasar a otra cosa. En primer lugar, nuestro equipo es bastante grande ahora, tenemos alrededor de 30 ingenieros, e incluso con ese tamaño, probablemente llevará semanas migrar todos esos componentes, especialmente porque nos pisaremos los unos a los otros. Estamos garantizados de crear errores de esta manera, hay demasiado código que se está cambiando como para que eso no suceda. Y habrá demasiados retrasos en nuestro trabajo de producto, así que sí, no estamos de acuerdo con eso. Para mejorar nuestro proceso, decidimos que debe ser algo que nos brinde beneficios a medida que avanzamos, y no cuando terminemos, y debe ser lo menos disruptivo posible.
Entonces, el enfoque básico que adoptamos es que un ingeniero convierte dos componentes en un sprint, y nuestro sprint dura dos semanas, para nosotros, y esta conversión de un solo componente tiene un límite de tiempo de dos horas. Eso significa que si parece que llevará más de dos horas, ese ticket se pone inmediatamente en espera y tomamos el siguiente. El razonamiento es que a medida que adquirimos experiencia haciendo estas conversiones, podemos aumentar la velocidad, tal vez cambiar las reglas para elegir más componentes, y luego podemos volver a visitar esos tickets que pusimos en espera, para ver si tal vez será más rápido esta vez porque sabemos más. Y luego, como parte de todo este esfuerzo, hay una regla adicional de que cualquier código nuevo que escribamos, cualquier componente nuevo que agreguemos a la base de código, debe utilizar la API de Composición. Por lo tanto, no más introducción de componentes de clase adicionales a la base de código.
Comments