Consulting Work Blog Stik
← Nazaj na blog

Navodilo, ki je izbrisalo napačnih šestindvajset jezikov

Navodilo, ki je izbrisalo napačnih šestindvajset jezikov

Avtomatizaciji svoje strani sem naročil, naj blog skrči na štiri jezike. Dva dneva pozneje sem ugotovil, da je pri tem po tihem izbrisala še šestindvajset jezikov z domače strani, in tega ni opazil niti jaz niti en sam obiskovalec.

TL;DR

  • Eno navodilo, namenjeno bloginemu delu strani, se je namesto tega izvedlo na celotni strani.
  • 26 od 30 jezikov je izginilo z domače strani, s strani z življenjepisom in iz vseh nizov v navigaciji.
  • Nič se ni sesulo in nobena stran ni vrnila napake 404, zato tega dva dni ni opazil nihče.
  • Popravek je prišel iz zgodovine v gitu, ne iz spomina, kako je stran nekoč izgledala.
  • Prava lekcija: preden se avtomatizirana sprememba izvede, poimenuj natančen seznam datotek, ki jih bo spremenila, in ta seznam preberi, preden karkoli izbrišeš.

Zakaj sem sploh želel manj jezikov

Moja stran je v nekaj mesecih zrasla na trideset jezikov: domača stran, stran z življenjepisom in blog, ki ga posodabljam skoraj vsak drugi dan. O tem, kako nevarno je to, sem že pisal: strojni prevod je dovolj tekoč, da deluje v redu, in dovolj napačen, da te osmeši - v jeziku, ki ga sam sploh ne znaš preveriti. Domača stran in življenjepis se skoraj ne spreminjata, zato sem s tem tveganjem lahko živel. Blog je bila druga zgodba. Novi prispevki izhajajo pogosto, jaz pa res ne morem jamčiti za kakovost prevoda svežega članka v estonščino na dan, ko izide.

Zato sem se odločil, da nabor jezikov, v katere se prevaja blog, skrčim na štiri, pri katerih si dejansko upam preveriti smiselnost: angleščino, ruščino, nemščino in češčino. Vse ostalo ostane izven bloga, dokler ne najdem boljšega načina za preverjanje. Ta del načrta je bil dober. Narobe je šlo pri tem, kako sem to naročil.

En stavek, napačen obseg

Dal sem eno samo navodilo: blog naj ostane pri štirih jezikih. Kratko in natančno, ali sem si vsaj tako mislil. To, kar se je dejansko izvedlo, je hkrati poseglo v tri različne stvari. Pravilno je skrčilo vsebinske mape bloga na štiri željene jezike. Poleg tega je prepisalo glavni seznam jezikov strani - konfiguracijsko datoteko, ki določa, kateri jeziki sploh obstajajo - in izbrisalo vsebino domače strani ter navigacijske nize za preostalih šestindvajset.

Težava je v tem, da “blog” in “seznam jezikov za celotno stran” živita v isti konfiguracijski datoteki. Nič v njej ne loči, kateri jeziki so namenjeni blogu in kateri celotni strani. Če iz tega seznama odstraniš en jezik, ga v istem trenutku izgubi vsak del strani, ki bere iz njega - vključno z domačo stranjo. Moje navodilo je poimenovalo en sam del strani. Sprememba, ki se je dejansko izvedla, pa je imela obseg vsega.

In tu je del, zaradi katerega je bilo to nevarno, ne le narobe: nič se ni pokvarilo na glas. Brez napake, brez 404, brez neuspešne gradnje. Stran je zgolj tiho prenehala generirati domačo stran in življenjepis za šestindvajset jezikov, izbirnik jezika pa jih ni več ponujal. Obiskovalec, ki je stran prej bral v portugalščini, je zdaj tiho pristal na angleški različici. Nekaj, kar manjka, ker je bilo izbrisano, je videti povsem enako kot nekaj, kar nikoli ni obstajalo - in nobeno od tega ne vrže napake.

Minila sta dva dneva, preden sem to opazil, in še to po naključju, sredi nepovezanega popravka, ko je povezava “Blog” v navigaciji za enega od jezikov, za katerega sem mislil, da je še vedno aktiven, vodila nekam čudno. Ta ena sama povezava v prazno je bila edina vidna sled nazaj do celotne težave.

Kaj je diff dejansko pokazal

Poštena napaka tu ni sama napaka obsega. Napaka je, da nikoli nisem preveril seznama datotek, ki jih bo sprememba dejansko spremenila, preden sem jo pognal. Prebral sem enovrstični opis tega, kar naj bi sprememba naredila, in predpostavil, da to opisuje tudi to, kar je res naredila. Ni je.

Popravljanje se je začelo z enim vprašanjem: kaj se je spremenilo in kje. Primerjal sem živo stran z zadnjim commitom pred navodilom “skrči blog”, in odgovor je bil takojšen in nedvoumen: glavna konfiguracija jezikov, mapa z vsebino domače strani in šestindvajset datotek z jezikovnimi nizi - nobena od njih niti blizu mape bloga. Git je imel vsako od teh datotek natanko tako, kot je bila prej. V resnici se ni izgubilo nič, le prepisano je bilo čez.

Iz te zgodovine sem obnovil domačo stran, življenjepis in navigacijske nize za vseh trideset jezikov, mapo bloga pa pustil točno tako skrčeno, kot sem si želel: štiri jezike, namenoma. Ostala je ena odprta zanka. Navigacijska povezava “Blog” je za obnovljen jezik prej vodila do blogovske izdaje v tem jeziku, ki je ni več. Podvajati štiri prispevke v še šestindvajset jezikov samo zato, da bi zapolnil to eno povezavo, se ni izplačalo, zato sem predlogo nastavil tako, da to povezavo preusmeri na angleški blog, in tako je ostalo.

Eno navodilo, napačen obseg: jeziki domače strani in življenjepisa so se skrčili na štiri in se dva dni pozneje vrnili na trideset, blog pa je ostal pri štirih jezikih, ki so bili dejansko nameravani

Kaj bi naslednjič preveril drugače

Preden zdaj kakršni koli avtomatizirani spremembi dovolim, da se dotakne žive strani z več razdelki, si na glas zastavim eno dodatno vprašanje: poimenuj natančne datoteke, ki jih bo to spremenilo, ne funkcije, ki naj bi jo popravilo. Če je odgovor nejasen, je to znak, da je treba ustaviti in preveriti, ne pognati in videti, kaj bo. In preden se karkoli izbriše, hočem najprej pred seboj imeti dejanski seznam datotek, ne enovrstičnega povzetka tega, kar naj bi navodilo pomenilo. Beseda o obsegu v navodilu - “blog”, “ta ekipa”, “samo frontend” - ni samodejno enaka obsegu spremembe, ki jo to navodilo sproži, ujemata pa se šele, če je nekdo to dejansko preveril: kar je natanko vprašanje, ki bi ga zdaj postavil tebi. Kakšno je najmanjše, najbolj samozavestno omejeno navodilo, ki si ga dal v zadnjem času in ni bilo nikoli preverjeno glede na to, kar je dejansko spremenilo?

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