Salta al contenuto

Blog ·

Un nome che non si può tradurre

Nove lingue dicevano nove cose diverse su una sola clausola di chiave esterna. Otto di loro erano traduzioni corrette, e il problema stava tutto lì.

Di Provibr

Pubblichiamo ogni articolo in nove lingue. Un lettore che ne stava percorrendo una ha notato una cosa che scritta sembra banale e che ha richiesto due tornate per essere riparata come si deve: una frase su una chiave esterna diceva una cosa diversa in ogni lingua, e tutte e nove avevano ragione.

La frase spiega perché una riga figlia che viene ripulita non debba portarsi via anche l’attesa del genitore. Nello schema è una sola clausola, e la clausola ha un nome.

Otto traduzioni corrette e nessun nome

Ecco che aspetto aveva la stessa clausola in tutto il catalogo prima che la toccassimo.

LinguaChe cosa diceva la frase
Ingleseset null rather than cascade
Olandeseop leegmaken en niet op meeverwijderen
Tedescoauf null setzen statt auf kaskadieren
Spagnolopone a nulo en lugar de propagar el borrado
Francesemise à nul, pas cascade
Italianoimpostata a nullo invece che a cascata
Portogheseanula em vez de propagar a eliminação
Rumenopusă pe null și nu în cascadă
Ucrainoставить null, а не каскадує

Ognuna di quelle è una buona frase. L’olandese è forse la scrittura migliore dell’elenco; spiega il comportamento a qualcuno che non ha mai visto uno schema. È anche la più lontana dall’essere utilizzabile, perché un lettore che voglia verificare che cosa abbiamo fatto davvero non ha niente da digitare.

Le due cose che si scrivono in uno schema Postgres sono SET NULL e CASCADE. Non sono descrizioni di un comportamento, sono gli identificatori di uno, e la descrizione di un identificatore non è un identificatore.

Il difetto stava nella fonte

Viene voglia di trattarlo come otto errori di traduzione. È un solo errore nella fonte, ed è leggerlo così che ha reso piccola la riparazione.

L’inglese diceva set null rather than cascade, in minuscolo, dentro la frase, senza nessun tipo di marcatura. Un traduttore a cui si consegna quello produce prosa, perché è prosa. Tutti e otto hanno fatto correttamente il loro lavoro sul materiale che è stato loro dato.

Quindi il cambiamento non è otto correzioni. È una sola decisione sulla forma, applicata nove volte, e cambia anche l’inglese.

Alla domanda sulla forma si è risposto misurando, non per gusto

Deve essere SET NULL in maiuscolo, oppure set null in minuscolo? In astratto sono difendibili entrambi, e l’astratto è esattamente il posto in cui quella discussione non finisce mai.

Abbiamo quindi guardato che cosa fa già il resto del corpus con l’SQL fra backtick. Le occorrenze sono nove: WHERE due volte, UPDATE due volte, DROP due volte, un DELETE nudo, un SELECT 1 in un controllo di monitoraggio e un FOR UPDATE SKIP LOCKED. Tutte in maiuscolo.

Ci sono anche token in minuscolo fra backtick che sembrano controesempi e non lo sono. Un unique che si rivela essere un contrassegno nell’API di qualcuno. Un where che è il nome di una costante in JavaScript. Un null che è un valore e non una clausola.

Da qui esce la regola vera, e non riguarda le maiuscole. La distinzione è fra una parola chiave e un nome. Una parola chiave del linguaggio va in maiuscolo perché è così che il linguaggio si scrive; un nome che per caso le assomiglia tiene le maiuscole e le minuscole che gli ha dato il suo proprietario. Decidere sulle sole maiuscole avrebbe dato qui la risposta giusta per la ragione sbagliata, e la risposta sbagliata da qualche altra parte.

Il corpus ricorda anche che un solo token può essere due nomi. La maggior parte delle occorrenze di DELETE nei nostri articoli non è affatto SQL, è il metodo HTTP in cose come DELETE /servers/{id}. Stesse lettere, linguaggio diverso, e nessuna regola sulle maiuscole li distingue.

Una decisione sulla forma ha un perimetro, e il perimetro ha un bordo

La prima tornata ha riparato l’articolo che il lettore stava leggendo. Un controllo successivo ha mostrato che un secondo articolo faceva la stessa affermazione su uno schema in una riga, senza il token, quindi una seconda tornata ha fatto anche quello.

Vale la pena dirlo chiaramente, perché una decisione sulla forma non è finita quando è finito il file che l’ha provocata. Prima di quella seconda tornata un controllo dei token riferiva che entrambi i nomi erano semplicemente assenti dall’inglese; dopo ha fatto ventiquattro conteggi in tutte le lingue senza scostamenti.

Il bordo è la parte che ha richiesto il pensiero. La regola è questa frase nomina una clausola, non compare la parola cascata. Nello stesso articolo, più giù nello stesso capoverso, c’è una frase su una cascata da una tabella di breve vita a una di lunga vita. Quella è la descrizione di una conseguenza, non un riferimento a una clausola, e resta prosa in quello che la lingua direbbe naturalmente.

Quel confine lo abbiamo misurato su tutto il catalogo inglese invece di fidarcene: tre formulazioni che potevano plausibilmente nominare una clausola, cercate fuori dai backtick in ogni articolo inglese. Nove riscontri all’epoca, cinque dei quali nell’articolo di cui trattava la seconda tornata. I quattro rimanenti erano un riferimento messo a un valore nullo, un’intestazione di sezione sulla pulizia alla cancellazione come strategia, un’osservazione sul fatto che una certa riga non partecipa a nessuna cascata, e un 404 su una richiesta di cancellazione. Nessuno di loro nomina una clausola. Dopo le due tornate ne restano sette, e l’articolo che la prima tornata ha riparato non compare più affatto nell’elenco, che è la conferma più economica che esista del fatto che il cambiamento è andato dove doveva.

Che cosa resta alla lingua

I nomi sono identici in tutti e nove i file. La frase che li circonda no, e non deve esserlo.

Il tedesco dice ancora che la chiave esterna steht auf, l’olandese staat op, il portoghese está em. Il verbo, la preposizione e l’ordine delle parole appartengono alla lingua. Solo i due nomi sono fissi, e sono fissi perché sono citazioni da Postgres e non affermazioni nostre.

Le parti meccaniche hanno tenuto. Il disegnatore produce un vero elemento di codice anche quando il token sta dentro il grassetto, come succede nell’elenco numerato in fondo a ogni articolo. Lo spazio unificatore francese prima dei due punti è sopravvissuto a una riparazione che ha riscritto la clausola immediatamente davanti, che è il genere di cosa che sparisce in silenzio quando qualcuno ribatte una riga.

E i diff sono la prova che la regola era abbastanza stretta. Tre righe messe e tre righe tolte per file nella prima tornata, una messa e una tolta nella seconda. Una riparazione di questo genere che tocca dieci righe ha ridecorato qualcosa.

Che cosa annoteremmo

  1. Otto traduzioni corrette possono comunque essere un difetto. La correttezza della frase non è la stessa cosa della presenza del nome.
  2. Il difetto di solito sta nella fonte. Prosa dentro, prosa fuori, e i traduttori non sono il problema.
  3. Un nome è una questione di forma, non una questione di lingua. Viene marcato una volta e copiato dappertutto.
  4. Misuri la forma di casa sul corpus invece di discuterne in astratto.
  5. La distinzione è fra parola chiave e nome, non fra maiuscolo e minuscolo.
  6. Un solo token può essere due nomi. La maggior parte dei nostri DELETE è HTTP, non SQL.
  7. Tracci il confine sul fatto che una frase nomini una clausola, non sul fatto che la parola compaia.
  8. Controlli l’articolo gemello. Una decisione sulla forma ha un perimetro, e raramente è un file solo.
  9. Lasci il verbo alla lingua. Riparare il nome non significa riparare la frase.
  10. Un diff piccolo è la prova. Tre righe messe e tre tolte significano che la regola era stretta.

Per chiarezza su che cosa sia: due tornate, la prima che mette i due nomi in nove file con tre righe messe e tre tolte ciascuno, la seconda che fa una riga messa e una tolta su un secondo articolo; la generazione dei contenuti ha prodotto 886 articoli senza avvisi e il controllo dei contenuti ha trovato 887 file generati su 887 identici byte per byte, la suite web a 4604 verdi, il confronto dei token a 40 conteggi e poi a 24 conteggi senza scostamenti, il confronto dei fatti a 296 e 256 senza nessuno, la scansione dei byte pulita e tre protezioni dimostrate rosse prima di essere credute verdi. La lettura del corpus è stata di tre formulazioni su 124 articoli inglesi. Non dimostrato: ogni traduzione ha ancora un solo lettore, nessuno di loro è madrelingua, e non c’è nessun controllo nel browser su come il token venga disegnato in tutte e nove le lingue.

Dal lavoro di piattaforma su Provibr. L’articolo di cui parlava tutto questo è il figlio risveglia il genitore, che cosa fanno nove cataloghi a un insieme di controlli fissi si trova in sedicimila chiavi, nove lingue, e un altro caso in cui la traduzione era corretta e la forma sbagliata si trova in la selezione avvolge l’intera frase.

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.