Migration de l'application Android de LearnEasy vers 100% Kotlin – Apprendre une langue en 15 jours

LearnEasy pour Android était une application Java pour ses cinq premières années d'existence. Deux ans plus tard, c'est maintenant 100% Kotlin! Cette migration s'est avérée être un énorme succès pour nous en termes de productivité et de bonheur des développeurs.

Il existe déjà de nombreuses ressources en ligne pour apprendre Kotlin. Dans cet article, nous nous concentrerons sur notre propre expérience de déploiement de code Kotlin à des millions d'utilisateurs.

Lignes de code en Java (rouge) et Kotlin (vert) au fil du temps

Pourquoi Kotlin

Lorsque nous avons commencé à envisager Kotlin au début de 2018, la prise en charge d'Android était inférieure à un an. Il n'était pas encore clair que Kotlin atteindrait son niveau actuel de popularité ou continuerait à déloger Java en tant que langage préféré de Google pour le développement Android.

Les principaux avantages attendus:

  1. Productivité. Kotlin est beaucoup moins verbeux que Java, ce qui le rend plus rapide et plus facile à écrire et (plus important encore!) À maintenir. Son interopérabilité transparente avec Java et son approche conservatrice pour ajouter de nouvelles fonctionnalités linguistiques en font un jeu d'enfant pour tout développeur Android.
  2. La stabilité. L'historique de notre référentiel Android contient plus de 100 commits de ses jours Java dans le style de «Fix NullPointerException crash». Les fonctionnalités de sécurité nulle de Kotlin empêchent davantage de NPE d'atteindre les utilisateurs et nous permettent de nous concentrer sur d'autres problèmes lors de la révision du code car il y a tellement moins de passe-partout à passer au crible.
  3. Développeur bonheur. Kotlin figurait parmi les langues les plus appréciées des utilisateurs de Stack Overflow en 2018, juste derrière Rust. Nos propres développeurs avaient déjà réagi positivement à des mises à niveau de langage similaires sur nos deux autres plates-formes majeures: la prise en charge de Swift dans notre application iOS et notre réécriture complète de LearnEasy.com en TypeScript.

Il y avait aussi certains risques, principalement qu'une migration Kotlin ne valait pas son coût d'opportunité en temps de développement. Une autre préoccupation était que Kotlin, comme CoffeeScript, pourrait éventuellement être rendu obsolète par des améliorations rétroportées du langage qu'il visait à améliorer.

En fin de compte, nos développeurs Android ont décidé à l'unanimité que les avantages étaient suffisamment valables pour justifier une politique d'écriture de tout le nouveau code Android dans Kotlin, même si nous n'étions pas encore prêts à s'engager davantage dans une migration totale de tout le code existant.

Mettre les développeurs au courant

Tous les développeurs Android de LearnEasy se rencontrent toutes les deux semaines pour discuter des changements de plate-forme récents et à venir, des post-mortels informels et des questions-réponses. Les premiers de ces assemblages ont été consacrés à des présentations d'introduction à Kotlin basées sur des sources telles que le guide des langues officielles, Kotlin Koans, les documents officiels d'Android et la feuille de triche MindOrks.

Chaque développeur Android s'est ensuite vu attribuer du code Java à porter sur Kotlin. Nous avons créé un nouveau rôle de "vérificateur Kotlin" pour les développeurs Kotlin plus expérimentés afin de partager les meilleures pratiques lors de la révision du code; La composition de ce rôle a progressivement augmenté jusqu'à ce qu'il contienne tous nos développeurs Android et ne soit plus nécessaire.

Depuis le début, nous avons toujours assuré la cohérence du code en ancrant nos outils Kotlin et en les appliquant dans les vérifications de l'état de la pré-validation et de la requête d'extraction GitHub.

Nous lint tout le code Kotlin avec detekt, les inspections IntelliJ, Android Lint et notre propre linter basé sur des regex, Splinter.

Pour le formatage automatique du code, nous exécutons ktlint dans le cadre d'un hook de pré-validation commun partagé entre tous les référentiels de l'entreprise. (L'autre candidat principal était le formateur IntelliJ, que nous avons trouvé plus lent et un peu plus difficile à exécuter dans Docker.)

Une fois que nous sommes passés à environ 10% de Java, nous avons supprimé PMD, SpotBugs et la plupart des inspections de notre pipeline CI. Continuer à exécuter ces outils spécifiques à Java aurait ralenti notre vitesse de développement tout en n'offrant plus beaucoup de valeur.

Conversion de l'ancien Java

Afin de rendre le code examinant les conversions Kotlin aussi indolore que possible, nous avons recommandé de gérer chaque fichier source dans sa propre demande d'extraction contenant au moins trois validations distinctes:

  1. Exécutez l'autoconvertisseur IDE. Ce commit est responsable de la plupart des désabonnements LOC et n'a pas besoin d'être examiné attentivement car il est généralement sûr en ce qui concerne les erreurs d'exécution, bien qu'il puisse introduire des erreurs au moment de la compilation.
  2. Correction des erreurs de compilation. Les correctifs sont généralement simples à implémenter, par exemple ajouter @JvmStatic annotations si nécessaire.
  3. Refactor. L'auteur doit satisfaire les linters et le code refactor pour être plus idiomatique dans Kotlin, par ex. en utilisant sumBy au lieu d'une boucle for.

Nous avons constaté que la conversion d'un fichier Java en Kotlin a réduit son nombre de lignes d'environ 30% en moyenne et jusqu'à 90% dans certains cas!

kotlin-mug

Le trophée de notre concours de conversion Kotlin

Bien que le portage de l'ancien code s'intègre confortablement dans la portée du rôle d'ingénieur de notre plate-forme Android, nous nous attendions à ce qu'il soit plus difficile pour nos équipes de produits d'établir des priorités. Nous avons encouragé les développeurs des équipes de produits à convertir leurs propres fichiers les plus fréquemment touchés chaque fois qu'ils se trouvaient avec du temps libre, et – fidèle à l'esprit de LearnEasy – nous avons gamifié ce processus en organisant un concours avec un classement quotidien. Au final, les développeurs de produits ont représenté environ la moitié de toutes les conversions.

Les pierres d'achoppement

L'écosystème d'outillage de Kotlin est beaucoup plus petit que celui de Java. C'est plus que suffisant pour nos besoins, cependant – nous peluchons notre code Kotlin à peu près aussi agressivement que nous le faisions déjà sur notre code Java.

De temps en temps, nous obtenons toujours des exceptions NullPointerExceptions et IllegalArgumentExceptions de dépendances Java tierces (telles que le framework Android lui-même) qui ne suivent pas la meilleure pratique d'utilisation des annotations de nullité, laissant le compilateur Kotlin sans aucun moyen de savoir si les paramètres de leurs méthodes ou retournent les valeurs peuvent jamais être nulles. Cette situation s'est améliorée au fil du temps à mesure que Google revient en arrière et annote ses API publiques.

Kotlin n'a toujours pas de support natif pour quelques fonctionnalités Java qui vont de l'inhabituel (appelant les méthodes protégées statiques d'une superclasse) à l'arcane (invocations de constructeurs de superclasse qualifiés), mais des problèmes comme ceux-ci ont été assez faciles à contourner.

Résultats

Le nombre de lignes de notre base de code Android augmentait de 46% d'une année à l'autre jusqu'à ce que nous introduisions Kotlin au début de 2018. Deux ans, de nombreuses nouvelles fonctionnalités de produit et plus du double du nombre de contributeurs actifs plus tard, notre base de code a presque exactement la même taille maintenant qu'elle était à l'époque!

Le bonheur des développeurs selon NPS a augmenté de 129 points pour Android pendant cette période, la plupart des développeurs citant Kotlin (et nos outils autour) comme un facteur majeur.

duodroid

Nous prenons également en charge Kotlin aux côtés de Python et Java en tant que langage de première classe pour la création de services backend chez LearnEasy, ce qui a nécessité peu d'efforts supplémentaires car nous pouvons réutiliser le code Java de nos services existants et les outils Kotlin de notre référentiel Android.

Dans l'ensemble, nous sommes très heureux d'avoir migré vers Kotlin lorsque nous l'avons fait, et nous sommes ravis de voir son utilisation continuer de croître à la fois au sein de notre entreprise et dans l'industrie du logiciel!

Intéressé par le génie logiciel chez LearnEasy? Nous embauchons!

Migration de l'application Android de LearnEasy vers 100% Kotlin – Apprendre une langue en 15 jours
4.9 (98%) 732 votes
 

Leave a Comment