Questions de documentation
La documentation, prise au sens large, inclut plusieurs
facteurs, dont le choix judicieux des noms, l'indentation,
les commentaires, etc. Cela dit, voici quelques
pistes et quelques liens portant sur la documentation du logiciel.
« You know what's worse than clever code? Clever undocumented code. Unfortunately the two are often correlated » – Caitie
McCaffrey (source)
Le
texte de Wooten ci-dessus contient un bel exemple d'un cas qui, à
mon avis, ne devrait pas tant être de la documentation que du code.
En effet, imaginez ceci (adapté du texte en question) :
//
// Calculer le temps requis pour traverser une distance
// étant donné une vitesse de déplacement
//
// @param distance : la distance à traverser
// @param vitesse : la vitesse de déplacement
//
// @return le temps requis pour traverser la distance
// « distance » à la vitesse « vitesse »
//
double calculerTempsDeplacement(double distance, double vitesse);
Le texte recommande d'indiquer les unités de mesure à même
les commentaires (aussi adapté de ce texte) :
//
// Calculer le temps requis pour traverser une distance
// étant donné une vitesse de déplacement
//
// @param distance : la distance à traverser (en Km)
// @param vitesse : la vitesse de déplacement (et Km/h)
//
// @return le temps requis (en minutes) pour traverser la
// distance « distance » à la vitesse « vitesse »
//
double calculerTempsDeplacement(double distanceKm, double vitesseKph);
En pratique, je pense que nous devrions viser une écriture plus proche
de celle-ci :
//
// Calculer le temps requis pour traverser une distance
// étant donné une vitesse de déplacement
//
// @param distance : la distance à traverser
// @param vitesse : la vitesse de déplacement
//
// @return le temps requis pour traverser la distance
// « distance » à la vitesse « vitesse »
//
Temps<Minute> temps_deplacement
(Distance<Kilometre> distance, Vitesse<Kilometre, Heure> vitesse);
Imaginez cette interface même sans commentaires. Elle demeure, il me
semble, très lisible :
Temps<Minute> temps_deplacement
(Distance<Kilometre> distance, Vitesse<Kilometre, Heure> vitesse);
On peut même l'imaginer générique, donc plus flexible
encore, sans perte de généralité ou de vitesse d'exécution :
template <class T, class D>
Temps<T> temps_deplacement(Distance<D> distance, Vitesse<D, T> vitesse) {
// code pour réaliser le calcul (peu importe)
}
// ...
int main() {
Temps<Minute> t = temps_deplacement(
Distance<Kilometre>{5.5}, Vitesse<Kilometre,Heure>{60.0}
);
// ...
}
...du moins présumant des constructeurs de conversion corrects. Évidemment,
en utilisant des
littéraux maison, on peut en arriver à un programme comme celui-ci :
Distance<Kilometre> operator "" _km(long double);
Vitesse<Kilometre,Heure> operator "" _kmh(long double);
// ...
template <class T, class D>
Temps<T> temps_deplacement(Distance<D> distance, Vitesse<D, T> vitesse) {
// code pour réaliser le calcul (peu importe)
}
// ...
int main() {
auto t = temps_deplacement(5.5_km, 60.0_kmh);
// ...
}
Si vous aimez l'écriture résultante, qui est selon moi plus
robuste du fait que le compilateur peut alors assurer le respect du contrat
sémantique de l'interface, ce contrat
étant exprimé à même la syntaxe de ses paramètres,
vous pouvez examiner l'article ../Divers--cplusplus/Implementer-changement-referentiel.html
qui montre comment il est possible d'y arriver sans perte d'efficacité.
- Il est fréquent que les gens qui posent des questions se fassent
répondre RTFM, pour Read the F***ing Manual. À ce sujet :
- Concevoir de la bonne documentation pour une API, selon James Yu en
2012 : http://blog.parse.com/2012/01/11/designing-great-api-docs/
- Saisir et documenter les petites décision de programmation alors
qu'elles sont faites, une pratique proposée par Andrew Binstock en
2012 : http://www.drdobbs.com/architecture-and-design/232900498
- Comment faire en sorte que les programmeurs documentent leur code? Une réflexion
de Neil McAllister en 2012 : http://www.infoworld.com/d/application-development/how-get-developers-document-their-code-183908
- En 2009, Shamus Young explique pourquoi,
selon lui, il existe un stéréotype persistant à l'effet que les programmeurs ne
soient pas très bons dans la rédaction de documentation technique... C'est
tout simplement parce que c'est vrai :
http://www.shamusyoung.com/twentysidedtale/?p=3521
- Dans ce texte de 2013, Andreas Boye nous
recommande de « documenter comme un programmeur », au sens où le format et la structure de notre documentation doivent être utiles :
http://www.andreasboye.com/2013/05/document-like-programmer.html
- Il y a bien sûr de la documentation dont on ne veut pas, selon Bozhidar Bozhanov en 2013 :
http://techblog.bozho.net/?p=1173
- En 2013, réflexion sur ce qui fait une bonne
documentation pour un langage de programmation :
http://www.hxa.name/notes/note-hxa7241-20130707T0900Z.html
- Écrire un bon tutoriel, selon Alex Ford en 2011 :
http://codetunnel.com/blog/post/how-to-write-a-programming-tutorial
- Les documents de design et leur importance, par Chris Cox en
2013 :
http://www.toptal.com/freelance/why-design-documents-matter
- À quel point est-il vraiment important de documenter le code? Une
réflexion de Jussi Pakkanen en 2013 :
http://voices.canonical.com/jussi.pakkanen/2012/09/25/the-code-documentation-fallacy/
- En 2014, David Leal préconise d'écrire de la
documentation « vivante » :
http://blog.mojotech.com/why-you-should-write-living-documentation/
- En 2014, Gareth Latty se dit d'avis qu'un
document Javadoc n'est pas de la documentation :
http://blog.lattyware.co.uk/post/93792267381/javadocs-are-not-documentation
- Dans ce texte de 2014, Julia Evans préconise
de ne pas avoir peur de lire le code source plutôt que la documentation,
surtout lorsqu'il faut développer une meilleure perspective sur un projet :
http://jvns.ca/blog/2014/12/29/on-reading-the-source-code-not-the-docs/
- En 2005,
Martin
Fowler propose une réflexion sur le code en tant que documentation :
http://martinfowler.com/bliki/CodeAsDocumentation.html
- Comme le rappelle
Raymond Chen
en 2015, mieux vaut ne documenter que ce envers
quoi on s'engagera :
http://blogs.msdn.com/b/oldnewthing/archive/2015/05/08/10613194.aspx
- La documentation d'une API
a elle aussi besoin d'amour, comme le rappelle Ian Watson en
2015 :
http://apimetrics.io/2015/07/22/api-documentation-needs-love-too/
- Rendre plus fluide l'acte d'écrire de la documentation, texte de
2015 par Pater Van de Voorde :
https://developer.atlassian.com/blog/2015/11/totw-write-better-docs-and-blogs/
- Texte de 2013 par Steve Losh, qui recommande
d'écrire de la « documentation qui enseigne » plutôt que de la « documentation
qui montre » :
http://stevelosh.com/blog/2013/09/teach-dont-tell/
- Écrire un Status Report pour la communauté
BSD :
https://www.freebsd.org/news/status/howto.html
- Écrire un README (un
LISEZMOI), par Rowan Manning en 2016 :
http://rowanmanning.com/posts/writing-a-friendly-readme/
- En 2016, Jesse Luoto explique comment un bon
README devrait être écrit selon lui, et parle de l'importance de ce
geste :
http://thejunkland.com/blog/how-to-write-good-readme.html
- En 2015, Arne Mertz discute de la subjectivité
du concept-même de lisibilité, en indiquant (les auteurs le savent déjà) que
rendre un texte lisible au sens large a moins de sens que rendre un texte
lisible pour un lectorat donné. Autrement dit, mieux vaut savoir à
qui un texte s'adresse, et cela vaut aussi pour le code :
http://arne-mertz.de/2015/11/whom-are-we-writing-code-for/
- Texte de 2016 par Arne Mertz, portant sur les
vertus et les caractéristiques d'une documentation de qualité :
http://arne-mertz.de/2016/05/clean-documentation/
- En 2016, Antonio Cangiano fait l'éloge d'une documentation
exposant les préconditions
et les postconditions
des fonctions :
http://programmingzen.com/2016/07/03/in-praise-of-function-pre-and-postconditions/
- Quelques conseils pour écrire des phrases plus lisibles et plus faciles à
mémoriser, en 2016 :
http://www.writethedocs.org/blog/newsletter-december-2016/
- En 2017, Tom Manderson relate quelques leçons apprises « à la dure » de
l'époque où il négligeait la documentation :
https://trm.io/2017/02/05/documentation-lessons.html
- Présentation de Timur Doumler en 2017, portant
sur l'écriture de code lisible avec
C++ :
https://drive.google.com/file/d/0B-YcSuujrbGNRElTZXNaQjQ3dlE/...
- Quelques trucs amusants trouvés dans les commentaires et dans la documentation de programmes existants :
http://wiki.c2.com/?FunnyThingsSeenInSourceCodeAndDocumentation
« Documentation is a love
letter that you write to your future self » –
Damian Conway (source)
« [Documentation] bugs are the most insidious kind » –
Alisdair Meredith (source)
Ce que je fais, personnellement
Dans mon code, je documente peu (certains diraient trop peu, et sans
doute avec raison), mais j'essaie de porter une attention particulière à quatre éléments, soit :
Chacun des liens ci-dessus donne plus de détails quant à ma pratique.
Formes auxiliaires de documentation
Nous avons aujourd'hui accès à des modalités nouvelles de documentation. En
voici quelques-unes.
Blogues
Mode d'expression du XXIe siècle, le blogue (forme concise pour Web Log),
que certains nomment « carnet », permet à un auteur d'exprimer ses idées et de les publier dans Internet sans intervention d'un tiers.
Foires aux questions (FAQ)
Il est fréquent que les gens posent, de manière récurrente, les mêmes questions, ou encore des questions tombant dans un même registre. Pour répondre à ces gens et à leurs besoins, il arrive souvent qu'une Foire aux questions (en anglais : Frequently Asked Questions), ou FAQ, soit mise en place. Pour vous aider, des outils et des trucs :
Les man pages
Sous Unix, depuis
le tout début, la documentation en-ligne est disponible à travers ce qu'on y
nomme des man pages, ou pages de
manuel, à l'aide de la commande man.
Whitepapers
Il arrive, avec l'expérience, qu'on nous demande de rédiger un Whitepaper, soit un document semi technique donnant des pistes ou guidant les gens tentant de résoudre un problème ou une classe de problèmes. Typiquement, ces documents soutiendront une technologie et mettront, au passage, en valeur celle-ci et sa pertinence pour ce qui est de résoudre un problème comme ceux décrits dans le document. Si vous devez le faire, des pistes :
Autres
Une démarche unifiée de documentation des produits, par Microsoft :
https://docs.microsoft.com/fr-fr/
Lisibilité du code
La lisibilité du code est une question éminemment sujbective. Tous la souhaitent, la majorité l'encourage, mais les définitions varient beaucoup selon les individus. Quelques opinions sur ce sujet :
- http://blog.ashodnakashian.com/2011/03/code-readability/
- http://iq0.com/notes/deep.nesting.html
(une opinion de Tom
Duff)
- http://www.artima.com/weblogs/viewpost.jsp?thread=252702
(une opinion de Bill Venners)
- Quelques règles de lisibilité (entre autres) pour la rédaction
de code C,
par Rob Pike
en 1989. Je suis à l'aise avec plusieurs
de ses propositions, outre la dernière sur la manière d'organiser
les inclusions de fichiers – ça a peut-être été
une approche raisonnable à une autre époque, mais aujourd'hui
ce qu'il proposait dans ce texte serait extrêmement contre-productif :
http://doc.cat-v.org/bell_labs/pikestyle?_
- À propos de la programmation
lettrée, ou Literate Programming :
- Un répertoire de programmes lettrés : http://literateprograms.org/LiteratePrograms:Welcome
- Bien que Donald
Knuth (rien de moins) soit un évangéliste de cette pratique,
il est possible de débattre des vertus d'une solution concise,
expliquée soigneusement mais aussi avec concision, du point de
vue de la lisibilité du fruit de tels efforts. Une réflexion
en ce sens, écrite en 2011 : http://www.leancrew.com/all-this/2011/12/more-shell-less-egg/
- Une autre critique de cette approche, par Peter A. Donis en
2012 : http://blog.peterdonis.com/opinions/still-another-nerd-interlude.html
- Une proposition en Factor,
texte de 2012 : http://re-factor.blogspot.in/2012/08/literate-programming.html
- En 2013, Shane Celis explique pourquoi
il a choisi d'essayer cette voie :
http://shanecelis.github.io/2013/05/20/why-im-trying-literate-programming/
- Un peu en réaction à cette pratique, texte de Peter Siebel en
2014 qui explique qu'à son point de vue, le code n'est pas de la
littérature, mais mérite tout de même que l'on réfléchisse à des manières
efficaces et pertinentes de le présenter :
http://www.gigamonkeys.com/code-reading/
- En 2014, Kartik Agaram se dit d'avis que
Donald
Knuth s'y est mal pris :
http://akkartik.name/post/literate-programming
- Texte de John D. Cook en 2016 :
http://www.johndcook.com/blog/2016/07/06/literate-programming-presenting-code-in-human-order/
- En 2016, John W. Shipman demande si la
programmation lettrée est une pratique dommageable :
http://johnwshipman.blogspot.ca/2016/02/is-literate-programming-harmful.html
- Réflexion sur la programmation illettrée, formulée par
Gilad
Bracha :
https://gbracha.github.io/illiterateProgramming/out/illiterateProgramming.html
(pour une suite, en 2017, voir
https://gbracha.blogspot.ca/2017/05/dead-programs-society.html)
- Une réflexion d'Andrew
Koenig sur la tension qui existe entre l'écriture des programmes
et leur lecture, dans une optique de compréhension du code : http://drdobbs.com/blogs/cpp/232200428
- Améliorer la lisibilité du code à travers Linq, par
Tommy Hanks en 2012 : http://www.tombatron.com/permalink/ag10b21iYXRyb25ibG9nchYLEg5CbG9nRW50cnlNb2RlbBjXnwMM
- Améliorer la lisibilité du code à travers des méthodes
anonymes , par Filip Ekberg en 2011 : http://blog.csharptutor.com/2011/10/05/making-code-more-readable-with-anonymous-functions/
- Selon Neil McAllister en 2012, les développeurs
chez Microsoft ont besoin d'un guide de style pour leurs programmes, et heureusement
ils en ont un : http://www.infoworld.com/d/application-development/why-microsoft-developers-need-style-guide-186026
- Série d'articles par Larry Osterman, en 2004,
sur la question du style en programmation :
- Texte de 2012 rappelant l'importance de la lisibilité,
en lien avec une expérience de débogage
particulière : http://blogs.perl.org/users/ovid/2012/04/the-price-of-cleverness-yaml-is-not-safe.html
- Le concours IOCCC
récompense des programmes C
pervers et qui font autre chose que ce que suggèrent leurs sources.
Ce sont parfois des chefs d'oeuvre de perversion, et certains individus célèbres
ont gagné ce concours par le passé. Pour jeter un coup d'oeil
aux « meilleures » sources proposées au fils
des ans, voir http://www.ioccc.org/years.html
- Réflexions sur l'importance du style (de la programmatique) dans
la programmation, par Nicholas C. Zakas en 2012 (texte
avec accent sur JavaScript) :
http://coding.smashingmagazine.com/2012/10/25/why-coding-style-matters/
- À propos de l'aptitude à lire le code, un texte de
John Regehr en 2013 :
http://blog.regehr.org/archives/940
- Améliorer la lisibilité du code
C++,
texte de 2014 :
http://derkarl.org/article/improving_code_readability_in_cpp
- En 2014, David R. MacIver recommande de lire
le code en posant des questions :
http://www.drmaciver.com/2014/01/reading-code-by-asking-questions/
- Selon James Hague en 2012, on ne lit pas
vraiment le code; on l'explore :
http://prog21.dadgum.com/194.html
- Comment écrire du code lisible, selon Don Werve en
2014 :
http://werve.net/articles/writing-readable-code/
- En 2014, Matthieu Tanguay-Carel exprime sa
vision de la lisibilité du code :
https://medium.com/bloc-posts/lets-get-serious-about-readability-4e4ce6a9b6c2
- Dans ce texte de 2015, Randy Gaul plaide pour
des alternatives (des if) plus lisibles :
http://www.randygaul.net/2015/10/15/good-if-statements-self-documenting-code/
- Truc intéressant, lu en 2016 : Eberhard Gräther, un stagiaire chez Google explique qu'il a
compris, une fois sur la tâche, qu'une programmeuse ou un programmeur, en
pratique, lit beaucoup plus de code qu'elle ou qu'il en écrit, et a pris le
temps d'écrire un programme pour l'accompagner dans sa lecture du code,
justement :
https://www.coati.io/blog/why_working_on_chrom_made_me_develop_a_tool_for_reading_source_code/
- L'outil standardese pour documenter le code
C++,
proposé par Jonathan Müller en 2016 :
https://github.com/foonathan/standardese (voir aussi
https://www.foonathan.net/2016/05/standardese-nextgen-doxygen/#content et
https://www.foonathan.net/2016/06/standardese-01/#content)
- Texte de 2016 par Amit Shekhar, qui fait l'éloge du code
autodocumenté :
https://medium.freecodecamp.com/good-code-vs-bad-code-263f71e867c1
- Texte de Jonathan Sacramento en 2016, portant
sur l'écriture de code
SQL « propre » :
http://jonathansacramento.com/posts/20161119_clean_sql.html