Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Why Data Literals Matters?

Why Data Literals Matters?

Jérémie Grodziski

October 22, 2015
Tweet

More Decks by Jérémie Grodziski

Other Decks in Programming

Transcript

  1. Why Data Literals
    Matters?
    Jérémie Grodziski - @jgrodziski
    {{ Softshake }}

    View Slide

  2. A chaque
    Début de Projet
    Je cherche
    Deux Choses

    View Slide

  3. Des Exemples de
    Concepts du Domaine
    Concrets et
    Réels
    Visible et
    Compréhensibles
    Avec des
    Données !

    View Slide

  4. Comment je peux obtenir un
    Feedback Immédiat ?
    Du Logiciel que je
    construit ?
    Des Hypothèses que je
    prend ?

    View Slide

  5. Pourquoi le Succès de JSON ?
    Concret et Réel
    Visible et
    Compréhensible
    Données !
    WYSIWYG
    JS est omniprésent
    avec les browser

    View Slide

  6. Utilisable directement ou
    avec un simple JSON.parse()

    View Slide

  7. Où voyez vous habituellement vos
    Données ?
    Stdout ?
    Debugger ?
    Base de données ?
    Fichiers textes (CSV, XML, JSON) ?
    Quand vous écrivez votre code
    source ? rarement...

    View Slide

  8. Data Literal
    « A notation for representing a fixed value in
    source code »
    Présent dans certains
    langages pour les
    types « composés »
    Tableau, Structure
    associative (map, vecteur,
    objet, etc.)
    Présent dans tous les
    langages pour les
    types « scalaire »
    Entier, Flottant, Booléen,
    String, Caractère

    View Slide

  9. Quelques « Scalaires »
    String
    Boolean
    Numbers 1 2 3 4.5
    Keyword :key1 :key2
    Symbol this that λ

    View Slide

  10. Quelques Structures de Données
    List
    Vector
    Map
    Set

    View Slide

  11. ...et beaucoup de fonctions
    Alan J. Perlis, developed Algol language, 1st recipient of the Turing
    Award
    For other « Perlism »: http://www.cs.yale.edu/quotes.html
    « It is better to have 100 functions
    operate on 1 data structure than 10
    functions on 10 data structures »

    View Slide

  12. Beaucoup de fonctions
    Etc.
    Excerpt from clojure.org/cheatsheet

    View Slide

  13. Représentation d’Arbre
    Deux fonctions :
    Est ce que ce nœud a des sous-nœuds ?
    ⇒  fonction qui retourne un booléen
    Comment récupérer la structure de
    données des sous-nœuds ?
    => fonction qui retourne la structure des sous-nœuds

    View Slide

  14. Tree Literal en JSON avec une map et
    des tableaux
    Ex : sortie JSON de
    la command tree
    sur mon mac

    View Slide

  15. Tree Literal en Clojure avec map et
    tableaux

    View Slide

  16. Chaque nœud est un tableau
    [node-root child1 child2 …]
    Plus simple, un Tree Literal avec un
    tableau de tableau
    La fonction tree-seq de Clojure
    permet de structurer cet arbre
    et de le parcourir avec
    clojure.walk
    Viz fait avec github.com/ztellman/rhizome

    View Slide

  17. Tree literal avec des objets plus
    complexe

    View Slide

  18. Représentation de Graphe
    Etant donné un
    nœud récupérer la
    liste des identifiants
    des nœuds adjacents
    Deux fonctions
    Récupérer la liste des
    identifiants des nœuds
    du graphe

    View Slide

  19. View Slide

  20. La représentation graphique du graphe est
    souvent nécessaire pour le « toucher »
    Viz fait avec github.com/ztellman/rhizome

    View Slide

  21. Cas d’Utilisation
    Des Data Literals
    En Conception

    View Slide

  22. Représentation Visuelle de votre
    problème – le jeu de Bowling

    View Slide

  23. Représentation Visuelle de votre
    problème – le Jeu d’Échec

    View Slide

  24. Représentation Visuelle de votre
    problème – le jeu du Sudoku

    View Slide

  25. Des Data Literals évolués :
    Clojure EDN (Extended Data Notation)
    Les Tagged Elements Clojure séparent la
    représentation littérale de la représentation
    mémoire :
    #tag "valueString"!
    Instant
    UUID

    View Slide

  26. Objet défini par un fil de
    continuité et une identité
    particulière
    Ex :
    Le compte bancaire n° 30003
    02367 000593287642 13,
    La carte de crédit 8644 7023 0531 105
    Le ticket EventBrite pour
    SoftShake
    Domain-Driven Design
    Objet immutable qui
    représente un concept dont
    l’égalité est basé sur
    l’ensemble de ses attributs
    et non sur une identité
    particulière
    Ex :
    Le montant 42 CHF
    L’UUID f4fbe22a-9d53-4359-
    adbb-57f7d21ed549
    L’instant 21 octobre 2015 à
    16:29
    La distance 53 m
    Value Object Entity

    View Slide

  27. Les Tagged Data Literals sont parfait
    pour les Value Object
    Pour chaque Value Object, pensez à sa
    représentation « String » avec une méthode
    valueOf(String)et une toString()!

    View Slide

  28. Qu’est ce qu’un état ?
    « résumé » avec un participe passé qui a une signification
    statique et stable (commande payée, utilisateur connecté, etc.)
    Influence le comportement de l’objet
    Implique que des transformations de données ont lieu durant
    une transition d’état, déclenché par un événement
    Est associé avec une identité, ils forment alors une entité, qui
    représente dans le temps les différents états et les transitions qui
    ont eu lieu
    Un état est la relation entre une entité et les
    valeurs qu’elle possède à un instant t ; cet
    état peut changer

    View Slide

  29. Etat, Identité et Fonction
    State
    Identity
    State 1 State 2 State 3
    Function Function
    Event triggers Event triggers
    •  value 1a
    •  value 1b
    •  value 1c
    •  value 1a
    •  value 1b
    •  value 1c
    •  value 2a
    •  value 2b
    •  value 1a
    •  value 1b
    •  value 1c
    •  value 2a
    •  value 2b
    •  value 3a
    Publish
    Internal Event
    Publish
    Internal Event
    ...
    Time

    View Slide

  30. Exemple avec l’entité Order
    Identity : Order N° 123456
    Checkout Paid Shipped
    pay ship
    Payment details
    from Payment
    Gateway received
    Carrier data
    q  Customer Data
    q  Product Lines
    (product + qty)
    q  Shipping Data
    States
    checkout
    q  Customer Data
    q  Product Lines
    (product + qty)
    q  Shipping Data
    q  Payment Data
    q  Customer Data
    q  Product Lines
    (product + qty)
    q  Shipping Data
    q  Payment Data
    q  Carrier Data
    Front website form
    submitted
    Order submitted
    event Order paid
    event Order shipped event
    Time

    View Slide

  31. Les Data Literals sont également
    parfait pour visualiser les
    transitions d’états d’une Entity
    Identity
    State 1 State 2 State 3
    Function Function
    •  value 1a
    •  value 1b
    •  value 1c
    •  value 1a
    •  value 1b
    •  value 1c
    •  value 2a
    •  value 2b
    •  value 1a
    •  value 1b
    •  value 1c
    •  value 2a
    •  value 2b
    •  value 3a
    ...
    Time
    States

    View Slide

  32. Les transitions d’états vues
    comme des fonctions
    Chaque « Snapshot » de l’état de l’entity à
    un instant t peut être affiché avec un
    Data Literal
    Un diff permet de visualiser les différences
    entre le prevState et le nextState fourni par
    la fonction
    function(input): output!
    function(prevState, event): nextState!

    View Slide

  33. setShippingMethod!
    increaseItemQty!
    Easy Diff

    View Slide

  34. OOP done right with Clojure
    Identity State as values Function
    Method = function applied to an entity’s
    state, producing a new state (eventually)
    Entity = Identity + State
    Protocol = Interface = set of methods

    View Slide

  35. Cas d’Utilisation
    Des Data Literals
    En Testing et
    Debugging

    View Slide

  36. TDD

    View Slide

  37. Testing BDD
    Dans les scénarios BDD (Behavior-Driven
    Development) les données peuvent être
    exprimé sous forme tabulaire suivant la
    grammaire Gherkin
    Certains framework permettent de rentrer
    directement un Data Literal : cf framework
    BDD Spexec
    See speakerdeck.com/jgrodziski/anatomy-of-a-bdd-execution-library-in-clojure

    View Slide

  38. Exemple de scénario BDD avec
    données tabulaire

    View Slide

  39. Debugging
    Tools.trace est une librairie Clojure qui permet
    d’instrumenter une fonction ou un namespace
    entier et de logguer les entrées/sorties de
    fonctions
    Combiné avec aprint
    (Awesome Print) cela
    fait des miracles…
    quasiment plus
    besoin de debugger

    View Slide

  40. Cas d’Utilisation
    Des Data Literals
    En Intégration
    De Données

    View Slide

  41. Les Flux de
    Données

    View Slide

  42. Principes pour des Fonctions
    Adaptées au Flux de Données
    Des Fonctions
    Pures
    Des
    Structures de
    Données
    Immutables
    vu comme des
    Data Literals
    Des Étapes –
    Fonctions –
    Composables
    Des Effets de
    bords isolés

    View Slide

  43. Fonction Pure
    Retourne toujours le même résultat pour les
    même arguments quelque soit le nombre
    d’appels (idempotent)
    Ne cause aucun effet de bord observable (safe)
    Transparence référentiel : le temps n’affecte pas
    le résultat d’une fonction, la fonction est
    transparente par rapport au temps
    Permet la « memoization », la composition et
    augmente la testabilité

    View Slide

  44. Des Structures de Données
    Immutables
    L’approche fonctionnelle favorise la
    consommation de valeurs et le retour de
    nouvelles valeurs depuis les fonctions
    La structure de données original n’est jamais
    modifiée
    Clojure fournit une implémentation efficace
    avec le Structural Sharing des Persistent Data
    Structures (partage des valeurs entre ancienne
    et nouvelle version de la structure)

    View Slide

  45. Des Fonctions Composables
    Fonction 1
    Fonction 2
    Fonction 3
    État
    t0
    État
    t2
    État
    t1
    État
    t3

    View Slide

  46. Des Effets de Bords Isolés
    Séparer la logique de traitement des
    données de l’effet de bord (persistence,
    messaging, etc.)
    Positionner les fonctions non-pures aux
    extrémités de la chaîne

    View Slide

  47. Fonctions Pures ou non ?
    Fonctions Pures sans effet
    de bord (Safe and
    Idempotent)
    •  Transformations des
    données
    •  Forme des structures de
    données (ex : map -> list)
    •  Valeurs (transcodage)
    •  Création de nouvelles
    données (ex : Calcul)
    •  Décision : autorisation,
    résultat
    Fonctions Impures avec
    effet de bord (Non Safe ou
    Non Idempotent)
    •  Safe, Non Idempotent :
    Enrichissement des
    données depuis une
    source externe
    « mutable » (ex : lecture
    issues de BdD)
    •  Non Safe, Non
    Idempotent : Persistence
    (insert, update),
    Messagerie

    View Slide

  48. Data Pipeline
    Outside
    World
    Outside
    World
    Convert from External
    Repr. To Internal
    Enrich from
    external DataSource
    Validate
    Transform
    Transform
    Transform Operate
    (Persistence,
    Messaging)
    Fonctions Pures
    Get Data
    Fonctions
    Non Pures
    Fonctions
    Non Pures
    Les fonctions non pures
    sont repoussées aux
    extrémités du pipeline

    View Slide

  49. Cas d’Utilisation
    Des Data Literals
    Domain Specific
    Language (DSL)

    View Slide

  50. Domain-Specific Language
    Un DSL avec structure de données profite
    des puissantes fonctions de manipulation de
    données de Clojure
    SQL
    HTML

    View Slide

  51. Cas d’Utilisation
    Des Data Literals
    Logs

    View Slide

  52. Logs with Data Literals
    Stocker les données contextuelles des logs
    sous une forme facilement exploitable est
    une préconisation des outils de visualisation
    (Splunk, Logstash)

    View Slide

  53. Logs HTTP Requests with Data
    Literals
    Ring est la librairie idiomatique de Clojure
    pour le web : chaque requête/réponse est
    représentée par une map traité par un
    handler

    View Slide

  54. C’est bien beau les logs mais…
    Est ce que je peux rejouer une
    interaction utilisateur ?

    View Slide

  55. Logs HTTP Requests with Data
    Literals and the method
    invocation
    Un simple eval permet
    de rejouer l’ensemble
    des requêtes HTTP
    loggués

    View Slide

  56. Clojure is an Homoiconic language
    Tous code Clojure est une structure de données
    de type List dont la forme est :
    (verb a b)!
    Clojure est lui même un Data Literal !
    Permet une méta-programmation très puissante
    « Code is Data, Data is Code »
    from homo - the same - and icon - representation -

    View Slide

  57. Code is Data
    Vector
    List
    Symbols
    List

    View Slide

  58. Event Sourcing
    L’Event Sourcing consiste à stocker l’ensemble
    des changements d’états d’une application
    comme une suite d’événements
    Le Replay est donc built-in…mais est fortement
    dépendant de la version du code source qui a
    traité l’événement à un instant t
    Peut-on stocker le code même qui a traité
    l’événement en même temps que celui ci ?

    View Slide

  59. Food for Thoughts about Event
    Sourcing
    Le stockage sous forme textuelle ou
    littérale de vos données est le plus pérenne
    dans le temps
    Il est lisible facilement par un être humain
    ET par une machine

    View Slide

  60. Et le Feedback dans tout ça ?
    Une REPL ou un notebook permettent
    d’interagir directement avec les Data
    Literals
    Et surtout de rentrer « dans la Zone »,
    d’être dans le « Flow » où la productivité
    est très forte
    cf Mihály Csíkszentmihályi

    View Slide

  61. A emporter
    Rendez vos données VISIBLE ! Touchez les !
    Elles expriment votre DOMAINE
    Vos Data Literals sont votre argile, vos
    fonctions sont vos mains qui les façonnent
    Rendez vos fonctions composables
    Isolez les effets de bords

    View Slide

  62. « An algorithm must be seen to be
    believed »
    Donal Knuth
    « Source Code is static, Behavior is
    dynamic:
    Good programs make it easy to reason
    about their Behavior »
    Barbara Liskov

    View Slide

  63. « Donnez moi des exemples »
    « Donnez moi du concret je me
    charge de l’abstraire ! »
    « Premature Abstraction is the
    Root of all Evil »
    « Donnez moi une REPL ! »

    View Slide

  64. Merci !
    Des questions ? Des
    remarques ?
    @jgrodziski
    www.grodziski.com
    Get the slides:
    speakerdeck.com/jgrodziski/why-data-literals-matters

    View Slide