J'ouvre un sujet de réflexion, que je pense être important : la simplification de l'usine qu'est devenu le projet zeste de savoir (et non, je n'ai pas dîné avec François Hollande ce soir ).
Si vous lisez ce topic en tant que contributeur plus ou moins régulier, essayez plutôt de vous mettre à place de quelqu'un qui n'a jamais commité dans le projet, qui a vu l'article sur la dernière ZEP et qui se dit : "tiens, ça a l'air cool comme projet, je vais essayer de corriger le bug du logo de la page apropos qui rend mal, pour me faire la main"
Certains me diront que ZdS est devenu trop gros pour ça, j'ai tendance à penser qu'un projet open source n'est jamais assez gros pour se fermer aux contributeurs potentiels. Car pour moi, il y'a deux façon de fermer un projet :
- mettre une licence propriétaire
- mettre tout un tas de barrière à l'entrée
ZdS peut déjà se réjouir d'avoir autant de développeurs, mais ce n'est pas parce qu'un est un bon groupe que ça l'on doit s’arrêter là. On doit continuer à "rester ouvert".
Dans la suite, je vais donc lister ce que je considère comme étant des barrières à l'entrée du développement de zds, les problèmes que ça implique, et pour finir donner quelques pistes d'assouplissement des barrières.
La documentation
La documentation actuelle de ZdS est d'une taille monstrueuse et très éparpillée. On en retrouve dans les fichiers :
- readme.md
- contributing.md
- gulp.md
- deploy.md
- workflow.md
- install-solr.md
- gulp.md
- readthedocs
- github.io
Problèmes
- Il n'y a aucun fil d'ariane entre les docs
- Le nouveau qui débarque ne sait pas par ou commencer (tellement il y'a de trucs à lire et un peu partout)
- La moitié de la documentation n'est pas à jour
Pistes
piste 1 : la doc a deux vitesses
Il s'agit ici d'avoir de la documentation "introductive" d'une part et de la documentation détaillée à coté. Pour éviter les problèmes de maintenances, il faudrait que la doc introductive soit constituée uniquement des élements qui bougent très peu.
Typiquement, en plus des pavés qui servent à décrire le Zestflow, on pourrait mettre dans la doc "introductive" une simple image simple et efficace qui reprend ce workflow dans les grandes lignes avec un lien pour en savoir plus qui dirige vers la version détaillée.
La doc "introductive" devrait adopter la même logique que des slides de présentation d'un projet : concision et grandes lignes.
Les process
Actuellement, le cycle de vie complet d'un problème, entre le moment ou il est déclaré, et le moment ou il est mis en production est le suivant :
N° action | description de l'action | acteur |
---|---|---|
1 | Nouveau bug posté sur le forum | membre lambda |
2 | Recopie du bug en tant qu'issue sur github | gestionnaire de ticket |
3 | Déclaration de prise en charge de l'issue | développeur |
4 | Développement/correction du correctif de l'issue | développeur |
5 | Développement/correction du test unitaire lié à l'issue | développeur |
6 | Rédaction/MAJ de la documentation liée à l'issue | développeur |
7 | Commit/Rebase + push du nouveau code | développeur |
8 | Création de la pull request (cartouche + explication de la PR + Note pour la QA) | développeur |
9 | Test de la PR | QA |
10 | Retour de la QA : si négatif alors retour à l'étape 4 | QA |
11 | Merge (si merge auto indisponible alors retour à l'étape 7) + fermeture de l'issue | gestionnaire de ticket |
12 | Rangement de l'issue fermée dans une milestone | gestionnaire de ticket |
13 | Création de la release liée à une milestone | deployeur |
14 | Déploiement de la release en préproduction | deployeur |
15 | Test de la release en préproduction : si problème alors retour à l'étape 4 | membres lambda |
16 | Déploiement de la release en production | deployeur |
Les problèmes
- Des doublons entre l'étape 1 et l'étape 2 (C'est déjà en étude dans un autre topic)
- L'étape 9 est notre goulot d'étranglement
- Le développeur passe plus de temps à gérer les conflits qu'a développer
- Des PRs sont mergées sans tests, et sans documentation
- Les corners cases ne sont pas toujours détectés à la QA
Les pistes d'assouplissement
piste 1 : une PR pas forcément une issue
L'une des règles du projet est : 1 PR = 1 issue. Sauf que dans la pratique ça ne fait qu'alourdir les process et au final on est plus perdant que gagnant. Pourquoi ?
- Il m'est souvent arrivé, en corrigeant un bug dans un fichier, de rencontrer un autre bug pas forcément lié à l'issue que j'ai en tête. A cause de la règle 1 PR = 1 issue, je ne peux pas corriger le deuxième bug tout de suite. Je suis obligé d'arriver jusqu'à l'étape 8 pour l'issue que je suis en train de corriger avant de recommencer à l'étape 3 pour la 2e issue (parfois même l'étape 2). Dans la pratique, je ne corrige jamais la deuxième issue, car soit j'ai oublié ce que c'était, soit j'ai la flemme de refaire toutes les étapes.
- Certaines issues sont souvent liés au même problème, ce qui fait qu'on fini par avoir plusieurs PRs avec des dépendances entre les PR.
- Il faut avoir une bonne connaissance de l'ensemble des issues existantes. Car sinon je risque de corriger plusieurs issues en même temps.
Bref, vous l'aurez compris, je pense que cette règle apporte plus de mal que de bien.
piste 2 : remplacer les hommes par les machines
Actuellement l'étape N° 9 est sans nul doute le goulot d'étranglement et c'est normal, le code doit être de qualité. Mais la qualité faite par les hommes a des failles, et dans notre cas, la faille c'est le temps.
L'idée ici est de :
- faire ce qu'il faut pour monter à 99% de couverture de code dans les tests (on est à 80% actuellement)
- ne pas laisser passer une PR qui fait descendre la couverture des tests
- faire une test review et valider la PR si elle passe les tests.
piste 3 : Les nightly builds
L'idée ici est de déployer tout les soirs, via une tache cron, l'instance de la branche dev dans son état le plus frais. ça permet de laisser le site testable tout le temps pour le lambda utilisateur et donc plus de retours possible avant de lancer une release.
La Stack d'outils
Aujourd'hui, dans le projet on travaille avec plusieurs gestionnaire de dépendances :
- pip : pour tout nos package python (django, etc.)
- npm : pour tout nos package front-end (js/sass)
- cabal : pas encore intégré dans le dev de zds
Problèmes
- Le développeur a besoin d'installer 2 gestionnaires de dépendances (2 fois plus de risque d'être bloqué pendant l'installation)
- Le déploiement n'est pas géré de manière "native" django : ce qui complique l'utilisation des outils de déploiement automatique de projet django.
- npm est souvent capricieux (pour l'exemple, le premier build du front-end en prépro pour la RC-1.4 a échoué, et on a souvent des souci dans travis)
Pistes d'assouplissement
piste 1 : remplacer npm par pip
Qui dit gestionnaire de dépendances à installer dit barrière à l'entrée pour le contributeur occasionnel. L'idée ici est de supprimer une barrière à l'entrée. C'est possible, et sans régression, il n'y a donc pas de raison à conserver une barrière à l'entrée pour le plaisir.
Le corollaire serait que la documentation d'installation se verrait divisée par deux. Quant on sait que la taille d'une documentation est aussi une barrière à l'entrée dans un projet, ça fait réfléchir.
J'invite donc tout ceux qui voient d'autres pistes de simplification à en parler.