Blog ·
Un nume care nu se poate traduce
Nouă limbi spuneau nouă lucruri diferite despre o clauză de cheie străină. Opt dintre ele erau traduceri corecte, și tocmai asta era toată problema.
De Provibr
Publicăm fiecare articol în nouă limbi. Un cititor care parcurgea una dintre ele a observat ceva ce scris pe hârtie pare mărunt și a cerut două runde ca să fie reparat cum trebuie: o propoziție despre o cheie străină spunea alt lucru în fiecare limbă, iar toate nouă erau corecte.
Propoziția lămurește de ce un rând copil care este curățat nu are voie să ia cu el și așteptarea părintelui. În schemă asta este o singură clauză, iar clauza are un nume.
Opt traduceri corecte și niciun nume
Iată cum arăta aceeași clauză prin catalog înainte să ne atingem de ea.
| Limba | Ce spunea propoziția |
|---|---|
| Engleză | set null rather than cascade |
| Neerlandeză | op leegmaken en niet op meeverwijderen |
| Germană | auf null setzen statt auf kaskadieren |
| Spaniolă | pone a nulo en lugar de propagar el borrado |
| Franceză | mise à nul, pas cascade |
| Italiană | impostata a nullo invece che a cascata |
| Portugheză | anula em vez de propagar a eliminação |
| Română | pusă pe null și nu în cascadă |
| Ucraineană | ставить null, а не каскадує |
Fiecare dintre ele este o propoziție bună. Cea neerlandeză este, se poate susține, cea mai bine scrisă din listă; îi lămurește purtarea cuiva care nu a văzut niciodată o schemă. Este totodată cea mai departe de a fi de folos, fiindcă un cititor care vrea să verifice ce am făcut de fapt nu are ce să tasteze.
Cele două lucruri pe care le scrieți într-o schemă Postgres sunt SET NULL și CASCADE. Nu sunt descrieri ale unei purtări, sunt identificatorii ei, iar descrierea unui identificator nu este un identificator.
Defectul se afla în sursă
Este ispititor să tratăm asta ca pe opt greșeli de traducere. Este o singură greșeală de sursă, iar citirea ei astfel este ceea ce a făcut reparația mică.
Engleza spunea set null rather than cascade, cu litere mici, curgând în propoziție, fără niciun fel de marcaj. Un traducător căruia i se dă asta produce proză, fiindcă asta și este. Fiecare dintre cei opt și-a făcut treaba corect pe materialul care i-a fost dat.
Așa că schimbarea nu înseamnă opt corecturi. Este o singură hotărâre despre formă, pusă în lucru de nouă ori, și schimbă și engleza.
Întrebarea despre formă a primit răspuns prin măsurare, nu prin gust
Să fie SET NULL cu majuscule sau set null cu litere mici? Amândouă se pot susține în abstract, iar în abstract este exact locul unde cearta aceea nu se termină niciodată.
Așa că ne-am uitat la ce face deja restul corpusului cu SQL între backticks. Sunt nouă apariții: WHERE de două ori, UPDATE de două ori, DROP de două ori, un DELETE singur, un SELECT 1 într-o verificare de monitorizare și un FOR UPDATE SKIP LOCKED. Toate cu majuscule.
Mai sunt și jetoane cu litere mici între backticks, care arată ca niște contraexemple și nu sunt. Un unique care se dovedește a fi un indicator din API-ul cuiva. Un where care este numele unei constante în JavaScript. Un null care este o valoare și nu o clauză.
Ceea ce dă regula adevărată, iar ea nu ține de majuscule. Deosebirea este între un cuvânt cheie și un nume. Un cuvânt cheie al limbajului merge cu majuscule fiindcă așa se scrie limbajul; un nume care se întâmplă să semene cu unul își păstrează scrierea pe care i-a dat-o stăpânul lui. Hotărârea numai după majuscule ar fi dat aici răspunsul bun din motivul greșit, și răspunsul greșit în altă parte.
Corpusul mai amintește și că un singur jeton poate fi două nume. Cele mai multe apariții ale lui DELETE din articolele noastre nu sunt deloc SQL, sunt metoda HTTP din lucruri precum DELETE /servers/{id}. Aceleași litere, alt limbaj, și nicio regulă despre majuscule nu le deosebește.
O hotărâre de formă are o arie, iar aria are o margine
Prima rundă a reparat articolul pe care îl citise cititorul. O verificare de după a arătat că un al doilea articol făcea aceeași afirmație despre o schemă, pe un singur rând, fără jeton, așa că o a doua rundă l-a făcut și pe acela.
Merită spus pe șleau, fiindcă o hotărâre despre formă nu este gata când este gata fișierul care a stârnit-o. Înaintea celei de a doua runde, o verificare de jetoane raporta amândouă numele ca pur și simplu absente din engleză; după ea, a numărat douăzeci și patru de apariții prin limbi, fără nicio abatere.
Marginea este partea care a cerut gândirea. Regula este numește propoziția aceasta o clauză, nu apare cuvântul cascadă. În același articol, mai jos în același paragraf, se află o propoziție despre o cascadă dintr-un tabel cu viață scurtă într-unul cu viață lungă. Aceea este descrierea unei urmări, nu trimiterea la o clauză, și rămâne proză în orice ar spune firesc limba.
Am măsurat granița aceea pe tot catalogul englez în loc să ne încredem în ea: trei formulări care ar fi putut plauzibil să numească o clauză, căutate în afara backtickurilor în fiecare articol englez. Nouă potriviri la vremea aceea, cinci dintre ele în articolul despre care era a doua rundă. Cele patru din altă parte erau o referință pusă pe o valoare nulă, un titlu de secțiune despre curățarea la ștergere ca strategie, o remarcă despre un rând anume care nu ia parte la nicio cascadă și un 404 la o cerere de ștergere. Niciuna dintre ele nu numește o clauză. După amândouă rundele rămân șapte, iar articolul reparat de prima rundă nu mai apare deloc în listă, ceea ce este cea mai ieftină confirmare cu putință că schimbarea a mers acolo unde trebuia.
Ce rămâne al limbii
Numele sunt identice în toate cele nouă fișiere. Propoziția din jurul lor nu este și nici nu trebuie să fie.
Germana spune în continuare că respectiva cheie străină steht auf, neerlandeza staat op, portugheza está em. Verbul, prepoziția și ordinea cuvintelor țin de limbă. Numai cele două nume sunt fixe, și sunt fixe fiindcă sunt citate din Postgres, nu afirmații ale noastre.
Părțile mecanice au ținut. Motorul de randare produce un element de cod adevărat chiar și când jetonul stă înăuntrul unui text îngroșat, ceea ce se și întâmplă în lista numerotată de la sfârșitul fiecărui articol. Spațiul neîntrerupt francez dinaintea unei linii de două puncte a supraviețuit unei reparații care a rescris clauza aflată chiar în fața lui, ceea ce este genul de lucru care dispare în tăcere când cineva retastează o linie.
Iar diferențele sunt dovada că regula a fost destul de îngustă. Trei linii puse și trei linii scoase pe fișier în prima rundă, una pusă și una scoasă în a doua. O reparație de felul acesta care atinge zece linii a redecorat ceva.
Ce am consemna
- Opt traduceri corecte pot fi totuși un defect. Corectitudinea propoziției nu este totuna cu prezența numelui.
- Defectul se află de obicei în sursă. Proză înăuntru, proză în afară, iar traducătorii nu sunt problema.
- Un nume este o întrebare de formă, nu de limbă. Este marcat o dată și copiat peste tot.
- Măsurați forma casei pe corpus în loc să o dezbateți în abstract.
- Deosebirea este cuvânt cheie față de nume, nu majuscule față de litere mici.
- Un singur jeton poate fi două nume. Cei mai mulți
DELETEai noștri sunt HTTP, nu SQL. - Trageți granița la faptul că o propoziție numește o clauză, nu la faptul că apare cuvântul.
- Verificați articolul soră. O hotărâre de formă are o arie și rareori este un singur fișier.
- Lăsați verbul limbii. Repararea numelui nu înseamnă repararea propoziției.
- O diferență mică este dovada. Trei linii puse și trei scoase înseamnă că regula a fost îngustă.
Ca să fie limpede ce este aceasta: două runde, prima punând cele două nume în nouă fișiere, cu trei linii puse și trei scoase la fiecare, a doua cu o linie pusă și una scoasă pe un al doilea articol; construirea de conținut a produs 886 de articole fără nicio avertizare, iar verificarea de conținut a găsit 887 din 887 de fișiere generate identice octet cu octet, suita web la 4604 verde, comparația de jetoane la 40 de numărători și apoi la 24, fără abateri, comparația de fapte la 296 și 256, fără niciuna, baleiajul de octeți curat și trei gărzi dovedite roșii înainte să fie crezute verzi. Citirea corpusului a însemnat trei formulări prin 124 de articole engleze. Nedovedite: fiecare traducere are în continuare un singur cititor, niciunul dintre ei nu este vorbitor nativ, iar o verificare în browser a felului în care se randează jetonul în toate cele nouă limbi nu există.
Din munca de platformă la Provibr. Articolul despre care era vorba în toate acestea este copilul îl trezește pe părinte, ce fac nouă cataloage unui set de comenzi fixe se află în șaisprezece mii de chei, nouă limbi, iar un alt caz în care traducerea era corectă și forma greșită se află în selecția cuprinde toată propoziția.