Why Data Literals Matters?

Why Data Literals Matters?

6c7fb4b051926511027cec4116cfe8cf?s=128

Jérémie Grodziski

October 22, 2015
Tweet

Transcript

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

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

  3. Des Exemples de Concepts du Domaine Concrets et Réels Visible

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

    que je construit ? Des Hypothèses que je prend ?
  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
  6. Utilisable directement ou avec un simple JSON.parse()

  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...
  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
  9. Quelques « Scalaires » String Boolean Numbers 1 2 3

    4.5 Keyword :key1 :key2 Symbol this that λ
  10. Quelques Structures de Données List Vector Map Set

  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 »
  12. Beaucoup de fonctions Etc. Excerpt from clojure.org/cheatsheet

  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
  14. Tree Literal en JSON avec une map et des tableaux

    Ex : sortie JSON de la command tree sur mon mac
  15. Tree Literal en Clojure avec map et tableaux

  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
  17. Tree literal avec des objets plus complexe

  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
  19. None
  20. La représentation graphique du graphe est souvent nécessaire pour le

    « toucher » Viz fait avec github.com/ztellman/rhizome
  21. Cas d’Utilisation Des Data Literals En Conception

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

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

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

  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
  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
  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()!
  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
  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
  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
  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
  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!
  33. setShippingMethod! increaseItemQty! Easy Diff

  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
  35. Cas d’Utilisation Des Data Literals En Testing et Debugging

  36. TDD

  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
  38. Exemple de scénario BDD avec données tabulaire

  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
  40. Cas d’Utilisation Des Data Literals En Intégration De Données

  41. Les Flux de Données

  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
  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é
  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)
  45. Des Fonctions Composables Fonction 1 Fonction 2 Fonction 3 État

    t0 État t2 État t1 État t3
  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
  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
  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
  49. Cas d’Utilisation Des Data Literals Domain Specific Language (DSL)

  50. Domain-Specific Language Un DSL avec structure de données profite des

    puissantes fonctions de manipulation de données de Clojure SQL HTML
  51. Cas d’Utilisation Des Data Literals Logs

  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)
  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
  54. C’est bien beau les logs mais… Est ce que je

    peux rejouer une interaction utilisateur ?
  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
  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 -
  57. Code is Data Vector List Symbols List

  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 ?
  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
  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
  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
  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
  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 ! »
  64. Merci ! Des questions ? Des remarques ? @jgrodziski www.grodziski.com

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