Consulting Work Блог Контакт
← Назад до блогу

Інструкція, яка видалила не ті двадцять шість мов

Інструкція, яка видалила не ті двадцять шість мов

Я доручив автоматизації власного сайту скоротити блог до чотирьох мов. Через два дні з’ясувалося, що заразом вона тихо стерла ще двадцять шість мов і з головної сторінки, і цього не помітив ні я, ні жоден відвідувач.

TL;DR

  • Інструкція, націлена на розділ блогу, натомість застосувалася до всього сайту.
  • З головної сторінки, сторінки резюме та з усіх рядків навігації зникли 26 із 30 мов.
  • Нічого не зламалося і не видало 404, тому два дні ніхто нічого не помітив.
  • Рішення знайшлося в історії git, а не в пам’яті про те, як сайт виглядав раніше.
  • Справжній урок: перш ніж запускати автоматичну зміну, назви точний перелік файлів, які вона зачепить, і прочитай цей перелік до того, як щось буде видалено.

Навіщо взагалі знадобилося менше мов

За кілька місяців мій сайт розрісся до тридцяти мов: головна сторінка, сторінка резюме і блог, який я оновлюю мало не через день. Я вже писав раніше про те, наскільки це небезпечно: машинний переклад достатньо гладкий, щоб виглядати пристойно, і достатньо кривий, щоб вас осоромити, причому мовою, яку ви самі перевірити не можете. Головна сторінка і резюме змінюються рідко, тож із цим ризиком там можна було миритися. З блогом усе інакше. Нові пости виходять часто, і я чесно не можу поручитися за якість перекладу свіжої статті естонською в день публікації.

Тож я вирішив скоротити набір мов, на які перекладається блог, до чотирьох, які я справді здатен сам перевірити: англійська, російська, німецька, чеська. Решта залишаються поза блогом, поки не з’явиться кращий спосіб їх перевіряти. Із самою ідеєю все було гаразд. Проблема була в тому, як саме я її сформулював.

Одна фраза, не той обсяг

Я дав одну інструкцію: залишити в блозі чотири мови. Коротку і, як мені здавалося, конкретну. А насправді вона зачепила одразу три різні речі. Папки з контентом блогу вона скоротила правильно, рівно до потрібних чотирьох мов. Але заразом переписала загальний список мов сайту, той самий конфігураційний файл, який визначає, які мови взагалі існують, і видалила контент головної сторінки та рядки навігації для решти двадцяти шести.

Проблема в тому, що «блог» і «список мов усього сайту» живуть в одному й тому ж конфігураційному файлі. У ньому ніщо не відділяє мови, які підтримує блог, від мов, які підтримує сайт загалом. Прибери мову з цього списку, і її одразу втрачають усі розділи, що з нього читають, включно з головною сторінкою. Моя інструкція називала розділ. А зміна, яка реально відбулася, охоплювала все.

Ось що перетворило це з простої помилки на по-справжньому небезпечну ситуацію: нічого не зламалося гучно. Жодної помилки, жодного 404, жодного збою збірки. Сайт просто тихо перестав генерувати сторінки головної та резюме для двадцяти шести мов, а перемикач мов перестав їх пропонувати. Відвідувач, який раніше читав сайт португальською, тепер мовчки потрапляв на англійську версію. «Видалено» і «ніколи не існувало» виглядають абсолютно однаково, і жодне з двох не видає помилку.

Я помітив це лише через два дні, і то випадково, посеред роботи над геть іншим виправленням, коли посилання «Blog» у навігації повело кудись не туди для однієї з мов, яку я вважав живою. Це єдине бите посилання і виявилося єдиною видимою ниткою до всієї проблеми.

Що насправді показав diff

Чесно кажучи, справжня помилка тут не в самому промаху з обсягом. Вона в тому, що я жодного разу не перевірив список файлів, які зміна насправді збиралася зачепити, перш ніж дозволити їй запуститися. Я прочитав однорядковий опис того, що вона мала зробити, і вирішив, що це і є опис того, що вона зробить. Виявилося, що ні.

Виправлення почалося з одного питання: що змінилося і де. Я порівняв бойову версію сайту з останнім комітом до інструкції «скоротити блог», і відповідь виявилася миттєвою й однозначною: загальний конфіг мов, папка з контентом головної сторінки і двадцять шість файлів рядків по мовах, жоден з яких навіть близько не лежав у директорії блогу. Git зберігав усі ці файли точно такими, якими вони й були. Насправді нічого не пропало, просто поверх задеплоїли нову версію.

Я відновив із цієї історії головну сторінку, резюме та рядки навігації для всіх тридцяти мов, а папку блогу залишив рівно такою урізаною, якою й хотів: чотири мови, свідомо. Залишився один хвіст. Посилання «Blog» у навігації для відновленої мови раніше вело на мовну версію блогу, якої більше не існує. Дублювати чотири пости ще на двадцять шість мов лише заради одного посилання не мало сенсу, тож я налаштував шаблон перенаправляти його на англійський блог і на цьому зупинився.

Одна інструкція, не той обсяг: мови головної сторінки й резюме звузилися до чотирьох і за два дні повернулися до тридцяти, тоді як блог залишився на тих чотирьох мовах, що й планувалося

Що я перевірятиму інакше наступного разу

Тепер, перш ніж дати будь-якій автоматичній зміні торкнутися живого багаторозділового сайту, я вголос ставлю одне додаткове питання: назви точний перелік файлів, які це зачепить, а не фічу, яку це має полагодити. Якщо відповідь розпливчаста, це сигнал зупинитися й перевірити, а не запустити й подивитися. І перед тим, як щось видалиться, я хочу бачити перед собою реальний перелік файлів, а не однорядкове резюме того, що інструкція нібито мала на увазі. Слово, яке задає обсяг в інструкції, «блог», «ця команда», «лише фронтенд», автоматично не дорівнює обсягу зміни, яку ця інструкція запускає, і вони збігаються лише тоді, коли хтось це реально перевірив: власне, це те саме питання, яке я поставлю вам. Яка найменша й, здавалося б, найточніше окреслена інструкція, яку ви нещодавно давали, так і не була перевірена на те, що вона реально зачепила?

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