février
2009
Discussion intéressante ce 11 février lors du troisième dojo du Club Agile Rhône Alpes : nous nous apprêtions à introduire des commentaires dans notre code de test quand un participant a fait remarquer qu’il préférerait voir ces mêmes informations sur la trace de sortie, afin de rendre les résultats de tests unitaires plus lisibles. Plusieurs solutions ont été discutées, et nous avons retenu la plus simple, à savoir inclure l’information en question directement dans le nom de la méthode de test.
Cela m’a fait prendre conscience à quel point un commentaire représente une information « morte » par rapport au code, « vivant » car exécuté. Et cela m’a remis en mémoire un chapitre du livre Clean Code: A Handbook of Agile Software Craftsmanship par Robert C. Martin (et d’autres auteurs comme Michael Feathers qui a écrit le chapitre « Error Handling »). En effet ce nouveau manuel de référence consacre pas moins de 21 pages à la question des commentaires dans le code (presqu’autant qu’au TDD !).
Comment bien commenter son code est un sujet assez sensible, sur lequel les développeurs et leurs managers sont enclins à s’enflammer facilement ! Personnellement je converge petit à petit vers l’opinion qu’il faut éviter les commentaires autant que possible, et Robert C. Martin explique cela très bien, aussi je traduis ci-dessous quelques extraits :
En effet, les commentaires sont, au mieux, un mal nécessaire. Si nos langages de programmation étaient suffisamment expressifs, ou si nous avions le talent de les manier subtilement pour exprimer notre intention, nous n’aurions pas beaucoup besoin de commentaires – peut-être même pas du tout besoin.
Le bon usage des commentaires est de compenser notre échec à nous exprimer nous-mêmes avec du code. Notez que j’ai utilisé le mot échec. Je le pense vraiment. Les commentaires sont toujours des échecs. Nous devons en avoir parce que nous n’arrivons pas toujours à nous exprimer sans eux, mais leur utilisation n’est pas une cause de célébration.
Alors quand vous vous trouvez dans une situation ou vous devez écrire un commentaire, réfléchissez-y et regardez s’il n’y a pas un moyen de changer les circonstances, et de vous exprimer avec du code. Chaque fois que vous vous exprimez avec du code, vous devriez vous taper sur l’épaule. Chaque fois que vous écrivez un commentaire, vous devriez faire la grimace et ressentir l’échec de vos capacités d’expression.
Pourquoi suis-je si remonté contre les commentaires ? Parce qu’ils mentent. Pas toujours, et pas intentionnellement, mais trop souvent. Plus un commentaire est ancien, et plus loin il est du code qu’il décrit, plus il est probable qu’il soit tout simplement faux. La raison est simple. Les programmeurs ne peuvent pas raisonnablement les maintenir.
…
Il y a l’argument que les programmeurs devraient être suffisamment disciplinés pour garder les commentaires dans un état élevé de réparation, pertinence et précision. Je suis d’accord, ils devraient. Mais je préférerais que cette énergie aille dans la direction de rendre le code si clair et expressif qu’il n’ait plus besoin de commentaires du tout.
Des commentaires imprécis sont bien pires que pas de commentaires du tout. Ils sont malhonnêtes et vous trompent. Ils font des promesses qui ne seront jamais satisfaites. Ils exposent de vieille règles qui n’ont plus besoin d’être suivies (et qui ne devraient pas être suivies).
La vérité peut être trouvée à un seul endroit : le code. Seul le code peut véritablement vous dire ce qu’il fait. C’est la seule source d’information réellement précise. Par conséquent, bien que les commentaires soient quelquefois nécessaires, nous dépenserons une énergie significative à les minimiser.
Le chapitre continue ensuite avec de nombreux exemples de bons et mauvais commentaires, qui me conviennent parfaitement, sauf le cas des mauvais commentaires de type « commentaires de journalisation« . Ce sont les commentaires que l’on ajoute en début de fichier ou de méthode pour indiquer pour quelle raison on y touche (identifiant de user story au minimum), la date, l’auteur. A supprimer absolument pour Robert C. Martin, étant donné que nos systèmes de gestion de source fournissent maintenant facilement cette information. Je suis d’accord sur le principe, mais pas sur la pratique !
En effet nous travaillons dans un cadre réglementaire et nous pouvons être audités par des clients, lesquels arrivent avec des formulaires d’évaluation du code qui exigent d’examiner… les commentaires ! J’ai constaté que les auditeurs n’étaient pas trop exigeants sur le détail des commentaires eux-mêmes, mais ils sont intransigeants sur le fait qu’il doit y avoir des commentaires. Donc à l’heure actuelle je ne suis pas confiant de présenter à des auditeurs du code très peu commenté (mais très lisible) comme le recommande Robert C. Martin. J’aurais un peu l’impression d’aller tout nu à l’audit…
Donc pour moi les commentaires de journalisation ont la fonction d’habiller un peu le code (et celui qui est audité). De plus les informations qu’ils contiennent sont assez utiles, notamment lors du support technique. Quand je travaille sur la résolution d’un bug mystérieux, et que j’arrive sur une certaine méthode, les commentaires de journalisation me sont utiles :
- une longue liste de commentaires m’indique que la mise au point a été laborieuse, et que je dois me méfier avant de modifier la fonction,
- un unique commentaire ancien m’indique une portion de code stable depuis longtemps. Est-il vraiment justifié d’y toucher maintenant ?
- les identifiants de user stories me renseignent les impacts possibles si je touche à cette méthode
- les noms de ceux qui ont travaillé successivement sur la méthode me renseignent aussi sur d’éventuels risques, ou sur des anti-patterns possibles.
Il est vrai que qu’un système de gestion de version de sources moderne peut fournir ces informations. Nous utilisons maintenant SubVersion qui offre la fonctionnalité « Blame », laquelle permet de voir « à plat » toutes les modifications d’un fichier. Il reste à voir si cette fonctionnalité est suffisamment performante (dans notre ancien système, certains fichiers ont été modifiés plus de 400 fois – est-ce que Blame fonctionne dans de tels cas ?).
Si Blame fonctionne réellement à cette échelle, je suis assez disposé à abandonner les commentaires de journalisation dans de futurs projets, à condition que le code soit développé suivant les principes exposés dans Clean Code.
Donc d’accord pour la nudité, mais à condition qu’elle soit magnifique !
Et vous, que pensez-vous des commentaires ? Que faites-vous en pratique ?
Remarque : vous pouvez lire un chapitre du livre en ligne ici sur informit.Com, c’est une introduction avec des interviews de programmeurs expérimentés (Bjarne Stroustrup, Grady Booch, Dave Thomas, et Ward Cunningham) qui expliquent ce que Clean Code veut dire pour eux.
5 Commentaires + Ajouter un commentaire
Commentaires récents
- Des tableaux pour l’intégration d’un équipier dans une équipe Scrum dans
- Rétrospectives, la directive première dans
- Des tableaux pour l’intégration d’un équipier dans une équipe Scrum dans
- Des tableaux pour l’intégration d’un équipier dans une équipe Scrum dans
- Des tableaux pour l’intégration d’un équipier dans une équipe Scrum dans
De rien Bruno! Merci plutôt pour tes contributions.
Je lâche une autre de nos pratiques concernant les commentaires. Cela rejoint le commentaire d’Emmanuel (ehsavoie).
A la déclaration de toute routine nous documentons la routine à l’aide de commentaires. Les commentaires expriment les contrats de la routine au sens de la Programmation Par Contrats. Pour plus d’informations, vous pouvez lire http://manu40k.free.fr/articleProgrammationParContrat.pdf
Merci pour vos commentaires, Nip, ManuU, et ehsavoie ! ManuU, ton témoignage sera précieux pour faire évoluer nos pratiques.
Bruno
Salut Bruno,
Vaste question que la notion de commentaires et de documentation du code…
Si je suis contre les commentaires dans le code (au sens dans une méthode) je trouve par contre les commentaires des méthodes importants voir essentiels dans le cas d’une API.
En fait, pour que le code soit auto-expressif il faudrait que l’on ait correctement défini un Ubiquitous Language au sens d’Eric Evans pour le domaine et les développeurs et que tout le monde maitrise ce langage et ce contexte. Et on en est loin ;o)
Alors je resterai avec ma Javadoc et en attendant une analyse sémantique, je serai discipliné ;o)
Bon week-end.
Emmanuel
Salut Bruno,
nous développons dans un cadre très règlementé. Les certificateurs cultivent un amour du commentaire.
Lors de notre dernier audit, nous avons tenu à faire remarquer à l’auditeur que nous cherchons à radicalement limiter la quantité de commentaires. La plupart du temps, il n’y en a pas.
Le code inspecté étant expressif, il a reconnu que ce qui lui plaisait dans nos commentaires était simplement le fait qu’ils sont affichés par l’IDE dans une autre couleur et que cela soulage l’œil!
Bref, il a accepté que si le code est expressif, le commentaire — qui marque le début d’une ligne de commentaire en Ada suffit. Voici donc nos commentaires les plus courants:
—————————————————————-
et
–
En fait, nous cherchons à réserver les commentaires aux justifications. Par exemple nous utilisons des commentaires pour démontrer qu’une division par zéro ne peut avoir lieu dans un calcul. Certes, nous utilisons une assertion dans le code pour exprimer cela, mais le commentaire documente l’assertion en donnant la démonstration.
A++
ManU
—
J’ai tendance a m’aligner sur les positions de uncle Bob. Et je supprime des tas de commentaires inutiles dans le code. Les seuls qui restent passent sous la forme de TODO.
En fait lorsque je laisse des commentaires en place sur du code existant, c’est *toujours* parce que les reponsabilites de la methodes/classe en question sont trop etendues, que le nom n’est pas suffisament explicite parce que trop generique et qu’il serait fortement necessaire de retravailler ce bout de code; et dans ce cas un TODO s’impose.
je comprends les points que tu avances concernant les commentaires. Cependant ca sous entend que
-les developpeurs ont exactement la meme facon de rediger les commentaires. Il est deja dificile d’avoir les memes regles appliques par tous lorsqu’il s’agit de code (et ce malgre les outils existants), autant dire que c’est mission impossible pour les commentaires.
-Qu’ils ne changent pas d’avis quand a l’utilite des commentaires en lisant tel ou tel arcticle ;).
Dans ton cas de commentaire de journalisation, il est vrai qu’il serait plus aise de les remplacer par le listing des modifications rapportees par le gestionnaire de source; mais encore tout depend des contraintes/performances que l’on rencontre.
Les seuls commentaires que je m’autorise sont de 2 ordres:
-Ceux commentant un algo complexe ou inhabituel: ils exposent brievement le principe ou renvoient vers une documentation exterieure comme un wiki.
-Ceux temporaires:
-pendant la modification du code et a effacer des que le code est ecrit
-pour un fix tempororaire de code (dans le cadre .Net, une modification de code via la page aspx par example) mais qui sera ensuite supprime des la prochaine realease.
Par contre a chaque commit du code, les commentaires sont indispensable dans le cadre du gestionnaire de source
Ah aussi dans le style commentaire inutiles, et toujours specifique a .Net, les regions! Quelle horreur ;).