Saltar al contenido

Cómo Duolingo consiguió MVVM en Android

Ilustración de una mano sosteniendo un diagrama de un duolingo sentado encima de un pájaro

Resumen ejecutivo

La aplicación Duolingo ha comenzado a tener problemas debido a problemas con la escala de su arquitectura de software de Android. Pudieron resolver estos problemas y restaurar la productividad del desarrollador utilizando el refactor de la arquitectura Model-View-ViewModel y usando Dagger y Hilt de Android Jetpack para inyectar dependencias. Para comprender cómo esto ha afectado a su negocio, lea el artículo adjunto aquí.

Introducción

Duolingo es la aplicación de aprendizaje de idiomas más popular del mundo, con más de diez millones de estudiantes cada día porque han logrado hacer cosas que la gente pensaba que eran impactantes. Este éxito se basa en un flujo constante de innovaciones y actualizaciones, y en un programa bien administrado que puede ofrecerlas todas. Para Doolingo, una aplicación sin respuesta en un dispositivo en cualquier parte del mundo podría significar un estudiante potencialmente frustrado. Esto los obliga a perfeccionar la aplicación, especialmente en los dispositivos Android utilizados por el sesenta por ciento de sus estudiantes, incluido su CEO, que monitorea la aplicación desde un teléfono de gama media. Entonces, cuando el equipo de desarrollo de Android de Duolingo registró errores de “la aplicación no responde”, descartó marcos, e incluso recibió una queja escrita a mano, tomaron medidas de inmediato.

Su condición no era tan rara. Los programas que no tienen una arquitectura a gran escala y mejores prácticas claras a menudo funcionan bien al principio, pero muestran signos de endeudamiento técnico a medida que crecen. La base de código de Android de Duolingo se creó para que pudieran agregar y lanzar nuevas funciones rápidamente, pero la falta de una arquitectura acordada se manifestó en regresiones de rendimiento cada vez más frecuentes. Estaba empezando a experimentar la frecuencia de disparos poco fiables, interacciones visualmente inconsistentes o interrumpidas y una variedad creciente de nuevos errores. Estas regresiones le cuestan no solo a los estudiantes incómodos, sino también al equipo, los esfuerzos de desarrollo significativos para el diagnóstico y la reparación. El equipo de desarrollo de Android de Duolingo se dio cuenta de que si querían retener nuevas funciones para garantizar un nivel específico de experiencia de usuario, necesitaban un nuevo enfoque basado en su base de código.

Descubrimiento

Primero, necesitan averiguar exactamente qué estaba pasando. Profundizando en los números, se descubrió que a medida que agregan nuevas funciones, la tasa de reproducción de la aplicación disminuye entre un 5% y un 10% cada mes. De hecho, uno de los lanzamientos más pesados ​​aumentó el bloqueo en un 10%, ralentizó los disparos en un 25% y comenzó las lecciones en un 70% en dispositivos de nivel de inicio lento.

Un análisis más detallado de su código llevó a la conclusión de que la mayoría de los problemas del programa podían considerarse en un solo obstáculo: un objeto de estado global llamado DuoState, que era responsable de mantener el estado de las diversas características del programa. Varias funciones populares (p. Ej. Puntos de experiencia Y Seguimiento diario de estrías) Lo usó para acceder a información vital. Tal centralización de sus datos alguna vez permitió al equipo replicar rápidamente. Simplemente agregaron funciones a DuoState cuando se necesitaba una nueva función para compartir información en la aplicación. Pero ahora el acceso frecuente y no optimizado al objeto ha llevado a un aumento en las regresiones de rendimiento.

DuoState estaba tan estrechamente vinculado a todo el código base que incluso pequeños cambios podrían afectar al resto de la aplicación. El equipo temía que una nueva característica menor pudiera causar efectos secundarios imprevistos, lo que provocaría muchas actualizaciones internas de la aplicación, lo que haría que el lanzamiento general fuera demasiado lento para muchos dispositivos. Esta regresión se hizo más frecuente con el crecimiento de la aplicación, y el equipo contrató a nuevos ingenieros para continuar con el mapa acelerado del producto. En 2020, cuando agregaron más desarrolladores, comenzaron a desarrollar regresiones significativas, a menudo cada 90 días. En una inspección más cercana, la probabilidad de regresión en una versión dada era proporcional al número de cambios realizados por ella. A este ritmo, estas regresiones allanarán completamente el camino para el producto en unos pocos años.

Esta arquitectura obsoleta se ha convertido en un obstáculo para el trabajo de la aplicación. Y Velocidad del equipo. Después de mucho debate interno, dejaron de desarrollar nuevas funciones, algunas de las cuales estaban estrechamente relacionadas con su línea principal. En dos meses completos, el equipo de desarrollo de Duolingo comenzó a refactorizar su aplicación de Android en un esfuerzo que llamaron “reinicio de Android”.

Reinicio de Android

Una de las primeras claves del equipo fue que su código no tenía límites claros. El objeto DuoState era fácilmente accesible en cualquier parte del código, lo que hacía que los desarrolladores lo accedieran con frecuencia de manera ineficiente. Necesitaban una mayor separación de preocupaciones en la base del código. Decidieron separar cada función en su propio módulo claramente definido, utilizando el diseño arquitectónico Model-View-ViewModel. El MVVM les permitió eliminar llamadas en una instalación monolítica de DuoState, lo que permitió que varios módulos se ejecutaran en subprocesos separados.

El diagrama se muestra antes y después de la implementación del diseño arquitectónico Model-View-ViewModel

La familiaridad del equipo con MVVM y el soporte de Google lo convirtió en una elección obvia. Esto les permitió formular claramente qué lógica debería incluirse en qué archivos (incluidos registros, vistas de modelos y repositorios). Esto contribuyó a una arquitectura más consistente de sus características. Con un camino claro por recorrer, el equipo rápidamente comenzó a refactorizar su código monolítico en clases, con límites y responsabilidades claros.

Junto con MVVM, el equipo usó Dagger y Hilt (también incluido en Android Jetpack) para implementar repositorios para reemplazar DuoState. Dagger genera un código legible y claro que proporciona descripciones de errores para ayudar a los desarrolladores a comprender exactamente lo que hace su código, eliminando los rastros de pila inactiva de las propiedades reflejadas; Y Hilt reduce la cantidad de código de placa de caldera necesario para escribir esto.

Esta nueva arquitectura permitió al equipo dividir DuoState en objetos más pequeños. Esto redujo inmediatamente las conexiones innecesarias entre dominios. Por ejemplo, el código responsable del seguimiento del progreso del usuario podría obtener sus puntajes de experiencia, pero no cuántas veces se ingresaron en un mes. Estas nuevas pautas arquitectónicas significaron que, aunque ninguna de las cosas era demasiado difícil de cambiar, era necesario coordinar y planificar el cambio en la aplicación. La introducción de una nueva arquitectura basada en código ha dado lugar a importantes logros en general.

La arquitectura MVVM facilita la separación de los datos del dominio, la interfaz entre los datos del dominio y la lógica de cómo interactúan estos dos dominios. Permitió a los desarrolladores de Duolingo monitorear con más determinación cómo responde la aplicación a las actualizaciones internas. Ya pudieron desarrollar una experiencia de cliente más compleja sin riesgo de regresiones o sin afectar las reglas básicas del negocio.

Productividad del desarrollador

En el pasado, el uso inconsistente de patrones de desarrollo ha complicado y retenido varias partes de la base del código. Sin consenso, cada desarrollador utilizó el código como mejor le pareció.

MVVM, Dagger y Hilt proporcionaron al equipo una comprensión más detallada de cómo deberían implementarse las nuevas funciones. Al seguir estas mejores prácticas, el código se ha vuelto más fácil y predecible. Los desarrolladores ahora pueden ayudar con funciones en las que inicialmente no trabajaron. Y los nuevos desarrolladores pueden participar de forma más eficaz; Siempre que entendieran la arquitectura, podrían hacer una contribución significativa de inmediato. Esta nueva claridad ha aumentado significativamente la velocidad del desarrollo del equipo.

Seguro de calidad

Más importante aún, la nueva arquitectura también reveló que ciertas características de la animación del programa funcionaban mal en dispositivos de nivel más débil. En consecuencia, las otras áreas principales del reinicio de Android fueron la reducción de basura, la eliminación de marcos y los errores de aplicación que no responde (ANR). El equipo usó plantillas de repositorio para ayudar a simplificar el intercambio de datos entre subprocesos. Estas plantillas aseguraron que pudieran hacer un uso más eficiente de los recursos del dispositivo con múltiples módulos de tornillos. Mover el trabajo del hilo principal mejoró la capacidad de respuesta, la velocidad de fotogramas general y dio como resultado animaciones optimizadas en dispositivos de nivel de entrada. También se ha mejorado el rendimiento en los dispositivos insignia.

Mejor experiencia general de Android

Después de seis meses de trabajar en la nueva arquitectura, el equipo de Android de Duolingo continuó transfiriendo nuevas funciones sin registrar regresiones de rendimiento significativas. Los días en los que tenían que parar la producción artística para cazar y corregir errores quedan atrás con seguridad.

La tasa de ANR diaria de la aplicación se redujo en un 41%. El porcentaje de tiempo durante el cual la velocidad de fotogramas de la aplicación cayó por debajo del objetivo se redujo en un 28%. Y lo más importante, los usuarios han desarrollado un aumento del 40% en la velocidad a medida que avanzan por las lecciones del programa, las tablas de clasificación y las historias.

El reinicio ha permitido a Duolingo ofrecer constantemente la experiencia de aprendizaje de idiomas divertida, eficiente y agradable de la marca registrada en una gama mucho más amplia de dispositivos Android.

Conclusión

Su misión dedicada a Duolingo los ha convertido en la aplicación líder mundial en el espacio de aprendizaje de idiomas. Su compromiso de perfeccionar la aplicación, creando la última experiencia educativa sin comprometer el acceso, es lo que los dejó allí.

Si está interesado en involucrar a su equipo en su propio reinicio de Android, consulte nuestro caso de estudio para los propietarios de productos y ejecutivos involucrados aquí.