Bonnes pratiques de documentation¶
Connaître son audience, maintenir la documentation à jour, et intégrer la doc dans le workflow de développement.
Connaître son audience¶
La documentation n'existe pas dans l'absolu — elle répond aux besoins d'un lecteur spécifique. Avant d'écrire, identifiez qui va lire.
graph LR
A[Developeur interne] --> B["Reference API\nDocstrings\nADR"]
C[Nouveau collegue] --> D["Getting started\nGuide d'onboarding\nArchitecture overview"]
E[Ops / SRE] --> F["Runbook\nDependances\nConfiguration"]
G[Consommateur externe] --> H["Doc API publique\nChangelog\nGuides d'integration"] | Audience | Ce qu'elle cherche | Format adapté |
|---|---|---|
| Dev interne | Comment ca marche | Docstrings, README, ADR |
| Nouvel arrivant | Par ou commencer | Onboarding guide |
| Ops | Comment déployer/debugger | Runbook, doc infra |
| Consommateur API | Comment intégrer | OpenAPI, tutorials |
| Manager / product | Quoi et pourquoi | Architecture overview |
DRY pour la documentation¶
Le principe DRY (Don't Repeat Yourself) s'applique aussi à la doc. Avoir la même information en deux endroits garantit qu'elle sera desynchonisee.
Single source of truth¶
# Mauvais : la version est en trois endroits
README.md → "Version : 2.3.0"
docs/installation.md → "Installer la version 2.3.0"
pyproject.toml → version = "2.3.0"
# Bon : une seule source, les autres referencent
pyproject.toml → version = "2.3.0" (source)
README.md → badge dynamique depuis PyPI
docs/ → genere depuis le code
Inclure plutôt que dupliquer¶
Avec MkDocs, utilisez --8<-- (snippet) pour inclure des extraits d'un fichier dans un autre :
La documentation dans le processus de review¶
Une pull request qui modifie le comportement d'une fonction sans modifier sa docstring est incomplète. Traitez la documentation comme du code.
Checklist de PR documentation¶
## Checklist documentation
- [ ] Les docstrings des fonctions modifiees sont a jour
- [ ] Le CHANGELOG est mis a jour si l'API publique change
- [ ] Un ADR a ete cree si une decision architecturale a ete prise
- [ ] Les exemples dans la doc fonctionnent toujours
- [ ] Le README reflete l'etat actuel si necessaire
Règles de review documentation¶
# .github/CODEOWNERS
docs/ @team-tech-writers @team-leads
docs/decisions/ @team-leads # ADR reviewes par les leads
openapi.yaml @team-api
Docs-driven development
Avant d'implémenter une nouvelle fonctionnalité, ecrivez d'abord la documentation utilisateur. Si vous n'arrivez pas à l'expliquer clairement, c'est que la conception n'est pas assez mure.
Cette pratique force la clarification des exigences et produit une meilleure UX.
Maintenance de la documentation¶
Détection des docs obsolètes¶
#!/usr/bin/env python3
"""
Detecte les fichiers de documentation non modifies
depuis plus de 180 jours.
"""
import subprocess
from datetime import datetime, timedelta
from pathlib import Path
THRESHOLD_DAYS = 180
def get_last_modified(filepath: str) -> datetime:
result = subprocess.run(
["git", "log", "-1", "--format=%ai", filepath],
capture_output=True, text=True
)
date_str = result.stdout.strip()
if not date_str:
return datetime.min
return datetime.fromisoformat(date_str[:19])
docs_dir = Path("docs")
threshold = datetime.now() - timedelta(days=THRESHOLD_DAYS)
for md_file in docs_dir.rglob("*.md"):
last_modified = get_last_modified(str(md_file))
if last_modified < threshold:
age_days = (datetime.now() - last_modified).days
print(f"{md_file} — {age_days} jours sans modification")
Tester les exemples de code¶
Les exemples de code dans la documentation doivent être exécutés en CI. Un exemple qui ne fonctionne plus est pire qu'une absence d'exemple.
# docs/examples/quickstart.py — teste en CI
from mon_service import AuthClient
client = AuthClient(
client_id="test_id",
client_secret="test_secret",
base_url="http://localhost:8080"
)
token = client.get_token(scope=["read:users"])
assert token.access_token
# .github/workflows/docs.yml
jobs:
test-examples:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Test documentation examples
run: |
pip install -e ".[dev]"
python docs/examples/quickstart.py
python docs/examples/advanced.py
Versionnage de la documentation¶
Quand votre projet a plusieurs versions en production, votre documentation doit aussi être versionnee.
# Avec mike (plugin MkDocs)
pip install mike
# Publier la version 2.1
mike deploy 2.1 latest --push
# Definir la version par defaut
mike set-default latest --push
# Lister les versions
mike list
Tableau des pratiques¶
| Pratique | Benefice principal | Comment l'implémenter |
|---|---|---|
| Doc dans la même PR | Jamais desynchonisee | Checklist PR, CODEOWNERS |
| Single source of truth | Pas de contradictions | Snippets MkDocs, badges dynamiques |
| Tests des exemples en CI | Exemples toujours fonctionnels | pytest-codeblocks, scripts Python |
| Détection docs obsolètes | Docs fraiche et crédible | Script Git + alerte CI mensuelle |
| Versioning de la doc | Chaque version a sa doc | mike + MkDocs |
| Docs-driven development | Meilleure conception | Process équipe, template de story |
| Review documentation | Qualité et cohérence | CODEOWNERS + checklist PR |
Anti-patterns a éviter¶
Documentation fantome
Une section "TODO : documenter cette partie" laissee des semaines en production. Mieux vaut ne rien écrire que d'annoncer une promesse non tenue.
Documentation cimetiere
Des pages jamais mises à jour, avec des exemples obsolètes et des instructions qui ne fonctionnent plus. Supprimez plutôt que de laisser pourrir.
Over-documentation
Documenter chaque getter/setter, chaque variable locale. Le bruit noie le signal. Documentez ce qui a de la valeur ajoutee.
Prochaine étape¶
Pour finir ce tutoriel, nous explorons les cas avances : sites de documentation, internationalisation et métriques.