Salta al contenuto

Blog ·

Tre difetti che nessuno script poteva vedere

Otto articoli in otto lingue passavano ogni controllo automatico. Un lettore ha trovato un numero inventato, mezza frase e un titolo smentito dai collegamenti.

Di Provibr

Pubblichiamo in nove lingue. L’inglese è la fonte e le altre otto sono traduzioni, e attorno a loro c’è un muro di automazione: un confronto della struttura che controlla che intestazioni, tabelle ed elenchi corrispondano, un confronto dei fatti che estrae da ogni paragrafo i frammenti di codice e i numeri e pretende che coincidano, una prova di tipografia per lingua, un controllo dei collegamenti, un controllo delle tabelle, una scansione dell’impaginazione a 390 pixel.

Otto articoli avevano superato tutto questo. Poi un secondo lettore ha ripercorso quegli otto in otto lingue e ha trovato in ognuno cose da migliorare: 44 in olandese, 40 in tedesco, 47 in spagnolo, 35 in francese, 39 in italiano, 22 in portoghese, 55 in rumeno, 23 in ucraino e 18 trasversali alle lingue. Il diff era esattamente di 307 righe tolte e 307 righe messe su 62 file.

La maggior parte riguarda la qualità ordinaria della traduzione: un registro scivolato, una proposizione che si legge come l’uscita di una macchina, un termine che non è quello che il settore usa in quella lingua. Tre di questi sono una cosa di genere diverso, e quelle tre sono la ragione per cui vale la pena annotare tutto questo.

Un numero che nessuno ha misurato

Un articolo descriveva una sonda di taratura: uno script che pianta difetti deliberati su una pagina e poi pretende che il rilevatore li trovi, così che una corsa che riporta zero rilevamenti si possa distinguere da una corsa che non stava guardando.

Quattro delle otto traduzioni dicevano che la sonda pretende tre rilevamenti.

Nessuno aveva verificato, perché un numero in una frase sugli strumenti di qualcun altro sembra un fatto ereditato. Lo script pianta tre elementi e pretende quattro tipi di rilevamento. Il testo di partenza, in inglese, diceva due. Una nota scritta durante la revisione diceva tre. Contando le traduzioni, sono tre affermazioni sul numero e due valori distinti, e nessuno di quei valori è quello che lo script pretende; ciascuno era stato riportato fedelmente in diverse lingue.

La riparazione non è stata correggere il numero. È stata toglierlo. La frase ora nomina i tre difetti piantati per quello che sono, e nessuna traduzione dichiara più alcun conteggio, perché un conteggio in quella posizione non aggiunge nulla di cui il lettore abbia bisogno ed è ostaggio di uno script che qualcuno modificherà.

La forma generale: un numero che viene da un riepilogo e non dalla cosa che descrive andrà alla deriva, e ci va in silenzio, perché resta un numero plausibile.

Una frase che ha perso la propria seconda metà

Una frase inglese poneva un contrasto: questo è un rifiuto, non un ripiego. In due lingue è sopravvissuta solo la prima metà. Ciò che restava era grammaticale, scorrevole, e diceva qualcosa di più debole e leggermente diverso da quello che diceva la fonte.

La parte interessante è come sia stata trovata. Sei degli otto lettori, lavorando in modo indipendente sulla propria lingua, hanno segnalato la stessa frase. In sei lingue era già corretta. Due avevano perso il contrasto ed erano la ragione per cui continuava a saltare fuori.

Un confronto della struttura non può vederlo, perché un paragrafo con una proposizione in meno resta un paragrafo. Un confronto dei fatti non può vederlo, perché al suo interno non c’è alcun numero e alcun frammento di codice. L’unica cosa che intercetta un contrasto caduto è qualcuno che legge la frase e si chiede con che cosa sia messa a contrasto.

Un titolo che contraddiceva ogni collegamento che vi puntava

I nostri articoli si collegano l’uno all’altro. La fonte inglese del quarto articolo aveva un titolo che descriveva una cosa che sta accanto a un’altra, e ogni collegamento in entrata usava la stessa formulazione.

In quattro lingue il titolo era stato tradotto come sotto e ogni collegamento in entrata come accanto a. Un lettore cliccava dunque un collegamento che prometteva una cosa e atterrava su una pagina la cui intestazione ne affermava un’altra.

Il controllo dei collegamenti lo lascia passare senza lamentarsi, e vale la pena essere precisi sul perché: verifica che la destinazione di un collegamento esista e risponda. Un collegamento con il testo sbagliato punta a una pagina che esiste. Non c’è nulla di cui un controllo HTTP possa accorgersi.

La soluzione è una regola più che una riparazione: il titolo di un articolo e ogni collegamento che vi punta sono una sola stringa in una traduzione, e vengono rivisti come una sola stringa. È facile da enunciare e facile da dimenticare, perché i due vivono in file diversi.

Due nuove protezioni, e perché una deve contare all’indietro

Due di questi tre sono ora automatizzati, e l’automazione è stata dimostrata rossa prima di darle fiducia, su una copia dell’albero con dei difetti piantati dentro.

La prima protezione copre i nomi intraducibili fuori dai frammenti di codice. Il confronto dei fatti copre già tutto ciò che sta fra backtick. Quello che non può vedere è il nome di un prodotto, il nome di un protocollo o una voce di menu che stiano nel testo corrente senza di essi: sono esattamente i termini che i traduttori traducono, correttamente per istinto e scorrettamente di fatto. In un turno precedente tre lingue avevano tradotto il nome di un menu; in un altro, tutte e otto avevano tolto una proprietà CSS da un frammento di codice e l’avevano trasformata in prosa.

La seconda protezione copre i numeri scritti in lettere. Il confronto dei fatti normalizza le cifre fra le lingue, quindi un separatore delle migliaia scritto come punto, come spazio o come virgola risulta uguale. È per costruzione cieco a un numero scritto in lettere, e in questo stile di casa quasi ogni numero della fonte inglese è scritto in lettere.

Quella protezione ha una sottigliezza che è costata a una prima versione la propria credibilità. Conta le occorrenze di ogni valore per articolo, nella fonte come parola o come cifra e in ogni traduzione come numerale di quella lingua o come cifra. L’implementazione ingenua conta ogni valore in modo indipendente, e allora «quarantuno» viene contato anche come un’occorrenza di «quaranta». Alla prima corsa questo ha prodotto 37 falsi riscontri, che è più che abbastanza perché qualcuno concluda che la protezione è rumore e smetta di leggerla.

La soluzione è contare dal valore più grande verso il basso e cancellare dal testo ogni riscontro man mano che lo si trova, così che quando si cerca «quaranta» ogni «quarantuno» sia già sparito. È un piccolo dettaglio di implementazione con una grande conseguenza: una protezione che grida al lupo è peggio di nessuna protezione, perché abitua le persone a saltare una riga nell’uscita.

Che cosa ha sbagliato il lettore

Un rilevamento della revisione era esso stesso errato, ed è istruttivo.

Il lettore olandese ha riferito che l’enfasi su una parola precisa era andata perduta in tutte e otto le lingue. Sei delle otto ce l’avevano. Il lettore olandese poteva vedere davvero un solo file e aveva dedotto il resto.

Ora è una regola: un lettore che lavora su una lingua riferisce su quella lingua. Un’affermazione su otto file è una misura, e ha bisogno di uno script o di otto file aperti, non di un’impressione.

C’era un rilevamento collegato che si è rivelato una vera spaccatura e non un errore. Quattro degli otto articoli olandesi usavano il registro formale e quattro quello informale. Su tutto il catalogo olandese, 47 file su 90 sono formali. Non è un difetto da correggere in otto file; è una decisione da prendere una volta sola e da applicare ovunque, e il turno l’ha annotata invece di scegliere in silenzio una parte.

Sei cose sbagliate nella fonte

La revisione ha prodotto anche sei rilevamenti che non erano affatto problemi di traduzione. L’inglese era sbagliato, e otto lingue avevano tradotto fedelmente la cosa sbagliata.

Quelli di proposito non sono stati corretti in otto lingue. Sono stati segnalati contro la fonte e trattati in un turno separato che ha cambiato prima l’inglese e poi ha portato ogni frase corretta attraverso le otto traduzioni, così che le otto restassero traduzioni di qualcosa invece che otto riparazioni indipendenti della stessa frase.

Anche quel turno ha trovato qualcosa: la nota che descriveva uno dei sei sbagliava a sua volta i numeri, ed è da lì che viene il conteggio della prima sezione di questo articolo. Una correzione che non viene verificata contro la fonte è solo un’altra affermazione.

Che cosa annoteremmo

  1. L’automazione controlla la forma e i fatti; non controlla il significato. Ognuno di questi otto articoli era verde.
  2. Un numero ereditato da un riepilogo prima o poi sarà sbagliato. Lo verifichi contro la cosa, oppure lo tolga.
  3. La riparazione migliore per un numero fragile è spesso nessun numero. Nomini le cose invece di contarle.
  4. Un contrasto caduto lascia una frase grammaticale. Solo un lettore lo trova.
  5. Sei lettori che segnalano la stessa frase sono un segnale sulla fonte, non su sei traduzioni.
  6. Un collegamento con il testo sbagliato punta a una pagina che esiste. Nessun controllo HTTP se ne accorgerà mai.
  7. Un titolo e ogni collegamento che vi punta sono una sola stringa. Li riveda insieme anche se vivono separati.
  8. Dimostri rossa una nuova protezione prima di crederla verde. Pianti il difetto su una copia dell’albero.
  9. Una protezione con falsi positivi viene ignorata, il che è peggio del non averla. Conti dal grande al piccolo e consumi ciò che trova.
  10. Un lettore riferisce sulla propria lingua. Un’affermazione su otto file è una misura.

Per chiarezza su che cosa sia: il confronto dei fatti è passato su 2432 paragrafi senza rilevamenti, il confronto della struttura su otto articoli in otto lingue senza nessuno, la protezione dei termini 248 controlli e la protezione dei numerali 240 controlli senza nessuno, il controllo dei contenuti 815 file generati su 815 identici byte per byte, la suite web 4572 verdi, il controllo dei metadati 288 su 288, i collegamenti 153 su 153, le tabelle 198 su 198 e la scansione dell’impaginazione 168 su 168 a 390 pixel contro una build di produzione. La prova di tipografia è stata dimostrata rossa con 28 superate e 3 fallite con dei difetti piantati, e verde a 31 in seguito. Non dimostrato: c’è ancora un lettore per lingua e nessuno di loro è madrelingua, e in questo turno non c’è stata alcuna misura di accessibilità né di spostamento dell’impaginazione. Due questioni terminologiche sono state rimesse a un livello superiore invece che decise.

Dal lavoro di piattaforma su Provibr. Che cosa fanno nove cataloghi a un insieme di controlli fissi si trova in sedicimila chiavi, nove lingue, e uno script di trasformazione che ha danneggiato tre articoli a cui non era mai stato puntato si trova in uno script di conversione dal raggio troppo ampio.

Inizi con un host e un agente

Crei un account, installi l’agente con un solo comando e colleghi il suo primo host Proxmox. Il periodo di prova dura 14 giorni e non chiede alcun dato di pagamento.