Comment rendre l'inspecteur de code Kindle pour vous





En ce qui concerne l'inspection du code, l'attention des gens est généralement concentrée sur qui le fait. Mais le développeur qui a écrit le code joue un rÎle tout aussi important dans le processus que le réviseur. Il n'y a presque pas de recommandations pour préparer le code pour l'inspection, de sorte que les auteurs font souvent des erreurs simplement par ignorance.



Cet article compile les meilleures pratiques pour participer à l'inspection de code en tant qu'auteur. Lorsque vous aurez fini de lire, vous commencerez à envoyer aux inspecteurs des ensembles de changements si parfaits qu'ils brûleront d'amour pour vous, rien de moins.



Mais je ne veux pas que les inspecteurs de code brillent d'amour pour moi



Et ils le seront toujours. Humiliez-vous. Personne dans l'histoire de l'humanité ne s'est encore plaint sur son lit de mort d'avoir été trop aimé de son vivant.



Pourquoi améliorer l'inspection du code?



L'apprentissage de techniques d'inspection efficaces facilitera la vie de l'inspecteur, de l'Ă©quipe et, surtout, de vous.



  • Processus de transfert de connaissances accĂ©lĂ©rĂ©. Si vous prĂ©parez correctement votre ensemble de modifications, l'attention de l'inspecteur sera attirĂ©e sur les domaines dans lesquels vous devez vous dĂ©velopper, plutĂŽt que sur des dĂ©fauts stylistiques ennuyeux. Et lorsque vous indiquez clairement que vous apprĂ©ciez la critique constructive, le rĂ©viseur commence Ă  consacrer plus d'efforts Ă  la rĂ©troaction.
  • Un exemple pour les autres. Les bonnes pratiques d'inspection du code dans vos performances Ă©tabliront la barre pour ceux qui vous entourent. De bonnes techniques sont gĂ©nĂ©ralement adoptĂ©es, ce qui signifie que ce sera plus facile pour vous lorsqu'un collĂšgue vous envoie du code pour examen.
  • Conflits minimaux. L'inspection du code crĂ©e souvent des tensions dans l'Ă©quipe. Si vous abordez la question de maniĂšre responsable et dĂ©libĂ©rĂ©e, les diffĂ©rends surviendront moins souvent.


RĂšgle d'or: valoriser le temps du critique



Cela semble évident, mais je rencontre souvent des auteurs qui traitent les inspecteurs comme leurs propres spécialistes du contrÎle de la qualité. Ces personnes ne frapperont pas du doigt pour détecter au moins certaines des erreurs ou pour effectuer un ensemble de modifications pratiques pour la vérification.



Vos collÚgues viennent travailler tous les jours avec une attention limitée. S'ils vous en consacrent une partie, ils ne peuvent plus dépenser cette ressource pour leurs propres tùches. Tirer le meilleur parti de son temps est une simple question de justice.



La révision du code est beaucoup plus réussie lorsque les participants peuvent se faire confiance. Votre inspecteur ne ménagera aucun effort s'il sait que vous prendrez ses remarques au sérieux. Si vous percevez l'examinateur comme un obstacle à surmonter, vous recevrez de sa part des recommandations beaucoup moins précieuses.



Technique



1. VĂ©rifiez vous-mĂȘme le code



avant d'envoyer le code Ă  un collĂšgue, lisez-le. Ne vous limitez pas Ă  attraper des erreurs - imaginez voir ce fragment pour la premiĂšre fois. Qu'est-ce qui peut ĂȘtre dĂ©routant?



D'aprĂšs mon expĂ©rience, il peut ĂȘtre utile de faire une pause entre l'Ă©criture et l'Ă©dition du code. Les gens envoient souvent un nouveau code Ă  la fin de la journĂ©e, mais c'est pendant cette pĂ©riode qu'ils risquent le plus de manquer quelque chose par nĂ©gligence. Attendez jusqu'au matin, jetez un regard neuf sur l'ensemble des modifications, puis transmettez-le Ă  un collĂšgue.







Quel idiot a écrit ça?

Synchronisation des tùches Cron avec le cycle lunaire: j'ai ajouté une logique synchronisée pour garder notre




pipeline ETL en phase avec la nature. Simulez autant que possible l'environnement de travail d'un validateur. Utilisez le mĂȘme utilitaire de comparaison que lui. Les bogues stupides se trouvent mieux dans ces utilitaires que dans votre Ă©diteur de code habituel.



Ne vous attendez pas Ă  ĂȘtre parfait. Vous allez inĂ©vitablement envoyer le code avec un morceau que vous avez oubliĂ© de supprimer aprĂšs avoir corrigĂ© un bogue, ou un fichier errant que vous alliez supprimer. Ce n'est pas la fin du monde, mais cela vaut toujours la peine d'ĂȘtre suivi. Notez les modĂšles dans vos erreurs et dĂ©terminez quels systĂšmes vous pouvez mettre en Ɠuvre pour les Ă©viter. Si les mĂȘmes erreurs passent trĂšs souvent, l'inspecteur conclura que vous n'apprĂ©ciez pas son temps.



2. RĂ©digez une description claire du jeu de modifications



Dans mon dernier travail de mentorat, j'ai eu des rencontres occasionnelles avec un programmeur plus expĂ©rimentĂ©. Avant la premiĂšre rĂ©union, il m'a demandĂ© de rĂ©cupĂ©rer un document de conception de logiciel que j'avais compilĂ©. En lui remettant les papiers, j'ai expliquĂ© en quoi consistait le projet et en quoi il Ă©tait liĂ© aux objectifs de mon Ă©quipe. Mon mentor fronça les sourcils et dit sans dĂ©tour: "Tout ce que vous venez de dire devrait ĂȘtre sur la premiĂšre page du document."



Et il avait raison. J'ai Ă©crit le document avec l'attente des dĂ©veloppeurs de mon Ă©quipe, mais je n'ai pas tenu compte du fait qu'il pourrait ĂȘtre lu par des Ă©trangers. Le public ne se limitait pas aux limites de mon dĂ©partement - il y avait encore des Ă©quipes partenaires, des mentors, des personnes qui prenaient des dĂ©cisions sur les promotions... Le document aurait dĂ» ĂȘtre rĂ©digĂ© pour que tout soit clair pour eux. AprĂšs cette conversation, j'essaye toujours de prĂ©senter mon travail dans le contexte nĂ©cessaire Ă  la comprĂ©hension.



La description de l'ensemble de modifications doit inclure toutes les informations de base dont le lecteur pourrait avoir besoin. MĂȘme si vous rĂ©digez la description pour le bien de l'examinateur, gardez Ă  l'esprit qu'il peut avoir moins d'informations contextuelles que vous ne le pensez. En outre, il est possible que d'autres collĂšgues devront Ă©galement travailler avec ce code Ă  l'avenir - lorsqu'ils examinent l'historique des modifications, ils doivent comprendre vos intentions.



Une bonne description décrit à quoi sert l'ensemble de modifications et pourquoi vous avez choisi d'agir de cette maniÚre.



Si vous voulez vous plonger plus profondément dans l'art d'écrire de grandes descriptions, lisez « Comment écrire un message de validation Git » de Chris Beams et « Mon commit Git préféré » de David Thompson.



3. Automatisez des choses simples



Si vous comptez sur l'inspecteur pour des petites choses comme une attelle flottante ou des problÚmes avec des tests automatisés, alors vous perdez son temps.







VĂ©rifiez si tout est en ordre avec la syntaxe? Je me tournerais vers le compilateur, mais c'est dommage de perdre son temps.



Les tests automatisĂ©s doivent ĂȘtre considĂ©rĂ©s comme faisant partie de la procĂ©dure standard dans le cadre de l'Ă©quipe. L'inspection ne commence que lorsque toute la sĂ©rie de contrĂŽles automatisĂ©s dans un environnement d'intĂ©gration continue a Ă©tĂ© rĂ©ussie .



Si votre équipe est tragiquement délirante et rejette l'intégration continue, mettez en place un examen automatisé en interne. Implémentez des hooks , des linters et des formateurs de pré-validation dans votre environnement de développement pour vous assurer que toutes les conventions sont respectées et que le comportement prévu persiste d'une validation à l'autre.



4. Assurez-vous que le code lui-mĂȘme rĂ©pond aux questions



Qu'est-ce qui ne va pas avec cette image?







Je ne comprends pas le but de la fonction.

Et, c'est au cas oĂč le Frombobulator est passĂ© pendant l'appel en l'absence d'implĂ©mentation frombobulate L'




auteur m'a aidĂ© Ă  comprendre la fonction, mais qu'en est-il du lecteur suivant? Creuser dans l'histoire des changements et relire toutes les discussions? C'est encore pire quand l'auteur vient Ă  mon bureau pour tout expliquer en personne. PremiĂšrement, cela m'empĂȘche de me concentrer, et deuxiĂšmement, aucune Ăąme vivante n'aura plus accĂšs aux informations sonores.



Lorsque l'inspecteur exprime de la confusion sur un point du code, votre travail n'est pas de clarifier la situation pour cette personne en particulier. Il est nécessaire de clarifier la situation pour tout le monde à la fois.







- Bonjour?

- Quand vous avez Ă©crit bill.py il y a six ans, pourquoi aviez-vous t = 6?

- Content que vous ayez appelé! Cela est dû à la taxe de vente de 6%.

- Bien sûr!

- Un excellent moyen de justifier une dĂ©cision de mise en Ɠuvre.




La meilleure réponse à toute question est la refactorisation du code qui le supprime. Que peut-on renommer pour clarifier comment changer la logique? Les commentaires sont une solution acceptable, mais ils jouent certainement dans le contexte d'un code qui se documente naturellement.



5. Saisissez les modifications de maniÚre fractionnée



RĂ©pandre les limites est une mauvaise pratique et peut souvent ĂȘtre observĂ©e lors de l'inspection du code. Le dĂ©veloppeur s'engage Ă  corriger un bogue dans la logique, mais en cours de route, il rencontre une faille dans l'interface. "Et bien, puisque je travaille avec ce morceau de toute façon," pense-t-il, "je vais le rĂ©parer en mĂȘme temps." En consĂ©quence, la confusion commence. Le rĂ©viseur devra maintenant dĂ©terminer quels changements fonctionnent pour la tĂąche A et lesquels fonctionnent pour la tĂąche B.



Les meilleurs ensembles de modifications font une chose . Plus le changement est précis et simple, plus il est facile pour l'inspecteur de garder le contexte à l'esprit. En partageant des modifications non liées, vous avez également la possibilité de faire examiner plusieurs pairs en parallÚle, ce qui signifie que votre code vous reviendra plus rapidement.



6.



Changements fonctionnels et non fonctionnels sĂ©parĂ©s Une autre rĂšgle de base est que les changements fonctionnels et non fonctionnels ne doivent pas ĂȘtre confondus.



Les dĂ©veloppeurs ayant peu d'expĂ©rience avec l'inspection de code enfreignent souvent cette rĂšgle. Ils apportent une sorte de changement de ventilation, et l'Ă©diteur de code change immĂ©diatement le format dans tout le fichier. Le dĂ©veloppeur ne comprend pas ce qui s'est passĂ©, ou dĂ©cide que c'est encore mieux et envoie le code, oĂč un changement fonctionnel est enfoui sous des centaines de lignes avec des non fonctionnelles.







Trouverez-vous un changement fonctionnel?



Une telle confusion est comme une salive face Ă  un inspecteur. Les modifications de format uniquement sont faciles Ă  vĂ©rifier. Des changements fonctionnels aussi. Une panne fonctionnelle dans un ocĂ©an de changements de format peut ĂȘtre vaine et folle.



De plus, les développeurs aiment mélanger le refactoring en changements majeurs en temps opportun. J'approuve fortement la refactorisation du code par mes collÚgues, mais pas lorsqu'ils implémentent simultanément un nouveau comportement.







Changement de comportement enterré au milieu de la refactorisation



Si un morceau de code nécessite à la fois une refactorisation et des changements de comportement, vous devez diviser le processus en deux ou trois ensembles:



  1. Ajouter des tests pour le comportement actuel (s'il n'y en a pas)
  2. Refactoriser le code sans rien changer dans les tests


En gardant les tests intacts dans la deuxiÚme étape, le réviseur peut s'assurer que la refactorisation ne perturbe pas le comportement. En conséquence, à la troisiÚme étape, il n'aura pas à comprendre ce qui est refactorisé ici, et ce qui fonctionne pour changer le comportement - aprÚs tout, vous avez séparé l'un de l'autre à l'avance.



7. Briser les changesets trop volumineux Les



changesets gonflĂ©s sont comme les vilains cousins ​​des frontiĂšres tentaculaires . Imaginez une situation: un dĂ©veloppeur arrive Ă  la conclusion que pour implĂ©menter la fonctionnalitĂ© A, il devra d'abord corriger la sĂ©mantique des bibliothĂšques B et C.S'il y a peu de changements, alors quoi qu'il arrive, mais trĂšs souvent ces modifications s'Ă©talent et une Ă©norme liste de changements est produite.



La complexité du journal des modifications augmente de façon exponentielle avec le nombre de lignes affectées. Si les modifications concernent 400 lignes ou plus, je cherche un moyen de les couper avant de demander une inspection.



Peut-ĂȘtre qu'au lieu de tout faire en mĂȘme temps, il sera possible de travailler d'abord avec les dĂ©pendances, et dans le prochain ensemble, d'implĂ©menter de nouvelles fonctionnalitĂ©s? Est-il rĂ©aliste de garder le code sain si vous implĂ©mentez la moitiĂ© de la fonctionnalitĂ© maintenant et l'autre moitiĂ© dans la phase suivante?



RĂ©flĂ©chir Ă  la façon de dĂ©composer le code pour obtenir une piĂšce intelligible et fonctionnelle peut ĂȘtre fastidieux. Mais cela permet une meilleure rĂ©troaction et crĂ©e moins de complexitĂ© pour le rĂ©viseur.



8. Acceptez les critiques avec bonté



Le moyen le plus sĂ»r de gĂącher tout le test est de prendre la critique avec hostilitĂ©. Il peut ĂȘtre difficile de rĂ©sister, car de nombreux dĂ©veloppeurs sont fiers de ce qu'ils font et perçoivent leur travail comme une extension d'eux-mĂȘmes. Et si l'inspecteur fait des commentaires sans tact ou s'adresse Ă  une personne , cela complique encore davantage la situation.



En fin de compte, vous, en tant qu'auteur, ĂȘtes libre de dĂ©cider comment vous rĂ©pondez aux commentaires. Traitez les propos de l'inspecteur comme une discussion objective du code qui n'a rien Ă  voir avec l'Ă©valuation de votre personnalitĂ©. Si vous ĂȘtes sur la dĂ©fensive, cela ne fait qu'empirer.



J'essaie de prendre tous les commentaires comme une tentative d'aider et de bénéficier. Si le critique trouve une erreur stupide dans le code, je suis instinctivement amené à commencer à trouver des excuses. Mais je me retiens et loue plutÎt son observation.







- Pour janvier et février 1900, cela ne fonctionnera pas.

- Exactement, bien remarqué!




Curieusement, le fait que l'inspecteur dĂ©tecte des failles non Ă©videntes dans le code est un bon signe. Cela suggĂšre que vous ĂȘtes douĂ© pour prĂ©parer les fichiers Ă  analyser. En l'absence de mise en forme bĂąclĂ©e, de mauvais noms et d'autres choses remarquables, le critique peut Ă©tudier la logique et la conception en profondeur et faire des observations plus prĂ©cieuses.



9. Soyez patient si l'inspecteur fait une erreur



De temps en temps, il arrive que l'inspecteur se trompe tout simplement. Il peut mal lire du code parfaitement normal aussi bien que vous pouvez planter des bogues. De nombreux dĂ©veloppeurs dans de tels cas commencent Ă  se dĂ©fendre farouchement. Ils sont offensĂ©s que quelqu'un soumette leur travail Ă  des critiques, et mĂȘme ne soit basĂ© sur rien.



Cependant, mĂȘme si le critique se trompe, vous avez encore beaucoup Ă  penser. S'il a mal lu quelque chose, quelle est la probabilitĂ© que d'autres personnes commettent la mĂȘme erreur Ă  l'avenir? Les lecteurs n'auraient-ils pas Ă  Ă©tudier le code dans les deux sens, juste pour s'assurer que le bogue qu'ils voient n'est pas lĂ ?







- Il y a un débordement de tampon ici, car aucune vérification n'a été effectuée pour savoir s'il y a suffisamment de mémoire dans le nom pour accueillir tous les caractÚres NewNameLen.

- Est-ce dans mon code? Impensable! Le constructeur appelle PurchaseHats, et il appelle CheckWeather, ce qui lÚverait une erreur si la longueur du tampon ne correspond pas. Vous liriez d'abord 200 000 lignes de code, puis vous oseriez admettre la possibilité que je me sois trompé quelque part.




RĂ©flĂ©chissez Ă  la façon de refactoriser ou d'ajouter des commentaires pour que, d'un coup d' Ɠil, vous puissiez voir que tout est en ordre. Si le malentendu provient de l'utilisation de fonctionnalitĂ©s peu connues du langage, rĂ©Ă©crivez le code en utilisant des mĂ©canismes qui ne nĂ©cessitent pas de connaissances approfondies.



10. Donner une réaction intelligible



Je me retrouve souvent dans cette situation: j'envoie des commentaires Ă  une personne, il met Ă  jour le code en tenant compte de certains d'entre eux, mais en mĂȘme temps reste silencieux. Il y a une pĂ©riode d'incertitude. Soit il a manquĂ© le reste des commentaires, soit il est toujours en train de corriger. Si vous commencez Ă  vĂ©rifier ce qui a dĂ©jĂ  Ă©tĂ© fait, hypothĂ©tiquement, il se peut que ce morceau de code soit toujours en cours de travail et que je perds mon temps. Si nous attendons, nous pouvons entrer dans une impasse - nous allons tous les deux nous asseoir et attendre la prochaine Ă©tape l'un de l'autre.



Établissez un certain ordre des actions dans l'Ă©quipe afin que l'on sache toujours qui a le «tĂ©moin» en ce moment. Le processus ne devrait pas ĂȘtre autorisĂ© Ă  ralentir simplement parce que personne ne comprend ce qui se passe. C'est facile Ă  faire - il suffit de laisser des commentaires au niveau de l'ensemble de modifications, Ă  partir duquel il est clair quand le droit d'agir est transfĂ©rĂ© Ă  un autre participant.







Corriger les en-tĂȘtes> Mettre Ă  jour le code en fonction des commentaires> Tout est prĂȘt, veuillez regarder.



Tout commentaire qui vous oblige Ă  prendre des mesures doit ĂȘtre rĂ©pondu en confirmant que vous l'avez pris. Certains outils d'inspection de code permettent de signaler les commentaires traitĂ©s. Sinon, utilisez un ensemble de puces de texte simples comme TerminĂ©. Si vous n'ĂȘtes pas d'accord avec le commentaire, expliquez poliment pourquoi vous avez dĂ©cidĂ© de vous abstenir de corriger.







Certains outils comme Reviewable et Gerritt suggÚrent de baliser les commentaires traités



. Équilibrez vos rĂ©actions par rapport aux efforts du rĂ©viseur. S'il a dĂ©taillĂ© un moment pour que vous puissiez apprendre quelque chose de nouveau par vous-mĂȘme, ne vous limitez pas Ă  la marque «Terminé». RĂ©pondez attentivement pour montrer que vous apprĂ©ciez son travail.



11. Solliciter habilement les informations manquantes



Parfois, les commentaires de l'inspecteur laissent trop de place à l'interprétation. Lorsqu'ils vous écrivent quelque chose dans l'esprit «Je ne comprends pas cette fonction», la question se pose immédiatement, ce qui n'est pas clair pour une personne. Trop long? Le nom est-il malheureux? Besoin de mieux documenter?



Pendant longtemps, je me suis demandé comment clarifier des commentaires vagues et ne pas entrer par inadvertance dans la confrontation. La premiÚre chose qui m'est venue à l'esprit a été de demander: «Qu'est-ce qui est incompréhensible en elle?», Mais cela semble grincheux.



Une fois, j'ai délibérément envoyé une vague réponse à ce genre de collÚgue, et il m'a désarmé avec sa réponse:



"Qu'est-ce qui peut ĂȘtre changĂ© pour l'amĂ©liorer?"


J'aime cette phrase car elle exprime une ouverture à la critique et un manque d'hostilité. Maintenant, lorsque j'obtiens de vagues commentaires, je réponds avec une variation du motif de base "Que peut-on changer pour l'améliorer?"



Une autre technique utile consiste Ă  essayer de deviner ce que le rĂ©viseur voulait dire et Ă  prendre les devants en corrigeant le code en consĂ©quence. Si vous obtenez un commentaire "incomprĂ©hensible", regardez de plus prĂšs le code. On trouve gĂ©nĂ©ralement quelque chose qui peut ĂȘtre amĂ©liorĂ© en termes de clartĂ©. Les modifications indiquent Ă  l'inspecteur que vous ĂȘtes prĂȘt Ă  apporter des modifications, mĂȘme s'il avait une idĂ©e diffĂ©rente du rĂ©sultat final.



12. Donner la priorité à l'examinateur



Au tennis, s'il n'est pas tout Ă  fait clair si le ballon est sorti des limites lors du service de l'adversaire, il est d'usage d'interprĂ©ter la situation en sa faveur. Cette rĂšgle doit Ă©galement ĂȘtre suivie lors de l'inspection de votre code.



Certaines décisions de conception sont une question de goût. Si le critique pense que votre fonction de dix lignes serait mieux divisée en deux fonctions de cinq lignes, la vérité objective n'est ni la vÎtre ni la sienne. La meilleure option dépend de la préférence.



Si l'inspecteur fait une proposition et que les arguments Ă  l'appui de sa position sont Ă  peu prĂšs Ă©gaux pour vous, acceptez son point de vue. AprĂšs tout, de vous deux, c'est lui qui profite d'un nouveau regard sur le code.



13. RĂ©duisez le temps de transfert de code



Il y a quelques mois, un utilisateur a apporté une petite modification à un projet open source que je maintiens. Je me suis désabonné avec des commentaires quelques heures plus tard, mais il a déjà disparu avec les extrémités. Quelques jours plus tard, je suis revenu et j'ai constaté qu'il n'y avait toujours pas de réponse.



Six semaines se sont écoulées et le mystérieux développeur est réapparu sur le projet avec des révisions. Bien que j'apprécie son travail, la longue pause entre les deux étapes de vérification a conduit au fait que j'ai consacré deux fois plus d'efforts à l'inspection. J'ai dû relire non seulement le code, mais aussi mes propres commentaires afin de me souvenir de ce qui était généralement discuté. Si la personne se présentait dans quelques jours, il n'y aurait pas besoin de travail supplémentaire.







Coûts intellectuels pour l'inspection de code avec des temps de transmission courts (à gauche) et longs (à droite)

L'axe des x est le temps; axe y - mémoire de l'inspecteur; ombrage bleu - restauration du contexte; remplissage bleu - vérification du code; remplissage gris - en attente; ombrage rouge - coûts supplémentaires




Six semaines est, bien entendu, un cas exceptionnel, mais je constate souvent de longues pauses injustifiées dans mon équipe. Quelqu'un soumet un ensemble de modifications pour examen, obtient des commentaires et reporte les modifications d'une semaine parce qu'il a été distrait par une autre tùche.



Outre le fait que vous devez passer du temps à récupérer le contexte plus tard, les fragments de code semi-finis créent de la complexité. Ils rendent plus difficile le suivi de ce qui est déjà drainé et de ce qui ne l'est pas encore. Plus les listes de modifications partiellement traitées sont créées, plus la probabilité de conflits de fusion est élevée et personne n'aime les manipuler.



Une fois que vous avez soumis votre code pour inspection, votre priorité absolue est de le suivre. Si le processus stagne par votre faute, vous volez le temps de l'inspecteur et compliquez la vie de toute l'équipe.



finalement



Lorsque vous préparez votre prochain journal des modifications à soumettre, réfléchissez aux facteurs que vous pouvez traiter et utilisez ces opportunités pour rendre la révision productive. Lorsque vous participez à une révision de code, vérifiez les éléments qui ralentissent réguliÚrement le processus et gaspillent des ressources.



N'oubliez pas la rĂšgle d'or: valorisez le temps du critique. Si vous lui donnez l'occasion de se concentrer sur les parties vraiment intĂ©ressantes du code, ses commentaires seront utiles. Si vous le forcez Ă  perdre du temps sur de petites choses ou Ă  dĂ©mĂȘler la confusion, tant pis pour vous deux.



Enfin, réfléchissez bien à vos réponses. Des malentendus sur des bagatelles ou des mots irréfléchis peuvent faire dérailler les choses à une vitesse alarmante. Les passions sont vives lorsqu'il s'agit de critiquer le travail de quelqu'un d'autre, alors évitez soigneusement tout ce qui pourrait amener l'examinateur à penser que vous l'attaquez ou que vous le traitez sans respect.



Toutes nos félicitations! Si vous avez lu jusqu'ici, vous pouvez déjà vous considérer comme un expert en inspection de code. Vos inspecteurs sont probablement déjà en feu, vous les traitez donc humainement.



All Articles