Je n'ai jamais trouvé le moyen idéal d'effectuer des révisions de code et pourtant, souvent mes clients en ont besoin. Chaque client semble les faire d'une manière différente et je ne me suis jamais senti satisfait d'aucun d'entre eux.
Quel a été le moyen le plus efficace pour vous d'effectuer des révisions de code?
Par exemple:
Dans mon travail, nous avons une règle très simple: les modifications doivent être examinées par au moins un autre développeur avant une fusion ou une validation dans le tronc. Dans notre cas, cela signifie que l'autre personne s'assoit physiquement avec vous sur votre ordinateur et parcourt la liste des modifications. Ce n'est pas un système parfait, mais il a néanmoins sensiblement amélioré la qualité du code.
Si vous savez que votre code va être révisé, cela vous oblige à le regarder en premier. De nombreux problèmes deviennent alors apparents. Dans notre système, vous devez expliquer ce que vous avez fait au réviseur, ce qui vous fait à nouveau remarquer des problèmes que vous avez peut-être manqués auparavant. De plus, si quelque chose dans votre code n'est pas immédiatement clair pour le réviseur, c'est une bonne indication qu'un meilleur nom, un commentaire ou une refactorisation est requis. Et, bien sûr, le réviseur peut également rencontrer des problèmes. De plus, en plus d'examiner le changement, le réviseur peut également remarquer des problèmes dans le code à proximité.
Ce système présente deux inconvénients principaux. Lorsque le changement est insignifiant, il est peu logique de le revoir. Cependant, nous devons absolument nous en tenir aux règles, pour éviter la pente glissante de déclarer les modifications "triviales" quand elles ne le sont pas. D'un autre côté, ce n'est pas un très bon moyen d'examiner les modifications importantes apportées au système ou l'ajout de nouveaux composants importants.
Nous avons déjà essayé des révisions plus formelles, lorsqu'un développeur envoyait un code électronique à réviser au reste de l'équipe, puis toute l'équipe se réunissait et en discutait. Cela a pris beaucoup de temps à tout le monde, et en conséquence, ces examens étaient rares, et seul un petit pourcentage de la base de code a été examiné. "Une autre personne examine les modifications avant de valider" a beaucoup mieux fonctionné pour nous.
J'aime les revues de code, même si elles peuvent être pénibles. La raison pour laquelle je les aime, c'est qu'ils obtiennent plus de regards sur le code et une perspective différente. Je crois que même avec la programmation par paires, le code devrait être revu. Il est assez facile pour deux personnes travaillant sur le même code de faire collectivement la même erreur qu'une autre paire d'yeux ne peut pas manquer.
Si cela se fait en groupe avec un projecteur, il devrait vraiment être examiné individuellement avant la réunion. Sinon, c'est juste une perte de temps ennuyeuse.
Je n'ai fait que des révisions de code par e-mail et en groupe. De manière générale, je ne pense pas que cela devrait être fait en personne. Vous ressentez un peu plus de pression pour parcourir le code avec quelqu'un qui regarde par-dessus votre épaule. Je crois qu'un outil conçu pour la révision de code serait un bon atout, car il peut aider avec certains des aspects banaux et devrait faciliter le signalement des bits de code problématiques, puis par e-mail.
Le problème avec une seule personne pour faire toutes les révisions de code est que cela peut être un goulot d'étranglement. Avec des normes de codage bien documentées et conçues, cela ne devrait pas être nécessaire. Selon l'environnement/le calendrier de publication, il peut être judicieux de toujours avoir quelqu'un en tant que réviseur de code de secours.
Je crois que la propriété du code est une bonne idée car cette personne peut se donner comme priorité de comprendre ce code et potentiellement jouer un rôle de gardien.
Chez SmartBear nous faisons non seulement un outil de révision de code , nous l'utilisons également au jour le jour. C'est une partie essentielle de notre processus de développement. Nous examinons chaque modification enregistrée.
Je pense que c'est une mauvaise idée d'avoir un seul réviseur de code de contrôleur d'accès pour de nombreuses raisons. Cette personne devient un goulot d'étranglement et elle doit faire trop de révision de code (juste pour faire avancer le projet) pour être vraiment efficace (60 à 90 minutes à la fois est la limite de l'efficacité). Les révisions de code sont un excellent moyen de partager des idées et des connaissances. Peu importe la superstar de votre gardien, ils peuvent apprendre des autres membres de l'équipe. De plus, le fait de faire réviser le code par tout le monde crée également un environnement de "propriété collective du code" - où les gens sentent qu'ils possèdent la qualité du code (ce n'est pas seulement le contrôle qualité ou le contrôleur d'accès).
Nous avons un livre blanc gratuit sur " Best Practices for Peer Code Review " qui contient 11 conseils pour rendre les revues de code efficaces. Une grande partie de cela est le même contenu du livre que John a mentionné sous une forme plus distillée.
Pas d'excuses. Pratiquez la programmation en binôme. C'est la meilleure révision de code possible. Tout autre mécanisme entraîne un jeu de blâme. La programmation en binôme induit l'esprit d'équipe et la propriété collective. De plus, vous débattez de vos idées avec votre paire, échouez rapidement, prenez des mesures correctives et seul le code codé et révisé de la paire est engagé dans le système de gestion de la configuration (CMS). Bonne programmation en paire!
L'une des choses que j'essaie de faire dans les revues de code auxquelles je participe est après avoir examiné le code moi-même, je fais une analyse statique du code, en utilisant des outils comme Findbugs, PMD, JavaNCCP et al, et je regarde tous les problèmes que ces outils trouvent dans le code à revoir. Je veux en particulier examiner tout ce qui a un niveau de complexité inhabituellement élevé, en leur demandant d'expliquer pourquoi ce niveau de complexité est nécessaire, ou pourquoi la vulnérabilité suggérée n'est pas importante.
YMMV
Là où je travaille actuellement, nous produisons des périphériques matériels et les logiciels qui s'interfacent avec eux et qui entrent dans l'infrastructure critique. Par conséquent, nous accordons une grande importance à la qualité des versions. Nous utilisons une variante de Fagan Inspection et avons un processus d'examen officiel. Nous sommes certifiés ISO 9001, entre autres certifications.
L'industrie des infrastructures critiques est très intéressée par sa fiabilité et sa répétabilité. :-)
Je recommande d'utiliser des revues de code si vous ne faites pas de programmation par paires.
Ne pas contester les avantages et les inconvénients du jumelage, mais il est difficile de contester les effets positifs de la révision constante de votre code par (au moins) une autre personne. Le code est même écrit et conçu par (au moins) deux programmeurs - il ne peut guère faire mieux que cela. Je dis "au moins" parce que imo, vous devriez essayer de changer de paire beaucoup pour que tout le monde puisse essayer de travailler avec le code.
Dans mon entreprise, nous avons des revues de code obligatoires pour les programmeurs juniors et des revues volontaires pour les seniors. Il n'y a pas de réviseur de code désigné, les demandes de révision sont envoyées à tous les développeurs.
Ce système fonctionne bien - les révisions sont effectuées si le temps le permet et les changements peuvent être examinés par plusieurs ensembles de globes oculaires.
L'outil excellent et gratuit Review Board fonctionne très bien pour nous et s'est révélé être un excellent moyen de communiquer les avis.
Si vous travaillez sur un projet où plusieurs personnes contribueront à la base de code, une norme doit être établie.
À ce stade, d'après mon expérience, il est préférable de désigner une personne comme le "roi" de la révision du code si vous le souhaitez et ce qu'il dit va. À cet égard, si un utilisateur ne respecte pas les normes, le roi s'en chargera.
En tant que développeur moi-même, je passe en revue mon propre code plusieurs fois pour être lisible, sensible et tout le reste. Habituellement, nous utilisons javadoc ou similaire dans des langues données avec lesquelles nous codons et utilisons la balise @author pour attacher la propriété aux fonctions, classes, etc.
Si une fonction n'est pas correcte, nous parlons au propriétaire, de même avec la classe, etc.
Dans mon entreprise, chaque tâche se voit attribuer un testeur pour tester la tâche, ainsi qu'un réviseur de code pour réviser le code.
Si votre produit est déjà sorti et que vous voulez vous assurer que vous ne faites rien de mal (comme une fuite de poignée ou une fuite de mémoire), les révisions de code sont une bonne chose. Je pense que lors du développement initial avant de publier votre produit, les révisions de code peuvent être trop de travail.
Si votre équipe a tous des développeurs seniors, la revue par les pairs est toujours utile. Tout le monde fait parfois des erreurs. Si votre équipe a des seniors et des juniors, laissez les développeurs seniors faire les révisions de code, mais vous avez toujours des révisions de code pour le code des seniors également.
Une chose importante à propos de la révision de code est qu'elle peut détecter les erreurs que nous commettons, mais elle ne remplace pas les tests.
Une personne est-elle considérée comme le gardien de la qualité et examine le code, ou l'équipe est-elle propriétaire de la norme?
Révisez-vous le code comme un exercice d'équipe à l'aide d'un projecteur?
Est-ce fait en personne, par e-mail ou à l'aide d'un outil?
Évitez-vous les avis et utilisez-vous des choses comme la programmation en binôme et la propriété collective du code pour garantir la qualité du code?
Comme pour tous les éléments de codage, la bonne réponse doit prendre en compte:
Dans mon entreprise, nous ne procédons jamais à des révisions de code formelles avant les enregistrements, à moins que nous ne modifiions une production hautement critique et que nous n'ayons pas le temps d'effectuer notre processus d'assurance qualité standard.
Ce que nous faisons, c'est que chaque fois que nous pensons qu'une révision de code serait utile, nous ajoutons un commentaire "// todo: révision de code par joe" au code modifié. Habituellement, nous sélectionnons Joe parce qu'il est propriétaire du code modifié, mais si ce critère de sélection ne s'applique pas (généralement, c'est le cas), nous avons simplement choisi quelqu'un d'autre au hasard. Et bien sûr, si Joe est disponible à ce moment-là, nous utilisons la bonne vieille méthode de révision par dessus l'épaule.
En tant que réviseur, la seule chose que vous avez à faire est de rechercher périodiquement le code entier pour "// todo: révision du code par moi", revoir les modifications et archiver le code sans le " todo ... "commentaire
En cas de problème, nous revenons aux méthodes de communication traditionnelles (mail/chat/etc).
Cette méthode nous fournit les deux principales qualités que nous recherchons dans un système de révision:
J'ai travaillé dans de nombreuses entreprises et vu de nombreux processus. Mon équipe actuelle gère cela du mieux que j'ai vu jusqu'à présent.
Nous utilisons un processus de développement agile et dans le cadre de cela, nous avons des portes que chaque histoire doit traverser. L'une de ces portes est la révision du code. L'histoire ne passe pas au test tant que la révision du code n'est pas terminée.
De plus, nous stockons notre code sur github.com. Ainsi, après qu'un développeur a terminé sa modification, il publie le lien vers le (s) commit (s) sur l'histoire.
Ensuite, nous identifions un collègue développeur pour examen. Github a un système de commentaires qui permet à quelqu'un de commenter directement sur la ligne de code en question. Github envoie ensuite un e-mail à la distribution, donc parfois nous obtenons des yeux supplémentaires de certaines de nos autres équipes.
Ce processus a très bien fonctionné pour nous. Nous utilisons un outil de processus agile qui facilite la publication des commits et facilite la communication.
Si un problème est particulièrement délicat, nous nous asseoirons pour en discuter. Cela fonctionne parce qu'il fait partie intégrante de notre processus et que tout le monde a compris comment le processus fonctionne. Nous pouvons remettre les tickets en cours si la révision du code entraîne une retouche nécessaire, puis elle peut être revue à nouveau après que les modifications sont apportées, ou le réviseur peut noter sur l'histoire que la correction des éléments est suffisante et n'a pas besoin d'être revue à nouveau.
Si les tests relancent quelque chose, ils remontent en cours et tout autre changement est également examiné.