Спустя двадцать лет после ажиотажа и страха вокруг ошибки 2000 года, что на самом деле произошло и что мы узнали?

Сразу после 7 часов утра в субботу, 1 января 2000 года, у моей кровати зазвонил рабочий телефон. Это было неожиданно. Большинство моих клиентов еще не приступили бы к работе после рождественских каникул, а те, кто заплатил за круглосуточное покрытие, не стали звонить мне напрямую.

Экран моего телефона показал, что это был генеральный директор местной производственной компании. Я написал программное обеспечение для управления их производственной линией несколько лет назад, и теперь они платят нам за поддержку и время от времени обновлять его для них.

«Мэтт, линия разорвана, и она больше не поднимется!» - было первое, что он сказал. Это не было редкостью. Завод располагался далеко от диспетчерского пункта, и нам уже пришлось защищать от молнии длинный кабель, который шел от компьютера к огромным производственным станкам примерно в 200 метрах от нас.

«Ты проверил связь?», - спросил я, ожидая, что неисправен кабель.

«Ага, все проходит», - ответил он. Мы также держали на месте полный резервный компьютер, который можно было заменить, если что-то пойдет не так с основным.

«Вы перешли на резервную машину?» - был мой следующий вопрос.

"Да. Та же проблема », - ответил он, -« Линия просто не работает. Все выглядит нормально, но никаких инструкций не отправляется ».

«Я буду через 30 минут», - сказал я и положил трубку. Когда я ехал на сайт, я пытался создать мысленную модель того, что могло происходить. Ошибка 2000 года не давала мне покоя, но мы обновили все компьютеры, и производственные линии были огромными и неповоротливыми, но в конечном итоге они просто подчинялись всему, что происходило по кабелю. Мы уже проверили у производителей, что их чипы не содержат ничего даже отдаленно зависящего от даты. Это была загадка. И досадно, потому что у нас еще не было достаточной пропускной способности Интернета, чтобы поддерживать этих клиентов удаленно!

Когда я прибыл на место, менеджер с энтузиазмом встретил меня и провел в диспетчерскую. Это было грандиозное название для того, что фактически было Portacabin, расположенным по одну сторону от разросшейся производственной и дистрибьюторской компании. В «диспетчерской» находился старый стол, на котором стояли два компьютера и два светильника, вмонтированные в коробку на стене: зеленый, чтобы показать, что производственная линия работает, и красный, который теперь горит, когда линия была остановлена.

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

За двенадцать месяцев до 31 декабря 1999 года моя компания проверила сотни, если не тысячи, компьютеров и программных систем на соответствие требованиям 2000 года. Мы обновили BIOS, исправили код и провели детальное моделирование на критически важном оборудовании наших клиентов, чтобы быть готовыми. Так называемая ошибка 2000 года возникла из-за того, что программисты использовали двузначные даты для обозначения года. Это было нормально, когда мы имели дело с датами в 20 веке, и многие из нас не ожидали, что наш код все еще будет использоваться в производственной среде, когда наступил 2000 год. Многие старые BIOS и программы, которые зависели от двузначного числа лет, представляли 2000 год как 1900 - или, в некоторых случаях, 19100. Я лично просмотрел несколько сотен тысяч строк исходного кода, чтобы убедиться, что эта ошибка была исправлена.

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

Мой единственный практический опыт работы с системой, выходящей из строя из-за ошибки 2000 года, - и это было в программе, которую я написал!

Когда я просмотрел код, там - глубоко внутри функции, которая отправляла команды производственным машинам - была двузначная дата. Код (на C) выглядел примерно так:

if (current_year >= 98)
{
  // Call function to send program
}

В другом месте current_year получил системную дату и вернул две последние цифры. Моя память не идеальна, но я знал, что не вставлял этот код. Я спросил менеджера, знает ли он что-нибудь об этом. Он неловко переминался с ноги на ногу, а затем сказал, что некоторые работники отправляли старые программы на машины, что вызывало проблемы. Каждая программа начиналась с номера версии, включая год. Они хотели запретить работникам использовать программы до 1998 года.

«Но я не писал этот код», - настаивал я.

«А… да…», - ответил он, покраснев, «у нас был парень с опытом работы (стажер), и он сказал, что может исправить это, не платя вам, ребята…»

Теперь все обрело смысл. Исправление, перекомпиляция и тестирование кода заняли короткое время, и наш счет был оплачен безропотно.

Вот и все: мой единственный практический опыт работы с системой, выходящей из строя из-за ошибки 2000 года, и это было в программе, которую я написал!

Но я думал, что ошибка 2000 года - это сплошная шумиха ...

В течение нескольких недель и месяцев после 1 января 2000 года, когда самолеты не падали с неба и цивилизация не вернулась к доисторическому обществу, беспокойство сменилось презрением. Некоторые СМИ обвинили ИТ-индустрию в запугивании и создании массовой истерии из-за проблемы, которая в конечном итоге не материализовалась.

Это убеждение игнорирует два ключевых момента:

  1. Были проблемы из-за ошибки 2000 года! 1 января 2000 года 154 беременным женщинам, которые были пациентами Северной больницы общего профиля в Шеффилде, прислали неверные результаты теста на синдром Дауна. Им ошибочно сказали, что они были в группе повышенного риска из-за того, что компьютеры неправильно рассчитали их возраст. На основании этих результатов две женщины прервали беременность. В Японии оборудование радиационного контроля вышло из строя в полночь, и аналогичные проблемы меньшего масштаба были зарегистрированы в Соединенных Штатах и ​​Франции.
  2. Причина, по которой глобальный эффект 1 января 2000 г. был (относительно) незначительным, заключалась в беспрецедентном международном сотрудничестве стоимостью от 200 до 858 миллиардов долларов. То, что эффект 2000 года был настолько приглушен 1 января, был результатом огромных и хорошо скоординированных закулисных усилий. Как пишет The Guardian в своем специальном отчете:

Другими словами, компании и правительства не тратили деньги на решение проблемы, которой не существовало. Тот факт, что небо не упало на вас, не означает, что проблемы 2000 года не было, но серьезные проблемы удалось предотвратить. Так далеко.

Были ли там паника и спекуляция? Да, конечно. Я знал, что одна компания взимает сумму, эквивалентную 250 долларам, за бесплатный чек и наклейку на лицевую панель компьютера. К сожалению, всегда будут люди, которые охотятся на страх перед другими. Однако проблема была реальной. Мой собственный небольшой опыт доказывает, что, если бы с ошибкой не справились так хорошо, все могло бы быть намного, намного хуже.

Что мы узнали?

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

Во-первых, мы лучше работаем вместе. Международные скоординированные усилия, объединившие всю отрасль, а также правительства и внешние заинтересованные стороны, доказывают, что мы можем решить основные проблемы, если приложим все усилия. Это было первое настоящее испытание относительно молодой индустрии, и тот факт, что люди потом шутили по поводу «отсутствия событий 2000 года», показывает, что мы прошли. Это заставляет меня задаться вопросом, насколько можно было бы добиться прогресса в решении других проблем, стоящих перед нашей планетой, если бы у нас был такой же уровень сотрудничества.

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

Я помню одного клиента, который управлял всей производственной линией на 8-битном домашнем компьютере 1980-х годов. Мы дали им предложение переписать программу, но в конце концов они решили купить новый компьютер и запустить программу в эмуляторе. Насколько я знаю, они все еще могут управлять своими системами, используя программу, которой уже почти 40 лет. Поэтому разработчикам полезно делать меньше предположений, особенно в отношении долговечности нашего программного обеспечения.

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