Consulting Work Blog Kontakt
← Natrag na blog

Instrukcija koja je izbrisala krivih dvadeset i šest jezika

Instrukcija koja je izbrisala krivih dvadeset i šest jezika

Rekao sam automatizaciji svoje stranice da smanji blog na četiri jezika. Dva dana kasnije otkrio sam da je tiho izbrisala i dvadeset i šest jezika s početne stranice, a nije to primijetio nijedan posjetitelj, a kamoli ja.

TL;DR

  • Jedna instrukcija namijenjena sekciji bloga primijenjena je umjesto toga na cijelu stranicu.
  • 26 od 30 jezika nestalo je s početne stranice, sa stranice životopisa i iz svih tekstova navigacije.
  • Ništa se nije srušilo i nigdje se nije pojavila 404 greška, pa to dva dana nitko nije primijetio.
  • Popravak je došao iz git povijesti, a ne iz sjećanja kako je stranica nekoć izgledala.
  • Prava pouka: prije nego automatizirana promjena krene, imenuj točne datoteke koje će dotaknuti, pa taj popis pročitaj prije nego što se išta izbriše.

Zašto sam uopće htio manje jezika

Moja stranica je za nekoliko mjeseci narasla na trideset jezika: početna stranica, stranica životopisa i blog koji ažuriram gotovo svakih nekoliko dana. Već sam prije pisao o tome koliko to može biti opasno: strojni prijevod je dovoljno tečan da izgleda u redu, a dovoljno loš da vas osramoti, i to na jeziku koji sami ne možete provjeriti. Početna stranica i životopis mijenjaju se rijetko, pa sam taj rizik ondje mogao podnijeti. Blog je bio druga priča. Novi tekstovi izlaze često, i doista ne mogu jamčiti za kvalitetu prijevoda svježeg članka na estonski istog dana kad se objavi.

Odlučio sam se stoga suziti skup jezika na koje se blog prevodi, na četiri kojima toliko vjerujem da ih mogu sam provjeriti: engleski, ruski, njemački, češki. Sve ostalo ostaje isključeno s bloga dok ne nađem bolji način da to provjerim. Taj dio plana bio je ispravan. Ono što je pošlo po zlu bio je način na koji sam to zatražio.

Jedna rečenica, krivi opseg

Dao sam jednu instrukciju: neka blog ostane na četiri jezika. Kratko, precizno, ili sam barem tako mislio. Ono što se zapravo pokrenulo dotaknulo je tri različite stvari odjednom. Ispravno je suzilo vlastite mape sadržaja bloga na četiri jezika koja sam želio. Ujedno je prepisalo i glavni popis jezika stranice, konfiguracijsku datoteku koja određuje koji jezici uopće postoje, te izbrisalo sadržaj početne stranice i tekstove navigacije za preostalih dvadeset i šest.

Problem je u tome što “blog” i “popis jezika cijele stranice” žive u istoj konfiguracijskoj datoteci. Ništa u toj datoteci ne razlikuje koje jezike podržava blog od onih koje podržava stranica kao cjelina. Čim se jezik ukloni s tog popisa, svaka sekcija koja iz njega čita, uključujući početnu stranicu, gubi ga u istom trenu. Moja je instrukcija imenovala sekciju. Promjena koja se zapravo dogodila imala je opseg svega.

Evo dijela zbog kojeg je to postalo opasno, a ne samo pogrešno: ništa nije glasno zakazalo. Nema greške, nema 404, nema pada builda. Stranica je jednostavno tiho prestala generirati početnu stranicu i životopis za dvadeset i šest jezika, a preklopnik jezika ih je prestao nuditi. Posjetitelj koji je nekad čitao stranicu na portugalskom sada bi nečujno završio na engleskom. Nestalo-jer-je-izbrisano izgleda potpuno isto kao nikad-nije-ni-postojalo, i nijedno od toga ne prijavljuje grešku.

Prošla su dva dana prije nego što sam to primijetio, i to samo slučajno, usred nepovezanog popravka, kad je poveznica “Blog” u navigaciji vodila nekamo čudno za jedan od jezika za koji sam mislio da je još uvijek živ. Ta jedna neispravna poveznica bila je jedini vidljivi trag natrag do cijelog problema.

Što je diff zapravo pokazao

Pravi propust ovdje nije sama greška u opsegu. Nego to što nikad nisam provjerio popis datoteka koje će promjena zapravo dotaknuti prije nego sam je pustio da se izvrši. Pročitao sam jednorečenični opis onoga što bi trebala napraviti i pretpostavio da opisuje i ono što je stvarno napravila. Nije.

Popravak je počeo jednim pitanjem: što se promijenilo, i gdje. Usporedio sam živu stranicu s posljednjim commitom prije instrukcije “suzi blog”, i odgovor je bio trenutan i nedvosmislen: glavna konfiguracija jezika, mapa sadržaja početne stranice i dvadeset i šest datoteka s tekstovima po jeziku, od kojih nijedna nije bila ni blizu mape bloga. Git je imao svaku od tih datoteka točno onakvom kakva je bila. Ništa zapravo nije bilo izgubljeno, samo prepisano novim postavljanjem.

Iz te povijesti vratio sam početnu stranicu, životopis i tekstove navigacije za svih trideset jezika, a mapu bloga ostavio točno onako suženu kako sam i htio: četiri jezika, namjerno. Preostao je jedan neriješen detalj. Poveznica “Blog” u navigaciji, za vraćeni jezik, nekad je vodila na izdanje bloga na tom jeziku koje više ne postoji. Duplicirati četiri teksta u još dvadeset i šest jezika samo da se popuni ta jedna poveznica nije se isplatilo, pa sam predložak postavio da umjesto toga preusmjerava na engleski blog, i tako ostavio.

Jedna instrukcija, krivi opseg: jezici početne stranice i životopisa srušili su se na četiri i dva dana kasnije vratili na trideset, dok je blog ostao na četiri jezika koja su doista bila namijenjena

Što bih sljedeći put provjerio drugačije

Prije nego što sada dopustim bilo kojoj automatiziranoj promjeni da dotakne živu, višesekcijsku stranicu, naglas si postavim jedno dodatno pitanje: imenuj točne datoteke koje će ovo dotaknuti, ne značajku koju bi to trebalo popraviti. Ako je odgovor nejasan, to je signal da se zaustavim i provjerim, a ne da to pustim i vidim što će biti. I prije nego što se išta izbriše, želim pred sobom imati stvarni popis datoteka, a ne jednorečenični sažetak onoga što je instrukcija navodno trebala značiti. Riječ koja opisuje opseg u instrukciji, “blog”, “ovaj tim”, “samo frontend”, automatski ne znači isti opseg kao promjena koju ta instrukcija pokreće, a podudaranje između njih vrijedi samo ako je netko to doista provjerio: a to je točno pitanje koje bih sada postavio natrag vama. Koja je najmanja, najsigurnije omeđena instrukcija koju ste nedavno dali, a nikad niste provjerili čega se zapravo dotaknula?

Need something like this for your own business? See how I can help →