Kotlin, le Scala agile

Par défaut

Android mange du Scala = indigestion

Coder pour Android se fait normalement en Java, ce qui m’a permis d’appréhender le SDK Android assez vite, vu que je connaissais bien le langage. Puis on me parle un jour de Scala, langage qui monte à vitesse grand V dans la Silicon Valley. Curieux comme je suis, je commence à me renseigner sur l’animal et ce que je lis est alléchant : programmation fonctionnelle.

La syntaxe est concise et agréable, on est obligé de spécifier à la déclaration si l’élément est mutable ou pas, le pattern matching fini de me convaincre d’essayer. C’est alors que je me suis mis en tête de mettre du Scala dans Radis, mon application Android.

Je lis et vois plusieurs exemple de code Scala qui tourne sur Android, c’est donc possible et je me lance dans l’écriture d’une nouvelle fonctionnalité en Scala ! Les première lignes compilées, je test et ça fonctionne, chouette ! Je continue à coder la fonctionnalité, j’ajoute des dépendances à des bibliothèques Scala quand soudain, c’est le drame.

La compilation échoue pour cause de limite atteinte du nombre de méthodes. Stupéfaction, je ne savais même pas qu’il existait ce genre de limitation. En creusant un peu, j’apprends qu’effectivement, les fichiers Dex ont une limite à ce qui ressemble à max_int méthodes, et que le runtime Scala en bouffe beaucoup à lui tout seul. En parallèle, j’avais commencé un projet de client RSS en Scala pour Android, et pareil, juste le runtime Scala avec du Spring et c’était fini.

Tristesse ! Mais c’est alors que Swift est sorti pour iOS et que je me suis à chercher « Swift for Android ». Car oui, même si je ne l’ai pas expérimenté, sur le papier, Swift à l’air très bien comme langage, j’ai même interprété son annonce à un aveux d’Apple sur la shittiness d’Objective-C ^^ (on peut rêver).

Kotlin, copain d’Android

kotlinEt cette recherche donc, elle m’a fait croiser le chemin de Kotlin via un article avec le titre parfait : Kotlin, the Swift for Android. Exactement ce que je cherchais !

En le lisant, je vois que la syntaxe est très similaire et que la philosophie est la même que Scala, sauf sur un point, et un point d’importance : un runtime minimal.

Kotlin ne va pas chercher à tout recoder le SDK Java, il va utiliser les structures de données existantes et utiliser la force de ses extension functions pour rendre le SDK Java plus élégant.

Me voilà donc en train de reconvertir mon code Scala en Kotlin et les deux sont tellement similaires que le tout fut converti et débuggé en l’espace d’une demi journée (pour la feature des graphiques donc). Depuis, je convertis petit à petit le code Java vers Kotlin lors de correction de bugs par exemple et ce langage m’a permis de rendre le tout bien plus stable et m’a aidé à identifier les crash de manière plus précise, notamment grâce au fait qu’il faille absolument définir à la déclaration si l’élément peut être null ou pas.

De plus, vu que tout est fait par la même boîte, l’intégration de Kotlin dans IntelliJ est poussée et ils visent clairement tout le monde couvert par Java, sans oublier Android donc.

Le langage à toutefois un soucis important : il n’est pas encore en 1.0. Ce qui signifie qu’à chaque sortie, il se peut que des choses ne fonctionnent plus ou pire, ne fonctionnent pas exactement de la même façon. Heureusement, le blog dédié au langage documente chaque changement et donne les outils (souvent intégrés à IntelliJ) pour faire la transition sans douleur. De plus, cette fameuse 1.0 a été annoncée pour cet été 2015, ce qui mettra un terme à ce bémol et permettra à ce langage de prendre son envol.

Bref, je conseille à tout programmeurs sur JVM à essayer ce langage, et j’espère vraiment que la 1.0 lui permettra de gagner ses lettres de noblesses dans le monde professionnel. Moi je sais déjà que tous mes projets perso Android seront en Kotlin 😉

Radis 1.1

Par défaut

Et voici une nouvelle version de Radis !

Les options sont à l’honneur avec l’arrivée de 2 nouvelles options :

  • Le nombre de mois à insérer pour les échéances ;
  • L’action du tap long sur le bouton de l’ajout rapide (le tap simple prenant l’autre action).

De plus, toutes les options concernant les comptes peuvent être supplantées dans chaque compte via le formulaire de compte.

Et bien sûr des corrections de crash, de bugs divers.

Radis 1.0

Par défaut

radis512x512Ça faisait un sacré bout de temps que je n’ai pas donné de nouvelles de Radis mais enfin voici les nouveautés de la version 1.0 :

  • les graphiques !
  • la navigation par panneau latéral
  • le pointage intégré à la liste des opérations (l’écran à part pour ça ne fonctionnait pas à l’usage, je ne l’utilisais plus…)

Cette version 1.0 a rencontré pas mal de rebondissements que je vais rapidement évoquer car très technique ; demandez en commentaire pour creuser si ça vous intéresse 🙂 :

  • test de Scala pour le module des graphiques avec Android : intéressant, langage très agréable mais le runtime explose la limite des fonctions possibles dans un DEX ;
  • réécriture du module en Kotlin, qui est tout aussi agréable que Scala et qui est Android friendly ! Il souffre un peu de sa jeunesse, Kotlin change encore pas mal à chaque version ;
  • conversion à Kotlin lors de correction de bugs ;
  • passage à Gradle ;
  • passage de ACRA vers Crashlytics pour le crash reporting, ainsi que la distribution de beta (ces gars sont fantastiques, un support très sympathique !) ;
  • sortie d’Android 5 et comme j’avais un bug sur la liste d’opérations, réécriture en passant au RecyclerView et petit redesign de l’actionbar pour se aller vers les Toolbar ensuite ;
  • petite phase de test avec un utilisateur qui m’a remonté de précieux bugs ;
  • réécriture des tests automatiques avec Espresso car Robotium déconne plein tube sur Android 5 (et la lib compat 21).

Tout ça fait que pour cette version, j’ai mis 8 mois pour réussir à faire tout ce que je voulais y faire et le stabiliser 😮

Contrairement à ce que pourrait laisser penser le numéro « 1.0 » de cette version, ce n’est pas une version finale, j’ai encore des idées et des choses demandées par des utilisateurs alors le travail continue. Même si une longue pause (sauf pour les bugs) s’annonce pour cause de pas d’accès à mon PC pendant un moment, plus un autre projet qui trotte dans ma tête que je vais commencer, mais c’est une autre histoire 😉