Лучшие ошибки софта VII

Довольно смешная (не смешная для авторов, конечно) ошибка произошла несколько лет назад. Игра Aliens: Colonial Marines вышла в феврале 2013 года и быстро получила шквал критики. Ну очень сырой продукт выпустили. Нещадно бажило всё, от графики до AI. И вот спустя четыре с хвостиком года обнаружился символ, исправление которого привело к наизаметнейшему улучшению поведения монстров. Достаточно было заменить ошибочное «Teather» на верное «Tether». Тестирование? Не, не слышал.

Автомобильная индустрия вовсю напичкивает машины сложным софтом, потому очередная проблема не удивляет. Но масштаб последствий интересный. Итак, Fiat Chrysler Automobiles NV отзывает около 4.8M автомобилей в США по причине баги в круиз-контроле. Вернее, с ним-то всё хорошо. Просто при схождении звёзд в 15 моделях этот контроль потом не выключить, да ещё и замыкание происходит. В общем, веселье, если ты не за рулём.

Затрудняюсь оценить ущерб, но ошибка классическая, хоть в учебники. В 1978 году с помощью NASA начали исследовать озоновые дыры над Антарктикой. Датчики собирают данные, софт анализирует, дыры находятся. Уря-уря. Пока в 1985 году совсем другие ребята не обнаружили, что огромная дырень прошла мимо программы исследований просто потому, что в код влепили ограничение на верхние границы. Мол, если значение такое-то, то оно шибко толсто, так не бывает, явно ошибка датчиков. Оказалось, бывает и не такое.

На дне у Ларнаки с 1980 года лежит большой и красивый кораблик MS Zenobia. А лежит он там потому, что в софте, управляющем закачкой балластной воды, выстрелила бага, закачавшая слишком много воды слишком не вовремя. Жертв нет. Как и Зенобии. Зато дайверам раздолье, внесено в карты годных мест.

Долго колебался, добавлять эту историю или нет. Решил добавить, т.к. можно считать примером того, с какой стороны в софт может прилететь проблема и как легко всё испортить, не учитывая все векторы «атаки». На юге Финляндии 12 апреля 1997 года поезда не ходили целый час. Всё потому, что на клавиатуру упала скрепка. Упала под пробел и, как понимаю, накрыла контакты. Дальше я не понял причины (машина запрашивала логин три дня и переполнила винт?), но в итоге сигналы на железке были переведены автоматикой в «стоп». Ну всё и остановилось. В общем, учитывайте и такие случаи, да.

Лучшие ошибки софта VI

В 1992 году случилось то, что будут называть London Ambulance Disaster. Светлым головам в Лондоне пришла мысль, что диспетчеры Скорой помощи слишком медленно работают, надо автоматизировать. Автоматизировали. Пустили в production систему, которая на момент ввода в строй НЕ была проверена под нагрузкой, а также содержала 81 известную ошибку. И вообще всё было плохо-плохо (детальный отчёт в PDF, а более человекочитаемая версия другого автора вот тут). Если кратко, почти сразу после запуска система почудачила, отправляя экипажи куда попало, звонки тоже смешались, наконец, из-за минорной баги всё упало. Два дня реакция Скорой была крайне запаздывающая, что привело к 46+ смертям.

Бекапы, бекапы… Лейквуд (Колорадо), 1990 год, 27 февраля. Вылетает единственный (!) жёсткий диск у единственного (!) компьютера, что управляет городскими светофорами. Ну, вы поняли.

А вот следствие как ошибки софта, так и человеческой: с 2011 года по 2017 год в Англии не отправили пациентам и врачам около 709К писем. Иначе говоря, шесть лет косячили с отправкой писем, содержащих в числе прочего информацию, отсутствие которой могло повредить здоровью 1700+ человек. Куда смотрели админы? Куда смотрели врачи? Куда смотрели пациенты? Отличный кейс для дискуссий на тему «мониторинга людьми».

У ошибок много следствий, после которых нельзя не задумываться о том, где заканчивается толерантность к «ну а чё, с каждым бывает, накосячил, да». Например, 4 февраля 2017 года на софт Florida Department of Children and Families накатили апдейт. И только 28 апреля заметили, что около 1500 обращений на Florida Abuse Hotline (горячая линия, на которую сообщают о насилии над детьми) не было обработано системой должным образом. В базу шло, а дальше нет. Потом, конечно, это стали поднимать из беклога, но такая долгая задержка следователям не сделала жизнь проще. С каждым бывает, да?

20 декабря 2017 года по всей России перестала работать часть кассовых аппаратов АО «Штрих-М», ООО «РР-Электро», ООО «Тринити» и ООО «НТЦ Измеритель». Масштаб для примера — в Алтайском крае вырубило около 20%, всего же по России около 80К касс. Всё было так грустно, что в кои веки власть пошла навстречу и ФНС оперативно разрешила магазинам отпускать товар и услуги без использования касс. Починкой занимались 2500 сервисных центров и 20000 инженеров. Потери бизнеса неведомы (примерно насчитали 2.5+ миллиарда рублей). Нагнал жути? А всё потому, что где-то в коде неправильно написали конвертацию даты: «при конвертации даты 20.12.2017 во внутренний формат устройства операция «печать чека» становилась циклической». При этом, как я понял, проблема возникла на стыке интеграции с софтом, который работал со «старым» форматом даты вида dd.mm.yy (при переходе на 2000-й год всему плохеет) вместо dd.mm.yyyy.

Лучшие ошибки софта V

В какой-то мере это ошибка и софта, потому включаю: Intel в 90-х умудрилась выпустить в процессорах Pentium ошибку деления над числами с плавающей запятой. В историю вошло как Pentium FDIV bug и обошлось в результате в $475M — процессоры не пропатчить, пришлось отзывать. Как аукнулись репутационные риски — не подсчитать, но наверняка в AMD за происходящим следили с большим интересом. Характерно, что в Intel знали о проблеме, но как-то… не считали её важной для рынка. Подумаешь, ошибочка. Кто будет страдать, тому камушек и заменим. Но малой кровью обойтись не получилось.

27 марта 2008 года в Хитроу открывали терминал №5. Тут же (хорошо, не прям вот тут же, успели отменить 34 рейса, но) закрыли, потеряв £16M, багаж, пассажиров и нервных клеток без счёта. Сложно тут выделить одну ошибку. Официальные лица говорят, что не успели дотестировать, выкатили всё в сжатые сроки, жизнь отличается от тестирования и т.д. Вроде бы и да. Но кейс «вручную убрать зарегистрированный багаж из системы» можно было и до релиза проверить, а не обнаружить, что он завешивает всё. Надо сказать, битый воробей лучше двух небитых ворон — с 2012 года терминал уже пять раз получил Skytrax World Airport Awards как лучший терминал в мире.

Самую забавную ошибку допустил Роберт Моррис в 1988 году. Вы Роберт. Вы написали вирус, который должен атаковать только VAX-компьютеры, а также с разумной периодичностью решать, плодиться ему или нет. Запускаете. Для подсчёта разумной периодичности слишком маленькое число, для VAX слишком портируемый код. Потому под ударом оказались 6K+ узлов тогда ещё ARPANET (энто как сейчас половину интернета заразить), ущерб на $100M, суд, условные 3 года, штраф на $10K, 400 часов общественных работ. А также попадание в историю. Кстати, Роберт не приуныл. Далее это соавтор будущего Yahoo! Store, соучредитель Y Combinator и вообще профессор в MIT.

В начале января 2010 года банковскую систему Австралии поразил неприятный баг (который в СМИ описывался как «вот то, что могло быть в 2000!») — условная «система» решила, что наступил 2016 год и потому миллионы кредитных карточек просрочены. В основном страдал Bank of Queensland, но задело и остальных. Ущерб не подсчитать. И вот тут меня накрыло дежавю. Полистал архивы. Точно. В начале 2010 года с миллионами карточек влетели и немцы. Плохой, плохой год.

Каждый опытный программист знает, что плохо написанные сервера надо часто ребутать. В какой-то момент этот опыт переняли и эксплуататоры Боинга 787. Смешно (немножко страшно тоже, впрочем), но его надо было ребутать раз в 248 дней, т.к. [по догадкам] система контроля содержала integer overflow (248 дней в секундах не помещаются в int). Вы этого не знали, потому не боялись. А теперь можно подумать ещё и о том, как такие баги проходят через жесточайшие этапы тестирования в Боинге.

Внеплановым шестым абзацем списка опишу не багу. Наверняка банальный человеческий фактор, но любопытен тем, как ошибки всё более глобализуются и входят в быт. В 2015 году в IT-департаменте Starbucks кто-то удалил одну таблицу. После чего бариста в кофейнях США и Канады три часа не могли воспользоваться терминалами. Напитки при этом отпускали (ура пятнице!). Сторонняя оценка утверждает, что потери составили несколько миллионов долларов. Можно также ещё подумать об ответственности разработчиков и админов — любой твой шаг аукнется на всю планету, а пользователь тут же ощутит это, находясь на другом континенте.

Лучшие ошибки софта IV

Скрытые файлы. Все знают о том, что файлы, чьё имя начинается с точки, считаются “скрытыми”. Можно поспорить о том, насколько это удобно и полезно, но есть такое. А на самом деле это бага, с которой мы можем поздравить Кена Томпсона или Денниса Ритчи. Кратко: наш мир изменила вот эта строка — “if (name[0] == ‘.’) continue;”

Казалось, после Therac-25 любой софт, облучающий людей радиацией, должен проходить многослойный контроль с гарантией годности в 100%, но нет. В 2000 году в Panama’s National Institute of Oncology умудрились знатно перегаммаоблучить 28 пациентов, от чего 5 потом умерли.
Фишка в том, что ошибка заключается в отсутствии защиты от дурака. Пациента перед облучением обкладывали щитами. Софт оперировал максимум четырьмя, а вот медикам нравилась конфигурация из пяти. Потому медики научились обманывать софт, рисуя на схеме один (!) щит с отверстием посередине. Не учли только то, что результат формул, считающих дозы облучения, тоже менялся. Такая вот глупость.

В 2004 году в Великобритании произошло… как бы так ловчее… Сначала Department for Work and Pensions заплатил £152M за создание софта для автоматизации работы Child Support Agency. Понятная трата, понятные цели. Софт был создан. И в этот нежный момент DWP решил реформировать CSA. Спасибо им за великолепный пример того, как одна огромная административная бага привела к сотням (в СМИ туда-сюда носят число в 500+) технических “багов”, а также к утроению суммарных трат на компенсацию такого фейла.

Високосный год заслуживает отдельного поста, но пусть так. Все программисты знают, что его (год) следует учитывать, но всегда находятся те, кто не смог.
В Новом 1997 году алюминиевый завод Tiwai Point схлопотал убыток в почти миллион долларов потому, что софт был озадачен 366-м днём (решил, что такого не бывает) и отправил в даун 660 компьютеров, заодно и плавильни остудились. Спустя два часа та же фигня произошла с заводом Comalco’s Bell Bay в Тасмании.
Что характерно, подобного рода ошибки правятся обычно в пару строк, но вреда могут нанести не хуже какой-нибудь стратегической ракеты.

Завершаем выпуск такой же классикой ошибок. Почему в 1997 году Social Security Administration в San Bernadino не смогли осилить свыше 100К отчётов о заработной плате? Потому, что софт был написан для няшного мира белых американцев с их нормальными именами. А вот всякие азиатские, латиноамериканские, индейские и прочие ФИО в этот мир не умещаются. Потому de la Rosa и Park Chong Kyu остались за бортом. Также софт сломался на женщинах, поменявших фамилию после замужества.
Затрудняюсь оценить прямой убыток, но в систему не поместилось отчётов на общую сумму в $234 миллиарда.

Лучшие ошибки софта III

21 сентября 1997 года ответственный человек вбил нолик в базу данных американского авианосца Yorktown, чем на три часа превратил эту махину в печально дрейфующее корытце. Классика division by zero error, из-за которой по цепочке падений всякого софта на борту проблема докатилась до двигателей, которые тоже остановились. Корытцем авианосец стал не во время чего-нибудь боевого, потому всё обошлось.

В Калифорнии 2011 года ошиблись интереснее. Тюрем много, сидят в них толпами. Решили проредить ряды сидельцев, выпустив на волю безобидных. Проредили, выпустили. Только вот из-за баги в софте, отвечающего за личные дела, около 450 выпущенных оказались отнюдь не безобидными воришками, но вполне способными на насилие (некоторые из них потом это подтвердили действием). Устроили себе холодное лето пятьдесят третьего, в общем.

Не самый опасный, но весьма неприятный баг случился с немецкими банковскими карточками в 2010 году. В карточках микрочип. В 30 с лишним миллионах карточек этот микрочип крякнул в момент Нового года, не в силах распознать 2010-й. Всем было неприятно. Затрудняюсь подсчитать ущерб, но то, что в Новый год треть населения Германии не смогла оплатить покупки, мелочью не кажется.

И снова 2010-й год, на сей раз в Великобритании. Есть база людей, готовых пожертвовать свои органы. По состоянию на тот год в базе было около 17 миллионов человек. Проблема в том, что у ~800,000 доноров орган мог быть записан ошибочно. Как понимаю, вскрылось после того, как у 25 пожертвовавших удалили не то. Масштаб и ущерб не очень велик, наверное, но показателен. Довольно простая база данных. Вряд ли сложный интерфейс. Наверняка ошибки в ней простые и глупые. Но на кону оказалось человеческое здоровье.

Завершаем тем же 2010-м годом. 11-го января американские инженеры обновили софт у наземных GPS-станций, чтобы те шли в ногу с новым поколением спутников. Спустя две недели обнаружилось, что обновление фактически сделало слепыми от 8,000 до 10,000 военных GPS-приёмников без учёта пострадавших железок в зонах боевых действий (Ирак и Афганистан). Чтобы понять уровень ошибки, надо вспомнить про наличие этих вот GPS-приёмников во всём современном стреляющем — от джипов и танков до истребителей и ракет.

Лучшие ошибки софта II

Mars Climate Orbiter, 1998 год — отличная иллюстрация того, чем заканчивается разобщённость команд разработки. Железка должна была подкрасться к Марсу, выйти на орбиту и оттуда следить за интересным. Так и произошло бы, не используй разработчики двигателя метрическую систему СИ, а разработчики софта британскую метрическую систему. Состыковаться не получилось на $327M — спутник распался в атмосфере, промахнувшись на разницу между ньютонами и фунт-силами.

В 2005 году крупнейший британский продуктовый ритейлер J Sainsbury PLC потерял $526M. История покрыта мраком, удаётся найти лишь хвостики произошедшего. Выкатили систему автоматизации полезной логистики, упрощающей поступление товаров со склада на полки магазинов. Вместо автоматизации получилась блокировка, ничто никуда не поступало. Ритейлер срочно нанял ~3000 “клерков”, которые вручную обеспечивали хоть какое движение, но уже было поздно. Суммарный ущерб от плохой разработки, простоя сети, дополнительного найма и прочих убытков влетел в сотни миллионов.

15 января 1990 года ~60К пользователей AT&T не смогли никуда позвонить. И не могли ещё девять часов. Всё это время 114 свитчей компании хороводили reboot, успев заблокировать ~50M звонков и лишить AT&T около $60M прибыли. Ущерб второго порядка (у пользователей) составил и того больше. А всё потому, что за месяц до катастрофы программисты обновили софт на свитчах, попутно влепив одну строчку с ровно одной багой. Выстрелило через месяц. Казалось бы, всё очень, очень хорошо тестировали.

Осенью 2003 года госпиталь St. Mary’s Mercy в Мичигане убил около 8500 человек. Хорошо, что “на бумаге”, а не натуральным образом. И снова последствия миграции. Был старый софт. Перешли на новый софт. В процессе переноса данных вместо кода “01” (правильный) влепили “20” (неправильный), что привело к виртуальному геноциду. Было бы смешно, если бы не массовая же рассылка уведомлений о смерти в страховые компании, блокировка выплат и т.п.

Должен был быть первым в списке, но я начал с финансовых потерь, а тут планета на кону. 26 сентября 1983 года Станислав Петров спас нас всех. Я тогда уже был, потому мог краем глаза увидеть грибки ядерных взрывов, если бы Петров (в тот момент дежурный командного пункта Серпухов-15) поверил ложному срабатыванию космической системы раннего предупреждения и дал ход последовательности, завершающейся World War III. Не поверил и не дал. Спасибо. Не спасибо тем, кто не учёл, что датчики спутника могут настолько засвечиваться солнечным светом, отражённым от высотных облаков. Не думаю, что проблема железная (исправили сверкой данных с других спутников, как понимаю), потому с натяжкой в софт.

Лучшие ошибки софта I

Arian-5. 4 июня 1996 года произошёл первый пуск ракеты-носителя Ариан-5. Происходил 37 секунд, после чего ракеты не стало. Всему виной legacy и разработчики. Взяли кусок кода из Ариан-4 и перетащили в код Ариан-5. Все так делают, но эти ребята не в полной мере учли, что ракеты разные. В какой-то момент компьютер Ариан-5 решил, что всё плохо, ну и дал серию неверных команд. Ракеты не стало, а вместе с ней и дорогостоящего спутника Cluster. Цена ошибки — $370M.

В 2012 году US National Grid Gas Company промигрировала со старой SAP на новую ERP. Всё прошло не очень удачно. Оказывается, новая система обрабатывает счета с адовыми глюками, ну и вообще сделана совсем не так, как хотелось бы. Ясно, что это не одна красивая бага, но case попал в выборку для иллюстрации: бюджет на разработку был в $383M, а вот доработку оценили в $945M. Рядышком судебные дела от тех, кому не то выплатили и не так насчитали. Ничёси выкатились в production.

2012 год, 1-е августа. Компьютеры Knight Capital Group (один из крупнейших трейдеров США) начинают биржевые сделки. И за 45 минут причиняют убыток в ~$400M. Вы не будете смеяться, но снова legacy! Если кратко, то при наливке нового софта на восемь серверов не долили на один. И всё стало плохо. Кусочек старого мамонта нанёс ответный удар.

Во сколько долларов обошёлся США blackout 2003 года? Если верить отчёту, в $6.4 миллиарда. Несколько штатов осталось без электричества, система обсыпалась доминошками, полетело множество голов. К таким сложным катастрофам очень редко приводит одна причина, но важно, что в данном случае одной из основных причин был баг в General Electric Energy Unix-based XA/21.

Mariner-1. Миссии космических штуковин навечно в списках крупнейших багов. 22 июля 1962 года стартанул, но через 293 секунды полёта всё крякнулось. Не очень понятно, насколько публичная версия о “пропущенном дефисе” верна, но кажется фактом то, что ошибку допустили при переносе формул с бумажки в код. Опечатались на $18.5M (сейчас это около $140M), в общем.