Tous droits réservés
normation.com
D’une programmation objet
classique aux Free Monads
8 ans de Scala dans Rudder
François ARMAND
far@normation.com
Vincent MEMBRÉ
vme@normation.com
1
Tous droits réservés
normation.com
What’s about?
Est-ce que la programmation fonctionnelle
améliore la qualité des développements ?
(en vrai, entre nous?)
2
Tous droits réservés
normation.com
Maturité de l’écosystème
● Lightbend (ex TypeSafe): L’entreprise
derrière Scala
● LAMP: Un Labo sur le développement de
Scala
● Scala Center: Promotion du langage dans
la communauté OSS
● TypeLevel: Rassemblement de la
communauté poussant les aspects
fonctionnels du langage
● Netflix, IBM, Twitter, Linked In, Xebia,
Criteo … Scala est partout !
Photo historique de la première assemblée de TypeLevel
3
Tous droits réservés
normation.com
What’s about?
Est-ce que la programmation fonctionnelle
améliore la qualité des développements ?
OUI!
Questions ?
4
Tous droits réservés
normation.com
What’s about?
Est-ce que la programmation fonctionnelle
améliore la qualité des développements ?
● 8 ans que nous développons Rudder en Scala
○ 8 ans que l’on pratique son aspect fonctionnel
● Qu’est ce que Scala nous apporte ?
● Des exemples, sortis directement de notre code, et
commentés rien que pour vous !
5
Tous droits réservés
normation.com
Qui parle ?
● 11 ans de Scala
● CTO @Normation
● Lead-dev de Rudder
● choix de Scala il y a
8 ans pour Rudder
● Etude “LaFoSec” avec
l’ANSSI en 2011
Continuous Configuration for Effective Compliance
François ARMAND / @fanf42
● 6 ans de Scala
● Développeur
● backend / api /
packaging ...
● Release manager
Vincent MEMBRÉ / @macbuche
6
Tous droits réservés
normation.com
Scala (historique)
● Créé par Martin Odersky à l’École Polytechnique
Fédérale de Lausanne (EPFL)
● Mêle les principes Objet et Fonctionnel (“dot theory”)
● 2004: Release publique (2.0)
● 2008: Early adopters: communauté très réduite
● 2010: Adoption en hausse: Scala 2.8, API Collection
● 2015: Scala devient hype! (Avec Spark et Big Data)
● La Recherche continue avec Dotty (futur compilateur)
7
Tous droits réservés
normation.com
Qu’est ce qu’on aime dans Scala?
Le compilateur est notre meilleur ami !
Si ça compile, c’est quasiment bon!
(Bon des fois c’est un petit peu long…, mais ca vaut le coût!)
8
Tous droits réservés
normation.com
Qu’est ce qu’on aime dans Scala?
L’expressivité du langage apporte beaucoup
● Tout est expression
● Peu de boilerplate
● Permet de produire un code concis
● Facile à maintenir
Particulièrement mis en valeur avec:
Les implicits
9
Tous droits réservés
normation.com
Qu’est ce qu’on aime dans Scala?
Un système de type puissant et précis
● L’intention se retrouve dans les types, du TDD (t => type!)
● Facile d’exprimer la sémantique du programme
● Abstractions et compositions par des propriétés prouvées
● Des refactoring de grande ampleur sans douleur
10
Tous droits réservés
normation.com
Exemples concrets tirés de Rudder
11
Tous droits réservés
normation.com
Les bases
● Uniquement du code non mutable + fonctions
○ (quelques rares cas, scope limité à une fonction ou moins)
● JAMAIS de NULL !
○ Option[String]
● Pas de “String Typing”
○ ex: pas de String,
○ mais des NodeID
● Repousser les effets de bord au maximum
○ Un coeur pur !
● Fonctions d’ordre supérieur, lambda
○ ex: collection: filter, map, etc
12
Tous droits réservés
normation.com
Les bases
● simple à comprendre, comportements répétables
○ structure de données complètement initialisées
○ pas de mutation ou d’I/O, uniquement des transformations
○ les types permettent de comprendre les intentions
● aide du compilateur lors de refactoring
○ “si ça compile, c’est (presque) bon”
● limiter le boilerplate
○ peu de cérémonie
○ se focaliser sur le but, l’intention
13
Bénéfices
Tous droits réservés
normation.com
ADT (Sum Type)
● Pattern matching (couverture de totalité)
14
def getPeople(id: PeopleId): Either[Error,Option[People]] = {...}
val message = getPeople(PeopleId(“Alice”) match {
case Right(Some(alice)) => s“Alice age is ${alice.age}”
case Right(None) => “Alice not found!”
case Left (Error(msg) => s“Error with storage: ${msg}”
}
println(message)
● Déclaration de sum type (presque simple)
sealed abstract class Either[+A, +B] { … }
final case class Left [+A, +B](a: A) extends Either[A, B]
final case class Right[+A, +B](b: B) extends Either[A, B]
Tous droits réservés
normation.com
ADT (Sum Type)
● rendre impossible les états illégaux
○ moins de complexité “accidentelle”
● aide du compilateur sur la totalité des traitements
● les cas d’erreurs sont des données comme les autres
○ on conserve la transparence référentielle
● faciliter la composition de programme
○ programmation fonctionnelle == légos
15
Bénéfices
Tous droits réservés
normation.com
● Décrire la logique du programme
● sucre syntaxique “For comprehension”
16
● Gérer les erreurs de façon pure et composable
● S’appuyer sur des lois mathématiques :
○ on sait que la tuyauterie fonctionne,
○ on peut se concentrer sur la logique métier
Bénéfices
Monade, erreurs &
for comprehension
Tous droits réservés
normation.com
Monade, erreurs &
for comprehension
17
● Chaque ligne renvoie Either[Error, T]
● Either est une monade
● résultat: Either[Error, T]
○ T = type de la dernière ligne
Tous droits réservés
normation.com
Implicits
● La “Scala touch”
○ https://www.slideshare.net/Odersky/what-to-keave-implicit
● permet de laisser le compilateur choisir
automatiquement certains paramètres
● exemples d’utilisation :
○ passage de contexte
○ implémentation de “types classes”
○ preuve de théorèmes
18
Tous droits réservés
normation.com
Ecosystème: bibliothèques “FP”
● “ bibliothèques qui fournissent des abstractions pour
la programmation fonctionnelle en Scala ”
● tiennent compte des spécificités de la JVM
○ constructions stack-safe
○ optimisations (pression sur le GC)
● fournissent des éléments de base des Catégories :
○ monoïd, semi-group, applicative functor, monad, …
○ des instances: IO, Writer, Either, Error, etc.
○ Free Monad
19
Scalaz & Cats
Tous droits réservés
normation.com
Ecosystème: bibliothèques “FP”
● Free Monad
○ abstraction couramment employée pour proposer un DSL (Domain
Specific Language) et des interpréteurs de ce DSL
20
Scalaz & Cats
Commands
(monads)
Interpreters
Programme Résultat
DSL
(ADT paramétré
=> functors)
Données Pures
Tous droits réservés
normation.com
Ecosystème: bibliothèques “FP”
21
Doobie : principle JDBC
● DSL de construction de requêtes JDBC
● basé sur des Free Monad
● https://www.slideshare.net/normation/doobie-feedbacks-from-the-trenches-scalaio-2016
● gestion propre des sessions, transactions, …
● gestion propre des erreurs, null, …
● Mapping “case class” ⇔ SQL gratuit et automatique
Bénéfices
Tous droits réservés
normation.com
Ecosystème: bibliothèques “FP”
● DSL de gestion de “Task” (unité de programme)
● exécutés sur un scheduler (asynchrone, parallel, etc)
● … à base de Free Monads
22
Monix: programmation asynchrone pure FP
● facilité de rajouter des contraintes
○ rate limitation, exécution ordonnée, sémaphores...
● pas de gestion manuelle des threads / futures / etc
● Pour les tests: contrôle du temps via un faux scheduler
Bénéfices
Tous droits réservés
normation.com
Next steps
23
Plus de bibliothèques
fonctionnelles (pures)
⇒ JSON, serveur REST
Property-based testing
⇒ scalacheck
Nos propres DSL et nos
interpréteurs
Tous droits réservés
normation.com
Conclusion
24
● libération: le code évolue dans un cadre clairement défini, répétable
● vers une “lingua franca” trans-bibliothèques,
○ mais aussi trans-langage de programmations (Haskell, OCaml…)
“recettes”
(design patterns)
Abstraction avec
propriétés prouvés,
lois de composition
programmation
Orientée Objet
Programmation
fonctionnelle
Design Top-bottom,
framework
Design bottom-up,
bibliothèques
Tous droits réservés
normation.com
Questions ?
François ARMAND
far@normation.com
Vincent MEMBRÉ
vme@normation.com
25

OSIS 2017 - Scala REX dans Rudder

  • 1.
    Tous droits réservés normation.com D’uneprogrammation objet classique aux Free Monads 8 ans de Scala dans Rudder François ARMAND far@normation.com Vincent MEMBRÉ vme@normation.com 1
  • 2.
    Tous droits réservés normation.com What’sabout? Est-ce que la programmation fonctionnelle améliore la qualité des développements ? (en vrai, entre nous?) 2
  • 3.
    Tous droits réservés normation.com Maturitéde l’écosystème ● Lightbend (ex TypeSafe): L’entreprise derrière Scala ● LAMP: Un Labo sur le développement de Scala ● Scala Center: Promotion du langage dans la communauté OSS ● TypeLevel: Rassemblement de la communauté poussant les aspects fonctionnels du langage ● Netflix, IBM, Twitter, Linked In, Xebia, Criteo … Scala est partout ! Photo historique de la première assemblée de TypeLevel 3
  • 4.
    Tous droits réservés normation.com What’sabout? Est-ce que la programmation fonctionnelle améliore la qualité des développements ? OUI! Questions ? 4
  • 5.
    Tous droits réservés normation.com What’sabout? Est-ce que la programmation fonctionnelle améliore la qualité des développements ? ● 8 ans que nous développons Rudder en Scala ○ 8 ans que l’on pratique son aspect fonctionnel ● Qu’est ce que Scala nous apporte ? ● Des exemples, sortis directement de notre code, et commentés rien que pour vous ! 5
  • 6.
    Tous droits réservés normation.com Quiparle ? ● 11 ans de Scala ● CTO @Normation ● Lead-dev de Rudder ● choix de Scala il y a 8 ans pour Rudder ● Etude “LaFoSec” avec l’ANSSI en 2011 Continuous Configuration for Effective Compliance François ARMAND / @fanf42 ● 6 ans de Scala ● Développeur ● backend / api / packaging ... ● Release manager Vincent MEMBRÉ / @macbuche 6
  • 7.
    Tous droits réservés normation.com Scala(historique) ● Créé par Martin Odersky à l’École Polytechnique Fédérale de Lausanne (EPFL) ● Mêle les principes Objet et Fonctionnel (“dot theory”) ● 2004: Release publique (2.0) ● 2008: Early adopters: communauté très réduite ● 2010: Adoption en hausse: Scala 2.8, API Collection ● 2015: Scala devient hype! (Avec Spark et Big Data) ● La Recherche continue avec Dotty (futur compilateur) 7
  • 8.
    Tous droits réservés normation.com Qu’estce qu’on aime dans Scala? Le compilateur est notre meilleur ami ! Si ça compile, c’est quasiment bon! (Bon des fois c’est un petit peu long…, mais ca vaut le coût!) 8
  • 9.
    Tous droits réservés normation.com Qu’estce qu’on aime dans Scala? L’expressivité du langage apporte beaucoup ● Tout est expression ● Peu de boilerplate ● Permet de produire un code concis ● Facile à maintenir Particulièrement mis en valeur avec: Les implicits 9
  • 10.
    Tous droits réservés normation.com Qu’estce qu’on aime dans Scala? Un système de type puissant et précis ● L’intention se retrouve dans les types, du TDD (t => type!) ● Facile d’exprimer la sémantique du programme ● Abstractions et compositions par des propriétés prouvées ● Des refactoring de grande ampleur sans douleur 10
  • 11.
  • 12.
    Tous droits réservés normation.com Lesbases ● Uniquement du code non mutable + fonctions ○ (quelques rares cas, scope limité à une fonction ou moins) ● JAMAIS de NULL ! ○ Option[String] ● Pas de “String Typing” ○ ex: pas de String, ○ mais des NodeID ● Repousser les effets de bord au maximum ○ Un coeur pur ! ● Fonctions d’ordre supérieur, lambda ○ ex: collection: filter, map, etc 12
  • 13.
    Tous droits réservés normation.com Lesbases ● simple à comprendre, comportements répétables ○ structure de données complètement initialisées ○ pas de mutation ou d’I/O, uniquement des transformations ○ les types permettent de comprendre les intentions ● aide du compilateur lors de refactoring ○ “si ça compile, c’est (presque) bon” ● limiter le boilerplate ○ peu de cérémonie ○ se focaliser sur le but, l’intention 13 Bénéfices
  • 14.
    Tous droits réservés normation.com ADT(Sum Type) ● Pattern matching (couverture de totalité) 14 def getPeople(id: PeopleId): Either[Error,Option[People]] = {...} val message = getPeople(PeopleId(“Alice”) match { case Right(Some(alice)) => s“Alice age is ${alice.age}” case Right(None) => “Alice not found!” case Left (Error(msg) => s“Error with storage: ${msg}” } println(message) ● Déclaration de sum type (presque simple) sealed abstract class Either[+A, +B] { … } final case class Left [+A, +B](a: A) extends Either[A, B] final case class Right[+A, +B](b: B) extends Either[A, B]
  • 15.
    Tous droits réservés normation.com ADT(Sum Type) ● rendre impossible les états illégaux ○ moins de complexité “accidentelle” ● aide du compilateur sur la totalité des traitements ● les cas d’erreurs sont des données comme les autres ○ on conserve la transparence référentielle ● faciliter la composition de programme ○ programmation fonctionnelle == légos 15 Bénéfices
  • 16.
    Tous droits réservés normation.com ●Décrire la logique du programme ● sucre syntaxique “For comprehension” 16 ● Gérer les erreurs de façon pure et composable ● S’appuyer sur des lois mathématiques : ○ on sait que la tuyauterie fonctionne, ○ on peut se concentrer sur la logique métier Bénéfices Monade, erreurs & for comprehension
  • 17.
    Tous droits réservés normation.com Monade,erreurs & for comprehension 17 ● Chaque ligne renvoie Either[Error, T] ● Either est une monade ● résultat: Either[Error, T] ○ T = type de la dernière ligne
  • 18.
    Tous droits réservés normation.com Implicits ●La “Scala touch” ○ https://www.slideshare.net/Odersky/what-to-keave-implicit ● permet de laisser le compilateur choisir automatiquement certains paramètres ● exemples d’utilisation : ○ passage de contexte ○ implémentation de “types classes” ○ preuve de théorèmes 18
  • 19.
    Tous droits réservés normation.com Ecosystème:bibliothèques “FP” ● “ bibliothèques qui fournissent des abstractions pour la programmation fonctionnelle en Scala ” ● tiennent compte des spécificités de la JVM ○ constructions stack-safe ○ optimisations (pression sur le GC) ● fournissent des éléments de base des Catégories : ○ monoïd, semi-group, applicative functor, monad, … ○ des instances: IO, Writer, Either, Error, etc. ○ Free Monad 19 Scalaz & Cats
  • 20.
    Tous droits réservés normation.com Ecosystème:bibliothèques “FP” ● Free Monad ○ abstraction couramment employée pour proposer un DSL (Domain Specific Language) et des interpréteurs de ce DSL 20 Scalaz & Cats Commands (monads) Interpreters Programme Résultat DSL (ADT paramétré => functors) Données Pures
  • 21.
    Tous droits réservés normation.com Ecosystème:bibliothèques “FP” 21 Doobie : principle JDBC ● DSL de construction de requêtes JDBC ● basé sur des Free Monad ● https://www.slideshare.net/normation/doobie-feedbacks-from-the-trenches-scalaio-2016 ● gestion propre des sessions, transactions, … ● gestion propre des erreurs, null, … ● Mapping “case class” ⇔ SQL gratuit et automatique Bénéfices
  • 22.
    Tous droits réservés normation.com Ecosystème:bibliothèques “FP” ● DSL de gestion de “Task” (unité de programme) ● exécutés sur un scheduler (asynchrone, parallel, etc) ● … à base de Free Monads 22 Monix: programmation asynchrone pure FP ● facilité de rajouter des contraintes ○ rate limitation, exécution ordonnée, sémaphores... ● pas de gestion manuelle des threads / futures / etc ● Pour les tests: contrôle du temps via un faux scheduler Bénéfices
  • 23.
    Tous droits réservés normation.com Nextsteps 23 Plus de bibliothèques fonctionnelles (pures) ⇒ JSON, serveur REST Property-based testing ⇒ scalacheck Nos propres DSL et nos interpréteurs
  • 24.
    Tous droits réservés normation.com Conclusion 24 ●libération: le code évolue dans un cadre clairement défini, répétable ● vers une “lingua franca” trans-bibliothèques, ○ mais aussi trans-langage de programmations (Haskell, OCaml…) “recettes” (design patterns) Abstraction avec propriétés prouvés, lois de composition programmation Orientée Objet Programmation fonctionnelle Design Top-bottom, framework Design bottom-up, bibliothèques
  • 25.
    Tous droits réservés normation.com Questions? François ARMAND far@normation.com Vincent MEMBRÉ vme@normation.com 25