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

Lis mon code

dicaormu
October 02, 2021

Lis mon code

Si vous êtes un développeur, peut-être que vous vous demandez comment mieux écrire le code pour qu'il soit fonctionnel, efficace, correct et plus facile à comprendre.
Avec ce talk, je vais me concentrer sur des règles et concepts de la psychologie avec des exemples concrets sur le code, pour trouver les paramètres généraux, qui nous aident à identifier le code qui est lisible par rapport au code qui ne l'est pas.

dicaormu

October 02, 2021
Tweet

More Decks by dicaormu

Other Decks in Programming

Transcript

  1. 2 Diana Ortega Développeur back-end avec plusieurs années d'expérience dans

    l'écosystème JVM et le langage Go. Vécu de nombreux projets cloud et data et passionnée par le développement logiciel, la Data et le craftsmanship @dicaormu
  2. 3 • Introduction et contexte • Mémoire à long terme

    • Mémoire de travail • Modèles mentaux Agenda
  3. 6 • D’habitude on travaille sur des projets avec une

    base de code existante • En 2013 la quantité des lignes de code estimés était de 1 trillion (Grady Booch's keynote at AOSD) • Il y a plus de 190M de projets gitHub dans le monde (d’après octoverse), dont de projets open source On lit beaucoup de code
  4. 11 case class ArgumentDefaultConf(env: String, mvt_cpt: Float, uwx2: Int, QUSCRTUS:

    String, i: Int, fs: FileSystemService, SK_tt1: String, toto: String, fab11: String, colv2: String, csvHeaderFromExtendedReader: String = "false" ) Test 1
  5. 14 D’après les recherches, la quantité d’information que le cerveau

    peut faire face avant que la confusion ne s'installe, est connue comme le nombre magique George Miller 1956 - psychologue Américain et Gordon Parker 2012 4
  6. 16 class Volume{ int width, height, length, posx, posy, posz,

    time; String color, name; Float spin, velocity; public int computeAngularVelocity(){ …. } } Test 2
  7. 19 public static void mian(String[] args) { Volume v =

    new Volume(); System.out.println(v.computeAngularVelocity()); } } 19 C’est possible que vous ne vous rappelez de l'implémentation dans quelques quelques heures
  8. 21 public static void mian(String[] args) { Volume v =

    new Volume(); System.out.println(v.computeAngularVelocity()); } }
  9. 23 a) for (String car : cars){ i) System.out.println(car); }

    b) for (int i=0; i<cars.size(); i++){ i) System.out.println(cars.get(i)); } c) for (int i = 0; cars.size()-1 >= i; i=i+1){ i) System.out.println(cars.get(i)); } Quelle est la meilleure option ?
  10. 25 A) for (String car : cars){…} // il y

    a le mot clé for, alors c’est une boucle Si c’était un langage inconnu
  11. 26 A) for (String car : cars){…} // il y

    a le mot clé for, alors c’est une boucle // On déclare la variable car Si c’était un langage inconnu
  12. 27 A) for (String car : cars){…} // il y

    a le mot clé for, alors c’est une boucle // On déclare la variable car // et on parcourt la collection de cars // pour mettre chaque élément dans la variable car Si c’était un langage inconnu
  13. 28 A) for (String car : cars){…} // Itérer sur

    la liste de cars. Et on connaît le type de car Langage connu
  14. 29 C) for(int i = 0; cars.size()-1 >= i; i=i+1){...}

    // il faut faire tout le processus Langage connu, code non idiomatique
  15. 30 for (String car : cars){ …} Idiomatique code, standards

    et patterns : existent dans tous les langages
  16. 32 const ( C0 = iota C1 C2 ) Idiomatique

    code, standards et patterns : existent dans tous les langages
  17. 34 • Utilisation de patterns • Utilisation de code idiomatique

    • Séparation par couches • Standards du langage • Familiarité => à quoi sert un flat map ? Reconnaissance des formes
  18. 35 • Noms de variables • Noms de méthodes •

    Noms de packages • Formatage du code • Interaction entre les services Cohérence
  19. 42 fruitsColors := map[string]string{"apple": "red", "banana": "yellow"} for key, value

    := range fruitsColors { fmt.Printf("%s -> %s\n", key, value) } if fruitsColors["apple"] == "red" { goodFruit = "apple" } else { goodFruit = "banana" }
  20. 44 fruitsColors:=map[string]string{"apple": "red", "banana": "yellow"} for key,value:=range fruitsColors{ fmt.Printf("%s ->

    %s\n",key,value) } if fruitsColors["apple"]=="red"{ goodFruit="apple" } else{ goodFruit="banana" }
  21. 46 fruitsColors := map[string]string{ "apple": "red", "banana": "yellow"} for key,

    value := range fruitsColors { fmt.Printf("%s -> %s\n", key, value) } if fruitsColors["apple"] == "red" { goodFruit = "apple" } else { goodFruit = "banana" }
  22. 49 • Séparer les idées à l'intérieur d’une méthode avec

    des espaces • Chaque méthode implémente peu d’idées • Utiliser les éléments du langage comme les interfaces ou les classes • Utiliser des packages (attention aux noms) • Evitez d’avoir un grand package “utils” Regroupement
  23. 50

  24. 54 fruitsColors := map[string]string{ "apple": "red", "banana": "yellow"} Explication très

    superficielle de Cowan, Nelson (1995) attention and memory : an integrated framework
  25. 55 for key, value := range fruitsColors { fmt.Printf("%s ->

    %s\n", key, value) } Explication très superficielle de Cowan, Nelson (1995) attention and memory : an integrated framework
  26. 56 if fruitsColors["apple"] == "red" { goodFruit = "apple" }

    Explication très superficielle de Cowan, Nelson (1995) attention and memory : an integrated framework
  27. 57 else { goodFruit = "banana" } Explication très superficielle

    de Cowan, Nelson (1995) attention and memory : an integrated framework
  28. 58 func function2(goodFruit string) { Explication très superficielle de Cowan,

    Nelson (1995) attention and memory : an integrated framework
  29. 60

  30. 61 Seulement 10% du temps, un développeur est capable de

    reprendre son code en moins d’une minute après une interruption Takao Nakagawa et al., “Quantifying Programmers’ Mental Workload during Program Comprehension Based on Cerebral Blood Flow Measurement: A Controlled Experiment,” 2014
  31. 63 Arbitrage entre Essayer de réduire la quantité d’interactions de

    mon code Essayer d’avoir tout mon code dans un seul endroit
  32. 67 Long parameter list Switch statements Alternative classes with different

    interfaces Primitive obsession Incomplete library class Large class Lazy class Data class Temporary field Data clumps Divergent change Feature envy Inappropriate intimacy Duplicated code or code clones Comments Message chains Middle man Parallel inheritance Refused bequest Shotgun surgery Speculative generality Les code smells- Martin Fowler
  33. 74 • Un diagramme d’état peut nous aider à comprendre

    un système • Un diagramme d’architecture du code peut nous aider à comprendre le code et nous aider à réduire la charge cognitive Modèles sketch by Nagai Hideyuki http://www.anopticalillusion.com/2015/06/impossible-stairway-by-nagai-hideyu ki/
  34. 75 • On peut se baser sur des approches existantes

    pour générer nos modèles: ◦ Domain Driven Design (DDD) ◦ Architectures hexagonales Modèles pour les systèmes plus complexes sketch by Nagai Hideyuki http://www.anopticalillusion.com/2015/06/impossible-stairway-by-nagai-hideyuki/
  35. 78

  36. 79

  37. 81 def up do alter table(:articles) do add :search_vector, :tsvector

    end execute "CREATE INDEX article_search_index ON articles USING GIN(search_vector)" end Exemple Elixir
  38. 82 • Si vous n’êtes pas dev. Elixir, vous traduisez

    ce code : def up do : création d’un méthode alter table(:articles) do : modification de la table articles … execute "CREATE INDEX article_search_index ON articles USING GIN(search_vector)" : C’est du SQL
  39. 83 • Si vous n’êtes pas dev. Elixir, vous traduisez

    ce code : def up do : création d’un méthode alter table(:articles) do : modification de la table articles … execute "CREATE INDEX article_search_index ON articles USING GIN(search_vector)" : C’est du SQL On mélange 2 types d’abstraction!!!
  40. 84 • Du code lisible est un code avec un

    modèle fort • Evitez les dépendances cycliques et les code smells • Evitez de mélanger les abstractions • Aidez votre mémoire Comment réduire la charge cognitive?
  41. 86 Make it work, make it right, make it fast

    Kent Beck (co-inventeur du xp)
  42. 88 • Nous avons une charge cognitive limitée (4 +-

    2) • On peut mieux exploiter ce petit nombre Conclusion
  43. 96 Références • GopherCon Europe 2019: Egon Elbre - Psychology

    of Code Readability • Octoverse survey • Cowan, Nelson (1995) attention and memory : an integrated framework • University of New South Wales. "Four is the 'magic' number." ScienceDaily. ScienceDaily, 28 November 2012. • Raymond Lister, Toward a Developmental Epistemology of Computer Programming; WiPSCE '16 • Felienne Hermans, The Programmer's Brain, What every programmer needs to know about cognition