Por Patrick Calahan y Scott Nyberg

A medida que surgen nuevas tecnologías de productividad para desarrolladores, las empresas pequeñas y ágiles con bases de código más recientes adoptan rápidamente la innovación. Por el contrario, las organizaciones más grandes, arraigadas en bases de código más grandes y antiguas, se enfrentan a obstáculos para sustituir las tecnologías heredadas.

Salesforce se enfrentó a este reto con su principal sistema de gestión de código fuente (SCM). Durante casi dos décadas, la base de código para el servidor de aplicaciones central ‘Core’ de Salesforce se almacenó en el SCM de Perforce. En 2021, Salesforce se comprometió a mejorar la eficiencia de sus desarrolladores internos mediante la migración a una potencia moderna de SCM: Git.

Solo dos años después, la migración está casi completada, lo que significa un gran paso hacia la implementación de un entorno de desarrollo altamente ágil y eficiente.

¿Cómo fue la migración a Git?

A pesar de un deseo de larga data para llevar las ventajas de Git a los desarrolladores internos, el gran tamaño y la complejidad de la base de código Core históricamente planteado barreras significativas, incluyendo:

  • Muchos archivos. Con más de 30 millones de archivos y un tamaño cercano a los 30 gigabytes, el reto consistía en optimizar operaciones comunes como git status a esta escala.
  • Archivos binarios. El código base incluye cientos de miles de archivos binarios. Esto introdujo complejidades, ya que la competencia de Git con este tipo de archivos es limitada, lo que crea problemas de almacenamiento y gestión.
  • Ficheros binarios
  • Un largo historial de confirmaciones. El historial de listas de cambios de Core abarca décadas. Esto suscitó preocupaciones sobre la escalabilidad de determinadas operaciones de Git a raíz de millones de cambios en el historial.
  • Un historial de cambios muy largo
  • Automatización de la legado. El desarrollo del núcleo dependía de docenas de herramientas y sistemas internos que estaban estrechamente acoplados a Perforce. Migrarlos simultáneamente habría sido poco práctico.
  • Numerosos desarrolladores. El entorno de colaboración de la base de código de Core implicaba a unos 5.000 empleados de Salesforce. Garantizar una transición fluida para esta comunidad de desarrollo tan amplia y diversa era clave.
  • Los desarrolladores de Core se han beneficiado de una transición fluida

¿Cómo se superaron los retos de la migración a Git?

Durante el proceso de migración, varios de los retos mencionados tuvieron soluciones técnicas relativamente sencillas. Por ejemplo, Git Large File Storage gestionó eficazmente los archivos binarios, mientras que las recientes mejoras introducidas en el propio Git, como el fsmonitor observador de archivos, mejoraron significativamente la capacidad de Git para gestionar un gran número de archivos.

Git Large File Storage

Por otro lado, hacer frente a los problemas específicos planteados por el ejército de desarrolladores y la gran escala de la infraestructura de apoyo de Core requirió un enfoque único. En lugar de abordar todos estos retos a la vez, un pequeño equipo de Salesforce inició el proceso construyendo un prototipo sencillo para demostrar la viabilidad básica de la transición de Core a Git. Para superar estos retos, Salesforce desarrolló una estrategia de migración incremental

El quid de esta estrategia consistía en aplicar una variante del «patrón estrangulador». En este marco, el repositorio Git se convierte en el SCM preferido en adelante, mientras que Perforce permanece en su lugar y se mantiene sincronizado con Git. Mediante un proceso de sincronización periódica, las confirmaciones de Git se reflejaron como listas de cambios de Perforce, lo que permitió que la automatización heredada funcionara sin alteraciones hasta su migración final a Git. Para facilitar aún más la transición, se desarrolló una capa proxy para permitir que gran parte de las herramientas heredadas interactuaran con Git y Perforce de forma independiente de SCM

Este enfoque aceleró de forma instantánea la productividad de los desarrolladores, eliminando los retrasos resultantes de una migración prolongada de todos los procesos de automatización.

La migración de Perforce a Git y Perforce se realizó de forma rápida y sencilla

¿Cómo se midió el éxito de la migración?

El enfoque incremental ofrecía oportunidades de mejora iterativa, lo que requería un estrecho bucle de retroalimentación: evaluar el rendimiento del nuevo sistema, conocer la satisfacción de los desarrolladores y medir el aumento real de la productividad.

Cómo se midió el éxito de la migración

Reconociendo el papel fundamental de las métricas para el éxito del proyecto, se realizaron inversiones estratégicas desde el principio:

  • Métricas detalladas: El marco de diagnóstico de bajo nivel «trace2» integrado en Git registra datos de cada comando Git ejecutado en los equipos de los desarrolladores.
  • Métricas agregadas: Con el fin de medir el progreso, Salesforce mejoró su sistema interno de seguimiento de errores para ayudar a realizar un seguimiento de las mejoras agregadas en la velocidad de sus desarrolladores basados en Git. Los exhaustivos informes y paneles de control revelaron un impresionante aumento del 8-10% en la productividad general de los desarrolladores con Git frente a Perforce.
  • Medición de la productividad global de los desarrolladores con Git
  • Métricas cualitativas: Se realizaron encuestas para conocer la satisfacción general de los desarrolladores y detectar áreas de mejora. Los comentarios calificaron la experiencia con Git de «buena» a «excelente»

¿Cómo mejora Git la productividad de los desarrolladores?

Git ofrece numerosas ventajas sobre Perforce, introduciendo una tremenda flexibilidad para desarrolladores y sistemas de automatización – permitiendo la rápida creación de ramas temporales de línea de código y el cambio sin problemas entre ellas. Git cambia las reglas del juego de la productividad de los desarrolladores en Salesforce, ya que impulsa varias mejoras clave de la productividad, entre las que se incluyen:

Git

  • Multitarea segura: La bifurcación local permite a los desarrolladores alternar fácilmente entre la creación de funciones y la corrección de errores críticos.
  • Seguridad multitarea
  • Un bucle interno más sólido: Con Git, los desarrolladores pueden realizar commits con la frecuencia que deseen. Los puntos de control frecuentes ayudan a garantizar que el trabajo nunca se pierda y que los borradores experimentales puedan recuperarse siempre. Esto también fomenta la entrega de unidades más pequeñas y autocontenidas que son más fáciles de gestionar y revisar.
  • Los desarrolladores pueden hacer commits con la frecuencia que deseen
  • Colaboración y creatividad: La bifurcación flexible de Git mejora significativamente el trabajo en equipo, permitiendo a los desarrolladores compartir fácilmente el trabajo, colaborar en las características y crear prototipos de soluciones novedosas a problemas difíciles.
  • Los desarrolladores pueden compartir fácilmente el trabajo, colaborar en las características y crear prototipos de soluciones novedosas a problemas difíciles
  • Automatización desplazada a la izquierda: La ramificación flexible también ayudó a modernizar los sistemas de integración continua de Core. Al probar exhaustivamente las ramas propuestas antes de fusionarlas, se ha mejorado la estabilidad de las líneas de código de desarrollo, lo que ha ayudado a los desarrolladores a llevar su eficiencia a nuevas cotas.
  • Las ramas flexibles también han ayudado a modernizar los sistemas de integración continua de Core

¿Cómo encaja Git en los planes de futuro de ingeniería?

Una vez que todos los desarrolladores internos realicen la transición a Git, la atención se centrará en actualizar la infraestructura existente para alinearla con Git, permitiendo las operaciones bajo un marco SCM unificado.

Cómo encaja Git en los planes futuros de ingeniería

La migración también puede impulsar la mejora del proceso de publicación. Las ramas flexibles de Git ayudarán a transformar los actuales procedimientos manuales y propensos a errores en un sistema automatizado y continuo. Esto minimizará las tareas que consumen tiempo, impulsando una mayor agilidad en Salesforce en respuesta a las necesidades cambiantes de los clientes.

Entradas recomendadas