Восстание машин

[info]infowatch порадовал сегодня крайне интересным постом про защищенность современного общества от компьютерных сбоев. Конечно, эти «компьютерные сбои» будут выглядеть несколько иначе, чем показывают в голивудском кино — например, вряд ли нам в ближайшем будущем придется увидеть массово взрывающиеся с «синим экраном» писишки или «обвал букв» на экране. Конечно, писишка или какой-нибудь яблофон нам знакомы, а то и непонятны, и именно от них обыватель больше всего ожидает какой-то «подлянки». Но выкидываемые таким оборудованием фокусы — ничто по сравнению с тем, что может вызвать отказ более незаметных компьютеров.

Речь идет про окружающие нас микроконтролеры. По многим подсчетам, у «современного цивилизованного человека» в квартире и машине имеется около 50 микроконтролеров. Каждый такой микроконтролер — это небольшой компьютер, снабженный собственным программным обеспечением, которое, к сожалению, подвержено ошибкам. Чтобы не быть голословным, приведу небольшой пример.

Думаю, многие видели на дорогах чудо отечественного автопрома под названием УАЗ Патриот (а кто не видел, может мельком ознакомиться с ТТХ по ссылке). В общем, по массогабаритным характеристикам это типичный представитель класса БЧД (большой черный джип), а по потрясающей маневренности и отличной управляемости — ближайший родственник ЗиЛ-130. А вот — шокирующая правда (из газеты Авторевю):

Дмитровский полигон, тест Авторевю, внедорожник УАЗ Патриот ходом штурмует заснеженный подъем. Половина уже пройдена, осталось еще немного, еще чуть-чуть… И вдруг — хр-р-р! — у УАЗа выбивает передачу в «раздатке», и машина остается без тяги. Ногу на тормоз, чтобы не скатиться вниз! Педаль встает колом, а Патриот лавиной катится вниз, неумолимо набирая ход. Поберегись! Почуяв неладное, фотограф отскакивает в сторону, а УАЗ, откатившись на десять метров от подножия склона, наконец-то «включает» тормоза и останавливается.

Оттуда же, из другой статьи:

Как показали дополнительные заводские тесты, которые ульяновцы провели после публикации АР, время отключения тормозной системы после длительной пробуксовки может достигать 10 секунд. Очень опасно! В чем причина? Заводчане отмалчиваются, но нам стало известно, что доводку программы управления АБС для Патриота компания Bosch поручила… студенту-практиканту. В принципе это обычная практика для крупных компаний, которым фирмы «третьего мира» заказывают какие-нибудь малобюджетные работы. Но странно, что ни тесты самой фирмы Bosch, ни заводские испытания УАЗа этой прорехи в программном обеспечении не выявили.

Решайте сами, а мне не хотелось бы оказаться на тормозном пути двухтонного внедорожника с «зависшей» АБС. К чести УАЗовских конструкторов, хочется добавить, что проблемы с раздаточной коробкой и АБС на более новых машинах уже решены, и вообще по количеству внедренных с начала производства доработок «Патриот» мог бы дать фору многим другим отечественным автомобилям (которые ездят с хорошо известными «косяками» уже десятки лет). К сожалению, далеко не все владельцы УАЗов 2007 года выпуска знают о дефекте АБС — многие «забивают» на дилерское техобслуживание сразу после покупки.

Наверное, от глюков прошивки УАЗа можно спастись, не выходя на улицу (а жратву покупать в «Утконосе», хе-хе). Но кто гарантирует, что такой же студент-практикант не заложил подобную «мину замедленного действия» в микроволновку или гидромассажную ванну с десятком программ? Кто может поручиться, что стиральная машина не зальет соседей внизу, а музыкальный центр не врубит марш «Гори, еврей!», когда рядом будут проходить озлобленные антифашисты? А как вы будете себя чувствовать, когда курьер из «Утконоса» на ваших глазах провалится в шахту лифта? И что вы будете делать, когда кондиционер с термостатом, сговорившись, решат вас немножко заморозить?

Многие, наверное, никогда не задумывались над этим, но современные методы разработки и тестирования программного обеспечения не гарантируют того, что это программное обеспечение будет работать безошибочно. Более того, сейчас «безошибочность» софта уже не является таким конкурентным преимуществом, как дешевизна и актуальность — соответственно, усилия разработчиков направлены на быстрый и недорогой выпуск ПО — как минимум, в самом широком сегменте рынка — приложениях для персональных компьютеров. В конце концов, всегда можно выпустить «патч».

Эти методики проникают и в более «ответственные» приложения. Как заметил [info]infowatch, в следующий раз прошивку для АБС будет делать аутсорсинговая фирма, «у которой в штате тот же один практикант плюс три юриста». А затем — и индусы подключатся. Возможно, критикуемый в тамошних комментах «несовременный» метод, когда программу пишет собирающийся на пенсию дядечка, менее подвержен ошибкам, чем перекладывание ответственности, называемое модным словом «аутсорсинг».

Но на мой взгляд, это не столь страшно, сколько постоянно растущая сложность встроенных систем. Если на УАЗе еще можно вытащить предохранитель и послать Bosch с ее практикантами в известном направлении (у нас нет дорог — одни направления), то в любой современной импортной машине компьютер еще и проверит уровень алкоголя в выдыхаемом воздухе, напомнит о необходимости пристегнуться, скажет «до сервиса осталось 100 километров», а если водитель заснет за рулем, несмотря на алкотестер — еще и подложит подушечку. Надо ли говорить, что без этого компьютера вы просто не запустите двигатель?

Помните закон Брукса про количество связей в коллективе? То же самое верно и для числа связей между модулями программы. Предположим, программист пишет программу из 7 как-то взаимосвязанных частей (большее количество трудно держать в голове) — например, работающую с 7 какими-нибудь датчиками. Тогда между ними имеется 7*6/2=21 различная «связь» (например, «если опросить датчик А, то следующее показание датчика Б будет на 1 завышено») — а это количество уже удержать в голове нельзя и можно допустить ошибку, просто забыв учесть какое-либо из них. Современные языки программирования и «соглашения о кодировании» позволяют свести количество связей между модулями к минимуму (предположим, к 6 вместо 21) — но о каких «паттернах проектирования» речь может идти в случае микроконтролера с парой килобайт ОЗУ? Если же уйти от «мелких» PIC и AVR к младшим ARM — то тут мы столкнемся со сложностью самой аппаратной платформы, не уступающей неплохому компьютеру 70-х годов. К тому же, если захочется использовать на этом ARM какую-нибудь адаптированную ОС — нет никаких гарантий, что в ней самой нет ошибок.

Не знаю, как будет называться OS/360 применительно к встроенному ПО (а скорее всего, каждый эмбеддер создаст «свою», с которой и натрахается вволю), а обращу внимание еще на один прискорбный факт — сейчас практически нет эффективных способов проверки программного обеспечения на безошибочность. Как говорил Дейкстра, тестирование может лишь выявить ошибки, но не доказать их отсутствие. С другой стороны, столь любимое Дейкстрой формальное доказательство правильности программ совершенно непригодно для использования.

В мире hardware этот этап прошли в середине 90-х, после обнаружения ошибки FPU в первых Pentium. Тогда из обширного багажа знаний уехавших на Запад советских ученых были извлечены математические методы проверки работы электронных схем, не требовавшие перебора всех вариантов входных данных — и благодаря им удалось внедрить такое тестирование для всех новых разработок. Думаю, что и для программ существуют аналогичные методики — в конце концов, любая программа для компьютера представляет собой лишь конечный автомат, разве что с невероятным количеством состояний.

Интересно, каким будет программный сбой, который заставит внедрить «контроль качества» в разработке программ? Думаю, что даже если Берлускони улетит в Везувий на презентованном ему в свое время Путиным «Патриоте», никто и не почешется. А вот упавший в Большой Каньон Обама — это уже поинтереснее. Подарит ли Медведев Обаме замечательный российский джЫп (с негротюнингом, разумеется)?