SlideShare une entreprise Scribd logo
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

Contenu connexe

Similaire à OSIS 2017 - Scala REX dans Rudder

cours1.ppt
cours1.pptcours1.ppt
cours1.ppt
testuser715939
 
Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
Jérôme Tamborini
 
REX Ansible
REX AnsibleREX Ansible
REX Ansible
Noël Bardelot
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
univalence
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieurFredy Fadel
 
Multi-Threading Et Cocoa
Multi-Threading Et CocoaMulti-Threading Et Cocoa
Multi-Threading Et Cocoa
CocoaHeads France
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache Zeppelin
Bruno Bonnin
 
Javaoop
JavaoopJavaoop
Javaoop
javaexpert
 
COURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxCOURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptx
LuneSabsPericolo1
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
Publicis Sapient Engineering
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
Laurent Guérin
 
Cours VB 2012 seance 1
Cours VB 2012 seance 1Cours VB 2012 seance 1
Cours VB 2012 seance 1ISIG
 
code4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABEScode4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABES
ABES
 
Introduction à l'objet - Deuxième année ISIMA
Introduction à l'objet - Deuxième année ISIMAIntroduction à l'objet - Deuxième année ISIMA
Introduction à l'objet - Deuxième année ISIMA
Loic Yon
 
introduction au CPP
introduction au CPPintroduction au CPP
introduction au CPP
sarah Benmerzouk
 
The Future of Javascript
The Future of JavascriptThe Future of Javascript
The Future of Javascript
Dr Samir A. ROUABHI
 
The future of JavaScript
The future of JavaScriptThe future of JavaScript
The future of JavaScript
Algiers Tech Meetup
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
sabrine_hamdi
 
Introduction au Domain Driven Design
Introduction au Domain Driven DesignIntroduction au Domain Driven Design
Introduction au Domain Driven Design
DNG Consulting
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?
Rui Carvalho
 

Similaire à OSIS 2017 - Scala REX dans Rudder (20)

cours1.ppt
cours1.pptcours1.ppt
cours1.ppt
 
Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
 
REX Ansible
REX AnsibleREX Ansible
REX Ansible
 
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017) Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
Spark-adabra, Comment Construire un DATALAKE ! (Devoxx 2017)
 
Javascript un langage supérieur
Javascript un langage supérieurJavascript un langage supérieur
Javascript un langage supérieur
 
Multi-Threading Et Cocoa
Multi-Threading Et CocoaMulti-Threading Et Cocoa
Multi-Threading Et Cocoa
 
Big Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache ZeppelinBig Data Viz (and much more!) with Apache Zeppelin
Big Data Viz (and much more!) with Apache Zeppelin
 
Javaoop
JavaoopJavaoop
Javaoop
 
COURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxCOURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptx
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
 
Cours VB 2012 seance 1
Cours VB 2012 seance 1Cours VB 2012 seance 1
Cours VB 2012 seance 1
 
code4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABEScode4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABES
 
Introduction à l'objet - Deuxième année ISIMA
Introduction à l'objet - Deuxième année ISIMAIntroduction à l'objet - Deuxième année ISIMA
Introduction à l'objet - Deuxième année ISIMA
 
introduction au CPP
introduction au CPPintroduction au CPP
introduction au CPP
 
The Future of Javascript
The Future of JavascriptThe Future of Javascript
The Future of Javascript
 
The future of JavaScript
The future of JavaScriptThe future of JavaScript
The future of JavaScript
 
I le langage java d'una manière avancée introduction
I  le langage java d'una manière avancée introductionI  le langage java d'una manière avancée introduction
I le langage java d'una manière avancée introduction
 
Introduction au Domain Driven Design
Introduction au Domain Driven DesignIntroduction au Domain Driven Design
Introduction au Domain Driven Design
 
.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?.Net pour le développeur Java - une source d'inspiration?
.Net pour le développeur Java - une source d'inspiration?
 

Plus de RUDDER

What if configuration management didn't need to be lvl60 in dev?
What if configuration management didn't need to be lvl60 in dev?What if configuration management didn't need to be lvl60 in dev?
What if configuration management didn't need to be lvl60 in dev?
RUDDER
 
Servers compliance: audit, remediation, proof
Servers compliance: audit, remediation, proofServers compliance: audit, remediation, proof
Servers compliance: audit, remediation, proof
RUDDER
 
OSIS 2019 - Qu’apporte l’observabilité à la gestion de configuration ?
OSIS 2019 - Qu’apporte l’observabilité à la gestion de configuration ?OSIS 2019 - Qu’apporte l’observabilité à la gestion de configuration ?
OSIS 2019 - Qu’apporte l’observabilité à la gestion de configuration ?
RUDDER
 
OW2Con - Configurations, do you prove yours?
OW2Con - Configurations, do you prove yours?OW2Con - Configurations, do you prove yours?
OW2Con - Configurations, do you prove yours?
RUDDER
 
The new plugin ecosystem in RUDDER 5.0
The new plugin ecosystem in RUDDER 5.0The new plugin ecosystem in RUDDER 5.0
The new plugin ecosystem in RUDDER 5.0
RUDDER
 
What uses for observing operations of Configuration Management?
What uses for observing operations of Configuration Management?What uses for observing operations of Configuration Management?
What uses for observing operations of Configuration Management?
RUDDER
 
UX challenges of a UI-centric config management tool
UX challenges of a UI-centric config management toolUX challenges of a UI-centric config management tool
UX challenges of a UI-centric config management tool
RUDDER
 
What happened in RUDDER in 2018 and what’s next?
What happened in RUDDER in 2018 and what’s next?What happened in RUDDER in 2018 and what’s next?
What happened in RUDDER in 2018 and what’s next?
RUDDER
 
What is RUDDER and when should I use it?
What is RUDDER and when should I use it?What is RUDDER and when should I use it?
What is RUDDER and when should I use it?
RUDDER
 
Fosdem - Configurations do you prove yours?
Fosdem - Configurations  do you prove yours?Fosdem - Configurations  do you prove yours?
Fosdem - Configurations do you prove yours?
RUDDER
 
L'audit en continu : clé de la conformité démontrable (#POSS 2018)
L'audit en continu : clé de la conformité démontrable (#POSS 2018)L'audit en continu : clé de la conformité démontrable (#POSS 2018)
L'audit en continu : clé de la conformité démontrable (#POSS 2018)
RUDDER
 
Fiabilité et conformité continues en production avec Rudder (#BBOOST 2018)
Fiabilité et conformité continues en production avec Rudder (#BBOOST 2018)Fiabilité et conformité continues en production avec Rudder (#BBOOST 2018)
Fiabilité et conformité continues en production avec Rudder (#BBOOST 2018)
RUDDER
 
Stay up - voyage d'un éditeur de logiciels libres
Stay up - voyage d'un éditeur de logiciels libresStay up - voyage d'un éditeur de logiciels libres
Stay up - voyage d'un éditeur de logiciels libres
RUDDER
 
How we scaled Rudder to 10k, and the road to 50k
How we scaled Rudder to 10k, and the road to 50kHow we scaled Rudder to 10k, and the road to 50k
How we scaled Rudder to 10k, and the road to 50k
RUDDER
 
What's new and what's next in Rudder
What's new and what's next in RudderWhat's new and what's next in Rudder
What's new and what's next in Rudder
RUDDER
 
Poss 2017 : gestion des configurations et mise en conformité chez un service ...
Poss 2017 : gestion des configurations et mise en conformité chez un service ...Poss 2017 : gestion des configurations et mise en conformité chez un service ...
Poss 2017 : gestion des configurations et mise en conformité chez un service ...
RUDDER
 
Poss 2017 - la continuité, arme secrète de la gestion du si - cas concret de ...
Poss 2017 - la continuité, arme secrète de la gestion du si - cas concret de ...Poss 2017 - la continuité, arme secrète de la gestion du si - cas concret de ...
Poss 2017 - la continuité, arme secrète de la gestion du si - cas concret de ...
RUDDER
 
POSS 2017 : Comment automatiser son infrastructure quand... on a pas le temps...
POSS 2017 : Comment automatiser son infrastructure quand... on a pas le temps...POSS 2017 : Comment automatiser son infrastructure quand... on a pas le temps...
POSS 2017 : Comment automatiser son infrastructure quand... on a pas le temps...
RUDDER
 
DevOps D-Day 2017 - Gestion des configurations et mise en conformité chez un ...
DevOps D-Day 2017 - Gestion des configurations et mise en conformité chez un ...DevOps D-Day 2017 - Gestion des configurations et mise en conformité chez un ...
DevOps D-Day 2017 - Gestion des configurations et mise en conformité chez un ...
RUDDER
 
RUDDER - Continuous Configuration (configuration management + continuous aud...
 RUDDER - Continuous Configuration (configuration management + continuous aud... RUDDER - Continuous Configuration (configuration management + continuous aud...
RUDDER - Continuous Configuration (configuration management + continuous aud...
RUDDER
 

Plus de RUDDER (20)

What if configuration management didn't need to be lvl60 in dev?
What if configuration management didn't need to be lvl60 in dev?What if configuration management didn't need to be lvl60 in dev?
What if configuration management didn't need to be lvl60 in dev?
 
Servers compliance: audit, remediation, proof
Servers compliance: audit, remediation, proofServers compliance: audit, remediation, proof
Servers compliance: audit, remediation, proof
 
OSIS 2019 - Qu’apporte l’observabilité à la gestion de configuration ?
OSIS 2019 - Qu’apporte l’observabilité à la gestion de configuration ?OSIS 2019 - Qu’apporte l’observabilité à la gestion de configuration ?
OSIS 2019 - Qu’apporte l’observabilité à la gestion de configuration ?
 
OW2Con - Configurations, do you prove yours?
OW2Con - Configurations, do you prove yours?OW2Con - Configurations, do you prove yours?
OW2Con - Configurations, do you prove yours?
 
The new plugin ecosystem in RUDDER 5.0
The new plugin ecosystem in RUDDER 5.0The new plugin ecosystem in RUDDER 5.0
The new plugin ecosystem in RUDDER 5.0
 
What uses for observing operations of Configuration Management?
What uses for observing operations of Configuration Management?What uses for observing operations of Configuration Management?
What uses for observing operations of Configuration Management?
 
UX challenges of a UI-centric config management tool
UX challenges of a UI-centric config management toolUX challenges of a UI-centric config management tool
UX challenges of a UI-centric config management tool
 
What happened in RUDDER in 2018 and what’s next?
What happened in RUDDER in 2018 and what’s next?What happened in RUDDER in 2018 and what’s next?
What happened in RUDDER in 2018 and what’s next?
 
What is RUDDER and when should I use it?
What is RUDDER and when should I use it?What is RUDDER and when should I use it?
What is RUDDER and when should I use it?
 
Fosdem - Configurations do you prove yours?
Fosdem - Configurations  do you prove yours?Fosdem - Configurations  do you prove yours?
Fosdem - Configurations do you prove yours?
 
L'audit en continu : clé de la conformité démontrable (#POSS 2018)
L'audit en continu : clé de la conformité démontrable (#POSS 2018)L'audit en continu : clé de la conformité démontrable (#POSS 2018)
L'audit en continu : clé de la conformité démontrable (#POSS 2018)
 
Fiabilité et conformité continues en production avec Rudder (#BBOOST 2018)
Fiabilité et conformité continues en production avec Rudder (#BBOOST 2018)Fiabilité et conformité continues en production avec Rudder (#BBOOST 2018)
Fiabilité et conformité continues en production avec Rudder (#BBOOST 2018)
 
Stay up - voyage d'un éditeur de logiciels libres
Stay up - voyage d'un éditeur de logiciels libresStay up - voyage d'un éditeur de logiciels libres
Stay up - voyage d'un éditeur de logiciels libres
 
How we scaled Rudder to 10k, and the road to 50k
How we scaled Rudder to 10k, and the road to 50kHow we scaled Rudder to 10k, and the road to 50k
How we scaled Rudder to 10k, and the road to 50k
 
What's new and what's next in Rudder
What's new and what's next in RudderWhat's new and what's next in Rudder
What's new and what's next in Rudder
 
Poss 2017 : gestion des configurations et mise en conformité chez un service ...
Poss 2017 : gestion des configurations et mise en conformité chez un service ...Poss 2017 : gestion des configurations et mise en conformité chez un service ...
Poss 2017 : gestion des configurations et mise en conformité chez un service ...
 
Poss 2017 - la continuité, arme secrète de la gestion du si - cas concret de ...
Poss 2017 - la continuité, arme secrète de la gestion du si - cas concret de ...Poss 2017 - la continuité, arme secrète de la gestion du si - cas concret de ...
Poss 2017 - la continuité, arme secrète de la gestion du si - cas concret de ...
 
POSS 2017 : Comment automatiser son infrastructure quand... on a pas le temps...
POSS 2017 : Comment automatiser son infrastructure quand... on a pas le temps...POSS 2017 : Comment automatiser son infrastructure quand... on a pas le temps...
POSS 2017 : Comment automatiser son infrastructure quand... on a pas le temps...
 
DevOps D-Day 2017 - Gestion des configurations et mise en conformité chez un ...
DevOps D-Day 2017 - Gestion des configurations et mise en conformité chez un ...DevOps D-Day 2017 - Gestion des configurations et mise en conformité chez un ...
DevOps D-Day 2017 - Gestion des configurations et mise en conformité chez un ...
 
RUDDER - Continuous Configuration (configuration management + continuous aud...
 RUDDER - Continuous Configuration (configuration management + continuous aud... RUDDER - Continuous Configuration (configuration management + continuous aud...
RUDDER - Continuous Configuration (configuration management + continuous aud...
 

OSIS 2017 - Scala REX dans Rudder

  • 1. 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
  • 2. 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
  • 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’s about? 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’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
  • 6. 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
  • 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’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
  • 9. 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
  • 10. 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
  • 11. Tous droits réservés normation.com Exemples concrets tirés de Rudder 11
  • 12. 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
  • 13. 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
  • 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 Next steps 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