dans un environnement professionnel
Questions Quels langages et paradigmes connaissez vous? Procédural/Structuré? C, VB, Delphi? Objet? Java, C#, C++, PHP, Python, Ruby? Déclaratif? SQL? Logique? Prolog? Fonctionnel? Haskell, Ocaml?
Présentation
Un exemple On veut lancer 2 dés à 6 faces, 200 fois
Un exemple On veut lancer 2 dés à 6 faces, 200 fois On calcule la somme des 2 faces pour chaque lancer
Un exemple On veut lancer 2 dés à 6 faces, 200 fois On calcule la somme des 2 faces pour chaque lancer On affiche l histogramme correspondant, en mode texte
Un exemple On veut lancer 2 dés à 6 faces, 200 fois On calcule la somme des 2 faces pour chaque lancer On affiche l histogramme correspondant, en mode texte 2: XXXX 3: XXXXXXXXXX 4: XXXXXXXXXXXXXXXXXXXXXX 5: XXXXXXXXXXXXXXXXXXXXX 6: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 7: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 8: XXXXXXXXXXXXXXXXXXXXXXXXXX 9: XXXXXXXXXXXXXXXXXXXXX 10: XXXXXXXXXXXXXX 11: XXXXXXXXXXXX 12: XXXX
Une solution en Java
Une solution en Scala
La «vraie» solution en Scala Stream.continually(util.Random.nextInt(6)+util.Random.nextInt(6)+2).take(200).groupBy(identity).toList.sortBy(_._1).foreach { case(a, b) => println(a+":" + "X" * b.size) }
Pourquoi s y intéresser Un meilleur Java 100% compatible
Pourquoi s y intéresser Un meilleur Java 100% compatible Plus concis
Pourquoi s y intéresser Un meilleur Java 100% compatible Plus concis Inférence de types
Pourquoi s y intéresser Un meilleur Java 100% compatible Plus concis Inférence de types Librairie standard plus riche (collections, String )
Pourquoi s y intéresser Un meilleur Java 100% compatible Plus concis Inférence de types Librairie standard plus riche (collections, String ) Plus puissant : n- uplets, définition d opérateurs, pattern matching, DSL
Pourquoi s y intéresser Un meilleur Java 100% compatible Plus concis Inférence de types Librairie standard plus riche (collections, String ) Plus puissant : n- uplets, définition d opérateurs, pattern matching, DSL Interpréteur pour les tâches «rapides»
Un meilleur Java package example trait Similarity { def issimilar(x: Any): Boolean def isnotsimilar(x: Any): Boolean =!issimilar(x) } class Point(val x: Int = 0, val y: Int = 0) extends Similarity { def issimilar(obj: Any) = obj.isinstanceof[point] && obj.asinstanceof[point].x == x def +(p: Point) = new Point(x+p.x, y+p.y) } object Point extends App { val p1 = new Point(1, 2) val p2 = new Point val p3 = new Point(5) val p4 = new Point(y=6) val p5 = p2 + p4 println(p2.isnotsimilar(p5)) }
Pourquoi s y intéresser La programmation fonctionnelle est de plus en plus fréquente : Java 8, C#, VB#, F#, C++ 11, Swift, Fortran 95, PHP 5.3, Ruby/Python, Map/ Reduce
Pourquoi s y intéresser La programmation fonctionnelle est de plus en plus fréquente : Java 8, C#, VB#, F#, C++ 11, Swift, Fortran 95, PHP 5.3, Ruby/Python, Map/ Reduce Un des rares langages vraiment hybride
Pourquoi s y intéresser La programmation fonctionnelle est de plus en plus fréquente : Java 8, C#, VB#, F#, C++ 11, Swift, Fortran 95, PHP 5.3, Ruby/Python, Map/ Reduce Un des rares langages vraiment hybride Il est plus intéressant pour un programmeur de connaître d autres langages que d approfondir celui qu il maitrise
2012 Pourquoi s y intéresser
2015 Pourquoi s y intéresser
Pour la petite histoire Développé en Europe (à l EPFL) Conçu par Martin Odersky A conçu Generic Java qui va donner les génériques qu on connaît depuis Java 5 Le compilateur qu il a écrit va être repris par Sun pour faire javac Puis il a voulu faire un «meilleur» Java, moins limitant A commencé par Funnel, simple mais trop «pur», élégant d un point de vue théorique mais peu pratique En 2002/2004, Scala apparaît : plus pragmatique mais toujours mixant fonctionnel et objet
La programmation fonctionnelle
La programmation fonctionnelle Un vaste sujet qui nécessiterait plusieurs cours
La programmation fonctionnelle Un vaste sujet qui nécessiterait plusieurs cours Un programme est une fonction, composé d autres fonctions
La programmation fonctionnelle Un vaste sujet qui nécessiterait plusieurs cours Un programme est une fonction, composé d autres fonctions On transforme des données, on ne les modifie pas (elles sont immutables comme String en Java)
La programmation fonctionnelle Un vaste sujet qui nécessiterait plusieurs cours Un programme est une fonction, composé d autres fonctions On transforme des données, on ne les modifie pas (elles sont immutables comme String en Java) Historiquement, cela fait des langages plus lents et typés «recherche universitaire»
La programmation fonctionnelle Un vaste sujet qui nécessiterait plusieurs cours Un programme est une fonction, composé d autres fonctions On transforme des données, on ne les modifie pas (elles sont immutables comme String en Java) Historiquement, cela fait des langages plus lents et typés «recherche universitaire» Mais de plus en plus utilisé dans le monde réel (Erlang, R)
Composition
Composition def randomchars = Stream.continually(util.Random.nextPrintableChar)
Composition def randomchars = Stream.continually(util.Random.nextPrintableChar) def randomcharswithlength(n: Int) = { val length = util.random.nextint(n) randomchars.take(length) }
Composition def randomchars = Stream.continually(util.Random.nextPrintableChar) def randomcharswithlength(n: Int) = { val length = util.random.nextint(n) randomchars.take(length) } def randomcharstream(n: Int) = Stream.continually(randomCharsWithLength(n))
Composition
Composition def randomstrings(n: Int) = randomcharstream(n).map { s => s.mkstring }
Composition def randomstrings(n: Int) = randomcharstream(n).map { s => s.mkstring } def find(n: Int, count: Int, s: String) = randomstrings(n).take(count).filter(_.contains(s))
Composition def randomstrings(n: Int) = randomcharstream(n).map { s => s.mkstring } def find(n: Int, count: Int, s: String) = randomstrings(n).take(count).filter(_.contains(s)) randomstrings(10).zipwithindex.find(_._1.contains( "foo")).map { _._2 }
Composition
Composition def firsta = randomstrings(10).zipwithindex.find(_._1.contains("a")).m ap { _._2 }.getorelse(0)
Composition def firsta = randomstrings(10).zipwithindex.find(_._1.contains("a")).m ap { _._2 }.getorelse(0) def averagea(n: Int) = Stream.continually(firstA).take(n).reduce(_+_)/n
Composition def firsta = randomstrings(10).zipwithindex.find(_._1.contains("a")).m ap { _._2 }.getorelse(0) def averagea(n: Int) = Stream.continually(firstA).take(n).reduce(_+_)/n def parallelaveragea(n: Int) = Stream.continually(firstA).take(n).par.reduce(_+_)/n
Les gains
Les gains Map/reduce : on code moins, on peut paralléliser, distribuer
Les gains Map/reduce : on code moins, on peut paralléliser, distribuer Option : plus de null pointer et on utilise map
Les gains Map/reduce : on code moins, on peut paralléliser, distribuer Option : plus de null pointer et on utilise map Code plus fiable Commutateur en Erlang: 31.5 ms d indisponibilité par an http://web.cs.ucdavis.edu/~filkov/papers/ lang_github.pdf
Les gains Map/reduce : on code moins, on peut paralléliser, distribuer Option : plus de null pointer et on utilise map Code plus fiable Commutateur en Erlang: 31.5 ms d indisponibilité par an http://web.cs.ucdavis.edu/~filkov/papers/ lang_github.pdf On réutilise plus le code qu en programmation objet
Scala : un langage hybride
Scala : un langage hybride On garde la mutabilité
Scala : un langage hybride On garde la mutabilité On peut commencer en mode «meilleur Java»
Scala : un langage hybride On garde la mutabilité On peut commencer en mode «meilleur Java» Puis introduire de l immutabilité et des fonctions progressivement
Scala : un langage hybride On garde la mutabilité On peut commencer en mode «meilleur Java» Puis introduire de l immutabilité et des fonctions progressivement Les performances sont équivalentes à Java
Scala : un langage hybride On garde la mutabilité On peut commencer en mode «meilleur Java» Puis introduire de l immutabilité et des fonctions progressivement Les performances sont équivalentes à Java Très puissant : opérateurs, XML et autres DSLs, implicits, macros...
Scala : un langage hybride On garde la mutabilité On peut commencer en mode «meilleur Java» Puis introduire de l immutabilité et des fonctions progressivement Les performances sont équivalentes à Java Très puissant : opérateurs, XML et autres DSLs, implicits, macros... Mais il faut savoir se limiter : http://www.scala- lang.org/ old/node/8610
Les niveaux suivant Odersky Level A1: Beginning application programmer Java- like statements and expressions: standard operators, method calls, conditionals, loops, try/catch class, object, def, val, var, import, package Infix notation for method calls Simple closures Collections with map, filter, etc. for- expressions Level A2: Intermediate application programmer Pattern matching Trait composition Recursion, in particular tail recursion XML literals Level A3: Expert application programmer Folds, i.e. methods such as foldleft, foldright Streams and other lazy data structures Actors Combinator parsers Level L1: Junior library designer Type parameters Traits Lazy vals Control abstraction, currying By- name parameters Level L2: Senior library designer Variance annotations Existential types (e.g., to interface with Java wildcards) Self type annotations and the cake pattern for dependency injection Structural types (aka static duck typing) Defining map/flatmap/withfilter for new kinds of for- expressions Extractors Level L3: Expert library designer Early initializers Abstract types Implicit definitions Higher- kinded types
Dans le monde réel
Ecosystème
Ecosystème On peut utiliser toutes les librairies Java
Ecosystème On peut utiliser toutes les librairies Java Certaines ont des «wrappers» : Swing, slf4j, Google Guice, JPA, JMX, MongoDB, Hadoop, Spring
Ecosystème On peut utiliser toutes les librairies Java Certaines ont des «wrappers» : Swing, slf4j, Google Guice, JPA, JMX, MongoDB, Hadoop, Spring D autres supportent naturellement Java et Scala : Play, Akka, Spark...
Ecosystème On peut utiliser toutes les librairies Java Certaines ont des «wrappers» : Swing, slf4j, Google Guice, JPA, JMX, MongoDB, Hadoop, Spring D autres supportent naturellement Java et Scala : Play, Akka, Spark... Les librairies Java s utilisent telles quelles mais on écrit plus de code
Ecosystème On peut utiliser toutes les librairies Java Certaines ont des «wrappers» : Swing, slf4j, Google Guice, JPA, JMX, MongoDB, Hadoop, Spring D autres supportent naturellement Java et Scala : Play, Akka, Spark... Les librairies Java s utilisent telles quelles mais on écrit plus de code Supporté par Eclipse, Idea, Netbeans, Emacs et autres
Scalatest
Equivalent de Junit Scalatest
Scalatest Equivalent de Junit Mais en Scala donc un DSL
Scalatest
Spark
Spark Implémente map/reduce comme Hadoop mais en plus rapide
Spark Implémente map/reduce comme Hadoop mais en plus rapide Utilisé par Amazon, Ebay, IBM, NASA, Yahoo...
Spark Implémente map/reduce comme Hadoop mais en plus rapide Utilisé par Amazon, Ebay, IBM, NASA, Yahoo... Très simple
Spark Implémente map/reduce comme Hadoop mais en plus rapide Utilisé par Amazon, Ebay, IBM, NASA, Yahoo... Très simple Trés rapide : peut trier 100 To en 23 min et 1000 To en 234 min
Spark Implémente map/reduce comme Hadoop mais en plus rapide Utilisé par Amazon, Ebay, IBM, NASA, Yahoo... Très simple Trés rapide : peut trier 100 To en 23 min et 1000 To en 234 min https://databricks.com/blog/2014/10/10/spark- petabyte- sort.html
Spark def avg(n: Int) = sc.parallelize(1 to n).map{ i => firsta }.reduce(_+_)/n
Spark def avg(n: Int) = sc.parallelize(1 to n).map{ i => firsta }.reduce(_+_)/n def time[a](f: => A) = { val s = System.nanoTime val ret = f printf("time: %.2f sec\n", (System.nanoTime- s)/ 1.0e9) ret }
Scala.js On écrit en Scala et il compile en Javascript
Scala.js On écrit en Scala et il compile en Javascript Le code est concis et efficace
Scala.js On écrit en Scala et il compile en Javascript Le code est concis et efficace Intégré avec Node.js et autres
Scala.js On écrit en Scala et il compile en Javascript Le code est concis et efficace Intégré avec Node.js et autres On peut le voir comme un exemple «ultime» de DSL
Scala.js
Scala.Js
Play Un framework complet pour faire des sites Web Utilisable en Java et Scala Typé «rapide et efficace», moins de contraintes que J2EE, rechargement à chaud Utilisé par LinkedIn, Coursera
Play Très complet : RESTful Templates Authentification CRUD Validation (par annotations) Planificateur de tâches SMTP mailer JSON & XML Persistence basée sur JPA Embarque une base de données pour simplifier les tests (h2) Embarque un framework de tests etc.
Play
Autres https://wiki.scala- lang.org/display/sw/tools +and+libraries https://twitter.github.io/
Twitter Ils utilisaient (et utilisent) Ruby et Ruby on Rails
Twitter Ils utilisaient (et utilisent) Ruby et Ruby on Rails Très efficace pour le front- end mais peu adapté aux traitements longs (performance, GC...)
Twitter Ils utilisaient (et utilisent) Ruby et Ruby on Rails Très efficace pour le front- end mais peu adapté aux traitements longs (performance, GC...) Besoin d un typage fort
Twitter Ils utilisaient (et utilisent) Ruby et Ruby on Rails Très efficace pour le front- end mais peu adapté aux traitements longs (performance, GC...) Besoin d un typage fort Ils ont regardé d autres langages : C++, Python, Erlang, Java, JRuby...
Twitter Ils utilisaient (et utilisent) Ruby et Ruby on Rails Très efficace pour le front- end mais peu adapté aux traitements longs (performance, GC...) Besoin d un typage fort Ils ont regardé d autres langages : C++, Python, Erlang, Java, JRuby... La gestion de la concurrence est un gros plus dans Scala
Guardian.co.uk Fondé en 1821 mais a choisi de devenir principalement numérique
Guardian.co.uk Fondé en 1821 mais a choisi de devenir principalement numérique La 1 ère architecture était basée sur Java, Spring, Hibernate, Velocity et Oracle
Guardian.co.uk Fondé en 1821 mais a choisi de devenir principalement numérique La 1 ère architecture était basée sur Java, Spring, Hibernate, Velocity et Oracle Mais elle était trop monolithique et pas assez flexible => l ajout de nouvelles fonctions était long
Guardian.co.uk Fondé en 1821 mais a choisi de devenir principalement numérique La 1 ère architecture était basée sur Java, Spring, Hibernate, Velocity et Oracle Mais elle était trop monolithique et pas assez flexible => l ajout de nouvelles fonctions était long Python + Django était une solution viable mais qui nécessitait de réécrire le code Java
Guardian.co.uk Ils utilisaient Scala à travers Scalatest pour leur code Java
Guardian.co.uk Ils utilisaient Scala à travers Scalatest pour leur code Java Ils ont donc généralisé son usage
Guardian.co.uk Ils utilisaient Scala à travers Scalatest pour leur code Java Ils ont donc généralisé son usage Puis sont passé à Play + Akka
Guardian.co.uk Ils utilisaient Scala à travers Scalatest pour leur code Java Ils ont donc généralisé son usage Puis sont passé à Play + Akka Plus de 2 millions de pages vues par jour
Guardian.co.uk Ils utilisaient Scala à travers Scalatest pour leur code Java Ils ont donc généralisé son usage Puis sont passé à Play + Akka Plus de 2 millions de pages vues par jour 0 interruption de service
Autres LinkedIn (ont construit Apache Kafka) Electricité de France Trading Novell Xerox FourSquare Sony Siemens
Echecs
Echecs Yammer (www.yammer.com) est un réseau social d entreprise
Echecs Yammer (www.yammer.com) est un réseau social d entreprise Après avoir décidé de migrer de Scala à Java, ils ont fait machine arrière en 2011
Echecs Yammer (www.yammer.com) est un réseau social d entreprise Après avoir décidé de migrer de Scala à Java, ils ont fait machine arrière en 2011 Ils citent : La complexité du langage D avoir sous- estimé le travail de formation et la difficulté de trouver des programmeurs Scala expérimentés Une compatibilité ascendante imparfaite Des problèmes de performance
Echecs Yammer (www.yammer.com) est un réseau social d entreprise Après avoir décidé de migrer de Scala à Java, ils ont fait machine arrière en 2011 Ils citent : La complexité du langage D avoir sous- estimé le travail de formation et la difficulté de trouver des programmeurs Scala expérimentés Une compatibilité ascendante imparfaite Des problèmes de performance La plupart des objections relèvent de l organisation ou ne sont plus valides
Echecs Yammer (www.yammer.com) est un réseau social d entreprise Après avoir décidé de migrer de Scala à Java, ils ont fait machine arrière en 2011 Ils citent : La complexité du langage D avoir sous- estimé le travail de formation et la difficulté de trouver des programmeurs Scala expérimentés Une compatibilité ascendante imparfaite Des problèmes de performance La plupart des objections relèvent de l organisation ou ne sont plus valides Mais il ne faut pas sous- estimer le coût du changement et savoir le faire progressivement
Notre expérience
Density
Density Editeur de progiciels pour la gestion d actifs, les mutuelles...
Density Editeur de progiciels pour la gestion d actifs, les mutuelles... 1 millions de lignes de Java en 10 ans
Density Editeur de progiciels pour la gestion d actifs, les mutuelles... 1 millions de lignes de Java en 10 ans 300 000 lignes «techniques», 700 000 lignes «métier»
Density Editeur de progiciels pour la gestion d actifs, les mutuelles... 1 millions de lignes de Java en 10 ans 300 000 lignes «techniques», 700 000 lignes «métier» Scala utilisé depuis 2 ans pour le nouveau code technique
Density Editeur de progiciels pour la gestion d actifs, les mutuelles... 1 millions de lignes de Java en 10 ans 300 000 lignes «techniques», 700 000 lignes «métier» Scala utilisé depuis 2 ans pour le nouveau code technique Le code «métier» reste en Java (8 depuis peu)
Les connections «résilientes»
Les connections «résilientes» L application garde des connections à la base de données
Les connections «résilientes» L application garde des connections à la base de données On veut qu elle détecte les pertes de connection, prévienne l utilisateur et lui propose de se reconnecter
Les connections «résilientes» L application garde des connections à la base de données On veut qu elle détecte les pertes de connection, prévienne l utilisateur et lui propose de se reconnecter Mais cela peut arriver n importe où dans le code (persistence automatique)
Les connections «résilientes» L application garde des connections à la base de données On veut qu elle détecte les pertes de connection, prévienne l utilisateur et lui propose de se reconnecter Mais cela peut arriver n importe où dans le code (persistence automatique) Certains opérations peuvent être réessayées, d autres non
Les connections «résilientes» L application garde des connections à la base de données On veut qu elle détecte les pertes de connection, prévienne l utilisateur et lui propose de se reconnecter Mais cela peut arriver n importe où dans le code (persistence automatique) Certains opérations peuvent être réessayées, d autres non http://javatoscala.com/
Les connections «résilientes»
Les connections «résilientes» On encapsule les connection et les «statements» dans une facade
Les connections «résilientes» On encapsule les connection et les «statements» dans une facade On l écrit en Java avec Eclipse
Les connections «résilientes» On encapsule les connection et les «statements» dans une facade On l écrit en Java avec Eclipse On convertit en Scala avec http:// javatoscala.com/
Les connections «résilientes» On encapsule les connection et les «statements» dans une facade On l écrit en Java avec Eclipse On convertit en Scala avec http:// javatoscala.com/ On écrit un «retry» et on le met devant les méthodes qui le supportent
Les connections «résilientes»
Les connections «résilientes» On encapsule les connection et les «statements» dans une facade avec la même interface
Les connections «résilientes» On encapsule les connection et les «statements» dans une facade avec la même interface On l écrit en Java avec Eclipse
Les connections «résilientes» On encapsule les connection et les «statements» dans une facade avec la même interface On l écrit en Java avec Eclipse On convertit en Scala avec http:// javatoscala.com/
Les connections «résilientes» On encapsule les connection et les «statements» dans une facade avec la même interface On l écrit en Java avec Eclipse On convertit en Scala avec http:// javatoscala.com/ On écrit «retry», «safely» et on les met devant les méthodes qui le supportent
Les connections «résilientes»
Reporting avec Birt
Reporting avec Birt On intègre un outil de reporting open- source : Birt
Reporting avec Birt On intègre un outil de reporting open- source : Birt Ecrit en Java
Reporting avec Birt On intègre un outil de reporting open- source : Birt Ecrit en Java API complexe
Reporting avec Birt On intègre un outil de reporting open- source : Birt Ecrit en Java API complexe Le gain est faible
Reporting avec Birt
Reporting avec Birt
Un compilateur de formules
Un compilateur de formules Le but est de définir des formules sur les champs de nos objets
Un compilateur de formules Le but est de définir des formules sur les champs de nos objets Nous utilisons un interpréteur Java modifié (BeanShell) mais c est lent
Un compilateur de formules Le but est de définir des formules sur les champs de nos objets Nous utilisons un interpréteur Java modifié (BeanShell) mais c est lent L éditeur ne fait pas de complétion comme un IDE
Un compilateur de formules
Un compilateur de formules Pour l éditeur, nous utilisons Ensime embarqué
Un compilateur de formules Pour l éditeur, nous utilisons Ensime embarqué Si on a une classe Java Foo avec geta et getb, on génère, on compile et on charge :
Avantages et inconvénients : notre expérience
Avantages et inconvénients : notre expérience Avantages
Avantages et inconvénients : notre expérience Avantages Très puissant
Avantages et inconvénients : notre expérience Avantages Très puissant Plus concis, plus agréable à programmer
Avantages et inconvénients : notre expérience Avantages Très puissant Plus concis, plus agréable à programmer Permet d envisager le parallélisme plus sereinement
Avantages et inconvénients : notre expérience Avantages Très puissant Plus concis, plus agréable à programmer Permet d envisager le parallélisme plus sereinement Permet de faire du code plus fiable tout en restant rapide
Avantages et inconvénients : notre expérience Avantages Très puissant Plus concis, plus agréable à programmer Permet d envisager le parallélisme plus sereinement Permet de faire du code plus fiable tout en restant rapide Inconvénients
Avantages et inconvénients : notre expérience Avantages Très puissant Plus concis, plus agréable à programmer Permet d envisager le parallélisme plus sereinement Permet de faire du code plus fiable tout en restant rapide Inconvénients Langage complexe et presque trop riche : il faut savoir se limiter
Avantages et inconvénients : notre expérience Avantages Très puissant Plus concis, plus agréable à programmer Permet d envisager le parallélisme plus sereinement Permet de faire du code plus fiable tout en restant rapide Inconvénients Langage complexe et presque trop riche : il faut savoir se limiter Besoin de changer (un peu) notre environnement de développement
Avantages et inconvénients : notre expérience Avantages Très puissant Plus concis, plus agréable à programmer Permet d envisager le parallélisme plus sereinement Permet de faire du code plus fiable tout en restant rapide Inconvénients Langage complexe et presque trop riche : il faut savoir se limiter Besoin de changer (un peu) notre environnement de développement Recrutement possible mais moins facile
Avantages et inconvénients : notre expérience Avantages Très puissant Plus concis, plus agréable à programmer Permet d envisager le parallélisme plus sereinement Permet de faire du code plus fiable tout en restant rapide Inconvénients Langage complexe et presque trop riche : il faut savoir se limiter Besoin de changer (un peu) notre environnement de développement Recrutement possible mais moins facile Part de marché et pérennité correctes mais loin de Java
Alternatives
Java 8 Alternatives
Alternatives Java 8 Autre langages : Clojure, Erlang, Haskell, F#...
Questions?