[{"data":1,"prerenderedAt":1078},["ShallowReactive",2],{"author-axel-shaita":3,"author-articles-axel-shaita":22,"authors":762},{"id":4,"title":5,"body":6,"description":10,"extension":13,"meta":14,"name":15,"navigation":16,"path":17,"readingTime":18,"seo":19,"stem":20,"__hash__":21},"authors\u002Fauthors\u002Faxel-shaita.md","Engineering Manager",{"type":7,"value":8,"toc":9},"minimark",[],{"title":10,"searchDepth":11,"depth":11,"links":12},"",2,[],"md",{},"Axel Shaïta",true,"\u002Fauthors\u002Faxel-shaita",1,{"title":5,"description":10},"authors\u002Faxel-shaita","fK0argUhsBkWLjpTAhY13oYLVzQthcEYkCEdtHWmIgE",[23],{"id":24,"title":25,"author":26,"body":27,"date":749,"description":750,"extension":13,"lang":751,"meta":752,"navigation":16,"path":753,"published":16,"readingTime":754,"seo":755,"stem":756,"tags":757,"__hash__":761},"articles\u002Farticles\u002F2026-03-06-comment-conventional-comments-a-transforme-nos-code-reviews.md","Comment Conventional Comments a transformé nos code reviews","axel-shaita",{"type":7,"value":28,"toc":723},[29,33,44,47,52,55,60,63,118,126,129,132,136,139,142,146,149,155,161,164,168,174,177,183,186,215,218,222,332,335,339,342,350,356,364,370,373,377,380,385,388,394,397,400,405,445,451,455,475,481,485,508,514,518,548,554,558,564,568,572,575,579,582,585,588,592,595,598,601,605,608,611,615,618,621,625,628,631,635,638,642,645,654,675,679,682,686,689,693,696,710,713,716,719],[30,31,32],"p",{},"Dans une équipe de développement, relire le code des autres c’est naturel. Savoir comment formuler\nses retours, beaucoup moins.",[30,34,35,36,43],{},"Chez Indy, nos reviews fonctionnaient bien. Le code était relu, les bugs étaient détectés. Mais la\nfaçon dont on formulait nos commentaires créait parfois de la confusion et des allers-retours\ninutiles. On a donc adopté ",[37,38,42],"a",{"href":39,"rel":40},"https:\u002F\u002Fconventionalcomments.org\u002F",[41],"nofollow","Conventional Comments",", une\nconvention toute simple qui a rendu nos échanges plus clairs et nos reviews plus efficaces.",[30,45,46],{},"Voici pourquoi et comment.",[48,49,51],"h2",{"id":50},"ce-quon-voulait-améliorer","Ce qu'on voulait améliorer",[30,53,54],{},"Certaines situations revenaient régulièrement dans nos reviews. Pas des problèmes graves, mais des\nfrictions qu’on pensait évitables.",[56,57,59],"h3",{"id":58},"lintention-qui-ne-passe-pas-à-lécrit","L’intention qui ne passe pas à l’écrit",[30,61,62],{},"Un reviewer écrit sur ce bout de code",[64,65,69],"pre",{"className":66,"code":67,"language":68,"meta":10,"style":10},"language-ts shiki shiki-themes github-light github-dark","for (const user of users) {\n  await stripe.customers.create({ email: user.email });\n}\n","ts",[70,71,72,97,112],"code",{"__ignoreMap":10},[73,74,76,80,84,87,91,94],"span",{"class":75,"line":18},"line",[73,77,79],{"class":78},"szBVR","for",[73,81,83],{"class":82},"sVt8B"," (",[73,85,86],{"class":78},"const",[73,88,90],{"class":89},"sj4cs"," user",[73,92,93],{"class":78}," of",[73,95,96],{"class":82}," users) {\n",[73,98,99,102,105,109],{"class":75,"line":11},[73,100,101],{"class":78},"  await",[73,103,104],{"class":82}," stripe.customers.",[73,106,108],{"class":107},"sScJk","create",[73,110,111],{"class":82},"({ email: user.email });\n",[73,113,115],{"class":75,"line":114},3,[73,116,117],{"class":82},"}\n",[64,119,124],{"className":120,"code":122,"language":123},[121],"language-text","L'appel à Stripe est fait dans la boucle, ça va générer une requête par utilisateur.\n","text",[70,125,122],{"__ignoreMap":10},[30,127,128],{},"Le constat est bon. Le reviewer a vu un vrai sujet. Mais l’auteur de la PR ne sait pas quoi en\nfaire. C’est un bug à corriger avant le merge ? Une suggestion d’optimisation pour plus tard ? Juste\nune observation ? Ça finit en « Tu veux que je change quelque chose ou c’est juste une remarque ? »",[30,130,131],{},"Le problème n’est pas la qualité du commentaire. C’est que l’écrit ne transmet pas l’intention aussi\nfacilement qu’on le croit. Notre commentaire peut être lu de plusieurs façons différentes.",[56,133,135],{"id":134},"le-filtre-de-lexpérience","Le filtre de l’expérience",[30,137,138],{},"Dans beaucoup d’équipes, un développeur junior va naturellement moins commenter les PR d’un senior.\nCe n’est pas qu’il n’a rien à dire, c’est qu’il ne sait pas comment le dire. Est-ce que c’est\npertinent ? Est-ce que ça va paraître naïf ? Sans cadre clair, le doute l’emporte et il laisse\npasser.",[30,140,141],{},"De l’autre côté, un senior qui écrit un commentaire direct ne cherche pas à fermer la discussion.\nC’est juste sa manière d’aller à l’essentiel. Mais quand il n’y a pas de langage partagé, le même\ncommentaire peut être lu comme un retour constructif ou comme une fin de non-recevoir.",[56,143,145],{"id":144},"pas-de-hiérarchie-dans-les-commentaires","Pas de hiérarchie dans les commentaires",[30,147,148],{},"Prenons deux commentaires issus d’une vraie review :",[64,150,153],{"className":151,"code":152,"language":123},[121],"Il manque une ligne vide avant le return.\n",[70,154,152],{"__ignoreMap":10},[64,156,159],{"className":157,"code":158,"language":123},[121],"Le Promise.all() ici lance les trois appels en parallèle, mais le deuxième a besoin du résultat du premier pour fonctionner.\n",[70,160,158],{"__ignoreMap":10},[30,162,163],{},"Ces deux commentaires vivent côte à côte dans la même review. L’un est un détail de formatting,\nl’autre est un vrai bug. Mais rien ne les distingue. L’auteur de la PR les traite avec le même\nniveau d’attention, alors que l’un mériterait clairement plus de focus que l’autre.",[48,165,167],{"id":166},"le-principe-de-conventional-comments","Le principe de Conventional Comments",[30,169,170,173],{},[37,171,42],{"href":39,"rel":172},[41]," est une convention légère pour structurer\nles commentaires de review. Pas un outil à installer, pas un process à déployer. Juste un format\nd’écriture que l’équipe décide d’adopter ensemble.",[30,175,176],{},"Chaque commentaire suit ce format :",[64,178,181],{"className":179,"code":180,"language":123},[121],"\u003Clabel> [decorations]: \u003Csubject> [discussion]\n",[70,182,180],{"__ignoreMap":10},[30,184,185],{},"Nous avons quatre éléments, dont deux optionnels :",[187,188,189,197,203,209],"ul",{},[190,191,192,196],"li",{},[193,194,195],"strong",{},"Label"," : le type de commentaire (issue, suggestion, nitpick…). C’est lui qui porte l’intention.\nEn un mot, le lecteur sait à quoi s’attendre.",[190,198,199,202],{},[193,200,201],{},"Decoration"," (optionnelle) : Utile quand le label seul ne suffit.",[190,204,205,208],{},[193,206,207],{},"Sujet"," : le message principal, en une ligne. Ce qu’on veut dire.",[190,210,211,214],{},[193,212,213],{},"Discussion"," (optionnelle) : le contexte, le raisonnement, une piste de solution. Le « pourquoi\n» derrière le commentaire.",[30,216,217],{},"L’idée est simple : à l’écrit, le ton est difficile à deviner. Le label le remplace, il dit\nexplicitement ce que le reviewer attend.",[48,219,221],{"id":220},"les-labels-quon-utilise","Les labels qu’on utilise",[223,224,225,238],"table",{},[226,227,228],"thead",{},[229,230,231,235],"tr",{},[232,233,195],"th",{"align":234},"left",[232,236,237],{"align":234},"Ce que ça veut dire",[239,240,241,252,262,272,282,292,302,312,322],"tbody",{},[229,242,243,249],{},[244,245,246],"td",{"align":234},[193,247,248],{},"issues",[244,250,251],{"align":234},"Un vrai problème : bug, risque, régression. À traiter.",[229,253,254,259],{},[244,255,256],{"align":234},[193,257,258],{},"suggestion",[244,260,261],{"align":234},"Une vraie amélioration : meilleur pattern, refacto, optimisation. Le code marche sans, mais il serait mieux avec.",[229,263,264,269],{},[244,265,266],{"align":234},[193,267,268],{},"question",[244,270,271],{"align":234},"On ne comprend pas un choix, on demande une clarification.",[229,273,274,279],{},[244,275,276],{"align":234},[193,277,278],{},"nitpick",[244,280,281],{"align":234},"Un détail de style ou de préférence. Non bloquant par définition.",[229,283,284,289],{},[244,285,286],{"align":234},[193,287,288],{},"praise",[244,290,291],{"align":234},"Quelque chose de bien fait qu’on veut souligner.",[229,293,294,299],{},[244,295,296],{"align":234},[193,297,298],{},"thought",[244,300,301],{"align":234},"Une réflexion, une idée. Pas une demande de changement.",[229,303,304,309],{},[244,305,306],{"align":234},[193,307,308],{},"todo",[244,310,311],{"align":234},"Un petit changement nécessaire mais trivial pouvant être effectué plus tard.",[229,313,314,319],{},[244,315,316],{"align":234},[193,317,318],{},"chore",[244,320,321],{"align":234},"Une tâche mécanique avant le merge (lancer un script, mettre à jour un fichier).",[229,323,324,329],{},[244,325,326],{"align":234},[193,327,328],{},"note",[244,330,331],{"align":234},"Une info utile pour le lecteur, sans action attendue.",[30,333,334],{},"On n’utilisera pas tous les labels tout le temps. L’important, c’est que chaque équipe trouve le\nsous-ensemble qui lui convient.",[56,336,338],{"id":337},"les-décorations","Les décorations",[30,340,341],{},"Les décorations se placent entre parenthèses après le label. Elles ajoutent du contexte sans changer\nle type de commentaire. Il y en a deux familles.",[187,343,344],{},[190,345,346,349],{},[193,347,348],{},"Le niveau de blocage"," : est-ce que ça doit être traité avant le merge ?",[64,351,354],{"className":352,"code":353,"language":123},[121],"issue (blocking): Cette mutation n'est pas idempotente.\n\nsuggestion (non-blocking): On pourrait extraire cette logique dans un composable dédié.\n\nsuggestion (if-minor): Renommer cette variable, seulement si le changement reste trivial.\n",[70,355,353],{"__ignoreMap":10},[187,357,358],{},[190,359,360,363],{},[193,361,362],{},"Le domaine concerné"," : de quoi on parle exactement ?",[64,365,368],{"className":366,"code":367,"language":123},[121],"issue (security): Le token est stocké en clair dans le localStorage.\n\nsuggestion (performance): Cette requête SQL fait un full scan, un index sur user_id réglerait le problème.\n\nnitpick (documentation): Le JSDoc de cette fonction ne mentionne pas le cas d'erreur.\n\nissue (accessibility): Ce bouton n'a pas de label accessible, un lecteur d'écran ne saura pas à quoi il sert.\n",[70,369,367],{"__ignoreMap":10},[30,371,372],{},"On peut aussi combiner les deux : issue (blocking, security): quand c’est à la fois critique et lié\nà la sécurité. L’idée c’est pas de tout décorer systématiquement, mais d’ajouter une précision quand\nelle aide le lecteur.",[48,374,376],{"id":375},"en-pratique","En pratique",[30,378,379],{},"Reprenons d’abord le commentaire sur l’appel Stripe qu’on a vu plus haut :",[64,381,383],{"className":382,"code":122,"language":123},[121],[70,384,122],{"__ignoreMap":10},[30,386,387],{},"Avec Conventional Comments, ça devient :",[64,389,392],{"className":390,"code":391,"language":123},[121],"suggestion (non-blocking): L'appel à Stripe est fait dans la boucle, ça va générer une requête par utilisateur.\n",[70,393,391],{"__ignoreMap":10},[30,395,396],{},"Même commentaire, mais maintenant tout est plus clair : c’est une suggestion, c’est pas bloquant, et\nil y a une piste concrète. L’aller-retour disparaît.",[30,398,399],{},"Voici d’autres exemples du quotidien.",[401,402,404],"h4",{"id":403},"un-vrai-problème-à-traiter-issue","Un vrai problème à traiter (issue)",[64,406,408],{"className":66,"code":407,"language":68,"meta":10,"style":10},"const user = await getUser(id);\nconst orders = await getOrders(user.id);\n",[70,409,410,428],{"__ignoreMap":10},[73,411,412,414,416,419,422,425],{"class":75,"line":18},[73,413,86],{"class":78},[73,415,90],{"class":89},[73,417,418],{"class":78}," =",[73,420,421],{"class":78}," await",[73,423,424],{"class":107}," getUser",[73,426,427],{"class":82},"(id);\n",[73,429,430,432,435,437,439,442],{"class":75,"line":11},[73,431,86],{"class":78},[73,433,434],{"class":89}," orders",[73,436,418],{"class":78},[73,438,421],{"class":78},[73,440,441],{"class":107}," getOrders",[73,443,444],{"class":82},"(user.id);\n",[64,446,449],{"className":447,"code":448,"language":123},[121],"issue (blocking): Si getUser renvoie null, la ligne d'après crash sur user.id.\n",[70,450,448],{"__ignoreMap":10},[401,452,454],{"id":453},"on-ne-comprend-pas-un-choix-question","On ne comprend pas un choix (question)",[64,456,458],{"className":66,"code":457,"language":68,"meta":10,"style":10},"const MAX_RETRIES = 10;\n",[70,459,460],{"__ignoreMap":10},[73,461,462,464,467,469,472],{"class":75,"line":18},[73,463,86],{"class":78},[73,465,466],{"class":89}," MAX_RETRIES",[73,468,418],{"class":78},[73,470,471],{"class":89}," 10",[73,473,474],{"class":82},";\n",[64,476,479],{"className":477,"code":478,"language":123},[121],"question: Pourquoi 10 ? C'est basé sur un cas réel ou c'est arbitraire ?\n",[70,480,478],{"__ignoreMap":10},[401,482,484],{"id":483},"un-détail-nitpick","Un détail (nitpick)",[64,486,488],{"className":66,"code":487,"language":68,"meta":10,"style":10},"const d = new Date(user.createdAt);\n",[70,489,490],{"__ignoreMap":10},[73,491,492,494,497,499,502,505],{"class":75,"line":18},[73,493,86],{"class":78},[73,495,496],{"class":89}," d",[73,498,418],{"class":78},[73,500,501],{"class":78}," new",[73,503,504],{"class":107}," Date",[73,506,507],{"class":82},"(user.createdAt);\n",[64,509,512],{"className":510,"code":511,"language":123},[121],"nitpick: \"d\" est cryptique, \"createdDate\" serait plus clair.\n",[70,513,511],{"__ignoreMap":10},[401,515,517],{"id":516},"du-code-bien-fait-quon-souligne-praise","Du code bien fait qu’on souligne (praise)",[64,519,521],{"className":66,"code":520,"language":68,"meta":10,"style":10},"const schema = z.discriminatedUnion(\"type\", [invoiceSchema, creditNoteSchema]);\n",[70,522,523],{"__ignoreMap":10},[73,524,525,527,530,532,535,538,541,545],{"class":75,"line":18},[73,526,86],{"class":78},[73,528,529],{"class":89}," schema",[73,531,418],{"class":78},[73,533,534],{"class":82}," z.",[73,536,537],{"class":107},"discriminatedUnion",[73,539,540],{"class":82},"(",[73,542,544],{"class":543},"sZZnC","\"type\"",[73,546,547],{"class":82},", [invoiceSchema, creditNoteSchema]);\n",[64,549,552],{"className":550,"code":551,"language":123},[121],"praise: Bon usage du discriminatedUnion, c'est le bon pattern ici.\n",[70,553,551],{"__ignoreMap":10},[401,555,557],{"id":556},"une-réflexion-thought","Une réflexion (thought)",[64,559,562],{"className":560,"code":561,"language":123},[121],"thought: On a deux façons de gérer les erreurs dans le repo, ça vaudrait le coup d'en discuter en équipe pour converger.\n",[70,563,561],{"__ignoreMap":10},[48,565,567],{"id":566},"ce-que-ça-a-changé-chez-nous","Ce que ça a changé chez nous",[56,569,571],{"id":570},"les-pr-avancent-plus-vite","Les PR avancent plus vite",[30,573,574],{},"Avant, l’auteur d’une PR devait relire chaque commentaire pour deviner s’il était bloquant ou non.\nTrois commentaires ambigus pouvaient bloquer un merge, le temps de clarifier. Maintenant, quand on\nvoit trois nitpick et zéro issue, on sait que la PR est prête. On traite les détails si besoin sans\nque ça bloque le merge.",[56,576,578],{"id":577},"les-juniors-commentent-plus-facilement","Les juniors commentent plus facilement",[30,580,581],{},"Avant les labels, nos développeurs moins expérimentés postaient rarement des commentaires sur les PR\ndes seniors. Depuis, on voit des « question: pourquoi on n’utilise pas X ici ? » apparaître\nrégulièrement. Le label porte l’intention à leur place, c’est une question, pas une critique.",[30,583,584],{},"Le senior le sait, le junior le sait, tout le monde est à l’aise. Un thought permet aussi de\npartager une réflexion sans s’engager sur une demande de changement. C’est un espace que beaucoup de\ngens dans l’équipe n’osaient pas prendre avant.",[30,586,587],{},"Et c’est loin d’être anecdotique. Un développeur qui ose commenter, poser des questions, challenger\nun choix technique, c’est un développeur qui progresse. Cette légitimité à s’exprimer dans une\nreview, c’est un levier de montée en compétence qu’il faut encourager, pas laisser au hasard.",[56,589,591],{"id":590},"les-échanges-senlisent-moins","Les échanges s’enlisent moins",[30,593,594],{},"Un nitpick: dit explicitement « c’est un détail, fais-en ce que tu veux ». L’auteur ne se sent pas\nsommé de tout corriger, le reviewer ne se sent pas ignoré quand sa remarque n’est pas suivie.",[30,596,597],{},"Au fond, les labels enlèvent l’émotion de l’équation. Particulièrement en français, l’écrit véhicule\nmal les intentions, une phrase neutre peut sonner sèche, une suggestion peut ressembler à un ordre,\nle label neutralise ça. Le retour devient plus simple à formuler, et plus simple à recevoir.",[30,599,600],{},"Et quand un vrai désaccord apparaît, la meilleure chose à faire reste d’en discuter de vive voix.",[56,602,604],{"id":603},"le-praise-change-la-culture","Le praise change la culture",[30,606,607],{},"On le dit rarement, mais souligner ce qui est bien fait a un vrai impact. Un praise fait plaisir à\nrecevoir et rappelle que la review n’est pas là uniquement pour pointer les problèmes.",[30,609,610],{},"Ça contribue à une culture où les gens ont envie de relire le code des autres et où la review est\naussi un outil de partage de connaissances, pas seulement de détection de bugs.",[56,612,614],{"id":613},"on-soblige-à-réfléchir","On s’oblige à réfléchir",[30,616,617],{},"Le simple fait de choisir un label force à clarifier sa propre pensée. Est-ce que c’est vraiment une\nissue ou juste un nitpick ? Est-ce que c’est blocking ou non-blocking ? Cette micro-réflexion\nproduit des commentaires plus précis et plus justes.",[30,619,620],{},"Le format force le reviewer à expliciter son niveau de préoccupation, c’est bénéfique des deux\ncôtés.",[48,622,624],{"id":623},"comment-on-la-adopté","Comment on l’a adopté",[30,626,627],{},"On n’a pas fait de grande annonce ni imposé un nouveau process. Quelques personnes ont commencé à\nutiliser les labels dans leurs reviews. Les autres ont vu le format, ont compris l’intérêt, et ont\nsuivi naturellement.",[30,629,630],{},"Si vous voulez faire pareil, voici ce qui a marché pour nous.",[56,632,634],{"id":633},"montrer-lexemple","Montrer l’exemple",[30,636,637],{},"Plutôt qu’imposer une règle, utilisez les labels dans vos propres reviews. L’intérêt se voit\nimmédiatement quand quelqu’un reçoit par exemple un nitpick pour la première fois, il comprend tout\nde suite la valeur du format.",[56,639,641],{"id":640},"outiller-léquipe","Outiller l’équipe",[30,643,644],{},"Le plus gros frein à l’adoption, c’est la friction. Si taper un label prend plus de temps qu’écrire\nun commentaire libre, personne ne le fera.",[30,646,647,648,653],{},"Sur GitHub, les\n",[37,649,652],{"href":650,"rel":651},"https:\u002F\u002Fdocs.github.com\u002Fen\u002Fget-started\u002Fwriting-on-github\u002Fworking-with-saved-replies\u002Fusing-saved-replies",[41],"saved replies","\npermettent de pré-remplir vos labels en un clic.",[30,655,656,657,662,663,668,669,674],{},"Petit bonus maison, un dev de l’équipe a développé Conventional Shields, une extension\n",[37,658,661],{"href":659,"rel":660},"https:\u002F\u002Fchromewebstore.google.com\u002Fdetail\u002Fconventional-shields-for\u002Fhjpbcioocbdinicingjamfhggimfcomd?hl=en",[41],"Chrome",",\n",[37,664,667],{"href":665,"rel":666},"https:\u002F\u002Faddons.mozilla.org\u002Ffr\u002Ffirefox\u002Faddon\u002Fconventional-shields-for-prs\u002F",[41],"Firefox"," et\n",[37,670,673],{"href":671,"rel":672},"https:\u002F\u002Fgithub.com\u002FV-Roger\u002FConventional-Shields",[41],"Raycast"," qui ajoute des badges visuels directement\ndans l’interface GitHub pour rendre les labels encore plus lisibles.",[56,676,678],{"id":677},"ne-pas-être-rigide","Ne pas être rigide",[30,680,681],{},"Si quelqu’un écrit nit au lieu de nitpick, l’intention est là. L’objectif c’est de mieux\ncommuniquer, pas de respecter un format à la lettre. Pareil, si un commentaire n’a pas de label mais\nqu’il est clair et constructif, personne ne va le refuser.",[56,683,685],{"id":684},"faire-une-review-en-mob-les-premières-semaines","Faire une review en mob les premières semaines",[30,687,688],{},"Les premiers jours, faites une ou deux reviews à plusieurs. Quelqu’un partage son écran, on commente\nensemble, on discute du choix de label. Ça aligne tout le monde et ça évite que chacun interprète\nles labels à sa manière.",[48,690,692],{"id":691},"pour-conclure","Pour conclure",[30,694,695],{},"Conventional Comments ne résout pas tous les sujets liés aux code reviews. Ça ne remplace pas :",[187,697,698,701,704,707],{},[190,699,700],{},"une culture de feedback saine",[190,702,703],{},"la discipline de faire des PR de taille raisonnable",[190,705,706],{},"le réflexe de passer en visio quand un désaccord s’enlise à l’écrit",[190,708,709],{},"la relecture de son propre code avant de l’envoyer en review",[30,711,712],{},"Mais ça apporte quelque chose de précieux : rendre explicite ce qui était implicite. L’intention du\nreviewer, la priorité du commentaire, le niveau d’exigence attendu, tout est clair dès la première\nligne. Et ça change la dynamique.",[30,714,715],{},"La review devient un vrai espace de collaboration et d’apprentissage, où chacun peut s’exprimer avec\nconfiance, quel que soit son niveau d’expérience.",[30,717,718],{},"Parce qu’au fond, une bonne code review, ce n’est pas qu’une question de code. C’est surtout une\nquestion de communication.",[720,721,722],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":10,"searchDepth":11,"depth":11,"links":724},[725,730,731,734,735,742,748],{"id":50,"depth":11,"text":51,"children":726},[727,728,729],{"id":58,"depth":114,"text":59},{"id":134,"depth":114,"text":135},{"id":144,"depth":114,"text":145},{"id":166,"depth":11,"text":167},{"id":220,"depth":11,"text":221,"children":732},[733],{"id":337,"depth":114,"text":338},{"id":375,"depth":11,"text":376},{"id":566,"depth":11,"text":567,"children":736},[737,738,739,740,741],{"id":570,"depth":114,"text":571},{"id":577,"depth":114,"text":578},{"id":590,"depth":114,"text":591},{"id":603,"depth":114,"text":604},{"id":613,"depth":114,"text":614},{"id":623,"depth":11,"text":624,"children":743},[744,745,746,747],{"id":633,"depth":114,"text":634},{"id":640,"depth":114,"text":641},{"id":677,"depth":114,"text":678},{"id":684,"depth":114,"text":685},{"id":691,"depth":11,"text":692},"2026-03-06","Dans une équipe de développement, relire le code des autres c’est naturel. Savoir comment formuler ses retours, beaucoup moins.","fr",{},"\u002Farticles\u002F2026-03-06-comment-conventional-comments-a-transforme-nos-code-reviews",12,{"title":25,"description":750},"articles\u002F2026-03-06-comment-conventional-comments-a-transforme-nos-code-reviews",[758,759,760],"Code Review","Bonnes pratiques","Collaboration","JNzePLG6byCq_ETeuw_f2FZSRByzkEEQgUYF5dBkwgw",[763,776,788,795,808,820,832,845,858,871,883,895,908,920,932,944,956,968,980,992,1005,1017,1029,1042,1054,1066],{"id":764,"title":765,"body":766,"description":10,"extension":13,"meta":770,"name":771,"navigation":16,"path":772,"readingTime":18,"seo":773,"stem":774,"__hash__":775},"authors\u002Fauthors\u002Falexandre-guillon.md","Software Engineer",{"type":7,"value":767,"toc":768},[],{"title":10,"searchDepth":11,"depth":11,"links":769},[],{},"Alexandre Guillon","\u002Fauthors\u002Falexandre-guillon",{"title":765,"description":10},"authors\u002Falexandre-guillon","4tf48mjyjFNqItOHaulICbrjeCyMag1o6801uHeTz98",{"id":777,"title":765,"body":778,"description":10,"extension":13,"meta":782,"name":783,"navigation":16,"path":784,"readingTime":18,"seo":785,"stem":786,"__hash__":787},"authors\u002Fauthors\u002Falexis-ablain.md",{"type":7,"value":779,"toc":780},[],{"title":10,"searchDepth":11,"depth":11,"links":781},[],{},"Alexis Ablain","\u002Fauthors\u002Falexis-ablain",{"title":765,"description":10},"authors\u002Falexis-ablain","_SIAtB7f-39e5t3GiJof81NP47s6MGo2n4gaHkTy1uQ",{"id":4,"title":5,"body":789,"description":10,"extension":13,"meta":793,"name":15,"navigation":16,"path":17,"readingTime":18,"seo":794,"stem":20,"__hash__":21},{"type":7,"value":790,"toc":791},[],{"title":10,"searchDepth":11,"depth":11,"links":792},[],{},{"title":5,"description":10},{"id":796,"title":797,"body":798,"description":10,"extension":13,"meta":802,"name":803,"navigation":16,"path":804,"readingTime":18,"seo":805,"stem":806,"__hash__":807},"authors\u002Fauthors\u002Fbaptiste-faure.md","Head of Talent Acquisition",{"type":7,"value":799,"toc":800},[],{"title":10,"searchDepth":11,"depth":11,"links":801},[],{},"Baptiste Faure","\u002Fauthors\u002Fbaptiste-faure",{"title":797,"description":10},"authors\u002Fbaptiste-faure","ELisToYtcgHmgdVWZkCclTPV6exZtfyXqhpx1jjbJHs",{"id":809,"title":765,"body":810,"description":10,"extension":13,"meta":814,"name":815,"navigation":16,"path":816,"readingTime":18,"seo":817,"stem":818,"__hash__":819},"authors\u002Fauthors\u002Fbenjamin-bouillot.md",{"type":7,"value":811,"toc":812},[],{"title":10,"searchDepth":11,"depth":11,"links":813},[],{},"Benjamin Bouillot","\u002Fauthors\u002Fbenjamin-bouillot",{"title":765,"description":10},"authors\u002Fbenjamin-bouillot","tbhCFZyfTt7ZM5b5YgqQ2nhgnSTl8BweaQQryc87fHo",{"id":821,"title":5,"body":822,"description":10,"extension":13,"meta":826,"name":827,"navigation":16,"path":828,"readingTime":18,"seo":829,"stem":830,"__hash__":831},"authors\u002Fauthors\u002Fcedric-nicoloso.md",{"type":7,"value":823,"toc":824},[],{"title":10,"searchDepth":11,"depth":11,"links":825},[],{},"Cédric Nicoloso","\u002Fauthors\u002Fcedric-nicoloso",{"title":5,"description":10},"authors\u002Fcedric-nicoloso","ibSoh4VZYiWYTuLOnZTedaAfcnvet1Q9H7ogW0LgorY",{"id":833,"title":834,"body":835,"description":10,"extension":13,"meta":839,"name":840,"navigation":16,"path":841,"readingTime":18,"seo":842,"stem":843,"__hash__":844},"authors\u002Fauthors\u002Fdavid-touzet.md","Staff Engineer",{"type":7,"value":836,"toc":837},[],{"title":10,"searchDepth":11,"depth":11,"links":838},[],{},"David Touzet","\u002Fauthors\u002Fdavid-touzet",{"title":834,"description":10},"authors\u002Fdavid-touzet","dHWwnQxb1Ubt-WwXWEODGEo9AFoq1cJUhfg3kdnYSBM",{"id":846,"title":847,"body":848,"description":10,"extension":13,"meta":852,"name":853,"navigation":16,"path":854,"readingTime":18,"seo":855,"stem":856,"__hash__":857},"authors\u002Fauthors\u002Feloise-chizat.md","Data Engineer",{"type":7,"value":849,"toc":850},[],{"title":10,"searchDepth":11,"depth":11,"links":851},[],{},"Eloïse Chizat","\u002Fauthors\u002Feloise-chizat",{"title":847,"description":10},"authors\u002Feloise-chizat","Utd72Vm9qT4hh2ZbFi6a2_nXw5Wb494Ed_HL1ra5yw8",{"id":859,"title":860,"body":861,"description":10,"extension":13,"meta":865,"name":866,"navigation":16,"path":867,"readingTime":18,"seo":868,"stem":869,"__hash__":870},"authors\u002Fauthors\u002Femmanuel-auclair.md","Staff engineer",{"type":7,"value":862,"toc":863},[],{"title":10,"searchDepth":11,"depth":11,"links":864},[],{},"Emmanuel Auclair","\u002Fauthors\u002Femmanuel-auclair",{"title":860,"description":10},"authors\u002Femmanuel-auclair","MtsA8THNLEn0dTtYEIQaGwDuf7MjQL55IOeei5gugEg",{"id":872,"title":765,"body":873,"description":10,"extension":13,"meta":877,"name":878,"navigation":16,"path":879,"readingTime":18,"seo":880,"stem":881,"__hash__":882},"authors\u002Fauthors\u002Fhoreb-parraud.md",{"type":7,"value":874,"toc":875},[],{"title":10,"searchDepth":11,"depth":11,"links":876},[],{},"Horeb Parraud","\u002Fauthors\u002Fhoreb-parraud",{"title":765,"description":10},"authors\u002Fhoreb-parraud","ajjsnUX4ohZI-ghMdbb92q_taWDkKXVZSLZXoAeLQtg",{"id":884,"title":5,"body":885,"description":10,"extension":13,"meta":889,"name":890,"navigation":16,"path":891,"readingTime":18,"seo":892,"stem":893,"__hash__":894},"authors\u002Fauthors\u002Fhugo-contreras.md",{"type":7,"value":886,"toc":887},[],{"title":10,"searchDepth":11,"depth":11,"links":888},[],{},"Hugo Contreras","\u002Fauthors\u002Fhugo-contreras",{"title":5,"description":10},"authors\u002Fhugo-contreras","2nc3VMu9ASq9Z6Pwx2-7-Ye991Pww4p-UEDBQFfjF-Q",{"id":896,"title":897,"body":898,"description":10,"extension":13,"meta":902,"name":903,"navigation":16,"path":904,"readingTime":18,"seo":905,"stem":906,"__hash__":907},"authors\u002Fauthors\u002Fjulien-tassin.md","Head of Engineering",{"type":7,"value":899,"toc":900},[],{"title":10,"searchDepth":11,"depth":11,"links":901},[],{},"Julien Tassin","\u002Fauthors\u002Fjulien-tassin",{"title":897,"description":10},"authors\u002Fjulien-tassin","iUIHI7SITje38Jh9X9uvYs4-VsHx4eCdt6hAlyLFG_o",{"id":909,"title":765,"body":910,"description":10,"extension":13,"meta":914,"name":915,"navigation":16,"path":916,"readingTime":18,"seo":917,"stem":918,"__hash__":919},"authors\u002Fauthors\u002Flaurent-renard.md",{"type":7,"value":911,"toc":912},[],{"title":10,"searchDepth":11,"depth":11,"links":913},[],{},"Laurent Renard","\u002Fauthors\u002Flaurent-renard",{"title":765,"description":10},"authors\u002Flaurent-renard","5BP7Ed-pt1SQHjh0UJ1XUrlLTcdlFaDoKBCP4deHq8A",{"id":921,"title":765,"body":922,"description":10,"extension":13,"meta":926,"name":927,"navigation":16,"path":928,"readingTime":18,"seo":929,"stem":930,"__hash__":931},"authors\u002Fauthors\u002Fleo-martin.md",{"type":7,"value":923,"toc":924},[],{"title":10,"searchDepth":11,"depth":11,"links":925},[],{},"Léo Martin","\u002Fauthors\u002Fleo-martin",{"title":765,"description":10},"authors\u002Fleo-martin","eYxCHkRgbGDV7shKdTA9s7Tu0zGV4yDGFoKR5MHQntY",{"id":933,"title":765,"body":934,"description":10,"extension":13,"meta":938,"name":939,"navigation":16,"path":940,"readingTime":18,"seo":941,"stem":942,"__hash__":943},"authors\u002Fauthors\u002Floic-bousquet.md",{"type":7,"value":935,"toc":936},[],{"title":10,"searchDepth":11,"depth":11,"links":937},[],{},"Loïc Bousquet","\u002Fauthors\u002Floic-bousquet",{"title":765,"description":10},"authors\u002Floic-bousquet","ko12qZwiGL8XNjAoy9oWypPkIjr29Pbq7vhdtgldqeQ",{"id":945,"title":765,"body":946,"description":10,"extension":13,"meta":950,"name":951,"navigation":16,"path":952,"readingTime":18,"seo":953,"stem":954,"__hash__":955},"authors\u002Fauthors\u002Floic-poullain.md",{"type":7,"value":947,"toc":948},[],{"title":10,"searchDepth":11,"depth":11,"links":949},[],{},"Loïc Poullain","\u002Fauthors\u002Floic-poullain",{"title":765,"description":10},"authors\u002Floic-poullain","oRIyJhFRTqxy5dLCYQ2OnYZ1DB-gLDUM-85vTSYuTF0",{"id":957,"title":847,"body":958,"description":10,"extension":13,"meta":962,"name":963,"navigation":16,"path":964,"readingTime":18,"seo":965,"stem":966,"__hash__":967},"authors\u002Fauthors\u002Fmaud-lelu.md",{"type":7,"value":959,"toc":960},[],{"title":10,"searchDepth":11,"depth":11,"links":961},[],{},"Maud Lélu","\u002Fauthors\u002Fmaud-lelu",{"title":847,"description":10},"authors\u002Fmaud-lelu","MMbsCKuE41OMHusrl12FIEsI-Trx7l8Nn_ANhvj2_y4",{"id":969,"title":5,"body":970,"description":10,"extension":13,"meta":974,"name":975,"navigation":16,"path":976,"readingTime":18,"seo":977,"stem":978,"__hash__":979},"authors\u002Fauthors\u002Fnicolas-poirier.md",{"type":7,"value":971,"toc":972},[],{"title":10,"searchDepth":11,"depth":11,"links":973},[],{},"Nicolas Poirier","\u002Fauthors\u002Fnicolas-poirier",{"title":5,"description":10},"authors\u002Fnicolas-poirier","dXrJkYo8az4SN_D23aYc3fQ7z8s1dR2a0lt1ogjAjJs",{"id":981,"title":5,"body":982,"description":10,"extension":13,"meta":986,"name":987,"navigation":16,"path":988,"readingTime":18,"seo":989,"stem":990,"__hash__":991},"authors\u002Fauthors\u002Fraphael-sauget.md",{"type":7,"value":983,"toc":984},[],{"title":10,"searchDepth":11,"depth":11,"links":985},[],{},"Raphaël Sauget","\u002Fauthors\u002Fraphael-sauget",{"title":5,"description":10},"authors\u002Fraphael-sauget","Uri9bcq0QDuxRA0PbBoNtu7p_5L3dALu4kzcXVW0xyM",{"id":993,"title":994,"body":995,"description":10,"extension":13,"meta":999,"name":1000,"navigation":16,"path":1001,"readingTime":18,"seo":1002,"stem":1003,"__hash__":1004},"authors\u002Fauthors\u002Fromain-koenig.md","Co-funder & Head of innovation",{"type":7,"value":996,"toc":997},[],{"title":10,"searchDepth":11,"depth":11,"links":998},[],{},"Romain Koenig","\u002Fauthors\u002Fromain-koenig",{"title":994,"description":10},"authors\u002Fromain-koenig","uyS8--eG2_ezyqRABcJnMJmQKKuSArhPWd14aUvFeEw",{"id":1006,"title":5,"body":1007,"description":10,"extension":13,"meta":1011,"name":1012,"navigation":16,"path":1013,"readingTime":18,"seo":1014,"stem":1015,"__hash__":1016},"authors\u002Fauthors\u002Fromaric-juniet.md",{"type":7,"value":1008,"toc":1009},[],{"title":10,"searchDepth":11,"depth":11,"links":1010},[],{},"Romaric Juniet","\u002Fauthors\u002Fromaric-juniet",{"title":5,"description":10},"authors\u002Fromaric-juniet","4Zb2artgT-eo-PHLXi3xi4d5t7s6PfhUxeSfXIikSUY",{"id":1018,"title":765,"body":1019,"description":10,"extension":13,"meta":1023,"name":1024,"navigation":16,"path":1025,"readingTime":18,"seo":1026,"stem":1027,"__hash__":1028},"authors\u002Fauthors\u002Fstanyslas-bres.md",{"type":7,"value":1020,"toc":1021},[],{"title":10,"searchDepth":11,"depth":11,"links":1022},[],{},"Stanyslas Bres","\u002Fauthors\u002Fstanyslas-bres",{"title":765,"description":10},"authors\u002Fstanyslas-bres","Xa0SahETuiN4q1jrmR2ych3moAqcZ2LbU7vSfEt2RuU",{"id":1030,"title":1031,"body":1032,"description":10,"extension":13,"meta":1036,"name":1037,"navigation":16,"path":1038,"readingTime":18,"seo":1039,"stem":1040,"__hash__":1041},"authors\u002Fauthors\u002Ftalent-acquisition.md","Talent Acquisition",{"type":7,"value":1033,"toc":1034},[],{"title":10,"searchDepth":11,"depth":11,"links":1035},[],{},"Équipe Talent Acquisition","\u002Fauthors\u002Ftalent-acquisition",{"description":10},"authors\u002Ftalent-acquisition","doDfE76txftQ4wIiKjJoDmSpyzSKk0tzlgVAp6-opAY",{"id":1043,"title":765,"body":1044,"description":10,"extension":13,"meta":1048,"name":1049,"navigation":16,"path":1050,"readingTime":18,"seo":1051,"stem":1052,"__hash__":1053},"authors\u002Fauthors\u002Fvictor-borg.md",{"type":7,"value":1045,"toc":1046},[],{"title":10,"searchDepth":11,"depth":11,"links":1047},[],{},"Victor Borg","\u002Fauthors\u002Fvictor-borg",{"title":765,"description":10},"authors\u002Fvictor-borg","-Za-JweoiP6hyclue_WkxMXdRUDTczPGlJf6AZckjUc",{"id":1055,"title":765,"body":1056,"description":10,"extension":13,"meta":1060,"name":1061,"navigation":16,"path":1062,"readingTime":18,"seo":1063,"stem":1064,"__hash__":1065},"authors\u002Fauthors\u002Fvirgil-roger.md",{"type":7,"value":1057,"toc":1058},[],{"title":10,"searchDepth":11,"depth":11,"links":1059},[],{},"Virgil Roger","\u002Fauthors\u002Fvirgil-roger",{"title":765,"description":10},"authors\u002Fvirgil-roger","DfVFe5j0bCgXeEr381ZYOM5DP4m-pWb93J9-m_muKJ0",{"id":1067,"title":765,"body":1068,"description":10,"extension":13,"meta":1072,"name":1073,"navigation":16,"path":1074,"readingTime":18,"seo":1075,"stem":1076,"__hash__":1077},"authors\u002Fauthors\u002Fyukan-zhao.md",{"type":7,"value":1069,"toc":1070},[],{"title":10,"searchDepth":11,"depth":11,"links":1071},[],{},"Yukan Zhao","\u002Fauthors\u002Fyukan-zhao",{"title":765,"description":10},"authors\u002Fyukan-zhao","LRPHugtAJnWHsmHxy9_SR5Zas_C5p-GR_uHEs1Fhk_E",1778159245581]