Étude de cas d'un auteur de plugin amateur

En 2024, je cherchais du travail. J’ai décidé de proposer mes services en tant que consultant en communautés. Cependant, la plupart des gens étaient surtout intéressés par une aide technique pour réparer ou mettre à jour leurs sites Discourse. Un client potentiel m’a demandé si je pouvais ajouter un formulaire de contact pour permettre aux personnes sans compte d’envoyer des retours. J’ai fait des recherches et j’ai conclu que ce n’était pas possible. Mais comme j’avais beaucoup de temps libre, j’ai suivi le tutoriel pour les développeurs de plugins pour voir ce que je pouvais faire. Finalement, j’ai développé un plugin de formulaire de contact et signé ce client.[1]

Pour que tout le monde soit clair sur ce point : je ne suis pas un programmeur frontend ! Cela fait 13 ans que je ne suis plus programmeur professionnel d’aucune sorte. Je sais comment créer un formulaire HTML et c’est à peu près la limite de mes connaissances. J’ai donc lutté avec la section Ember et Handlebars du tutoriel et assemblé un bricolage qui fonctionnait suffisamment bien. Heureusement, j’étais à l’aise avec les systèmes de templating, les ayant utilisés dans un emploi précédent.

J’ai trouvé un emploi à la Fondation OpenSSL[2] et j’ai surtout abandonné mes clients. Mais le client pour qui j’avais créé le plugin m’a gardé en rétention car il appréciait vraiment mon travail. (J’ai réalisé plusieurs projets sans rapport pour lui.) Afin de justifier ma rétention, j’ai décidé de mettre à niveau son serveur Discourse. Voici ce que j’ai vu :

Seul ce message apparaissait sur le site de mon client car j’avais été stupide : j’avais installé, mais pas activé, le plugin de contact sur mon site de test. J’ai donc rapidement activé le mode sans échec et désactivé le plugin. Le week-end dernier, j’ai passé du temps à comprendre ce qui avait mal tourné et comment je pouvais le réparer pour mon client.

Après quelques recherches, j’ai trouvé Dépréciation de l’extension de fichier .hbs dans les thèmes et les plugins :

Dans la dernière version de Discourse, l’utilisation de fichiers .hbs dans les thèmes et les plugins est dépréciée. Le support de ce format de fichier sera supprimé après la prochaine version ESR.

C’était en mars, ce qui signifie que j’aurais dû avoir jusqu’à la fin septembre pour le corriger si j’étais sur la version ESR. Mais ma configuration Discourse utilise “tests-passed”[3], donc j’ai eu l’erreur quelques mois plus tôt, je suppose.

Puisque je devrai le réparer de toute façon (ou décevoir mon client), je me suis lancé dans les instructions : Mise à jour automatique des thèmes et des plugins vers le format de fichier .gjs. La première étape consistait à installer un environnement de développement puisque j’avais changé d’ordinateur portable depuis la dernière fois que j’avais essayé cela.[4] Lorsque j’ai enfin réussi à faire fonctionner Discourse et à vérifier que mon plugin était cassé localement, j’ai lancé le processus de lint[5] :

$ pnpm eslint --fix .

/Users/jericson/src/discourse-contact-plugin/assets/javascripts/discourse/components/contact-form.js
   1:8   error  Use Glimmer components(@glimmer/component) instead of classic components(@ember/component)          ember/no-classic-components
   3:16  error  Native JS classes should be used instead of classic classes                                         ember/no-classic-classes
   3:16  error  Please switch to a tagless component by setting `tagName: ''` or converting to a Glimmer component  ember/require-tagless-components
  20:3   error  Use the @action decorator instead of declaring an actions hash                                      ember/no-actions-hash

✖ 4 problems (4 errors, 0 warnings)

Bien qu’il soit agaçant de devoir modifier mon plugin, le processus de lint m’a au moins aidé à nettoyer et moderniser mon code. Cependant, le script automatisé a échoué lors de la tentative de conversion vers le format .gjs. J’ai donc décidé d’essayer https://ask.discourse.com/

J’ai 12 questions là-bas. Je ne les partagerais pas avec un humain car elles ne sont que les élucubrations d’un programmeur de plus en plus frustré. À un moment donné, le bot a suggéré une “approche moderne plus robuste” pour l’un de mes sous-problèmes qui comprenait… un fichier .js et un fichier .hbs.

Image tirée de 8½ où le réalisateur a jeté la critique négative du critique à propos de 8½.

Je sais pourquoi cela arrive. Il est entraîné sur les discussions de Meta Discourse et il y a encore beaucoup de publications contenant du code Handlebars, y compris la deuxième partie du tutoriel officiel pour les développeurs de plugins. Ce contenu sera mis à jour avec le temps, mais je crains que cela prenne un peu plus de temps car le conseil officiel pour obtenir de l’aide lors de la mise à niveau est de demander au chatbot plutôt que de poser des questions sur Meta Discourse.

Je suppose que je ne devrais pas me plaindre ; cela m’a aidé à trier mon code et probablement avec moins de friction que de demander aux humains.

Stabilité de la plateforme

Je travaille maintenant pour la Fondation OpenSSL. Vous connaissez probablement OpenSSL à cause de Heartbleed. Il est utilisé partout. La version la plus populaire à télécharger est la 1.1.1, qui a atteint sa fin de vie en 2023. La suivante la plus populaire est la 3.0, sortie en 2021, mais qui est toujours prise en charge en tant que version à support à long terme (LTS). Ensuite vient la 3.5, notre dernière version LTS. Ces trois versions représentent presque 2/3 des téléchargements depuis GitHub.

C’est un peu décevant car la 3.5 possède de nouvelles fonctionnalités intéressantes. Mais en fin de compte, les fonctionnalités qui intéressent le plus les gens sont une combinaison de SSL/TLS et de primitives cryptographiques. À moins que vous ne soyez enthousiaste à l’idée des algorithmes cryptographiques post-quantiques, vous repousserez la douleur de la mise à niveau aussi longtemps que possible.

OpenSSL est bien plus bas dans la pile que Discourse, bien sûr. Mais le principe est le même. À moins qu’il y ait une nouvelle fonctionnalité, les gens ne sont pas intéressés par des mises à jour destructrices. Je sais que vous êtes enthousiastes à l’idée des nouvelles fonctionnalités ajoutées à Discourse. Je comprends le désir de modifier une API pour obtenir des optimisations plus tard. Je m’inquiète simplement que se déplacer trop vite nuise à Discourse en tant que plateforme sur laquelle les communautés sont construites.

En parlant de cela, il existe une présentation très utile intitulée Gardening Platforms écrite par Alex Komoroske. La diapositive 90 commence une section intitulée “Plateforme + Écosystème” qui explique comment les plateformes doivent coévoluer avec leurs écosystèmes. Dans ce cas, Discourse est la plateforme qui soutient un écosystème de concepteurs de plugins et de thèmes, de services d’hébergement, de la communauté Meta Discourse et même des communautés construites sur Discourse. Une observation importante dans les notes de l’orateur de la diapositive 98 :

Mais ils ne sont pas indépendants ; ils sont liés symbiotiquement.

Les actions se produisant dans l’un influencent l’autre, et vice versa. Considérez cela comme des boucles de rétroaction les reliant dans les deux sens.

Ils ne sont pas rigidement liés ; c’est plus comme un élastique qui les relie. C’est une attraction gravitationnelle.

Si une plateforme et un écosystème évoluent trop vite l’un par rapport à l’autre, le lien se brise avec des effets désastreux. Je fais confiance à Discourse pour bien agir envers l’écosystème. C’est juste que, pour moi, les week-ends comme le dernier ont ébranlé cette confiance.


  1. Je suis moyennement fier de mon travail, même si cela a fini par être un site assez statique. ↩︎

  2. Présage ! ↩︎

  3. Cela doit aussi être mis à jour ↩︎

  4. Redis et Rails étaient plus difficiles à installer que je ne m’en souvenais. ↩︎

  5. Pas avant d’avoir passé beaucoup de temps à échouer à récupérer eslint.config.mjs, cependant. ↩︎

Je pense que vous avez rencontré cette erreur à cause de ce bug, et non parce que votre plugin nécessitait une mise à jour immédiate :

J’ai vécu la même chose avec de nombreux plugins que j’avais développés. Je n’avais pas la capacité nécessaire pour les moderniser selon les standards de Discourse. J’ai un emploi dans le domaine de la science des données, donc même si je connais les concepts du génie logiciel, je ne reste pas à jour sur les spécificités du développement web. Finalement, je n’ai pas mis à jour mon site pendant huit mois car il dépendait de ces plugins obsolètes.

Je ne veux pas minimiser ta lutte, mais fondamentalement, je pense qu’avec l’avènement de la programmation par agents, ce rythme de développement est devenu un problème mineur. Ce qui m’aurait pris une ou deux semaines à coder et à rendre fonctionnel n’a requis qu’un abonnement Claude Code à 20 $ et quelques minutes par plugin. Qui plus est, j’ai également pu les optimiser pour la performance. Après avoir utilisé la programmation par agents pour plusieurs projets professionnels et personnels, je ne pense pas coder quelque chose à partir de zéro de nouveau dans ma vie. C’est comme la différence technologique entre écrire et livrer une lettre à la main versus envoyer un e-mail. C’est un peu triste, mais en même temps, on a l’impression d’avoir reçu des pouvoirs de niveau divin.

Cela semble plausible. Passer à la dernière version ESR (et être un peu plus vigilant dans les tests) semble être une bonne stratégie à partir de maintenant.

Je ne pense pas que le rythme de développement soit un problème en soi. C’est le rythme de tout. Pourquoi, par exemple, le tutoriel sur les plugins n’a-t-il pas été mis à jour ? C’est une mine prête à exploser au visage de quelque pauvre type qui souhaite créer un plugin. Cela fonctionnera pour le moment, mais ils finiront par rencontrer le même problème que moi. La solution n’est pas d’utiliser l’IA pour corriger le plugin plus tard, mais de corriger dès maintenant les instructions sur la création d’un plugin. Je veux dire, il n’y a aucune raison d’enseigner encore l’ancienne méthode, n’est-ce pas ?

Parce que nous sommes une équipe assez réduite qui maintient une base de code monumentale tout en devant implémenter de nouvelles fonctionnalités pour des clients payants, le tout en assurant le support et en veillant à ce que tout fonctionne pour notre communauté open source.

Nous ne pouvons pas tout faire en une journée, et la documentation prend souvent du retard.

Je comprends très bien vos frustrations, mais je pense qu’il est important de mentionner ce point également.

Merci pour ces informations détaillées, @jericson. Comme vous le dites, Discourse se trouve dans une situation très différente de celle d’OpenSSL, tant en termes d’utilisation que de position dans la pile. C’est un équilibre constant entre progrès, personnalisation et stabilité. Il n’existe pas de solution parfaite qui satisfasse tout le monde, mais nous prenons toujours en compte les retours de nos clients et de la communauté open source. J’apprécie vraiment la citation que vous avez partagée :

:chefs_kiss:

Comme l’a mentionné @moin, l’expérience que vous avez eue avec la dépréciation de .hbs était due à un bug présent sur latest pendant environ une semaine. Nous sommes vraiment désolés à ce sujet ! Bien que l’utilisation de .hbs soit dépréciée, elle est toujours prise en charge. Votre code .hbs devrait à nouveau fonctionner.

Merci d’avoir signalé cela. J’ai procédé à un nettoyage des mentions restantes de .hbs dans la documentation :

Je comprends tout à fait.[1] J’aime vraiment Discourse et j’ai écrit ce message parce que je souhaite que Discourse continue de connaître le succès.

Une chose que j’ai apprise, c’est que les communautés n’aiment pas le changement, mais elles sont beaucoup plus ouvertes au changement si elles sentent qu’elles ont un pouvoir d’action. Il existe d’innombrables façons de donner aux gens ce pouvoir. Par exemple, le tutoriel pourrait être transformé en articles wiki afin que des personnes comme moi puissent les mettre à jour. La mise en œuvre du plan ESR aide aussi, car elle donne aux gens la possibilité de ne pas effectuer de changements immédiatement.[2] Pouvoir rédiger mon expérience et la faire voir aux personnes qui gèrent le projet open source aide également. Surtout depuis que les problèmes que j’ai dénoncés ont été résolus du jour au lendemain. :wink:

Dans l’article « Écouter les utilisateurs est-il nuisible ? »,[3] Kathy Sierra a écrit :

La plupart d’entre nous réalisent que les groupes de discussion sont notoirement inefficaces pour de nombreuses choses, mais nous supposons toujours que l’écoute des retours réels des utilisateurs réels est la meilleure façon de développer de nouveaux produits et services, ainsi que d’améliorer ce que nous avons. Mais il y a un énorme problème avec cela : les gens ne savent pas nécessairement comment demander quelque chose qu’ils n’ont jamais imaginé ! La plupart des gens font des suggestions basées entièrement sur des améliorations incrémentielles, en regardant ce qui existe et en réfléchissant à comment cela pourrait être amélioré. Mais cela est très différent d’avoir une vision de quelque chose de profondément nouveau.

La véritable innovation proviendra rarement de ce que les utilisateurs disent directement.

Comme je l’ai dit, je ne suis pas développeur frontend. Je ne comprends pas vraiment pourquoi ces changements ont été apportés ou comment ils me bénéficieront.[4] Et cela n’a pas d’importance si, à terme, ils rendront Discourse meilleur.

Néanmoins, cela peut aider des personnes comme moi à adhérer si je peux voir la vision un peu plus clairement. Pour ce changement, l’argument est :

  1. une bien meilleure expérience de développement
  2. permettra d’importants gains de performance dans les futures versions de Discourse

Ça a l’air bien, je suppose ? Je n’ai pas particulièrement remarqué le point #1 et le #2 pourrait signifier beaucoup de choses. Ce serait plus efficace pour moi quelque chose comme (et je l’invente totalement) :

  1. Lorsque nous avons converti les plugins officiels de Discourse, nous avons constaté que cela a réduit le nombre de lignes de code de X %. En plaçant le modèle dans le même fichier que le JavaScript, le code est plus facile à comprendre et à modifier à l’avenir.
  2. Nous avons configuré une branche de test pour supprimer complètement Handlebars et avons découvert que ce changement rendait le chargement des pages X % plus rapide. De plus, nous avons identifié une optimisation potentielle qui pourrait éliminer [certains problèmes soulevés par les utilisateurs].

Un peu plus de détails, avec un œil sur l’éducation des non-experts, fait beaucoup pour maintenir la confiance. Je n’aime peut-être pas les changements, mais comment puis-je argumenter contre la résolution de problèmes réels auxquels d’autres utilisateurs ont été confrontés ?


  1. OpenSSL présente une dynamique similaire. Nous avons une société (~15 personnes) qui vend des contrats de support et une fondation (10 personnes, dont moi) qui veille aux intérêts non commerciaux. Notre documentation est également en retard. En rédigeant le message original, j’ai remarqué que nous avions encore des références à des fonctionnalités supprimées le mois dernier. Je travaille sur une PR pour cela. Et nous avons apporté des changements que des projets en aval ont vivement critiqués. ↩︎

  2. Moins utile pour les auteurs de plugins qui souhaitent prendre en charge des communautés souhaitant rester à la pointe de la technologie. Mais cela me conviendra très bien, car je crois être la seule personne à utiliser mon plugin. ↩︎

  3. Son blog a disparu d’Internet, mais il existe une archive PDF. ↩︎

  4. Ce n’est pas que je compte vraiment tant que cela dans l’ensemble des choses. Je parle de moi en tant que représentant d’autres personnes qui dépendent de Discourse. Après tout, je me connais mieux que la plupart des gens ! ↩︎

Pourquoi cela doit-il être un wiki pour cela ? La documentation pour les développeurs est gérée via GitHub. J’apprécie d’autant plus le processus où les modifications sont révisées, même davantage qu’un wiki.

Je suis d’accord pour dire que la documentation des plugins doit être mise à jour à ce stade. L’objectif de la période de « dépréciation », durant laquelle les plugins fonctionnent encore mais où le site affiche un avertissement indiquant qu’ils tomberont bientôt en panne, est de donner aux auteurs de plugins suffisamment de temps pour les corriger. Pourtant, durant cette période, une équipe de développeurs à temps plein et rémunérés n’a pas pu mettre à jour la documentation de développement du plugin principal. C’est une attente étrange à imposer à des développeurs individuels alors qu’une équipe ne peut pas pleinement la gérer dans le même laps de temps.

Pour moi, cela indique que le rythme de développement est trop rapide et/ou que les auteurs de plugins ne constituent pas une priorité significative pour Discourse. Personnellement, je pense qu’il s’agit davantage de ce dernier point. Je comprends que certaines choses doivent être mises de côté, il s’agit donc d’une observation de ma part plutôt que d’une critique. Discourse reste entièrement personnalisable via des plugins, et j’apprécie les améliorations continues.

Cela dit, je pense que nous en sommes arrivés à un moment où un guide de documentation étape par étape pour créer un plugin de base est une idée obsolète. Un seul document de contexte à lire pour un agent afin de construire un squelette de plugin est désormais tout ce dont un auteur de plugin amateur a besoin. En fait, pour une base de code open source comme Discourse, la documentation n’est même plus nécessaire, car les agents obtiennent leur contexte directement à partir de la base de code elle-même. Lorsque je travaillais sur mes plugins, j’ai vu Claude lire les plugins existants pour apprendre les modèles de conception. J’ai même pu identifier un bug dans le code principal : Chat Pitchfork timeouts: replies silently create threads and auto-tracking bloats over time

En résumé, pour toute personne qui lit ceci et aspire à devenir un auteur de plugin amateur, la documentation peut être obsolète, mais il est 1000 fois plus facile de créer un plugin aujourd’hui qu’auparavant.

Pour préciser ce point : la chronologie de dépréciation pour hbs n’a commencé que récemment. La date la plus précoce à laquelle nous envisagerons de retirer le support est après le prochain ESR (fin juillet). Donc, oui, nous aurions dû mettre à jour la documentation plus tôt, mais ce n’est pas un cas de « retrait du support sans avertissement suffisant ». .hbs est toujours pris en charge, et il y a largement le temps de procéder aux modifications nécessaires.

Nous maintenons plus de 600 thèmes et plugins, je peux donc vous assurer que nous « ressentons aussi la douleur » de ces migrations. Nous faisons de notre mieux pour rendre les changements aussi fluides que possible pour tous, et nous continuerons à apprendre de chaque modification apportée.

:100: Exactement

Nous n’avons pas tout à fait cela pour le moment. Mais nous commençons à constituer un répertoire de compétences dans le dépôt principal. De plus, toute la documentation pour les développeurs au format Markdown a été déplacée dans le dépôt principal, en partie pour qu’il soit plus facile pour les agents IA d’y faire référence.

Il se peut que j’aie confondu les choses dans ma tête, car j’ai corrigé mes plugins à la fois pour la mise à niveau d’Ember 6 (le gros obstacle de mise à jour pour moi) et effectué la migration depuis hbs en même temps. Désolé si j’ai été trop catégorique !

Mais je pense que si Discourse souhaitait développer l’écosystème de plugins créés par les utilisateurs, un tutoriel moderne de « vibecoding » serait utile. Mais après tout, est-il souhaitable d’ouvrir les vannes à une vague de plugins générés par vibecoding ? Difficile à dire :smile:

Ah ! Cela aide. PR soumise.

Je suis un partisan de placer la documentation sur GitHub. C’est beaucoup plus de travail de soumettre des modifications que de modifier un article de wiki, mais l’étape de révision est utile. (Et pour la documentation des auteurs de plugins, exiger une connaissance de Git n’est pas un obstacle si élevé.)