¿Qué tipo de actualizaciones consideramos mayores? Tengan en cuenta que no estoy hablando de un SemVer mayor. Estoy hablando de algo que típicamente solo hacemos a un framework quizás una vez cada pocos años, ¿verdad? Las razones comunes para tales actualizaciones mayores incluyen, primero, corregir defectos arquitectónicos de diseño. Segundo, introducir nuevas capacidades fundamentales, y tercero, eliminar la deuda técnica de la arquitectura existente. Tengan en cuenta, estos usualmente implican refactorización masiva o incluso reescritura desde cero, que fue el caso de Vue 3.
Los rasgos comunes de estas razones centrales son que son extremadamente costosos de hacer de manera incremental, ¿verdad? Porque algunos de los problemas están arraigados en la arquitectura y sin revisar la arquitectura, algunas de las mejoras simplemente no eran posibles en primer lugar. Entonces, hacer tales grandes actualizaciones mientras se mantiene la total compatibilidad con versiones anteriores a veces es simplemente prohibitivamente costoso de hacer, ¿verdad? ¿Por qué? Porque la total compatibilidad con versiones anteriores es una carga que se acumula con cada nuevo cambio mayor introducido. Cuanto más ambiciosos son los nuevos cambios, más deuda técnica se acumulará durante el proceso.
A largo plazo, hará que el proceso sea aún más difícil, añadir nuevas características, mucho más difícil. Y lo más importante, se vuelve cada vez más costoso mantener el software a largo plazo. Ahora, por otro lado, podemos reducir el alcance de los cambios para hacer las cosas más factibles, pero esto también resulta en mejoras menos ambiciosas, menos posibilidades exploradas y potencialmente estancamiento. Así que es casi como si hubiera un montón de perillas que puedes intentar girar, pero cuando giras una de ellas, las otras se moverán en reacción a la que estás girando.
Entonces, aquí visualicé algunos de los factores que tenemos que considerar mientras hacemos actualizaciones mayores en cuatro perillas, ¿verdad? Estas son la compatibilidad con versiones anteriores, qué tan fácil es actualizar, el costo para implementar y mantener los cambios y mantenerlo a largo plazo, y finalmente, el nivel de mejoras que estos cambios pueden provocar. Entonces, en el caso de Vue 3, el ejemplo es si giramos la compatibilidad con versiones anteriores al 100%, esto hará que sea extremadamente fácil de actualizar, pero también aumentará significativamente los costos de implementación y mantenimiento. Y si intentamos empujar la escala de mejora hasta el 100% al mismo tiempo, aumentará el costo a una escala casi inviable. Ahora, si giramos la perilla de compatibilidad un poco hacia abajo a un 90%, ahora podemos tener tanto un costo razonable como mejoras bastante importantes, pero la actualización del usuario sufrirá, ¿verdad? Se volverá más difícil actualizar. Así que esto esencialmente resume los compromisos que hemos optado en Vue 3, ¿verdad? Intentamos mantener la mayoría de los conceptos del framework y las APIs intactas mientras introducíamos nuevas capacidades. Así que la API es 90% compatible, no es 100% compatible. Lo más importante, algunos de los aspectos internos han cambiado, ¿verdad? Pero pudimos traer actualizaciones mayores en casi todos los aspectos desde el rendimiento hasta el tamaño del paquete hasta la arquitectura interna, la mantenibilidad a largo plazo, la integración de TypeScript, ¿verdad? Es una mejora en todos los aspectos. Desafortunadamente, también tuvimos que introducir algunos de los pequeños cambios disruptivos. Muchos de los cambios de la API pública ahora están cubiertos en la construcción compacta. Sin embargo, algunos de los intercambios son más fundamentales, por ejemplo, el cambio de usar getters-setters de ES5 a proxies para el sistema de reactividad o cambiar el formato del DOM virtual subyacente. Estos cambios fueron necesarios para el nivel de mejoras que estábamos buscando. Sin embargo, también hicieron que fuera más desafiante para los proyectos existentes actualizar, especialmente las aplicaciones con dependencias externas que dependen del comportamiento interno de Vue 2. Este es el mayor obstáculo que hemos visto en la práctica.
Ahora, no estoy tratando de buscar excusas al hablar de todo esto. Mirando hacia atrás, probablemente podríamos haber hecho algunas cosas mucho mejor, especialmente con los cambios disruptivos para hacer el proceso de actualización más suave. Podríamos haber introducido una construcción compacta antes y definitivamente deberíamos haber trabajado en los nuevos documentos antes también. Pero en última instancia, todavía creo que hacer que Vue 3 sea 100% compatible con versiones anteriores, especialmente con otras bibliotecas que dependían del comportamiento interno de Vue 2, es algo que simplemente era demasiado costoso para comprometerse. No podríamos obtener el nivel de mantenibilidad y el nivel de mejoras que queremos, que tenemos ahora mismo al mismo tiempo, si nos comprometemos a la compatibilidad total con versiones anteriores. Así que, suficiente sobre los cambios disruptivos, pero ahora hablemos de algo más optimista.
Comments