История ошибки 2000 года

v6n3g8fec4jk0kngws5xmbev_ge.jpegВ конце девяностых мир переживал за компьютерные системы, которые обещали вот-вот отказать. Эксперты запугивали, что при наступлении 2000 года софт не сможет корректно обработать дату, и мир погрузится в хаос: отключатся платёжные системы, биржи встанут, откажет любая электроника. В реальности новый век наступил без каких-либо проблем, переживания оказались напрасны.

Именно так ошибку 2000 года восприняло общественное сознание. К примеру, британский политик-брекзитёр заявил, что опасения о влиянии роли Брекзита на экономику похожи на панику бага Y2K.

Об ошибке тысячелетия забыли почти сразу после наступления 2000 года. Даже в непрофильных изданиях месяцами обсуждали баг Y2K, но уже в первые дни нового года внимание к теме угасло. Завораживающая смена числа с 1999 на 2000 не создала катастроф, которыми так пугали. Скептики объявили, что деньги на устранение бага потратили впустую.

Происходящее за кулисами важнее представлений неспециалистов. Градус общественной паники действительно ушёл выше уровня, которого заслуживала ситуация. Реальная опасность компьютерных сбоев по всему миру 1 января 2000 года существовала и требовала вмешательства разработчиков ПО. Целые отделы программистов годами устраняли проблему Y2K.


В повседневной жизни мы не записываем первые два символа года — они почти всегда одинаковые. Схожая логика продиктовала правило экономии места на накопителях ранних компьютеров: если век неважен, его можно отбросить. Вместо восьми цифр дата записывается в шесть. Экономия кажется мизерной, но если дат миллионы, то счёт идёт на мегабайты памяти, которых у первых ЭВМ было немного.

nandw6yt6stiwou3rxmax3r_9x8.jpeg
Книга «Punched Cards Their Applications To Science And Industry» («Перфокарты, их применение в науке и технике») от 1958 года в первую очередь рассказывает про электромеханические устройства для чтения перфокарт. Оформление списка литературы на стандартной перфокарте IBM. В колонках 15 и 16 указываются последние две цифры года издания. В другом фрагменте книга мотивирует выбор краткого формата года тем, что большинство записей предназначены для XX века.

Человек родился 1 января XX20 года, а умер 2 января XX20. Прожил ли он полноценную жизнь или внезапно умер после родов? Без контекста это установить невозможно, поэтому мы переспросим, ушёл ли из жизни необычный долгожитель или младенец. Похожим образом без указания века компьютер не отличит 2000 год от 1900. В этом и состоит суть ошибки Y2K.

Простая иллюстрация: срок действия на банковской карте указывается в виде MM/YY, и некоторые простейшие алгоритмы платёжных систем проверяли просроченность арифметическим сравнением чисел YYMM. Контрпример для такого алгоритма — любая карта, действительная позднее 2000 года. В 1999 году наивный алгоритм назовёт недействительной карту со сроком действия 12/01, до декабря 2001 года.

Кажется странным, что вредная привычка сокращать век дожила до конца девяностых. Часто говорят, что источник проблем — махровое легаси первых компьютеров и языков программирования, которые по какой-то глупой причине работали почти 40 лет без изменений. Это правда лишь отчасти: заря компьютерной эпохи в первую очередь заложила традиции разработки, которые живут до сих пор. К примеру, современной операционке ни к чему обратная совместимость с перфокартами, но ограничение в 80 символов на строчку терминала из Linux убрали лишь три месяца назад.

Даже к концу семидесятых характеристики ЭВМ в бизнесе оставались скромными. При этом от них уже требовали реальных применений в автоматизации. Из мейнфрейма с процессором на 0,9 миллиона операций в секунду, 1,5 МиБ ОЗУ и 2 ГиБ дискового хранилища как-то приходилось выжимать 20 тысяч транзакций в час, идущие от 300—500 одновременных пользователей. И эти слабенькие вычислительные машины обходятся в сотни тысяч, миллионы долларов. Лишь к 1990 году гигабайт данных на жёстком диске дешевеет ниже 10 тысяч долларов.

А ещё не каждому предприятию по карману флагманские семейства S/360, S/370 или S/390. Для клиентов поменьше IBM разработала вычислительные машины S/3, S/32, S/34, S/36, S/38, AS/400 со значительно более скромными характеристиками. Максимальная ёмкость жёсткого диска бизнес-ЭВМ IBM System/32 — это 13 мегабайтов, в которые нужно уместить не только код, но и данные.

ihkatfkvbjmr6phkkgu2xlzi3ho.jpeg
Однопользовательская ЭВМ IBM System/32, 1975 год. Машина с экраном на 6 строчек предназначена для задач уровня бухгалтерии. Фото: Computer History Museum.

В таких условиях возмутительная раздутость уровня XML или JSON появиться просто не может. Какие тут текстовые форматы — счёт шёл на каждый байт.

Похожим образом дату записывали на Коболе, одном из старейших языков программирования бизнес-приложений. Здесь YY — две цифры года, MM — номер месяца, DD — день.

01 EMP-HIRE-DATE.
03 EMP-HIRE-DATE-YY PIC 99.
03 EMP-HIRE-DATE-MM PIC 99.
03 EMP-HIRE-DATE-DD PIC 99.

Здесь дата представлена в виде 3 байтов, по 4 бита на каждую из цифр. Кобол настолько древний, что даже числа в нём десятичные (если не указано обратное, USAGE IS COMPUTATIONAL).

Стандартизированного поля даты в Коболе нет, но самописные реализации всё же чем-то руководствовались. Код ACCEPT todays-date FROM DATE возвращает текущую дату системы в виде 6-значного числа формата YYMMDD. Если его сравнить с числом из представления выше, то легко понять, наступил этот день или нет. Функция CENTURY-DATE, которая возвращала дату в виде 8-значного числа YYYYMMDD с указанием века, появится в более поздних стандартах языка.

По дате формата YYMMDD удобно сортировать: сравнение, что случилось раньше, сводится к арифметической операции.

С наступлением нового века сортировка сломается: год 00 должен быть позднее 99, а не наоборот. Число 000101 окажется меньше, чем 991231, то есть 1 января 2000 года программа скажет, что 31 декабря 1999 ещё не наступило. Попытка вычислить срок между этими датами вернёт почти 100 лет, а не 1 сутки.

Даже при обновлении старых систем формат даты не меняли, чтобы сохранить совместимость с существующими базами данных и другими компонентами. Программист не задумывался, что его софтом будут пользоваться через 20—30 лет. Для него «ошибка 2000 года» звучит ещё более отдалённо, чем для нас «переполнение 32-битного Unix-времени». Последнее случится уже в 2038 году и исправлено в Linux для 32-битных систем только с версии ядра 5.6. Но почему-то мы не торопимся обновлять старые маршрутизаторы.

Часть «вины» лежала на распространении двоично-десятичного кода (BCD), в котором каждый разряд десятичного числа будет записан 4 битами. Двоично-десятичный код обязан популярности банковской сфере из-за скорости и предсказуемости при округлении чисел — в нём невозможна ситуация, когда 0.1 + 0.2 выдаст ответ 0.30000000000000004. Бухгалтеры и финансисты слегка нервничают, когда появляются артефакты округления двоичных чисел с плавающей запятой. Поэтому процессоры для бизнес-применений поддерживали нативную обработку двоично-десятичного кода, и переводить числа между формами записи приходилось меньше.

Дата из 6 цифр уместится в 3 байта. Конечно, надёжнее будет сконвертировать дату в одно двоичное целое число. Но конвертация потребует сложных математических действий: это долгие циклы или таблицы. Такое сложнее перевода BCD в десятичный код за линейное время, иногда даже одной машинной инструкцией, предусмотренной производителем чипа. Двоично-десятичный код добавляет в запись даты лишь 1—2 лишних байта, но избавляет от 5—10 ассемблерных инструкций, в которых тяжело разобраться и легко запутаться.

В восьмидесятые программисты мира бизнес-приложений ЭВМ размером с шкаф переходили на настольные персональные компьютеры, но сохраняли выработанный менталитет. На ранних 8- и 16-битных персоналках их встречала знакомая аппаратная поддержка двоично-десятичного кода.

Наконец, часть проблем касалась уже календаря. Если 2000 год високосный (он делится на 400), то 1900 — нет. В реальном 2000 году есть 29 февраля. Если компьютер посчитает, что на дворе 1900, после 28 февраля наступит сразу 1 марта.


Внимание общественности к ошибке смены веков привлёк канадский программист Питер де Ягер. В 1978 году он, на тот момент сотрудник IBM, заметил, что компьютер может принять два нуля за 1900 год. На жалобу Питера руководство отмахнулось: зачем думать о проблеме, которая не актуальна в ближайшие 22 года? К 2000 году ошибку точно исправят, говорили ему.

К 1989 году ситуация не изменилась. На тот момент де Ягер работал в компании, которая развернула у себя продукт Professional Office Systems. 1 января 1990 года система «слегла»: в приложении на год была отведена одна цифра. Вновь вспомнивший про 2000 год Питер ради эксперимента сдвинул время на личном компьютере на несколько минут до полуночи 31 декабря 1999 года. Через десять минут дата сменилась на 1984 год.

В 1993 году де Ягер пишет в журнал Computerworld статью на три страницы, с которой всё и началось. Заголовок «Doomsday 2000» («Судный день 2000») привлёк всеобщее внимание к Y2K. Поначалу красочные описания грядущей беды не воспринимали всерьёз, но с приближением 2000 года де Ягер завоевал репутацию эксперта в вопросах цифрового армагеддона. С тех пор Питер занимался исключительно проблемой дат.

uditluzlb0qkdhrb-zipi_68-rm.jpeg
Обложка журнала «Тайм» от 18 января 1999 года

Впрочем, странности обработки дат в индустрии замечали и без каких-либо статей. Мартин Томас, управлявший командой устранения бага Y2K в Deloitte Consulting, рассказывал, как в конце восьмидесятых британская сеть продуктовых магазинов получила партию консервов. Система учёта приняла срок годности 01/00 за январь 1900 года и потребовала утилизировать 80-летний неликвид.

В середине 1997 года автокомпания «Крайслер» для теста перевёла все часы сборочного завода в Стерлинг-Хайтсе на 31 декабря 1999 года, что преподнесло немало сюрпризов. Невозможно было выплатить зарплату. Система безопасности просто отключилась: никто не мог ни зайти, ни выйти.

К концу десятилетия в компаниях появляются команды инженеров, которые занимаются только анализом и исправлением ошибки Y2K. Проблему вывели даже на межгосударственный уровень: в 1998 году на саммите «Большой восьмёрки» все участники согласились с опасностью бага. 19 октября 1998 года президент США принимает акт «Year 2000 Information and Readiness Disclosure Act». В России вопросом совместимости Y2K занимались государственный комитет по связи и информатизации и специальная правительственная комиссия.

Не обошлось без паники. Популярность сценариев конца света присутствовала в американском сознании на протяжении всех девяностых. Журналисты и писатели с упоением начали рисовать картину цифрового Судного дня. Даже крупные и уважаемые новостные издания рекомендовали запасаться водой и продовольствием.

hu8ektb9ga9c7sw9wc8skdqpxzm.jpeg
Y2K-постапок с элементами советов домохозяйке

Литература ошибки 2000 года варьировалась от подробных руководств по выживанию до художественных романов о мире после глобального компьютерного сбоя. Фикшн-произведения рисовали чудовищное будущее. 1 января из неба выпадают осадки в виде пассажирских авиалайнеров, а на каждой атомной электростанции случается Чернобыль местного масштаба. Взрывается бытовая техника, схлопывается глобальная финансовая система, отключаются электросети и телефоны. Затем из этих ингредиентов сооружается сценарий депрессивного разложения цивилизации в голодное полуфеодальное общество с разгулом жестокой организованной преступности.


Короткометражка с Леонардом Нимоем эксплуатирует популярную тему страха ошибки Y2K

Справочники выживальщика подробно расписывали, как спасаться при упадке цивилизации. Они почти ничего не говорили о попытках исправить баг и мало обсуждали теорию за ошибкой 2000. Вместо этого книги сразу же углублялись в страшилки и советы для мира после закрытия банков и разгула безработицы. Кто-то просто советовал покупать золото. Остальные тратили страницы на перечисление предметов и ресурсов, которыми нужно срочно запасаться.

Впрочем, как вспоминают работники книжных магазинов, эта литература не пользовалась популярностью и исчезла с полок после наступления 2000 года.

Наборы переживальщика Y2K — постарались предприимчивые дельцы — имели хотя бы какую-то практическую ценность. Сухой паёк сохранит питательные качества вне зависимости от формата компьютерных данных, пусть даже его продают по завышенной цене, пытаясь оседлать волну истерии.

pcmuyl-ywzdj5jxrht9yd5livsc.jpeg
Готовая к апокалипсису 2000 года семья из Колорадо


Добавление двух цифр решает проблему на 8000 лет.

01 EMP-HIRE-DATE.
03 EMP-HIRE-DATE-YR.
05 EMP-HIRE-DATE-CC PIC 99.
05 EMP-HIRE-DATE-YY PIC 99.
03 EMP-HIRE-DATE-MM PIC 99.
03 EMP-HIRE-DATE-DD PIC 99.

Но длина записи в Коболе ограничена. Если нужно вставить два байта по центру, придётся переписать весь файл с нуля в новый и заменить оригинал исправленной копией. Код приложения, которое обрабатывает этот файл, тоже придётся скорректировать. Процесс сулит долгое тестирование и отключения. Не всегда базу данных получается вот так тормознуть.

Относительно небольшое обновление кода программы не так изящно и добавляет лишь несколько десятилетий жизни, но менее затратно по времени. Пусть если год меньше 50, то это уже новый XXI век.

IF EMP-HIRE-DATE-YY > 50
MOVE 19 TO PRINT-HIRE-DATE-CC
ELSE
MOVE 20 TO PRINT-HIRE-DATE-CC.

Не каждые данные допускают уверенность, что даты до 1950 или после 2050 года невозможны. В некоторых случаях такие «костыли» продлевали жизнь всего на 20 лет. Это выяснилось в этом январе: кому-то приходили счета из 1920 года, не работало некоторое ПО.


В некоторых случаях Y2K исправляли не до 10 000 года, а на 9 столетий. Если 3 байта даты хранились в 4-битном знаковом числе, то в неиспользуемые полбайта влезет одна цифра для подписи века. Программы с таким патчем подвержены проблеме либо 2100, либо 2900 года.

Дату можно представить в виде числа дней, прошедших от точки отсчёта в прошлом. Число дней записывается в двоичное 14-битное число. Так можно представить 16 384 различных лет. Конкретные ограничения задаются выбором эпохи.

Иногда запись года не исправляли вовсе. Формат TLE командования воздушно-космической обороны Северной Америки описывает объекты на орбите Земли. До сих пор в нём указаны лишь 2 последних символа года. Любопытно, что на ситуацию непрямым образом могут повлиять компании спутникового Интернета, которые планируют запускать десятки тысяч аппаратов на орбиту. TLE рассчитан на пятизначное число объектов, поэтому истощение пула номеров потребует пересмотра всего формата данных.

Детали патчей военного оборудования по понятным причинам остаются секретом. Чаще всего в СМИ выпускали сообщения об успешной проверке на готовность к Y2K с помощью симуляторов и специальной тестовой среды. Иногда проходили полноценные боевые испытания. 1 мая 1999 года ВМС США запустили крылатую ракету «Томогавк». За день до пуска время на ракете было установлено на 29 февраля 2000 года, чтобы заодно проверить обработку високосного года.

kqlvfr4lmhnnsmon_vuynicalvg.jpeg
Лаконичный стикер готовности оборудования к 2000 году

А вот масштабного возвращения программистов-ветеранов с пенсии не произошло. Вместо ожидаемого призыва легионов коболистов компании часто ограничивались штатными работниками или аутсорсили исправления. При подготовке к 2000 году американские компании влили миллиарды в дешёвый труд фирм Infosys, Wipro и TCS. Неожиданным последствием Y2K стала популяризация фирм из Индии. В последующие годы индийский аутсорс станет нормой.


Сильно беспокоились об ошибке 2000 года всего 7% американцев. Опрос в декабре 1999 показал, что лишь каждый пятый планировал запасаться наличными. Кто-то боялся летать в последний день года. Питер де Ягер рассказывает, что 31 декабря провёл в полёте, чтобы показать безопасность патчей.

Утро 1 января «неприятно» удивило. Перебоев электричества не возникло, всё так же исправно шли финансовые транзакции, компьютерный баг не запустил межконтинентальные баллистические ракеты. Немедленно начался подсчёт потраченного «впустую». Точную сумму назвать затруднительно, хотя сам де Ягер оценивает мировые затраты в 300—400 миллиардов долларов. Некоторые банки, с его слов, тратили до 100 миллионов долларов.

Критика всё же имела под собой основания. Комиссии и эксперты перестарались и обещали откровенно несбыточное.

Мир не пал из-за неисправимых микросхем, в которых год представлен двумя знаками. Среди них — чипы BIOS некоторых компьютеров и многие микроконтроллеры. Их слишком много, все не заменить, утверждала страшилка. На деле эксперты Y2K как правило не имели опыта разработки аппаратного обеспечения — в лучшем случае они понимали в софте. Они не задумывались, что на этих микросхемах перевода и сравнения дат просто не происходит.

rmvani1jkks5xyr7gzd_yf45v_k.jpeg
Постеры про Y2K от Geek Squad в стиле фильмов категории «Б» пятидесятых планировали расклеивать на автобусных остановках, но лишний маркетинг просто не потребовался. Фото: Best Buy.

Другой пугающий сценарий предполагал развитие каскада отказов, распространяющихся от программы к программе и перекидывающихся на готовые к 2000 году компоненты. В реальности если одна подсисистема ошибочно выдаст год 1900, то другая, взаимодействующая с ней, либо передаст год 1900 дальше, либо выдаст ошибку, либо пометит год неверным.

Легко представить, как готовый к Y2K и уязвимый к багу 2000 года самолёты из-за неучтённого високосного дня 29 февраля 2000 года получают от компьютера разрешение на посадку на одну и ту же полосу. Но в веб-приложении одна неправильная запись в базе данных не начнёт гулять по всей системе словно вирус.

Обыватель не ощутил ни подготовку к багу, ни бессонную ночь на рубеже веков для команд технической поддержки, ни последствия непропатченных систем. Очевидцы и руководители команд устранения Y2K вспоминают незначительные сбои, но ничего катастрофичного или хотя бы особо интересного. Некоторые из принимавших участие в устранении бага объясняют малое число сообщений о сбоях тем, что компании просто не захотели бы трубеть о собственных неудачах.

Часть проблем всё же просочилась в СМИ. Вот лишь несколько компьютерных сбоев. Ни один из них не угрожал жизни людей.

  • Некоторые объекты использования атомной энергии сообщали о неполадках. Отказы датчиков температуры морской воды на АЭС в Японии описываются без подробностей, но характеризуются как мелкие и неопасные. На другой японской АЭС в полночь отключилась система оповещения. Похожие инциденты произошли на атомных электростанциях США. Неполадки быстро исправили.
  • Несколько спутников-шпионов США отключились и не работали трое суток. Вызвано это было не багом Y2K, а патчем для его исправления.
  • Пострадали финансовые учреждения. Сообщалось о многочисленных отказах при обработке транзакций старыми версиями софта CyberCash. Один из банков Чикаго был вынужден перевести выплаты медицинским страховщикам в ручной режим — на дискеты. Тысячи клиентов некоего голландского банка испытывали проблемы с софтом от Apple. Налоговики США с задержкой в сутки обработали 700 тысяч долларов.
  • Всё остальное создавало легко устранимые неудобства. В Австралии автоматы напечатали на автобусных билетах неправильную дату, и сканер билетов их не принял. Бессрочные банковские карты небольшого числа членов Golden 1 Credit Union по неизвестной причине истекли 31 декабря 1999 года.
  • Производители десктопного софта часто патчили только новые версии. К примеру, неправильно обрабатывает дату после 2000 года Access версии 2.0 (1994) и старше. Последнее было неприятно для пользователей Windows 3.0, в которой новые версии Access работали хуже. С другой стороны, эта операционка на тот момент уже выходила из употребления.


Кроме мелких неполадок в медиа сообщали о курьёзных случаях.

  • Первого новорождённого в 2000 году в Дании зарегистрировали столетним.
  • Клиент салона видеопроката в Нью-Йорке вернул кассету с фильмом «Генеральская дочь» вовремя, но получил штраф в 91 250 долларов за просрочку длиной в век. Ошибку немедленно исправили.
  • Перевод в 6 миллионов долларов от 30 декабря 1899 года поступил на банковский счёт жителя Германии. История умалчивает, как долго он продержался миллионером.
  • Подверженная багу 2000 года полицейская система превратила подростков в стариков. Криминальные сводки рассказывали о сексуальных домогательствах в отношении 83-летней женщины от 80-летнего мужчины и двух пропавших подростках в возрасте 83 и 84 лет.


Есть как минимум один случай серьёзной медицинской ошибки из-за бага Y2K. В одном из регионов Англии через несколько месяцев после наступления 2000 года было отмечено необычно много детей, рождённых с синдромом Дауна. Программа оценки неправильно посчитала возраст 154 беременных женщин и некорректно выставила группу риска для последующих исследований анмиоцентезом. Всего у матерей с неправильно определённой низкой группой риска появились 4 ребёнка с синдромом Дауна. Из-за неверной оценки высокого риска 2 аборта были проведены по ошибке.
В новом тысячелетии мир немедленно забыл про компьютерный баг обработки дат. Про него напоминали только стикеры «Y2K Compliant», которые клеились на готовую к новому веку технику.

Внешне ошибка 2000 года мало отличается от смены табло обменных пунктов c четырёх- на пятисимвольные при падении рубля. Уточнение даты до четырёх знаков выглядит как небольшое, пусть и дорогое в масштабах всей экономики исправление.

На корректировку ошибки потратили сотни миллиардов долларов. Без наглядных катастрофичных последствий усилия по патчу Y2K выглядели избыточными и излишне дорогими. Специалисты оправдывались, что проблема существовала и была исправлена. Кто-то просто радовался общественному вниманию к критической инфраструктуре и апгрейдам.

События, когда кончаются знаки, происходили и будут случаться в будущем. Переход с IPv4 на сети IPv6 призван избавить мир от дефицита интернет-адресов. Когда-то к телефонным номерам добавят ещё одну цифру. 19 января 2038 года для непропатченных Unix-систем наступит либо 1 января 1970 года, либо, из-за использования знаковой переменной, 13 декабря 1901 года.

У любого информационного проекта есть ограничения, но этого не нужно бояться. Если система выходит за рамки заложенных в неё допущений, это лишь свидетельствует о её незапланированной популярности.

ti6rgnmpxczqct-t5p8_ibxzx4g.png

По материалам Stack Exchange, Stack Overflow, архива минобороны США (1, 2), CelesTrak (1, 2), Popular Mechanics, блога Криса Уэстона, How-To Geek, Mental Floss, «Би-би-си», cs.swarthmore.edu, Fast Company, Inc.com, Computerworld, Cnet и Slate.

© Habrahabr.ru