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. Des Exemples de Concepts du Domaine Concrets et Réels Visible

    et Compréhensibles Avec des Données !
  2. Comment je peux obtenir un Feedback Immédiat ? Du Logiciel

    que je construit ? Des Hypothèses que je prend ?
  3. Pourquoi le Succès de JSON ? Concret et Réel Visible

    et Compréhensible Données ! WYSIWYG JS est omniprésent avec les browser
  4. 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...
  5. 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
  6. Quelques « Scalaires » String Boolean Numbers 1 2 3

    4.5 Keyword :key1 :key2 Symbol this that λ
  7. ...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 »
  8. 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
  9. Tree Literal en JSON avec une map et des tableaux

    Ex : sortie JSON de la command tree sur mon mac
  10. 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
  11. 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
  12. La représentation graphique du graphe est souvent nécessaire pour le

    « toucher » Viz fait avec github.com/ztellman/rhizome
  13. 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
  14. 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
  15. 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()!
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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!
  21. 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
  22. TDD

  23. 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
  24. 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
  25. 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
  26. 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é
  27. 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)
  28. 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
  29. 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
  30. 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
  31. Domain-Specific Language Un DSL avec structure de données profite des

    puissantes fonctions de manipulation de données de Clojure SQL HTML
  32. 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)
  33. 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
  34. C’est bien beau les logs mais… Est ce que je

    peux rejouer une interaction utilisateur ?
  35. Logs HTTP Requests with Data Literals and the method invocation

    Un simple eval permet de rejouer l’ensemble des requêtes HTTP loggués
  36. 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 -
  37. 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 ?
  38. 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
  39. 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
  40. 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
  41. « 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
  42. « 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 ! »
  43. Merci ! Des questions ? Des remarques ? @jgrodziski www.grodziski.com

    Get the slides: speakerdeck.com/jgrodziski/why-data-literals-matters