Что ж, настало время страшных историй. И сегодня у нас крайне печальная страница как из истории медицины, так и из истории промышленного программирования – случай, вошедший в историю под названием "худшая программная ошибка в истории человечества".
Предисловие
Вычислительная техника окружает нас повсюду, являясь видимой частью нашей жизни. Компьютеры, смартфоны стали весьма привычными бытовыми предметами, и ни у кого не возникает сомнений по поводу того, что их ценность заключается не только в физической начинке, но и в сопутствующем программном обеспечении. Однако мало кто задумывается о том, что благодаря программам работает и фактически вся промышленность, транспорт и многое другое. Программы управляют самолётами, автомобилями, промышленными роботами, заводским технологическим и даже медицинским оборудованием. Но оператор оборудования, как и пользователь персональных вычислительных устройств, имеет доступ лишь к пользовательскому интерфейсу и набору команд для непосредственного выполнения своей работы, не имея возможности заглянуть в прошивку (что в любом случае выходило бы за рамки его знаний и компетенции). Таким образом, прошивка оборудования является неотъемлемой его частью, играющей важнейшую роль в функционировании, но остающейся в тени.
И история Therac-25 наглядно показывает, что программное обеспечение – это не просто некая невидимая сущность – это именно то, что заставляет оборудование работать и выполнять свои функции. А незамеченные ошибки в коде на стороне производителя могут приводить к поистине катастрофическим последствиям.
История создания аппарата
1982 год. В серию выходит новейший аппарат лучевой терапии Therac-25, созданный канадской госкорпорацией AECL ("Корпорация по атомной энергии Канады"). Стоит отметить, что метод лечения раковых опухолей лучевой терапией появился сравнительно недавно – внедрение в медицину началось в 1950-х годах, а эффективность значительно повысилась только в 1970-х годах, благодаря изобретению компьютерной томографии, которая позволила более точно определять границы опухолей. В общем, лучевая терапия на тот момент являлась достаточно инновационным методом, но уже активно использовавшимся на практике для лечения пациентов.
Суть метода лучевой терапии заключается в облучении раковой опухоли ионизирующим излучением, что приводит к уничтожению раковых клеток и снижению темпов роста опухоли. При отсутствии в организме метастаз, этот метод в совокупности с другими приводит к хорошим результатам лечения.
Линейный ускоритель Therac-25 был уже третьим аппаратом в серии: его предшественниками являлись Therac-6 начала 70-х годов и последующий за ним Therac-20. Числа в названии аппаратов указывали на максимальный уровень энергии электронных и рентгеновских лучей в МэВ. Чем выше был уровень энергии при терапии, тем эффективнее и глубже оказывалось воздействие на опухоль. Therac-25 был более компактен чем его предшественники, гибок в настройках. Первый прототип, являющийся полностью аппаратным, появился в 1976 году. В конце 1982 г. была готова коммерческая версия, которая полностью управлялась с помощью компьютера. Итого пять машин было установлено в госпиталях США, и Therac-25 начал свою работу по спасению жизней онкологических больных.
Что же могло пойти не так?
Загадочные инциденты
Therac-25 успешно выполнял свою миссию по спасению онкобольных. Однако затаившиеся в системе опасные ошибки ждали своего часа.
1. Июнь 1985, пациентка Кэти Ярбро
61-летняя Кэти Ярбро была направлена на лучевую терапию после удаления опухоли из груди. Ей была прописана доза облучения в 10 МэВ в область ключицы. Когда началась процедура, сильный жар пронзил область, на которую воздействовал аппарат. Процедура должна была длиться всего несколько секунд и быть совершенно безболезненной, поэтому реакция, произошедшая у Кэти, выбивалась из ожидаемой. "Вы обожгли меня!" – заявила женщина вошедшему в комнату технику, на что тот удивлённо ответил, что такое невозможно. Кэти вернулась домой. Однако область, куда воздействовало излучение, в течение нескольких дней покраснела и начала сильно болеть. Покраснение перекинулось с груди на спину. Всё выглядело так, будто ожог прошёл сквозь тело пациентки, как это бывает при лучевых ожогах. Плечо Кэти опухло, и боль стала настолько невыносимой, что невозможно стало даже шевелить рукой. Несмотря на растерянность врачей и непонимание ими причин инцидента, стало очевидно, что необходима консультация с производителем оборудования. После проведённой консультации, физик больницы рассчитал дозу, полученную Кэти, в 15-20 тысяч рад, при смертельной дозе в 1000 рад и ожидаемой терапевтической дозе в 200 рад. Грудь Кэти пришлось удалить, руку и плечо обездвижить. Женщина до конца своей жизни страдала от хронических болей.
2. Июль 1985, пациентка в Онтарио
В том же году, пациентка 40 лет с раком шейки матки попадает в больницу в Онтарио, и так же, как и Кэти, ожидает процедуру лучевой терапии на аппарате Therac-25. Новенький аппарат работал примерно полгода в данной клинике. Через 5 секунд после начала лечения аппарат вывел сообщение об ошибке и перешёл в состояние «Пауза процедуры». Система дозиметрии вывела на экран сообщение «Доза отсутствует». Оператор повторил попытку, нажав клавишу "Продолжить", надеясь что на этот раз пациентка получит необходимую для неё дозу. Однако сообщение о паузе и отсутствии дозы повторялось, и после ещё пяти неудачных попыток, оператор был вынужден вызвать механика, который не обнаружил никаких неисправностей.
Но на самом деле всё это время аппарат работал, облучение пациентки происходило, и женщина почувствовала сильный ожог. Её бедро в течение нескольких дней после процедуры покраснело и стало сильно болеть. Пациентка скончалась через несколько месяцев из-за победившего её организм рака, но если бы она не умерла, ей пришлось бы ампутировать ногу из-за переоблучения. Общая доза радиации, полученная пациенткой, оценивается от 13 до 17 тыс. рад.
3. Декабрь 1985, пациентка в Вашингтоне
Информации по этому инциденту мало, но известно, что результатом проведённой процедуры у пациентки стала эритема - рисунок из красных параллельных полос на коже. Через полгода у пациентки развился некроз тканей в месте обработки и появились хронические язвы, ей сделали операцию и пересадили кожу, после чего она продолжила жить с минимальными последствиями для жизни.
AECL не взяла на себя вину за этот инцидент, уверяя в своём официальном письме, что ни поломка машины, ни ошибка оператора не могли привести к такому исходу.
4. Март 1985, пациент Рэй Кокс
21 марта 1986 года один из пациентов пришёл на девятый сеанс лечения в связи с опухолью на спине. Ему было назначено облучение электронами с энергией 22 МэВ и дозой 180 рад, с общей накопленной за несколько недель дозой радиации в 6000 рад. Оператор ввела данные сеанса и обнаружила, что вместо типа лечения она ввела "Х" ("Радиационное") вместо "Е" ("Электронное"). Курсором она переместилась к этому месту и исправила "Х" на "Е". Поскольку остальные параметры были верными, она продолжала нажимать клавиши, пока не добралась до поля команд. Все параметры были отмечены проверенными, и появилось сообщение о готовности машины. Она нажала клавишу "Включить луч". Аппарат остановился и выдал сообщение "Ошибка 54".
Во время первого запуска аппарата пациент ощутил сильный ожог, а машина издала громкий треск. Так как это была его уже девятая по счёту процедура, то он сразу понял, что что-то идёт не так. Система голосовой связи с оператором не работала. Рэй начал вставать со стола, но излучатель включился и повторно сильно обжёг руку. Рэй встал, прошёл качаясь до входа в комнату и начал стучать в дверь, чтобы позвать на помощь.
После процедуры обеспокоенный Рэй Кокс немедленно обратился в медпункт, но из-за отсутствия серьёзных видимых причин (только покраснение кожи) был отправлен домой. Был вызван врач Фриц Хагер, и он убедился, что калибровка аппарата находится в пределах нормы. Медперсонал проверил машину и не смог обнаружить каких-либо проблем. Therac-25 был опять включён и проработал до конца дня.
Ночью Рэй из-за боли в шее и плече обратился в скорую помощь больницы. Общая доза радиации, полученная пациентом Рэем Коксом, оценивается от 16500 до 25000 рад.
В течение следующих недель у Рэя наблюдался паралич левой руки, тошнота, рвота, и в итоге он был госпитализирован с радиационным миелитом спинного мозга. Его ноги, средняя часть диафрагмы и голосовые связки оказались парализованы. У пациента также начались рецидивы кожных инфекций простого герпеса. Рэй Кокс умер через пять месяцев после облучения.
5. Апрель 1985, пациент Вернон Кидд
Тот же самый аппарат Therac-25 и та же самая оператор, что управляла машиной при облучении Рея Кокса, при схожих обстоятельствах переоблучили ещё одного пациента - 66-летнего Вернона Кидда. Во время процедуры на экране снова появилась зловещая "Ошибка 54", машина издала громкий треск, а пациент ощутил сильный ожог на лице.
Полученная Верноном доза составила как минимум 4000 рад. Вернон Кидд умер от облучения через три недели. Вскрытие показало тяжелое радиационное поражение правой височной доли и ствола мозга.
Расследование инцидентов
Прокуратура штата Техас обратилась к профессору компьютерных наук Калифорнийского университета в Ирвайне, Нэнси Ливесон, как к эксперту для проведения расследования. Нэнси пригласила в свою команду Кларка Тёрнера, и на протяжении примерно трёх лет они собирали материалы и реконструировали события, связанные с Therac-25.
В качестве основы для своей программы, единственный программист Therac-25, чьё имя AECL тщательно сохранило в секрете, использовал программное обеспечение от предыдущих машин серии - Therac-6 и Therac-20. Однако эти машины использовали аппаратные блокировки, чего не было в Therac-25.
"Ошибка-54" у аппарата Therac-25 была одной из наиболее серьезных и опасных проблем, выявленных в ходе его эксплуатации. Основной причиной возникновения этой ошибки было так называемое "состояние гонки" (race condition). Состояние гонки происходит, когда две или более задачи (или процессы) обращаются к одному и тому же ресурсу (например, памяти) без правильной синхронизации, что приводит к непредсказуемым результатам. В случае Therac-25, состояние гонки возникло в коде, управляющем положением линзы и мощности луча, что приводило к неправильной настройке параметров облучения.
Другим серьёзным багом, скрытым в Therac-25, было арифметическое переполнение значения переменной. Переменная имела небольшое фиксированное максимальное значение, которое при определённых условиях достигалось, и её значение сбрасывалось в нуль. В итоге это приводило к неправильным вычислениям и некорректным состояниям.
В коде всего было найдено четыре явных бага и несколько потенциальных ошибок. Однако вина за возникновение неисправностей лежала не только на самом коде, но и на неадекватном подходе к проектированию в целом.
Итоги расследования
Расследователями был выделен ряд критических факторов, способствующих возникновению неисправностей:
- В Therac-25 не было достаточных аппаратных блокировок, которые могли бы предотвратить чрезмерную дозу радиации в случае сбоя программы.
- Программное обеспечение Therac-25 не было тщательно протестировано на модульном уровне, особенно в сценариях, имитирующих реальные условия эксплуатации.
- В качестве базы для создания кода было повторно использовано программное обеспечение предыдущих моделей без учёта важнейших изменений в аппаратной части новой установки.
Отчёт Нэнси Ливесон
Нэнси опубликовала итоговый отчёт по расследованию, в конце которого привела свои выводы касательно ситуации.
Излишняя уверенность в программном обеспечении
Обычная ошибка в инженерном деле, как в данном случае, так и во многих других, заключается в чрезмерной уверенности в программном обеспечении. Среди непрофессионалов в области ПО существует ощущение, что программное обеспечение не может или не должно давать сбоев, что приводит к излишней самоуверенности и чрезмерной зависимости от компьютерных функций. Связанная тенденция среди инженеров — игнорирование программного обеспечения. Первый анализ безопасности Therac-25 не включал программное обеспечение, хотя на нем практически полностью лежала ответственность за безопасность. Когда начали возникать проблемы, предположили, что их вызвало оборудование, и расследование касалось только аппаратной части.
Непонимание разницы между надёжностью и безопасностью
Это программное обеспечение было высоко надежным. Оно работало десятки тысяч раз до того, как вызвало передозировку у кого-то, и случаи ошибочного поведения были редкими. AECL предполагала, что их программное обеспечение безопасно, потому что оно было надежным, и это привело к излишней самоуверенности.
Отсутсвие защитного проектирования
Программное обеспечение не содержало самопроверок или других функций обнаружения и обработки ошибок, которые могли бы выявить несоответствия и ошибки в коде. Логи были ограничены из-за нехватки памяти. <...>
Реакции пациентов были единственными реальными указаниями на серьезность проблем с Therac-25; не было независимых проверок правильности работы машины и ее программного обеспечения. Такое подтверждение нельзя поручить операторам без предоставления им средств для обнаружения ошибок: программное обеспечение Therac-25 «лгало» операторам, и сама машина не могла обнаружить, что произошла массивная передозировка.
В пункте "Неадекватные практики разработки программного обеспечения" Нэнси привела ряд обобщающих инструкций, которые необходимо учитывать при разработке такого оборудования как Therac-25:
- Спецификации и документация программного обеспечения не должны быть второстепенными.
- Должны быть установлены строгие практики и стандарты обеспечения качества программного обеспечения.
- Дизайн должен быть простым, а опасных практик кодирования следует избегать.
- Способы обнаружения ошибок и получения информации о них, такие как программные логи, должны быть предусмотрены в программном обеспечении с самого начала.
- Программное обеспечение должно подвергаться тщательному тестированию и формальному анализу на уровне модулей; системное тестирование само по себе не является достаточным. Регрессионное тестирование должно проводиться при всех изменениях программного обеспечения.
- Компьютерные дисплеи и представление информации операторам, такие как сообщения об ошибках, вместе с пользовательскими инструкциями и другой документацией должны быть тщательно спроектированы.
Оригинальный отчёт Нэнси Ливесон можно посмотреть по ссылке: http://sunnyday.mit.edu/papers/therac.pdf
Заключение
Печальная история Therac-25 продемонстрировала важность тщательной разработки медицинских устройств и программного обеспечения. Ошибки при создании этого аппарата привели к фатальным последствиям, но также стали ценным уроком для индустрии. Эти инциденты подчеркнули необходимость всестороннего тестирования, надёжных систем защиты от ошибок, качественной документации, обучения персонала и интеграции безопасности на всех этапах разработки. Современные стандарты медицинского оборудования значительно улучшились благодаря урокам Therac-25, что позволило предотвратить подобные происшествия в будущем.
___________________
Ну а на этом пока всё. Если вам понравилась статья, подписывайтесь на наш канал, ставьте лайки и оставляйте комментарии, а так же не забывайте про колокольчик, что бы не пропустить наши новые материалы, это очень мотивирует нашу команду. Так же вы можете найти нас в Телеграме и ВКонтакте, там мы публикуем мемы и короткие материалы, которые не всегда подходят для Дзена. Спасибо, что читаете нас!