16 puntos por xguru 2024-12-23 | Aún no hay comentarios. | Compartir por WhatsApp
  • Meta está migrando su base de código Android de Java a Kotlin a través de un proyecto de varios años
  • Actualmente administra una de las bases de código Android más grandes del mundo y ya convirtió con éxito más de la mitad a Kotlin
    • Meta adoptó una estrategia de desarrollo Kotlin-first desde 2020
  • Razones para convertir todo el código:
    • Para aprovechar al máximo los beneficios de Kotlin en "mayor productividad" y "seguridad ante nulos", decidió convertir incluso sus decenas de millones de líneas de código Java existentes
    • Reforzar la seguridad ante nulos y resolver problemas de una base de código mixta
      • La compilación mixta (compilar Java y Kotlin al mismo tiempo) hace que la velocidad de build sea la más lenta
      • El código Java restante provoca problemas de seguridad ante nulos: el código Java que no es null-safe puede convertirse en una causa potencial de NullPointerException (NPE) en el grafo de dependencias
      • Kotlin garantiza la seguridad ante nulos mediante validaciones en tiempo de ejecución

Proceso de automatización

  • Al principio ejecutaban repetidamente la herramienta de conversión J2K del IDE IntelliJ
    • En la enorme base de código de Meta, esto requería más de 100,000 clics y cada ejecución tomaba varios minutos
    • Como resultado, este método era ineficiente por su falta de escalabilidad
  • Desarrollaron la herramienta de automatización: Kotlinator
  • Proceso de conversión en 6 pasos
    1. Deep Build: compilar el código a convertir para que el IDE pueda resolver todos los símbolos. Incluye dependencias de terceros y código generado
    2. Preprocessing: basado en la herramienta personalizada de Meta, Editus. Incluye unas 50 etapas, como manejo de seguridad ante nulos y dependencias, además de workarounds para J2K
    3. Headless J2K: modificaron J2K para que pudiera ejecutarse en un entorno de servidor
    4. Postprocessing: unas 150 etapas, incluyendo cambios específicos de Android, seguridad ante nulos y aplicación del estilo de Kotlin
    5. Linters: mejora continua de la calidad de conversión mediante correcciones automáticas
    6. Build Error-based Fixes: analizar errores de build y aplicar correcciones adicionales

Hacer J2K headless

  • Modificaron J2K para que pudiera ejecutarse de forma remota:
    • J2K estaba fuertemente acoplado al IDE IntelliJ, por lo que era difícil ejecutarlo de forma independiente
    • Al principio consideraron usar el entorno de pruebas de IntelliJ para ejecutarlo, pero tras conversar con el experto en J2K de JetBrains (Ilya Kirillov), cambiaron al enfoque de inspección headless
    • Lo implementaron creando un plugin de IntelliJ que extiende la clase ApplicationStarter y llama a la clase JavaToKotlinConverter de J2K
  • Ventajas del enfoque headless
    • Solución a problemas del IDE local: los desarrolladores pueden trabajar sin tener que hacer clic directamente en botones del IDE
    • Conversión simultánea de varios archivos: hizo posible procesar archivos a gran escala
    • Menor tiempo consumido: aunque el tiempo de conversión en sí aumentó a unos 30 minutos, el tiempo que consumen los desarrolladores se redujo considerablemente
    • Soporte para build y corrección de errores: etapas útiles pero costosas en tiempo (como las correcciones después del build) pueden ejecutarse automáticamente de forma remota
  • Automatización y revisión de código
    • Usando sistemas internos de Meta, generan trabajos batch diarios:
    • Se crean diffs por lotes según criterios personalizados (la versión de pull request de Meta)
    • Se asignan revisores automáticamente y, tras ejecutar pruebas y validaciones, finalmente se despliega el diff aprobado
  • Proveen una UI web: los desarrolladores pueden activar de forma remota la conversión de archivos o módulos específicos
  • Cómo deciden el orden de conversión
    • No fuerzan un orden específico:
      • Se da prioridad a los archivos en desarrollo activo
      • Kotlinator maneja automáticamente el grafo de dependencias para resolver problemas de compatibilidad con archivos externos
      • Ejemplo: actualiza automáticamente foo.getName() a foo.name

Otros puntos

  • Agregaron etapas personalizadas de Preprocessing (Java->Java) y Postprocessing (Kotlin->Kotlin)
  • Mejoraron la calidad de conversión usando la herramienta interna Editus de Meta y la biblioteca PSI de JetBrains
  • Nullsafe y NullAway

Presente y futuro de la conversión a Kotlin

  • Ya se convirtió a Kotlin más de la mitad del código Java de Android de Meta (o parte del código fue eliminado)
  • Sin embargo, la mitad fácil ya terminó:
    • El trabajo restante es complejo y de gran escala
    • Para una conversión completamente automatizable, será necesario agregar pasos personalizados o contribuir a mejorar J2K
    • En el caso de la conversión semiautomática, el objetivo es lograr despliegues fluidos y seguros mejorando Kotlinator
  • Consideran que otras empresas probablemente también estén enfrentando problemas similares al convertir código Android
  • Meta compartió las soluciones obtenidas durante el proceso de mejora y optimización de sus herramientas de conversión
  • Propuesta de colaboración:
    • Discutir con otros desarrolladores en el canal #j2k de Kotlinlang Slack
    • Compartiendo casos y soluciones entre todos, sería posible construir una mejor experiencia de conversión

Aún no hay comentarios.

Aún no hay comentarios.