Käsky, joka poisti väärät kaksikymmentäkuusi kieltä

Käskin oman sivustoni automaatiota kutistamaan blogin neljään kieleen. Kaksi päivää myöhemmin selvisi, että se oli hiljaa pyyhkinyt kaksikymmentäkuusi kieltä myös etusivulta, eikä kukaan, ei edes yksikään kävijä, ollut huomannut mitään.
TL;DR
- Yksi blogiosioon tarkoitettu ohje ulottui koko sivustolle.
- 26 kieltä 30:stä katosi etusivulta, CV-sivulta ja jokaisesta navigaation tekstistä.
- Mikään ei kaatunut eikä yksikään sivu antanut 404-virhettä, joten kukaan ei huomannut mitään kahteen päivään.
- Korjaus löytyi git-historiasta, ei muistikuvasta siitä, miltä sivusto joskus näytti.
- Varsinainen opetus: ennen kuin automaattinen muutos ajetaan, nimeä tarkalleen mitkä tiedostot se koskettaa, ja lue se lista läpi ennen kuin mitään poistetaan.
Miksi halusin vähemmän kieliä alun perin
Sivustoni oli kasvanut muutamassa kuukaudessa kolmeenkymmeneen kieleen: etusivu, CV-sivu ja blogi, jota päivitän lähes parin päivän välein. Olen jo aiemmin kirjoittanut siitä, miten vaarallista tämä voi olla: konekäännös on sujuvaa tarpeeksi näyttääkseen ihan hyvältä ja väärää tarpeeksi nolatakseen sinut kielellä, jota et itse pysty tarkistamaan. Etusivu ja CV muuttuvat harvoin, joten sen riskin kanssa saatoin elää siellä. Blogi oli eri asia. Uusia postauksia julkaistaan usein, enkä todellakaan pysty takaamaan tuoreen vironkielisen artikkelin käännöslaatua sen julkaisupäivänä.
Niinpä päätin karsia blogin käännöskielet niihin neljään, joiden laadun uskallan itse tarkistaa: englanti, venäjä, saksa ja tšekki. Kaikki muut jäävät blogista pois, kunnes minulla on parempi tapa varmistaa käännösten laatu. Tämä osa suunnitelmasta oli järkevä. Se, mikä meni pieleen, oli tapa, jolla pyysin sitä.
Yksi lause, väärä laajuus
Annoin yhden ohjeen: pidä blogi neljässä kielessä. Lyhyt ja täsmällinen, tai niin ainakin luulin. Se, mikä lopulta ajettiin, kosketti kolmea eri asiaa yhtä aikaa. Se karsi oikein blogin omat sisältökansiot niihin neljään kieleen, jotka halusin. Mutta se myös kirjoitti uudelleen sivuston pääkielilistan, konfiguraatiotiedoston, joka määrittää, mitkä kielet ylipäätään ovat olemassa, ja poisti etusivun sisällön ja navigaatiotekstit jäljellä olevalta kahdeltakymmeneltäkuudelta kieleltä.
Ongelma on siinä, että ”blogi” ja ”koko sivuston kielilista” asuvat samassa konfiguraatiotiedostossa. Mikään tiedostossa ei erota, mitkä kielet kuuluvat blogille ja mitkä koko sivustolle. Kun kieli poistetaan tuosta listasta, jokainen sitä lukeva osio, etusivu mukaan lukien, menettää sen samalla kertaa. Ohjeeni nimesi yhden osion. Muutos, joka lopulta ajettiin, kattoi kaiken.
Tässä on se osa, joka teki tilanteesta vaarallisen eikä vain väärän: mikään ei hajonnut äänekkäästi. Ei virheilmoitusta, ei 404:ää, ei epäonnistunutta buildia. Sivusto vain hiljaa lakkasi generoimasta etusivua ja CV-sivua kahdellekymmenellekuudelle kielelle, ja kielivalitsin lakkasi tarjoamasta niitä. Kävijä, joka oli aiemmin lukenut sivustoa portugaliksi, päätyi nyt hiljaa englanninkieliselle sivulle. Poistamisen aiheuttama puuttuminen näyttää täsmälleen samalta kuin se, ettei kieltä olisi koskaan ollutkaan, eikä kumpikaan anna virheilmoitusta.
Kaksi päivää kului ennen kuin huomasin asian, ja sekin sattumalta, kesken yhden asiaan liittymättömän korjauksen, kun navigaation ”Blogi”-linkki osoitti jotain outoa yhdellä kielistä, joiden luulin yhä olevan käytössä. Se yksi roikkuva linkki oli ainoa näkyvä lanka, joka johti koko ongelman jäljille.
Mitä diffi todella paljasti
Rehellinen virhe tässä ei ole itse laajuuden mokaaminen. Se on se, etten koskaan tarkistanut listaa tiedostoista, joita muutos oikeasti tulisi koskettamaan, ennen kuin annoin sen ajaa. Luin yhden rivin kuvauksen siitä, mitä sen piti tehdä, ja oletin sen kuvaavan sitä, mitä se todella teki. Ei kuvannut.
Korjaaminen alkoi yhdestä kysymyksestä: mikä muuttui ja missä. Otin diffin tuotannossa olevan sivuston ja viimeisimmän, ennen ”kutista blogi” -ohjetta tehdyn committin väliltä, ja vastaus oli välitön ja yksiselitteinen: pääkielikonfiguraatio, etusivun sisältökansio ja kaksikymmentäkuusi kielikohtaista tekstitiedostoa, eikä yksikään niistä ollut lähelläkään blogihakemistoa. Git piti jokaisen näistä tiedostoista tallessa täsmälleen sellaisina kuin ne olivat olleet. Mitään ei oikeasti kadonnut, se oli vain korvattu uudemmalla julkaisulla.
Palautin etusivun, CV:n ja navigaation tekstit kaikille kolmellekymmenelle kielelle tuosta historiasta ja jätin blogikansion täsmälleen niin karsituksi kuin halusinkin: neljä kieltä, tarkoituksella. Yksi asia jäi vielä auki. Palautetun kielen ”Blogi”-linkki osoitti aiemmin kyseisen kielen blogiversioon, jota ei enää ole olemassa. Neljän postauksen monistaminen kahdellekymmenellekuudelle uudelle kielelle vain yhden linkin täyttämiseksi ei ollut sen arvoista, joten asetin templaatin ohjaamaan sen sen sijaan englanninkieliseen blogiin, ja jätin sen siihen.

Mitä tarkistaisin ensi kerralla toisin
Nykyään, ennen kuin annan minkään automaattisen muutoksen koskea tuotannossa olevaa, moniosaista sivustoa, kysyn yhden ylimääräisen kysymyksen ääneen: nimeä tarkalleen tiedostot, joita tämä koskee, älä ominaisuutta, jonka sen piti korjata. Jos vastaus on epämääräinen, se on merkki pysähtyä ja tarkistaa, ei ajaa ja katsoa mitä tapahtuu. Ja ennen kuin mitään poistetaan, haluan nähdä oikean tiedostolistan edessäni, en yhden rivin yhteenvetoa siitä, mitä ohjeen piti tarkoittaa. Ohjeen laajuutta kuvaava sana, ”blogi”, ”tämä tiimi”, ”vain frontend”, ei ole automaattisesti sama asia kuin sen aiheuttaman muutoksen todellinen laajuus, ja nämä kaksi täsmäävät vain, jos joku on oikeasti tarkistanut niin: mikä on juuri se kysymys, jonka haluan kysyä nyt sinulta takaisin. Mikä on se pienin ja itsevarmimmin rajattu ohje, jonka olet viime aikoina antanut, mutta jota ei koskaan tarkistettu sitä vasten, mitä se todellisuudessa kosketti?
Need something like this for your own business? See how I can help →
Get the AI Audit Kickoff Checklist
Fifteen questions to ask about your own processes before you spend a cent on AI. The same first hour I run in a real audit, as a one-page PDF. Drop your email and you get it right away, plus the occasional note when I write something worth your time. No spam, unsubscribe in one click.