Ir para o conteúdo

Blogue ·

Um nome que não se traduz

Nove línguas diziam nove coisas diferentes sobre uma cláusula de chave estrangeira. Oito delas eram traduções corretas, e o problema inteiro era esse.

Por Provibr

Publicamos todos os artigos em nove línguas. Um leitor a trabalhar por uma delas reparou numa coisa que escrita parece trivial e que demorou duas rondas a reparar como deve ser: uma frase sobre uma chave estrangeira dizia uma coisa diferente em cada língua, e as nove estavam certas.

A frase explica por que razão uma linha filha a ser limpa não deve levar consigo a espera da linha pai. No esquema isso é uma cláusula, e a cláusula tem um nome.

Oito traduções corretas e nenhum nome

Eis o aspeto da mesma cláusula pelo catálogo fora antes de lhe tocarmos.

LínguaO que a frase dizia
Inglêsset null rather than cascade
Neerlandêsop leegmaken en niet op meeverwijderen
Alemãoauf null setzen statt auf kaskadieren
Espanholpone a nulo en lugar de propagar el borrado
Francêsmise à nul, pas cascade
Italianoimpostata a nullo invece che a cascata
Portuguêsanula em vez de propagar a eliminação
Romenopusă pe null și nu în cascadă
Ucranianoставить null, а не каскадує

Todas elas são boas frases. A neerlandesa é possivelmente a melhor escrita da lista; explica o comportamento a quem nunca viu um esquema. É também a que está mais longe de ser utilizável, porque um leitor que queira ir ver o que realmente fizemos não tem nada para escrever.

As duas coisas que se escrevem num esquema Postgres são SET NULL e CASCADE. Não são descrições de um comportamento, são os identificadores de um, e a descrição de um identificador não é um identificador.

O defeito estava na fonte

É tentador tratar isto como oito erros de tradução. É um erro de fonte, e ler as coisas assim foi o que tornou a reparação pequena.

O inglês dizia set null rather than cascade, em minúsculas, a correr dentro da frase, sem marcação de espécie alguma. Um tradutor a quem se entregue aquilo produz prosa, porque é isso que aquilo é. Cada um dos oito fez o seu trabalho corretamente sobre o material que lhe foi dado.

Portanto a mudança não são oito correções. É uma decisão sobre forma, aplicada nove vezes, e muda também o inglês.

A questão da forma foi respondida a medir e não por gosto

Deve ser SET NULL em maiúsculas, ou set null em minúsculas? As duas são defensáveis em abstrato, e em abstrato é exatamente onde essa discussão nunca acaba.

Por isso fomos ver o que o resto do corpus já faz com SQL dentro de backticks. Há nove ocorrências: WHERE duas vezes, UPDATE duas vezes, DROP duas vezes, um DELETE sozinho, um SELECT 1 numa verificação de monitorização, e um FOR UPDATE SKIP LOCKED. Todas em maiúsculas.

Há também tokens em minúsculas entre backticks que parecem contraexemplos e não são. Um unique que afinal é um sinalizador na API de alguém. Um where que é o nome de uma constante em JavaScript. Um null que é um valor e não uma cláusula.

O que dá a regra verdadeira, e não é sobre maiúsculas. A distinção é entre uma palavra-chave e um nome. Uma palavra-chave da linguagem vai em maiúsculas porque é assim que a linguagem se escreve; um nome que por acaso se parece com uma mantém a caixa que o seu dono lhe deu. Decidir só pela caixa teria produzido aqui a resposta certa pela razão errada, e a resposta errada noutro sítio qualquer.

O corpus é também um lembrete de que um token pode ser dois nomes. A maior parte das ocorrências de DELETE nos nossos artigos não é SQL de todo, é o método HTTP em coisas como DELETE /servers/{id}. As mesmas letras, outra linguagem, e nenhuma regra sobre maiúsculas as distingue.

Uma decisão de forma tem um âmbito, e o âmbito tem uma margem

A primeira ronda reparou o artigo que o leitor andava a ler. Uma verificação posterior mostrou que um segundo artigo fazia a mesma afirmação sobre um esquema numa linha, sem o token, por isso uma segunda ronda tratou desse.

Vale a pena dizê-lo com clareza, porque uma decisão sobre forma não está acabada quando o ficheiro que a provocou está acabado. Antes dessa segunda ronda uma verificação de tokens comunicava os dois nomes como simplesmente ausentes do inglês; depois dela fez vinte e quatro contagens pelas línguas fora sem nenhum desvio.

A margem é a parte que deu que pensar. A regra é esta frase nomeia uma cláusula, e não aparece a palavra cascata. No mesmo artigo, mais abaixo no mesmo parágrafo, há uma frase sobre uma cascata de uma tabela de vida curta para uma de vida longa. Isso é a descrição de uma consequência e não uma referência a uma cláusula, e fica como prosa naquilo que a língua diria naturalmente.

Medimos essa fronteira em todo o catálogo inglês em vez de confiar nela: três formulações que podiam plausivelmente estar a nomear uma cláusula, procuradas fora dos backticks em todos os artigos ingleses. Nove ocorrências na altura, cinco delas no artigo de que a segunda ronda tratou. As quatro restantes eram uma referência a ser posta a um valor nulo, um título de secção sobre a limpeza ao eliminar como estratégia, uma observação de que uma certa linha não participa em nenhuma cascata, e um 404 num pedido de eliminação. Nenhuma delas nomeia uma cláusula. Depois das duas rondas restam sete, e o artigo que a primeira ronda reparou já não aparece de todo na lista, que é a confirmação mais barata possível de que a mudança foi para onde devia.

O que fica com a língua

Os nomes são idênticos nos nove ficheiros. A frase à volta deles não é, nem deve ser.

O alemão continua a dizer que a chave estrangeira steht auf, o neerlandês staat op, o português está em. O verbo, a preposição e a ordem das palavras pertencem à língua. Só os dois nomes são fixos, e são fixos porque são citações do Postgres e não afirmações nossas.

As partes mecânicas aguentaram. O desenhador produz um elemento de código a sério mesmo quando o token fica dentro de texto a negrito, o que acontece na lista numerada no fim de cada artigo. O espaço inquebrável francês antes de dois pontos sobreviveu a uma reparação que reescreveu a cláusula mesmo à sua frente, que é o género de coisa que desaparece em silêncio quando alguém volta a escrever uma linha.

E as diferenças são a prova de que a regra era suficientemente estreita. Três linhas para dentro e três linhas para fora por ficheiro na primeira ronda, uma para dentro e uma para fora na segunda. Uma reparação deste género que toque em dez linhas redecorou alguma coisa.

O que registaríamos

  1. Oito traduções corretas podem ainda assim ser um defeito. A correção da frase não é o mesmo que a presença do nome.
  2. O defeito está normalmente na fonte. Prosa à entrada, prosa à saída, e os tradutores não são o problema.
  3. Um nome é uma questão de forma e não uma questão de língua. É marcado uma vez e copiado para toda a parte.
  4. Meça a forma da casa sobre o corpus em vez de a discutir em abstrato.
  5. A distinção é palavra-chave contra nome, e não maiúsculas contra minúsculas.
  6. Um token pode ser dois nomes. A maior parte dos nossos DELETE é HTTP e não SQL.
  7. Trace a fronteira em se a frase nomeia uma cláusula, e não em se a palavra aparece.
  8. Vá ver o artigo irmão. Uma decisão de forma tem um âmbito, e raramente é um só ficheiro.
  9. Deixe o verbo à língua. Reparar o nome não quer dizer reparar a frase.
  10. Uma diferença pequena é a prova. Três linhas para dentro e três para fora quer dizer que a regra era estreita.

Para que fique claro o que isto é: duas rondas, a primeira a pôr os dois nomes em nove ficheiros a três linhas para dentro e três para fora cada, a segunda a fazer uma linha para dentro e uma para fora num segundo artigo; a compilação de conteúdo produziu 886 artigos sem avisos e a verificação de conteúdo encontrou 887 de 887 ficheiros gerados idênticos byte a byte, a bateria de testes da web a 4604 verdes, a comparação de tokens a 40 contagens e depois a 24 contagens sem desvios, a comparação de factos a 296 e a 256 sem nenhum, a varredura de bytes limpa, e três guardas provadas vermelhas antes de se acreditar que estavam verdes. A leitura do corpus foram três formulações em 124 artigos ingleses. Por provar: cada tradução continua a ter um leitor, nenhum deles falante nativo, e não há nenhuma verificação de navegador de como o token é desenhado nas nove línguas.

Do trabalho de plataforma na Provibr. O artigo de que isto tudo tratava é O filho acorda o pai, o que nove catálogos fazem a um conjunto fixo de controlos está em Dezasseis mil chaves, nove idiomas, e outro caso em que a tradução estava correta e a forma estava errada está em A seleção envolve a frase inteira.

Comece com um host e um agente

Crie uma conta, instale o agente com um único comando e ligue o seu primeiro host Proxmox. O período experimental dura 14 dias e não pede quaisquer dados de pagamento.