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

Clean Code du point de vue de la cognition

Yoan
November 22, 2023

Clean Code du point de vue de la cognition

Dans cette conférence, basée sur le travail de Felienne Hermann (dans son livre "The Programmer's Brain"), vous allez :
- Découvrir les processus cognitifs à l'œuvre lors de la lecture de code
- Apprendre des techniques de lecture pour comprendre rapidement un code complexe
- Découvrir des stratégies de compréhension de texte et comment les appliquer sur du code source
- Comprendre la forte corrélation entre Clean Code (code smells, anti-patterns linguistiques) et charge cognitive
- et bien d'autres choses encore

A la fin de cette session, vous aurez touché du doigt les limites de votre cerveau et repartirez avec des stratégies pour les dépasser.

Préparez-vous à apprendre à apprendre 😉

Yoan

November 22, 2023
Tweet

More Decks by Yoan

Other Decks in Programming

Transcript

  1. Yoan Thirion #sharingiscaring Mon Intention - Comprendre comment fonctionne notre

    cerveau - Partager avec vous des techniques et pratiques nous permettant de devenir meilleur à la fois sur la lecture que sur l’écriture de code
  2. Yoan Thirion #sharingiscaring Cognition “La cognition est l'ensemble des processus

    mentaux qui se rapportent à la fonction de connaissance et mettent en jeu la mémoire, le langage, le raisonnement, l'apprentissage, l'intelligence, la résolution de problèmes, la prise de décision, la perception” - Wikipédia
  3. Yoan Thirion #sharingiscaring Un mot sur le livre Apprendre à

    optimiser les processus cognitifs afin de : • Lire le code plus facilement • Ecrire du code plus rapidement et de meilleure qualité (cognitivement parlant) https://www.manning.com/books/the-programmers-brain Sorti le 7 septembre 2021 Dr Felienne Hermans ü Associate professor at the Leiden Institute of Advanced Computer Science ü @felienne
  4. Yoan Thirion #sharingiscaring Testons votre cerveau Observez ce code pendant

    3 minutes Essayez de le reproduire le mieux possible public class InsertionSort { public static void main(String[] args) { int[] array = {45, 12, 85, 32, 89, 39, 69, 44, 42, 1, 6, 8}; int temp; for (int i = 1; i < array.length; i++) { for (int j = i; j > 0; j--) { if (array[j] < array[j - 1]) { temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } }
  5. Yoan Thirion #sharingiscaring Différents processus cognitifs 1) Information entrant dans

    notre cerveau. 2) Information entre dans la MCT 3) L'information passe de la MCT à la MDT 4) Où elle est combinée à des informations provenant de la MLT Mémoire à Long Terme (MLT) • Peut stocker nos souvenirs pendant une très longue période • Disque dur du cerveau Mémoire à Court Terme (MCT) • Utilisé pour retenir brièvement des informations entrantes • RAM / cache qui peut être utilisé pour stocker temporairement des infos Information Filtre MCT MLT MDT Mémoire de Travail (MDT) • La "pensée" proprement dite se déroule dans la mémoire de travail. • Processeur du cerveau 1 2 3 4
  6. Yoan Thirion #sharingiscaring Que se passe-t-il lorsqu’on lit du code

    ? Utilise la MLT pour accéder à notre connaissance (Mots clés par exemple) Utilise la MCT pour stocker certaines informations que nous rencontrons Essayer d'exécuter mentalement le code / comprendre ce qui se passe TRACING Information Filtre MCT MLT MDT 1 2 4 3
  7. Yoan Thirion #sharingiscaring Que se passe-t-il lorsqu’on lit du code

    ? MLT MCT Filtre MCT MLT MDT 1 2 4 3 public class InsertionSort { public static void main(String[] args) { int[] array = {45, 12, 85, 32, 89, 39, 69, 44, 42, 1, 6, 8}; int temp; for (int i = 1; i < array.length; i++) { for (int j = i; j > 0; j--) { if (array[j] < array[j - 1]) { temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } } int[] array int temp 2 boucles public static void main(String[] args) for (int i = 1; i < array.length; i++)… public class InsertionSort { public static void main(String[] args) { int[] array = {45, 12, 85, 32, 89, 39, 69, 44, 42, 1, 6, 8}; int temp; for (int i = 1; i < array.length; i++) { for (int j = i; j > 0; j--) { if (array[j] < array[j - 1]) { temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } } } for (int i = 0; i < array.length; i++) { System.out.println(array[i]); } } } Code reproduit Les informations extraites de notre MLT dépendent de ce qu’on y a stocké. Une personne moins expérimentée en Java est susceptible d'extraire beaucoup moins d'informations de sa MLT.
  8. Yoan Thirion #sharingiscaring Pourquoi c’est important ? Les recherches indiquent

    que près de 60 % de notre temps est consacré à la lecture / compréhension de code plutôt qu'à son écriture. Reading code Writing code Améliorer notre rapidité de lecture de code (sans perdre en compréhension) nous aide à améliorer considérablement nos compétences en programmation On lit pour de multiples raisons • Ajouter 1 fonctionnalité • Trouver un bug • Comprendre 1 système https://ieeexplore.ieee.org/abstract/document/7997917
  9. Yoan Thirion #sharingiscaring Pourquoi c’est aussi difficile ? Limite de

    temps Ne peut pas retenir de l’info plus de 30 secondes Mémoire à Court Terme Limite de taille Juste quelques “slots” disponible 7 +/- 2 Certaines recherches indiquent que sa capacité pourraient être encore inférieure… 2 à 6 “slots” Un problème de mémoire…
  10. Yoan Thirion #sharingiscaring Surpasser ces limites L’experience de De Groot

    Les experts regroupent les informations de manière logique : chunks / morceaux http://snitkof.com/cg156/chesschunkingtheory.php N'occupe qu'un seul slot dans la MCT
  11. Yoan Thirion #sharingiscaring L’experience de De Groot sur les Devs

    En 1981 Katherine McKeithen a répété l’expérience de De Groot’s avec des Devs : Principal enseignement : les débutants peuvent traiter beaucoup moins de code que les experts. Nombre de lignes de code https://www.researchgate.net/publication/222462455_Knowledge_Organization_and_Skill_Differences_in_Computer_Programmers
  12. Yoan Thirion #sharingiscaring Chunking 1 - Observez cette phrase pendant

    5 secondes et essayez de vous en souvenir le mieux possible - Reproduisez-la sur papier
  13. Yoan Thirion #sharingiscaring Chunking 2 xqlaw qbwukcaw dhjp Plus facile

    que le premier ! Parce qu'il s'agit de lettres que vous reconnaissez 2 phrases de même longueur : 3 mots, 17 caractères, 13 caractères différents - Observez cette phrase pendant 5 secondes et essayez de vous en souvenir le mieux possible - Reproduisez-la sur papier
  14. Yoan Thirion #sharingiscaring Chunking 3 agile grenoble 2023 Ici, vous

    pouvez regrouper les caractères en mots. Vous pouvez alors ne retenir que trois morceaux : “agile”, “grenoble”, “2023”. Comme les experts en échecs - Observez cette phrase pendant 5 secondes et essayez de vous en souvenir le mieux possible - Reproduisez-la sur papier
  15. Yoan Thirion #sharingiscaring Design Patterns The holy origins The holy

    structures CREATIONAL BEHAVIORAL STRUCTURAL The holy behaviors
  16. Yoan Thirion #sharingiscaring Ecrire des commentaires Permet de chunker des

    gros morceaux de code Plus vous avez d'informations stockées sur un sujet spécifique plus il est facile de “chunker” efficacement l'information.
  17. Yoan Thirion #sharingiscaring Mémoire de Travail (MDT) Mémoire à court

    terme appliquée à un problème Quand on lit du code, la mémoire de travail n'est capable de traiter que 2 à 6 “choses” à la fois… Dans le contexte de la mémoire de travail, cette capacité est appelée charge cognitive !!!
  18. Yoan Thirion #sharingiscaring Technique 1 Refactorer pour réduire la charge

    cognitive Refactoring temporaire (la plupart du temps) pour comprendre le code Example – remplacer des constructions linguistiques peu familières 1 dev ne connaissant pas les fameux “functors”, “monads”, … Ce qui est facile à lire / comprendre dépend de nos connaissances préalables Il n'y a pas de honte à s'aider à comprendre un code en le traduisant sous une forme plus familière. Refactorings automatisés
  19. Yoan Thirion #sharingiscaring Technique 2 Dependency graph https://annotate.codereading.club/ Annoter les

    variables Tracer des lignes entre les occurrences d'une même variable Permet de comprendre où les données sont utilisées dans le programme
  20. Yoan Thirion #sharingiscaring Technique 3 State table Un tableau d'état

    se concentre sur les valeurs des variables plutôt que sur la structure du code. Il comporte des colonnes pour chaque variable et des lignes pour chaque étape du code. How to ? Lister toutes les variables Créez un tableau : 1 colonne / variable 1 ligne pour chaque ligne de mutation Exécutez chaque partie du code
  21. Yoan Thirion #sharingiscaring Zones liées à la lecture de texte

    (langage naturel) Technique 4 Stratégies de compréhension de texte appliquées au code Lire du code c’est comme lire du texte
  22. Yoan Thirion #sharingiscaring Stratégies de comprehension de code Activating Penser

    activement à des choses connexes pour activer les connaissances antérieures Determining importance Décider quelles parties d'un texte sont les plus pertinentes Visualizing Dessiner des diagrammes du texte lu pour en approfondir la compréhension Inferring Lier des faits qui ne sont pas explicitement donnés dans le texte Summarizing Créer 1 court résumé textuel Questioning Se poser des questions sur le texte Monitoring Garder une trace de sa compréhension d'un texte
  23. Yoan Thirion #sharingiscaring Chunking Pipeline Extract method Chunking master Functional

    pipeline Dans le Pipeline Object Calisthenics : 1 seul niveau d ’indentation
  24. Yoan Thirion #sharingiscaring Mieux nommer Bon nommage aide à activer

    notre MLT pour trouver des informations pertinentes qu’on connait déjà sur le domaine du code Mauvais nommage peut nous amener à faire des suppositions sur le code, ce qui conduit à des idées fausses
  25. Yoan Thirion #sharingiscaring Pourquoi se focaliser sur le nommage ?

    Une grande partie de notre code = NOMS Créent beaucoup de discussions (Code Reviews) 1 code review sur 4 comprend des remarques sur le nommage… (Miltiadis Allamanis) Les noms : la forme la plus à jour de documentation
  26. Yoan Thirion #sharingiscaring Un bon nom peut être défini de

    manière syntaxique Simon Butler, maître de conférences associé à l'Open University (UK), a dressé une liste de problèmes liés aux noms de variables :
  27. Yoan Thirion #sharingiscaring Code Smells beaucoup de charge cognitive… Long

    parameter list https://refactoring.com/catalog/ Primitive Obsession Comments Cyclomatic Complexity… Surcharge notre MCT Surcharge notre MDT
  28. Yoan Thirion #sharingiscaring Linguistic Anti Patterns https://veneraarnaoudova.com/linguistic-anti-pattern-detector-lapd/LAs/ Des méthodes qui

    en disent plus qu'elles n’en font Identifiants dont le nom indique le contraire de ce que l'entité contient Des méthodes qui en font plus que ce qu’elles disent Des méthodes qui font l’opposé de ce qu’elles disent var elements = retrieveElements(); private Product retrieveElements() { return products.last(); } public Either<Error, PartieDeChasse> PrendreLapéro(Func<DateTime> timeProvider) { _chasseurs.ForEach(c => c.SortirDeLaPartie(this)); Status = Apéro; EmitEvent("Petit apéro", timeProvider); return this; } private bool Exists(string chasseur) { var found = false; foreach (var c in _chasseurs) { if (c.Nom == chasseur) { return found; } } return false; } var isValid = 42; Impossible à chunker correctement…
  29. Yoan Thirion #sharingiscaring Ses trouvailles Elle a étudié leur présence

    dans 7 projets open-source : 11% des setters : renvoient également une valeur 2,5% des méthodes : nom et commentaire donnent des descriptions opposées à son fonctionnement 64% des identifiants commençant par 'is’ : pas des booléens…
  30. Yoan Thirion #sharingiscaring Comment s’en prémunir ? Les avoir en

    tête nous permet de les éviter (Code Smells, LAP, …) Check lists pour les Code Reviews Apprendre ensemble : code kata, coaching craft Automatiser leur detection Analyses static / comportementale de code [Fact] public void NoGetMethodShouldReturnVoid() => Methods() .HaveNameMatching("Get[A-Z].*", useRegularExpressions: true).Should() .NotHaveReturnType(typeof(void)) .Check(); [Fact] public void IserAndHaserShouldReturnBooleans() => Methods() .HaveNameMatching("Is[A-Z].*", useRegularExpressions: true).Or() .HaveNameMatching("Has[A-Z].*", useRegularExpressions: true).Should() .HaveReturnType(typeof(bool)) .Check(); [Fact] public void SettersShouldNotReturnSomething() => Methods() .HaveNameMatching("Set[A-Z].*", useRegularExpressions: true).Should() .HaveReturnType(typeof(void)) .Check(); [Fact] public void FieldsShouldNotUseIncorrectSyntax() => FieldMembers().That() .HaveNameMatching("__", useRegularExpressions:true) .Should() .NotExist() .Check(); https://github.com/ythirion/archunit-examples/
  31. Yoan Thirion #sharingiscaring Abstract Code Smells / LAP Ecrire du

    code chunkable (Patterns, bon nommage, commentaires de haut niveau, …) Travailler les techniques de lecture Automatiser la détection Une caution scientifique sur le feeling qu’on avait avec Clean Code
  32. Yoan Thirion #sharingiscaring A decouvrir en plus Flashcards Rétention dans

    la MLT (Automatisation) Gérer les interruptions Meilleur on-boarding … https://yoan-thirion.gitbook.io/knowledge-base/software-craftsmanship/the-programmers-brain