Studio di caso di un autore amatoriale di plugin

Nel 2024 stavo cercando lavoro. Ho deciso di offrire i miei servizi come consulente per le community. Per lo più, però, le persone erano interessate a supporto tecnico per risolvere o aggiornare i loro siti Discourse. Un potenziale cliente mi ha chiesto se potevo aggiungere un modulo di contatto per gli utenti senza account, in modo che potessero inviare feedback. Ho fatto delle ricerche e ho concluso che non era possibile. Ma avevo molto tempo libero e ho seguito il tutorial per sviluppatori di plugin per vedere cosa potevo fare. Alla fine ho sviluppato un plugin per il modulo di contatto e ho firmato il contratto con il cliente.[1]

Per chiarezza generale: non sono un programmatore frontend! Sono passati 13 anni da quando ero un programmatore professionista di qualsiasi tipo. So come creare un modulo HTML e questo è praticamente tutto ciò che so. Quindi ho faticato attraverso la sezione su Ember e Handlebars del tutorial e ho assemblato una soluzione di fortuna che funzionava abbastanza bene. Fortunatamente ero a mio agio con i sistemi di templating, avendoli già utilizzati in un lavoro precedente.

Ho trovato un lavoro presso la OpenSSL Foundation[2] e ho quasi abbandonato i miei clienti. Ma il cliente per cui avevo creato il plugin mi ha mantenuto in regime di consulenza perché apprezzava davvero il mio lavoro. (Ho svolto per lui diversi progetti non correlati.) Per guadagnare la mia consulenza, ho deciso di aggiornare il suo server Discourse. Ecco cosa ho visto:

Questo errore era presente solo sul sito del mio cliente perché ero stato stupido e avevo installato, ma non attivato, il plugin di contatto sul mio sito di staging. Quindi sono rapidamente entrato in modalità sicura e ho disattivato il plugin. Lo scorso weekend ho dedicato del tempo a capire cosa fosse andato storto e come potessi risolvere il problema per il mio cliente.

Dopo alcune ricerche, ho trovato Deprecazione dell’estensione .hbs nei temi e nei plugin:

Nell’ultima versione di Discourse, l’uso di file .hbs nei temi e nei plugin è deprecato. Il supporto per questo formato di file verrà rimosso dopo il prossimo rilascio ESR.

Questo era a marzo, il che significa che avrei dovuto avere fino alla fine di settembre per risolverlo se fossi stato sul rilascio ESR. Ma la mia configurazione di Discourse usa “tests-passed”[3] e quindi ho ricevuto l’errore qualche mese prima, immagino.

Dato che dovevo comunque risolvere il problema (o deludere il mio cliente), mi sono tuffato nelle istruzioni: Aggiornamento automatico di temi e plugin al formato file .gjs. Il primo passo è stato installare un ambiente di sviluppo, dato che avevo cambiato laptop da l’ultima volta che ho provato.[4] Quando ho finalmente fatto funzionare Discourse e verificato che il mio plugin fosse rotto localmente, ho eseguito il processo di 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)

Sebbene sia fastidioso dover modificare il mio plugin, almeno il processo di lint mi ha aiutato a ripulire e modernizzare il mio codice. Tuttavia, lo script automatizzato si è bloccato tentando di convertire in .gjs. Quindi ho deciso di provare https://ask.discourse.com/

Ho 12 domande lì. Non le condiviserei con un umano perché sono solo i rantoli di un programmatore sempre più frustrato. A un certo punto il bot ha suggerito un “approccio moderno più robusto” per uno dei miei sottoproblemi che includeva… un file .js e un file .hbs.

Fotogramma da 8½ in cui il regista ha scartato la recensione negativa del critico su 8½.

So perché succede questo. È addestrato sulle discussioni di Meta Discourse e ci sono ancora molti post con codice Handlebars, incluso la parte due del tutorial ufficiale per sviluppatori di plugin. Quelle cose verranno aggiornate nel tempo, ma mi preoccupa che ci vorrà un po’ più di tempo perché il consiglio ufficiale per ottenere aiuto con l’aggiornamento è di chiedere al chatbot invece di chiedere su Meta Discourse.

Immagino non dovrei lamentarmi; mi ha comunque aiutato a ordinare il mio codice e probabilmente con meno attrito rispetto a chiedere agli umani.

Stabilità della piattaforma

Quindi ora lavoro per la OpenSSL Foundation. Probabilmente conosci OpenSSL a causa di Heartbleed. È usato ovunque. La versione più popolare da scaricare è la 1.1.1 che ha raggiunto la fine del supporto nel 2023. La successiva più popolare è la 3.0, rilasciata nel 2021, ma è ancora supportata come rilascio a lungo termine (LTS). La successiva è la 3.5, che è il nostro ultimo LTS. Questi tre rilasci rappresentano quasi 2/3 dei download da GitHub.

È un po’ deludente perché la 3.5 ha alcune nuove funzionalità interessanti. Ma alla fine le funzionalità a cui le persone tengono di più sono una combinazione di SSL/TLS e primitive crittografiche. A meno che tu non sia entusiasta degli algoritmi crittografici post-quantistici, rimanderai il più possibile il dolore dell’aggiornamento.

OpenSSL è molto più in basso nello stack rispetto a Discourse, ovviamente. Ma il principio è lo stesso. A meno che non ci sia una nuova funzionalità, le persone non sono interessate ad aggiornamenti che rompono la compatibilità. So che voi tutti siete entusiasti delle nuove funzionalità aggiunte a Discourse. Capisco il desiderio di cambiare un’API per ottenere alcune ottimizzazioni in seguito. Mi preoccupa solo che muoversi troppo velocemente possa danneggiare Discourse come piattaforma su cui vengono costruite le community.

A proposito, c’è una presentazione davvero utile chiamata Gardening Platforms scritta da Alex Komoroske. La diapositiva 90 inizia una sezione chiamata “Piattaforma + Ecosistema” che spiega come le piattaforme devono co-evolvere con i loro ecosistemi. In questo caso, Discourse è la piattaforma che supporta un ecosistema di progettisti di plugin e temi, servizi di hosting, la community Meta Discourse e persino le community costruite su Discourse. Un’importante intuizione nelle note del relatore dalla diapositiva 98:

Ma non sono indipendenti; sono legati simbioticamente.

Le azioni che accadono in uno influenzano l’altro e viceversa. Pensaci come a cicli di feedback che li collegano in entrambe le direzioni.

Non sono rigidamente legati insieme, è più come un elastico che li unisce. È una forza gravitazionale.

Se una piattaforma e un ecosistema si muovono troppo velocemente l’uno rispetto all’altro, il legame si spezza con effetti disastrosi. Mi fido che Discourse farà la cosa giusta nei confronti dell’ecosistema. È solo che per me, weekend come quello scorso, sembrano minare questa fiducia.


  1. Sono moderatamente orgoglioso del mio lavoro, anche se alla fine si è trattato di un sito piuttosto statico. ↩︎

  2. Presagio! ↩︎

  3. Anche questo deve essere aggiornato ↩︎

  4. Redis e Rails sono stati più difficili da installare di quanto ricordassi. ↩︎

  5. Non prima di aver passato molto tempo a cercare di scaricare eslint.config.mjs, però ↩︎

Penso che tu abbia ricevuto l’errore a causa di questo bug, non perché il tuo plugin avesse bisogno di un aggiornamento proprio ora

Ho passato la stessa situazione con molti plugin che avevo scritto. Non avevo la banda per modernizzarli secondo gli standard di Discourse. Ho un lavoro nel campo della data science, quindi, pur conoscendo i concetti di ingegneria del software, non tengo il passo con i dettagli specifici dello sviluppo web. Alla fine, non ho aggiornato il mio sito per otto mesi perché dipendeva da questi plugin deprecati.

Non voglio sminuire la tua difficoltà, ma fondamentalmente penso che con l’avvento della codifica agenziale, questo ritmo di sviluppo sia diventato un problema trascurabile. Ciò che mi avrebbe richiesto una o due settimane per essere codificato e corretto è stato realizzato con un abbonamento da 20 dollari a Claude Code e pochi minuti per ogni plugin. Inoltre, sono riuscito anche a ottimizzarli per le prestazioni. Dopo aver utilizzato la codifica agenziale per alcuni progetti lavorativi e hobbistici, non credo che scriverò mai più codice da zero nella mia vita. È come la differenza tecnologica tra scrivere e consegnare una lettera a mano rispetto all’invio di un’email. È un po’ triste, eppure allo stesso tempo sembra di essere stati dotati di poteri di livello divino.

Sembra probabile. Passare all’ultima versione ESR (e prestare un po’ più di attenzione ai test) sembra un buon piano da ora in poi.

Non credo che il ritmo di sviluppo sia un problema di per sé. È il ritmo di tutto. Perché, ad esempio, il tutorial sui plugin non è stato aggiornato? È una mina pronta a esplodere in faccia a qualche poveretto che vuole creare un plugin. Funzionerà per il momento, ma alla fine si troveranno ad affrontare lo stesso problema che ho avuto io. La soluzione non è usare l’IA per correggere il plugin in seguito, ma correggere subito le istruzioni su come creare un plugin. Voglio dire, non c’è motivo di insegnare ancora il vecchio modo di fare le cose, vero?

Perché siamo un team piuttosto piccolo che mantiene una base di codice enorme e deve implementare nuove funzionalità per i clienti paganti, fornendo nel contempo supporto e mantenendo tutto funzionante per la nostra comunità open source.

Possiamo fare solo una certa quantità di cose in un giorno, e la documentazione spesso rimane indietro.

Capisco molto bene le tue frustrazioni, ma ritengo che anche questo punto meriti di essere menzionato.

Grazie per le informazioni dettagliate @jericson. Come hai detto, Discourse si trova in una posizione molto diversa rispetto a OpenSSL, sia per quanto riguarda l’utilizzo che la posizione nello stack. È un continuo equilibrio tra progresso, personalizzazione e stabilità. Non esiste una soluzione perfetta che renda tutti felici, ma teniamo sempre in considerazione i feedback dei nostri clienti e della comunità open-source. Mi piace molto la citazione che hai condiviso:

:chefs_kiss:

Come ha menzionato @moin, l’esperienza che hai avuto con la deprecazione di .hbs era un bug su latest per circa una settimana. Ci dispiace molto per questo! Sebbene l’uso di .hbs sia deprecato, è ancora supportato. Il tuo codice .hbs dovrebbe essere di nuovo funzionante.

Grazie per averlo segnalato. Ho provveduto a pulire le rimanenti menzioni di .hbs nella documentazione:

Capisco perfettamente.[1] Mi piace davvero Discourse e ho scritto questo post perché voglio che Discourse continui ad avere successo.

Ho imparato che le comunità non amano i cambiamenti, ma sono molto più aperte ai cambiamenti se sentono di avere un ruolo attivo. Ci sono innumerevoli modi per dare alle persone un ruolo attivo. Ad esempio, il tutorial potrebbe essere trasformato in post wiki in modo che persone come me possano aggiornarli. Anche l’implementazione del piano ESR aiuta, perché offre la possibilità di non apportare cambiamenti immediatamente.^[Meno utile per gli autori di plugin che vogliono supportare comunità che desiderano rimanere all’avanguardia. Ma sarà fantastico per me, dato che credo di essere l’unica persona che utilizza il mio plugin.) Anche poter scrivere la mia esperienza e farla vedere alle persone che gestiscono il progetto open source aiuta. Soprattutto perché le cose di cui mi sono lamentato sono state risolte in una notte. :wink:

In “Ascoltare gli utenti è considerato dannoso?”,[2] Kathy Sierra scrisse:

La maggior parte di noi si rende conto che i focus group sono notoriamente inefficaci per molte cose, ma continuiamo a presupporre che ascoltare feedback reali da utenti reali sia il modo migliore per guidare nuovi prodotti e servizi, nonché per migliorare ciò che abbiamo. Ma c’è un enorme problema con questo: le persone non necessariamente sanno come chiedere qualcosa che non hanno mai concepito! La maggior parte delle persone fa suggerimenti basati interamente su miglioramenti incrementali, guardando ciò che esiste e pensando a come potrebbe essere migliore. Ma questo è molto diverso dall’avere una visione per qualcosa di profondamente nuovo.

La vera innovazione raramente deriva da ciò che gli utenti dicono direttamente.

Come ho detto, non sono uno sviluppatore frontend. Non capisco davvero perché siano stati apportati questi cambiamenti o come mi porteranno benefici.[3] E va bene se, alla fine, renderanno Discourse migliore.

Tuttavia, può aiutare persone come me a stare dalla parte giusta se riesco a vedere la visione un po’ più chiaramente. Per questo cambiamento, la proposta è:

  1. un’esperienza di sviluppo molto migliore
  2. abiliterà grandi miglioramenti delle prestazioni nelle versioni future di Discourse

Sembra buono, immagino? Non ho notato in particolare il punto #1 e il #2 potrebbe significare molte cose. Per me sarebbe stato più efficace qualcosa del genere (e sto proprio inventando):

  1. Quando abbiamo convertito i plugin ufficiali di Discourse, abbiamo scoperto che abbiamo risparmiato X% di righe di codice. Mettendo il template nello stesso file del JavaScript, il codice è più facile da comprendere e modificare in futuro.
  2. Abbiamo creato un ramo di test rimuovendo completamente Handlebars e abbiamo scoperto che questa modifica ha reso il caricamento delle pagine X% più veloce. Non solo, abbiamo visto un’ottimizzazione potenziale che potrebbe eliminare [alcuni problemi sollevati dagli utenti].

Un po’ più di dettagli con l’obiettivo di educare i non esperti fa molto per mantenere la fiducia. Potrei non piacere i cambiamenti, ma come posso contestare la risoluzione di problemi reali affrontati da altri utenti?


  1. OpenSSL ha una dinamica simile. Abbiamo una Corporation (circa 15 persone) che vende contratti di supporto e una Fondazione (10 persone, me compreso) che si occupa degli interessi non commerciali. Anche la nostra documentazione è in ritardo. Mentre scrivevo il post originale, ho notato che abbiamo ancora riferimenti a funzionalità rimosse lo scorso mese. Sto lavorando a una PR per risolvere questo problema. Inoltre, abbiamo apportato alcune modifiche che i progetti a valle hanno criticato aspramente. ↩︎

  2. Il suo blog è scomparso da internet, ma esiste un archivio PDF. ↩︎

  3. Non che io conti molto nel grande schema delle cose. Sto parlando di me come rappresentante di altre persone che dipendono da Discourse. Del resto, conosco meglio me stesso di chiunque altro! ↩︎

Perché deve essere un wiki per questo? La documentazione per gli sviluppatori è gestita tramite GitHub. Mi piace ancora di più il processo in cui le modifiche vengono revisionate rispetto a un wiki.

Sono d’accordo sul fatto che la documentazione dei plugin debba essere aggiornata in questo momento. L’obiettivo del periodo di “deprecazione”, durante il quale i plugin continuano a funzionare ma il sito mostra un avviso sul fatto che smetteranno di farlo a breve, è quello di dare agli autori dei plugin abbastanza tempo per correggerli. Eppure, in quel lasso di tempo, un team di sviluppatori retribuiti a tempo pieno non è riuscito ad aggiornare la documentazione principale per lo sviluppo dei plugin. È un’aspettativa strana da avere dagli sviluppatori individuali quando un team non riesce a gestirla completamente nello stesso periodo.

Per me, questo indica che la velocità di sviluppo è troppo elevata e/o che gli autori dei plugin non sono una priorità significativa per Discourse. Personalmente, credo che sia più quest’ultimo caso. Capisco che qualcosa debba passare in secondo piano, quindi questa è un’osservazione da parte mia e non una critica. Discourse rimane completamente personalizzabile tramite plugin e apprezzo i continui miglioramenti.

Detto questo, penso che siamo arrivati al punto in cui una guida documentale passo dopo passo per creare un plugin boilerplate sia un’idea obsoleta. Oggi, per un autore di plugin alle prime armi, è sufficiente un unico documento contestuale da far leggere a un agente per generare la struttura di base di un plugin. Anzi, per una codebase open source come Discourse, la documentazione non è affatto necessaria, poiché gli agenti ottengono il contesto direttamente dalla codebase stessa. Quando stavo lavorando ai miei plugin, ho visto Claude leggere i plugin esistenti per apprendere i modelli di progettazione. Sono stato persino in grado di individuare un bug nel codice principale: Chat Pitchfork timeouts: replies silently create threads and auto-tracking bloats over time

In sintesi, per chiunque legga questo e aspiri a diventare un autore di plugin alle prime armi, la documentazione potrebbe essere obsoleta, ma creare un plugin è ora 1000 volte più facile rispetto al passato.

Solo per chiarire questo punto: la linea temporale di deprecazione per hbs è iniziata solo recentemente. La data più antica in cui prenderemo in considerazione l’eliminazione del supporto è dopo la prossima ESR (fine luglio). Quindi sì, avremmo dovuto aggiornare la documentazione prima, ma non si tratta di “eliminare il supporto senza un preavviso sufficiente”. .hbs è ancora supportato e c’è abbondanza di tempo per apportare le modifiche necessarie.

Manteniamo oltre 600 temi e plugin, quindi posso assicurarti che “sentiamo il peso” di queste migrazioni anche noi. Facciamo del nostro meglio per rendere le modifiche il più fluide possibile per tutti e continueremo a imparare da ogni cambiamento che apportiamo.

:100: Esatto

Non abbiamo ancora esattamente questo. Ma stiamo iniziando a costruire una directory di abilità nel repository principale. Inoltre, tutta la documentazione per gli sviluppatori in formato markdown è stata spostata nel repository principale, anche per renderla più facile da consultare per gli agenti AI.

Potrei aver confuso le cose nella mia testa, dato che ho corretto i miei plugin sia per l’aggiornamento a Ember 6 (il grande blocco di aggiornamento per me) sia ho effettuato la migrazione da hbs contemporaneamente. Scusa se ho esagerato!

Ma penso che, se Discourse volesse far crescere l’ecosistema dei plugin creati dagli utenti, sarebbe utile un tutorial moderno sulla “vibecoding”. Ma poi, è auspicabile aprire le porte a un’ondata di plugin generati tramite vibecoding? Difficile dirlo :smile:

Ah! Questo aiuta. PR inviata.

Sono un sostenitore del posizionamento della documentazione su GitHub. Presentare le modifiche richiede un po’ più di lavoro rispetto alla modifica di un post su wiki, ma la fase di revisione è utile. (E per la documentazione degli autori di plugin, la richiesta di conoscenze su Git non è una barriera così alta.)