Ir al contenido

Blog


Por qué los nuevos chips M1 de Apple son esenciales para el desarrollo rápido de iOS

1 de marzo de 2022

|
Michael Thole

Michael Thole

Nunca ha sido tan fácil iniciarse en el desarrollo para iOS como ahora. Las herramientas son en gran parte gratuitas, y hay una plétora de contenido educativo de calidad disponible en línea, incluyendo algunos de la propia Apple. Como te dirá cualquiera que haya hecho iOS durante mucho tiempo, hay una sensación mágica al empezar un nuevo proyecto y crear rápidamente algo desde cero.

Sin embargo, a medida que aumenta el tamaño de una base de código y se multiplica el número de desarrolladores que contribuyen a ella, esa sensación de progreso rápido puede convertirse en una lenta caminata. El desarrollo de software es un proceso muy iterativo, por lo que la cantidad de tiempo entre la realización de un pequeño cambio de código y ser capaz de probar / experimentar ese cambio es muy importante para la productividad general de los desarrolladores. En DoorDash, hemos estado trabajando para minimizar esta latencia, manteniendo nuestro desarrollo rápido y nuestros ingenieros felices.

Hablaremos de algunos de los enfoques que estamos adoptando para aumentar la velocidad de desarrollo, pero el primero es también el más fácil: ¡comprar a tus ingenieros de iOS nuevos Macbook Pros M1 Max!

Los nuevos MacBook M1 lo hacen todo más rápido

Apple lanzó los chips M1 de consumo en el Mac Mini y el MacBook Air a finales de 2020 (con un rendimiento impresionante), y se rumoreaba ampliamente que lanzaría los nuevos MacBook Pro poco después. Queríamos adelantarnos a los acontecimientos, así que empezamos a elaborar un plan de negocio para actualizar todo nuestro equipo iOS a estos nuevos portátiles lo antes posible.

Desde un punto de vista empresarial, las matemáticas son sencillas: Una inversión en productividad de los desarrolladores tiene un "periodo de amortización". Es simplemente una función del ahorro de tiempo previsto y el coste de ingeniería. En lugar de recuperar la inversión en dólares, puede recuperarse en tiempo de ingeniería que de otro modo se habría perdido. En nuestro caso, eso requería estimar cuánto tiempo ahorraría cada día el ingeniero medio con estos nuevos portátiles y multiplicarlo adecuadamente.

Basándonos en patrones de uso aproximados, asumimos que un ingeniero medio de iOS realiza alrededor de cinco compilaciones limpias y 30 incrementales cada día... Multiplicamos eso por nuestros tiempos medios de compilación para hacernos una idea de cuánto tiempo pasa cada ingeniero "esperando al compilador" cada día. Me viene a la mente un cómic de xkcd.

Del mismo modo, necesitábamos medir la velocidad de los nuevos portátiles para calcular el tiempo ahorrado. Al hacerlo antes de que el hardware estuviera disponible, tuvimos que hacer algunas estimaciones basadas en los chips de consumo y en la información de marketing de Apple, con un pequeño recorte.

En nuestro caso, pudimos calcular que la actualización de un ingeniero de iOS supondría unos 35 minutos de "tiempo ahorrado" cada día. Multiplicando esa cifra por el coste medio de contratar a un ingeniero de iOS, encontramos un "periodo de amortización" de menos de dos meses.

Figura 1: El coste del "tiempo dedicado a compilar" de los portátiles antiguos frente a los nuevos muestra que el coste único de la actualización del hardware se amortiza rápidamente.

Y lo que es más importante, estos cálculos aproximados eran tan abrumadoramente positivos que no necesitábamos tener en cuenta un montón de ventajas menos obvias o más difíciles de medir de estas máquinas más rápidas. Por ejemplo, no tuvimos en cuenta cuantitativamente cómo los ingenieros estarían menos frustrados, cómo Xcode sería más sensible, que la función de autocompletar funcionaría más rápido, o que se reduciría el cambio de contexto a la espera de los tiempos de compilación.

Con un sólido argumento comercial, hicimos un pedido para actualizar a todos los ingenieros actuales y futuros de iOS a un MacBook Pro de 16 pulgadas con M1 Max y 64 GB de RAM. 

Manténgase informado con las actualizaciones semanales

Suscríbase a nuestro blog de ingeniería para recibir actualizaciones periódicas sobre los proyectos más interesantes en los que trabaja nuestro equipo.

¿Cuáles son los resultados reales?

Han pasado un par de meses y por fin hemos recibido nuestra primera remesa de estos nuevos equipos. No perdimos el tiempo y preparamos una comparación de velocidad de compilación entre los portátiles nuevos y los antiguos, y esperamos ansiosos los resultados.

Figura 2: La sincronización de varias compilaciones "limpias" de nuestro proyecto de referencia en un MacBook Pro Intel i9 de 2019 y un MacBook Pro M1 Max de 2021 mostró mejoras de rendimiento consistentes.

que hicimos en nuestra presentación. En total, nuestra construcción de referencia pasó de 7:46 min. a 3:48 min. Es decir, ¡casi el doble de rápido!

Dos veces. Como. Rápido. 

Nos pareció especialmente impresionante. Si pensamos en qué otros cambios podríamos hacer en un código de gran tamaño para acelerarlo en el mismo porcentaje -un montón de microoptimizaciones que se pueden hacer aquí, algún código obsoleto que hay que eliminar allí, etc.- no veríamos ni de lejos la misma aceleración relativa, ni siquiera con meses de trabajo.

Sin embargo, no todo son buenas noticias. Dada la fuerte demanda de estos portátiles y los continuos problemas de la cadena de suministro mundial, aún no hemos recibido los portátiles de sustitución para todos nuestros ingenieros, pero están en camino. 

¿Cómo acelerar los tiempos de compilación?

Incluso con toda esta potencia extra, la construcción media tarda minutos en completarse. No es terrible, pero no es exactamente la iteración rápida a la que aspiramos. Y a medida que nuestro equipo y nuestra base de código sigan creciendo, nuestro tiempo de compilación seguirá aumentando, probablemente más rápido de lo que Apple puede reducirlo con portátiles más rápidos. ¿Qué más podemos hacer?

Podemos modularizar nuestro código base. En lugar de tener que compilar un millón de líneas de código, dividimos la aplicación en muchos trozos de código más pequeños y trazamos las dependencias entre ellos. De este modo, los ingenieros y equipos pueden trabajar en subconjuntos del código base, lo que mejora drásticamente la velocidad de iteración del desarrollo. Aún estamos trabajando en ello, pero estamos empezando a ver algunas de las ventajas y tendremos más que decir al respecto en el futuro.

Paralelamente a nuestro esfuerzo de modularización, también estamos adoptando nuevas tecnologías como SwiftUI y Xcode Previews. Estas tecnologías nos permiten eliminar casi por completo el bucle de ajustar, compilar y ejecutar al desarrollar interfaces de usuario. En su lugar, podemos definir nuestros datos de vista previa y "código en vivo" el código de la vista real, obteniendo información casi instantánea en el lienzo de Xcode. Aunque esto sólo ayuda al desarrollo de "vistas", hemos descubierto que es un área en la que la iteración rápida es especialmente útil.

Esperamos tener más artículos que profundicen en estos métodos alternativos para acelerar nuestro desarrollo iOS así que permaneced atentos. 

Conclusión

Al fin y al cabo, si te pasas el día desarrollando profesionalmente en Xcode, no hay duda de que actualizar a uno de estos nuevos MacBook Pro M1 es una gran elección. Y si trabajar en una gran base de código iOS con un grupo de desarrolladores apasionados te parece interesante, únete a nosotros. Tendremos un MacBook Pro M1 Max esperándote.

Sobre el autor

  • Michael Thole

    Michael es ingeniero de software en DoorDash, desde finales de 2019, trabajando en el equipo de la plataforma iOS.

Trabajos relacionados

Ubicación
San Francisco, CA; Mountain View, CA; Nueva York, NY; Seattle, WA
Departamento
Ingeniería
Ubicación
San Francisco, CA; Sunnyvale, CA
Departamento
Ingeniería
Ubicación
San Francisco, CA; Sunnyvale, CA; Seattle, WA
Departamento
Ingeniería
ID de trabajo: 3013456
Ubicación
Pune, India
Departamento
Ingeniería
Ubicación
San Francisco, CA; Seattle, WA; Sunnyvale, CA
Departamento
Ingeniería