Hop à peine le temps de manger un sandwich au crabe, je vous raconte ce que j’ai vu aujourd’hui mercredi 12 novembre. C’est parti.
D’abord Scala 2.12 et Java 8 par Adriaan Moors, de Typesafe. La sortie de Java 8 amène bien entendu de nouvelles possibilités pour Scala. Si Java fêtera ses 20 ans le 30 janvier prochain, Scala vient juste de passer la barre des 10 ans. Les équipes de contributeurs, autour de Scala, dont plus de la moitié ne sont d’ailleurs pas salarié de Typesafe, travaillent pour que la version 2.12 soit la première version full java 8. La sortie est prévue en janvier 2016, avec cependant des premières versions de Scala 2.12 dès l’année prochaine. Il ne faudra pas attendre spécialement de gains de performances, mais d’abord moins de bytecode, donc des cycles de compilation plus rapides. Scala 2.12 utilisera obligatoirement Java 8 et arrêtera le support de Java 6.
La version 2.11 introduira d’abord de nouvelles optimisations qui vont booster les temps de compilation. Le projet de Miguel Garcia de l’EPFL se base entre autre sur Java8 afin de revoir les outils d’optimisations utilisés lorsque l’on compile du code Scala vers du byte-code Java.
La présentation d’Adriaan était intéressante car il a utilisé le REPL Scala avec Java 8… pour taper du code Java 8 en live et donc montrer quelques fonctionnalités de Java 8, pour ensuite se concentrer sur Scala.
Pour en savoir plus, je vous invite à regarder la roadmap de Scala 2.12
Après une grosse pause déjeuner et son fameux sandwich, je me pose dans une salle archi-complète, la salle 8, où Chet Haase de Google se prépare pour faire l’un de ses fameux talks « barés ». Cheet est l’un des lead-architects de la plateforme Android, plus particulièrement du côté UI. En dehors d’être un excellent speaker, il faut aussi du stand-up/one-man-show. Et donc, équipé d’une cravate, de slides improbables et d’un texte improvisé, il nous a bien fait rire pendant 15 mn sur les délires d’un consultant « process-process-process ».
Morceau choisi :
« Si vous écrivez plus de code, cela génère plus de bugs et d’erreurs. Donc on peut dire que error=(more code) au carré… ou plutôt e = mc2 »Si vous voulez rire 15mn, je vous recommande « Patterns Shmatterns »
Conférence suivante, sur le Big Data et l’Analytics avec « Lightning Fast Big Data Analytics with Apache Spark » par Gerard Maas et Andy Petrella. Cette présentation très didactique montre le framework Apache Spark, ainsi que l’écosystème d’outils autour de Spark. Le framework permet d’écrire en Java, en Scala ou en Python du code, orienté fonctionnel, afin de pouvoir exécuter des traitements massivement parallèles, sur des clusters. Spark propose d’abord un modèle de programmation simple, intuitif surtout lorsque l’on vient du monde Scala (map, flatMap, split, reduceByKey…) que les 2 speakers montrent avec des exemples de code. Côté rapidité, Spark est donné comme étant plus rapide qu’Hadoop, tout en étant en mesure de résoudre le même type de problèmes.
Andy présente aussi Spark SQL, Spark Streaming puis ML Lib pour le machine learning, et parle rapidement de GraphX. Ce que j’ai retenu en effet c’est qu’il est vraiment plus simple d’écrire du code, qui ensuite sera optimisé et exécuté en cluster, en ayant une approche fonctionnelle.
Je continue avec une autre conférence sur la programmation fonctionnelle, avec « What Have the Monads Ever Done For Us ? » par Dick Wall. Du temps des Romains, les citoyens se disaient « à part la démocratie, l’eau potable, la sécurité, la fin de la guerre et la république, qu’ont-ils vraiment fait pour nous ? »
Sans le savoir, vous avez très certainement utilisé des Monades. La présentation était très simple et orientée pour les développeurs n’ayant aucunes connaissances préalables sur les Monoïdes, les Functors et donc les Monades.
Un Monoid en quelque mot, c’est un accumulateur avec une valeur initiale et une fonction de combination. L’addition, la multiplication ou la concaténation sont des exemples qui peuvent s’implémenter avec un monoid. La soustraction et la division ne le sont pas, car un monoid doit respecter une loi d’associativié. Or l’ordre d’exécution a de l’importance sur une soustraction ou une division.
a apply(b apply c) == (a apply b) apply c
Vous pouvez vous lancer et écrire votre interface de Monoid en Java en quelques lignes :
public interface Monoid<T> { T identity(); T combine(T a, T b); default T applyOn(Stream<T> stream) { return stream.reduce(identity(), this::operator); } }
Dick présente ensuite quelques implémentations en Java 8 afin de montrer comment utiliser des Monoids, avant d’aborder les Functors. C’est assez simple, un Functor c’est d’abord un object qui représente une fonction. Avant Java 8, il était déjà possible mais assez compliqué de mettre en place ce principe. Java 8 permet maintenant de s’en approcher. Un functor permet par exemple de transformer une liste d’éléments en appliquant une fonction. Un Functor a donc une fonction « map » qui prend en argument une fonction et qui retourne une nouvelle chose du même type, mais transformé. L’exemple de base est l’implémentation des listes chaînées, l’exemple le plus simple pour comprendre l’utilisation et l’intérêt des Functors.
Un exemple de Functor serait une fonction de comparaison,
public class TestFunctor { public static void main(String[] args) { List<Integer> list = Arrays.asList(10, 45, 24, 22, 9, 3); Comparator<Integer> intComparatorMySuperFunctor = Integer::compareTo; Collections.sort(list, numStringComparator); } }
Un autre exemple d’utilisation en Java 8, c’est Optional, dont j’ai parlé dans un article précédent. Visualisez Functor comme un conteneur, capable de prendre un type A en entrée et de retourner un type B, en appliquant une fonction. Dans l’exemple ci-dessus, intComparatorSuperFunctor prend 2 Integer en entrée et retourne un boolean.
Dick présente ensuite les Monades, et leur mise en oeuvre en Java 8. C’est faisable mais verbeux et finalement, je pense que cela restera peu ou pas utilisé en Java. Enfin il termine par la mise en oeuvre de monade avec les for-comprehension de Scala. For-comprehension est du pur sucre syntaxique qui simplifie l’écriture et l’utilisation des monades, sans devoir utiliser map/flatMap.
En reculant un peu, nous en sommes là en 2014. Java 8 ouvre la porte vers la programmation fonctionnelle, mais cela n’en fait pas un langage fonctionnel. Scala est quelque part plus loin, sans proposer ce que fait Haskell. Est-ce que finalement tout ceci permet vraiment de simplifier notre code ? Je pense que oui. L’exemple de Dick Wall (impossible pour moi à transcrire ici) avec la composition de Future, montre des cas très concrets d’utilisation.
Dans les mois qui viennent, venez voir ce que propose Java 8, afin de ne pas louper le prochain train. Il est clair que le fonctionnel a le vent en poupe.
Pour terminer j’ai pu assister à une partie de la présentation de Brian Goetz (l’un des core-developper de Java) sur les projets pour les versions futures de Java. Il a expliqué entre autre l’idée de value class pour Java 9/10. Une value class, c’est quelque chose qui se code comme une classe mais fonctionne comme un type simple. Les values class sont implicitement finales et immutables. Vous pouvez donc les passer par valeur. Cependant une value class peut avoir des champs, des méthodes, des modificateurs d’accessibilité… comme une classe. Enfin les values class n’extendent pas java.lang.Object.
Pour aller plus loin sur ce sujet :
Value Types by B.Goetz, J.Rose & G.Steele
Value Types explained for Java
Conclusion de la première journée
Côté contenu, j’ai vu de bonnes conférences. En discutant avec d’autres Français, un peu moins présent d’ailleurs cette année, j’ai entendu de bons échos sur Polymer, material design, machine learning, les présentations sur les algorithmes d’apprentissage. Il y avait aussi pas mal de présentations plus classiques sur Java et JavaEE.
Let’s go pour la 2ème journée !!!
0 no like