Как мы делаем программное обеспечение, которое приносит деньги?

Это эссе является дополнением к моему докладу Lambda Days 2017. Первоначально он был опубликован в моем личном блоге.

Спасибо Хоуп Вагонер и Майку Сассаку за их любезный обзор этого эссе. Без их помощи это не было бы и половиной того, что есть.

Я хотел бы сказать пару слов о хороших программных системах. Я хотел бы здесь раскрыть значение слова «хорошо» и выдвинуть свою идею о том, как мы можем добиться этого в контексте того, в чем мы работаем. Я черпаю здесь вдохновение Генри Дэвида Торо, американского философа. Торо работал в 18 веке, до Гражданской войны в моей стране. Современники считали его чудаком, бездельником, который жил странным образом и мало работал. Хотя первая половина верна, я не согласен со второй. Работой Торо была «Отмена», совершавшаяся по большей части в частном порядке из-за ее незаконности. Мы можем простить современникам Торо то, что они спутали его с бездельником, выращивающим бобы. Мне кажется, что Торо — в своих взглядах на гражданское общество, индивидуальное поведение и влияние изобретений на то и другое — является исключительно важным философом для эпохи techne.

Самым влиятельным эссе Торо является его «Обязанность гражданского неповиновения». Торо утверждает, что правительство — это своего рода машина, которую человечество — добровольно или нет — использует в качестве произведения. Начало этого эссе хорошо известно:

Я всем сердцем принимаю девиз: «Лучше то правительство, которое правит меньше всего»; и я хотел бы, чтобы он действовал более быстро и систематически. Выполненное, оно, в конце концов, сводится к следующему, в что я также верю: «Лучше то правительство, которое вообще не правит»; и когда люди будут готовы к этому, то и будет у них такое правительство.

Вы найдете этот отрывок в защиту «сокращения» правительства или его анархического свержения, в зависимости от того. Извлечение теряет то значение, которое придает Торо, «когда люди готовы к нему».

Правительство в лучшем случае лишь средство.

Правительства — это инструмент, «способ, который люди избрали для исполнения своей воли». Правительство, в американском представлении о нем, представляет собой набор норм и законов, которые свободно связывают людей вместе и с ними. Это Воля Народа, рассматриваемая в идеальной американской манере, ищет Справедливости и Свободы. Однако на практике это не так. Порок правительства — это порок народа, тем более что оно является «своего рода деревянным ружьем для самого народа».

Власть правительства, даже такая, которой я готов подчиниться (...), все же нечиста: чтобы быть строго справедливой, она должна иметь санкцию и согласие управляемых.

Правительство в смысле Торо существует для того, чтобы продвигать нормы народа. Он делает это без рассмотрения этих норм.

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

Нормы политического организма, в анализе Торо, продвигаются в будущее сами по себе, вне связи с моральным импульсом. Подчинить себя политическому телу — значит подчинить себя этим средствам, заглушить собственное чувство добра и зла. «Сначала мы должны быть мужчинами, а потом подданными», — заявляет Торо. То есть мы должны, как личности, искать Добро в том виде, в каком мы его знаем. Чтобы произвести Добро, нам нужна помощь других, какой-то политический орган для объединения ресурсов и действий. Соберите достаточно людей в этот политический орган, и вы найдете очертания правительства. С этой целью:

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

Какое это имеет отношение к программным системам? Ну, когда мы говорим о себе, мы говорим о «сообществах». Разве мы не организуемся между собой, чтобы объединить наши ресурсы? Я вижу здесь слабые очертания политического тела. В духе Торо, стремящегося к известности, я хотел бы рассмотреть два фундаментальных вопроса современной разработки программного обеспечения:

  1. Как мы делаем программное обеспечение качественным?
  2. Как мы делаем программное обеспечение, которое приносит деньги?

Здесь есть напряжение, в котором компромиссы в одном отражаются в другом. Динамический баланс между риском, прибылью и мастерством играет роль, когда мы уютно устраиваемся за клавиатурой. Бьюсь об заклад, что все мы в какой-то момент своей карьеры сталкивались с обязательством отправить продукт до того, как завершим программный проект к нашему удовлетворению. Я отправил программное обеспечение, в котором не был полностью уверен. Хуже того, я отправил программное обеспечение, которое не считал безопасным. Это из-за отсутствия тестирования или жизненного опыта, обусловленного сроками или стремлением быть первым на рынке. Компромисс, взвешенный с компромиссом. «Как мы делаем программное обеспечение, которое приносит деньги?» включает в себя контекст, в котором мы находим нашу работу: экономические модели, которые связывают безопасность нашей жизни с работой наших рук. Каждая часть программного обеспечения, которое мы пишем, — да и вообще любой инженерный артефакт — является результатом человеческого творения. Это творение производится человеческой культурой, которая поддерживает и ограничивает его, политикой его контекста. То, что сделано, отражает возможности тех, кто это сделал, и намерения тех, кто это заказал. Работа наших рук содержит отражение контекста, в котором мы работали.

На ум приходят два примера этого, оба хорошо изученные. Я начну рядом с моим жизненным опытом и уйду. Bay Area Rapid Transit или BART — это легкорельсовый поезд в районе залива Сан-Франциско.

чтобы соединить пригородные сообщества Ист-Бэй с мегаполисом Окленда и связать все это с Сан-Франциско с помощью Transbay Tube под заливом Сан-Франциско.

согласно исследованию Управления технологической оценки «Автоматическое управление поездом на скоростном железнодорожном транспорте». Автоматизация, применяемая к утомительным, повторяющимся задачам, устраняет определенный класс случайностей. У этого класса несчастных случаев есть общий отказ из-за внезапной потери внимания, ошибочных входных данных или усталости: это человеческие ошибки. Автоматизация, когда она применяется к областям, требующим детальных решений, вводит случайности другого рода: неадекватную или опасную реакцию на непредвиденные обстоятельства. Чего не хватает автоматизации, так это нюансов; Чего не хватает людям, так это выносливости. Признавая это, системы, которые возлагают на людей роль наблюдателя за многими подсистемами, выполняющими утомительные, повторяющиеся задачи, предназначены для использования навыков обоих. Автоматика выполняет свои задачи, отчитываясь наверху перед оператором, который, в свою очередь, дает указания исполнителям задач. Такие системы держат людей «в курсе» и более безопасны, чем те, которые этого не делают. BART, как и было задумано, сильно зависит от автоматизации, что не дает операторам-людям «никаких эффективных средств» контроля. Оператор BART лишь немногим меньше путешествует, чем пассажиры поезда.

… за исключением аварийной остановки поезда и, таким образом, снижения производительности (и, возможно, безопасности) системы в целом».

Наблюдательный совет BART проигнорировал опасения по поводу чрезмерной автоматизации в утопическом оформлении, обычном для Калифорнии. Для этой технической культуры является аксиомой то, что технология сама по себе является Добром и принесет Добро. Орошение озеленяет пустыню, создавая плодородные поля и ухоженные города из песка. Интернет охватывает всех нас, децентрализуя наше общение с радио, книг, газет и телевидения, демократизируя его в процессе. Считается, что технологии, применяемые быстро и энергично, неизбежно улучшат жизнь простого человека. Даже смерть может устареть! Не говоря уже о том, что Солтон-Си заливает землю из-за отсутствия осторожности. Не говоря уже о том, что коммуникация переориентируется на Facebook, где снова будут доминировать центральные, но уже непрозрачные голоса. Прогресс мутный!

Опасения были особенно связаны с системой автоматического управления поездом BART. УВД контролирует движение поезда, его остановки на станциях, его скорость и открытие дверей. Исследование Управления технологической оценки объявляет ATC «в основном небезопасным». Хольгер Хьортсванг, инженер строящегося BART, сказал о спецификации ATC:

[это] было ослаблено нереалистичными требованиями. . . такие термины, как: «Основные функции управления системой должны быть полностью автоматическими». . . с абсолютной гарантией безопасности пассажиров и поездов, высоким уровнем надежности. . . и «система управления должна быть основана на принципах, позволяющих обеспечить безотказную работу во всех известных режимах отказа». Это конкретизация Утопии!»

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

Еще в 1971 году трое упомянутых сотрудников BART занялись проектированием системы ATC (автоматического управления поездом). По мере развития истории опасения этих инженеров в конце концов стали достоянием общественности, и все трое были уволены.

Руководство BART, по-видимому, считало, что трое его критиков поторопились, что ошибки в системе находятся в процессе устранения и что эти трое поступили неэтично, предоставив информацию.

Неудобные истины удобно отбрасываются, отрицая достоверность вестника и тем самым сообщения. Трудовые отношения предлагают немедленный метод обесценивания: увольнение. Это огромное неравенство сил между работником и работодателем. Такое несоответствие придает вес политическому нарративу «все в порядке». Тем не менее, система сохраняет свою реальность независимо от преобладающего нарратива.

… менее чем через месяц после открытия службы, когда поезд сошел с конца пути на станции Фремонт. Погибших не было, были только легкие травмы, но безопасность системы УВД вызывала серьезные сомнения.

Никто в BART не собирался делать опасный поезд. Это произошло из-за характера управления BART. Технополитическая организация, не сбалансированная в своей политико-технической динамике, будет метаться от одной чрезвычайной ситуации к другой. Реальность лежащей в основе системы будет выражать себя. Выход из строя УВД не был катастрофой: никто не погиб. Но провал процесса принятия решений BART был обнародован так, что это не было до аварии. Очень трудно спрятать поезд, сошедший с рельсов. Надзорные органы BART, желающие доставить поезд публике, которая проголосовала за его постройку, будут наказаны той же публикой за опоздание. Наступила слепота, и поезд будет достаточно безопасным. Инженеры не испытывали такого же давления со стороны общественности и вместо этого стремились доставить безопасный поезд, в идеале вовремя, но лучше опоздать, чем умереть. После того, как об этом стало известно, этот дисбаланс в BART был устранен за счет политического усиления технического персонала BART и введения резервов в механизм ATC. Тем не менее, по сей день BART остается ошибочной системой. Сбои происходят часто, что ограничивает эффективность обслуживания в часы пик. Конечно, никто не умирает, и это главное. Интроспективная организация, такая как BART, признает свой несовершенный баланс и намеревается исправить себя. Такие организации стремятся к общему пониманию между своей технической и политической идентичностью, даже если баланс в конечном счете остается смещенным в сторону политической цели. Техническое «в петле»: связь контроля не полностью находится в политической сфере. В идеальном мире этот баланс существовал бы с самого начала и отражался бы в технической системе. Но лучше опоздать, чем умереть.

Организации, которые достигают некоторого баланса между техническими и политическими аспектами, являются идеальными. Такие организации позволяют базовой технической системе выражать свою реальную природу. То есть полученная система будет настолько безопасной, насколько позволяет ее конструкция. Каждая система несет в себе набор неизбежных случайностей. Это центральный тезис Чарльза Перроу «Обычные несчастные случаи: жизнь с технологиями высокого риска».

Необычный термин обычная авария означает, что, учитывая характеристики системы, множественные и неожиданные взаимодействия отказов неизбежны. Это выражение интегральной характеристики системы, а не констатация частоты. Для нас нормально умереть, но мы делаем это только один раз. Системные аварии случаются редко, даже редко; однако это еще не все, что обнадеживает, если они могут вызвать катастрофы.

«Системные характеристики», о которых упоминает Перроу, довольно просты: интерактивная сложность и тесная связь между компонентами системы. Каждая система, рассматриваемая всеведением, постижима во времени. Разумеется, ни один человек не является всеведущим, и операторы должны использовать упрощенную модель своей системы. Системные модели строятся на основе данных телеметрии в реальном времени, предшествующих знаний в предметной области и жизненного опыта. Они частично задуманы на этапе проектирования системы и частично являются ответом на обнаруженную систему. В идеале модели фиксируют важные характеристики системы, позволяя оператору построить точную ментальную модель работающей системы. Точность этой ментальной модели определяет предсказуемость системы для данного оператора. Именно благодаря предсказанию, и только предсказанию, мы взаимодействуем с тем, что строим, и контролируем его. Ментальные модели для простых систем — скажем, падающая птица, нажимающая кнопку на панели управления, — просты. Если принять во внимание только падающую птицу и кнопку, то мы с высокой степенью уверенности будем относиться к предсказаниям, сделанным в отношении системы. Возьмем также систему, управляемую нашей падающей птицей — скажем, атомную электростанцию ​​в маленьком городке — и наша уверенность в прогнозах упадет. Почему? Силовая установка сложная. Это композиция множества более мелких подсистем, взаимодействующих полунезависимо друг от друга. Подсистемы по отдельности требуют специальных и четких знаний для понимания. взаимодействия между подсистемами требуют более высокого уровня знаний для понимания и, что еще хуже, могут быть недостаточно изучены разработчиками. Линейные взаимодействия — когда одна подсистема влияет на другую, которая влияет на следующую — идеальны: их легко спроектировать и обдумать. В хорошо спроектированных системах преобладают линейные взаимодействия. Нелинейных взаимодействий часто невозможно избежать.

[Э]эти виды взаимодействий [являются] сложными взаимодействиями, предполагающими наличие ветвящихся путей, петель обратной связи, скачков от одной линейной последовательности к другой из-за близости (…) Соединения не только смежные, последовательные единицы, но могут размножаться по мере достижения других частей, единиц или подсистем.

Или, более кратко:

Линейные взаимодействия — это те, которые находятся в ожидаемой и знакомой последовательности производства или обслуживания, а также те, которые хорошо видны, даже если они незапланированы.

Сложные взаимодействия представляют собой незнакомые последовательности или незапланированные и неожиданные последовательности, которые либо невидимы, либо сразу понятны.

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

Слабая связанность (…) позволяет определенным частям системы выражать себя в соответствии со своей логикой или интересами. (…) Слабосвязанные системы, будь то хорошие или плохие, могут включать в себя потрясения, неудачи и давление с целью перемен без дестабилизации.

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

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

Невозможно запланировать каждый сбой, с которым столкнется система. Хорошо спроектированная система снизит вероятность системной аварии, но это лучшее, что можно сделать. Сложная система — это система, в которой ни один человек не может иметь совершенную ментальную модель указанной системы. Сложные системы не обязательно являются следствием плохого дизайна. Скорее, они сложны, потому что решают некоторые сложные социальные потребности: производство электроэнергии, контроль финансовых операций, логистика. Сложные системы являются продуктом политического решения финансировать и осуществлять строительство некоторого решения предполагаемой потребности. Это то, что К. Уэст Черчмен назвал решениями «злых проблем»:

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

Это подводит нас ко второму примеру политического контекста системы, влияющего на ее работу. Ядерный реактор «Реактор Большой Мощности Канальный» (РБМК) — это ядерный реактор советской конструкции, предназначенный для использования обычных водяных и графитовых регулирующих стержней для замедления реакции деления природного урана. Эта конструкция дешева, что объясняет, почему было построено много реакторов, но у нее есть серьезный недостаток: реактор требует активного охлаждения. Без питания, если иное специально не подготовлено, реактор входит в контур обратной связи с положительным коэффициентом пустотности. Водяной замедлитель нагревается, испаряется, понижая замедление реакции. Это превращает больше воды в пар, еще больше снижая замедление. Этот цикл продолжается до тех пор, пока не будет нарушена защитная оболочка реактора.

Самый известный реактор РБМК - №1. 4 в Чернобыльском комплексе. Этот реактор взорвался 26 апреля 1986 года, когда сочетание политического требования и действий оператора привело к взрывной обратной связи. Авария произошла во время эксперимента по выработке электроэнергии для целей аварийного охлаждения. Как объясняет Григорий Медведев в своей «Правде о Чернобыле»:

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

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

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

Ю. А. Измайлов, ветеран Главатомэнерго, главного управления атомной энергетики, шутил по этому поводу: «При Веретенникове нам практически невозможно было найти в главке кого-нибудь, кто хорошо знал бы реакторы и ядерную физику. Однако в то же время отдел бухгалтерии, снабжения и планирования вырос до невероятных размеров».

Чернобыльская станция и другие генерирующие объекты управлялись с сочетанием небрежности и некомпетентности или теми, кто запугал их молчанием, опасаясь, что их заменят более послушные техники. Программа экспериментов, разработанная для Чернобыля № 1. 4 испытание проводилось не с прицелом на безопасность, а на политический успех. Успешная проверка инерционного метода раскрутки указывала бы вышестоящему руководству на смелость и правильность настроя главного инженера завода М. Н. Фомина. Экспериментальная программа намеренно отключила системы безопасности перед запуском теста, чтобы получить «чистые» результаты. От Медведева:

Системы защиты, срабатывающие по заданным уровням воды и давлению пара в барабанах-сепараторах, были заблокированы при попытке продолжения испытаний, несмотря на нестабильное состояние реактора; система защиты реактора по тепловым параметрам была отключена.

Система защиты МПА на максимальную проектную аварию была отключена, чтобы избежать ложного срабатывания САОР во время испытаний, что сделало невозможным ограничение масштаба вероятной аварии.

Оба аварийных дизель-генератора были заблокированы вместе с рабочим и пуско-резервным трансформаторами, что привело к отключению энергоблока от сети…

Реактор РБМК был разработан для удовлетворения запланированной потребности в дешевой электроэнергии, и компромиссы, заложенные в его конструкцию для достижения этой цели, были непоправимы. Есть проблемы с небезопасными системами, которые становятся «безопасными» за счет дополнений, а не фундаментальной переделки. Операторы могут по своему усмотрению или по принуждению отключить предохранительные устройства. Перроу отмечает в Обычные несчастные случаи: «Системы безопасности (…) необходимы, но они могут ввести в заблуждение. (…) Любая часть системы может непредвиденным образом взаимодействовать с другими частями». Система аварийного покидания космического корабля может быть случайно активирована, скажем, локтем. Или программный пороговый сигнал тревоги может срабатывать во время рекламной акции из-за повышенного спроса со стороны клиентов, но операторы, не зная об этой рекламной акции, ограничивают трафик. Процедуры устаревают или плохо написаны с самого начала. Из книги Дэвида Э. Хоффмана «Мертвая рука»:

Один (чернобыльский) оператор (…) был сбит с толку бортовым журналом (вечером накануне эксперимента 26 апреля). Он позвонил еще кому-то, чтобы узнать.

"Что мне делать?" он спросил. «в программе есть указания, что делать, а потом много чего зачеркнуто».

Другой человек задумался на минуту, а затем ответил: «Следуйте зачеркнутым инструкциям».

BART ATC, хотя и несовершенный, был сделан безопасным за счет включения в его механизм не подлежащих обсуждению избыточностей. Такой подход невозможен с реактором РБМК. Исправление его недостатков требует коренной переделки шрифта. Такие системы существуют только до тех пор, пока соблюдается баланс между техническими и политическими аспектами, и даже тогда это не является гарантией того, что маловероятное событие не произойдет. В Чернобыле такого баланса не было.

Перроу выступает за техническое общество, которое откажется строить системы, катастрофический риск которых считается слишком высоким. Это замечательно, но, я считаю, в конечном счете неработоспособно, учитывая проблему занятости, обсуждавшуюся выше, в дополнение к подразумеваемому разделению между политическими и техническими целями, которого на практике не существует. Когда меня просят построить что-то, что, согласно политическим ограничениям, не будет соответствовать цели, я могу отказаться, а кто-то другой не может. То, что мои собственные руки чисты, не означает, что было сделано что-то хорошее. Более того, приведенные выше примеры слишком масштабны — неисправный поезд для метро, ​​ядерный вулкан — и последствия их отказа, вероятно, выходят за рамки того, над чем работает большинство инженеров-программистов. Частная забота о пригодности какой-либо небольшой системы может оставаться в тайне с учетом того, что ее влияние будет ограниченным. Существуют также идеологии развития, которые подчеркивают подходы «сейчас, а потом думают о будущем», наиболее типичным примером которых является мантра «Двигайся быстро и ломай вещи». Эти возражения справедливы в малом, но в совокупности способствуют медленной катастрофе. Подумайте, сколько в мире устаревших программных систем, которые привередливы, плохо выполняют свои функции и тратят время пользователей на сбои. Сколько схем делается для замены таких систем — чтобы, наконец, сделать все правильно — только для того, чтобы эта цель была сорвана «временными» взломами, тестами, которые будут очень скоро, или документацией, которая никогда не появится? Чего здесь не хватает, так это чувства того, что Ханс Йонас в своем «Императиве ответственности» назвал «измененной природой человеческого действия»:

Вся предыдущая этика (...) имела эти взаимосвязанные молчаливые предпосылки: что человеческое состояние, определяемое природой человека и природой вещей, дано раз и навсегда; что человеческое благо на этой основе можно было легко определить; и что диапазон человеческих действий и, следовательно, ответственность были узко ограничены.

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

(Т)технологическая мощь превратила то, что раньше и должно было быть предварительным, возможно, просветляющие игры спекулятивных рассуждений, в конкурирующие чертежи проектов, и, выбирая между ними, мы должны выбирать между крайностями отдаленных последствий. (…) Вследствие неизбежно «утопического» масштаба современной техники неуклонно сокращается спасительный разрыв между повседневными и высшими вопросами, между поводами для обычного благоразумия и поводами для просветленной мудрости. Живя теперь постоянно в тени нежелательного, встроенного, автоматического утопизма, мы постоянно сталкиваемся с вопросами, для положительного выбора которых требуется высшая мудрость — ситуация невозможная для человека вообще, потому что он не обладает этой мудростью (…) Нам нужна мудрость больше всего, когда мы меньше всего в это верим.

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

Хотя вряд ли где-нибудь и в любое время найдется цивилизация, которая не говорила бы или не говорила об индивидуальном прогрессе на путях личного совершенствования, например, в мудрости и добродетели, кажется, что особая черта современного западного человека — мыслить прогресса преимущественно как атрибута — фактического или потенциального — коллективно-общественной сферы: что означает наделение этого макроизмерения с его преемственностью между поколениями способностью, предрасположенностью, даже встроенной целью быть субстратом той формы изменения, которую мы называем прогрессом. . (…) Связь интригующая: вместе с суждением о том, что общий смысл прошлых изменений был восходящим и направленным на чистое улучшение, возникает вера, что это направление присуще динамика процесса, которая, таким образом, должна сохраняться в будущем — и в то же время приверженность этой самой устойчивости, продвигать ее как цель человеческих усилий.

То, что это становится связанным с техническим прогрессом, не должно вызывать удивления. Особенно после того, как промышленная революция утвердилась, большинство новых технологий обеспечивало все больший и больший материальный комфорт. Технологии стали ассоциироваться со средствами на пути к Прогрессу, с Прогрессом как таковым. Обратите внимание на энергичное самовосхваление раннего промышленника или нынешнее самовосхваление инженера-программиста. Марксистская мысль возражает, что этот Прогресс верен, если вы можете себе это позволить, и с этим трудно не согласиться. Следует отметить, что марксистская мысль не отвергает связь технологии с прогрессом, но оспаривает, что это наиболее эффективная политическая/экономическая система для достижения технического прогресса. В анализе Йонаса конечная ошибка этого идеала прогресса заключается в том, что, хотя утешение и может быть достигнуто, оно достигается за счет надежды не только на утешение, но и на существование будущих поколений. : успехи становятся все больше и больше, но и неудачи также увеличиваются в масштабах. Наша этика не в состоянии справиться с этими работами.

(T) они предпринимаются не для сохранения того, что существует, или для облегчения того, что невыносимо, а, скорее, для постоянного улучшения того, что уже достигнуто, другими словами, для прогресса, который в своих самых амбициозных целях созидание земного рая. Таким образом, он и его произведения находятся под эгидой высокомерия, а не необходимости…

Существующая этика является «презентистской», то есть она связана с действиями в настоящий момент между теми, кто сейчас присутствует. В такой этике не менее похвально жертвовать настоящим ради благополучия будущего, чем жертвовать благополучием будущего ради настоящего. То, что Йонас пытался построить, было этикой, которая сама по себе содержала понятие ответственности перед будущим человечества в целом. Успех проекта, я думаю, очевиден в современном смысле сохранения, который пронизывает наши представления о загрязнении и его влиянии на биосферу. Несостоятельность проекта также очевидна.

Логическая структура Йонаса не зависит от масштабов его конечной цели. Эта структура интуитивно знакома работающим инженерам, живущим, как и мы, с действиями, которые, хотя и применяются сегодня, не принесут результатов в течение достаточно долгого времени.

(D) развития, приводимые в движение технологическими актами с краткосрочными целями, имеют тенденцию становиться незащищенными, то есть приобретать свою собственную компульсивную динамику, автомобильный импульс, благодаря которому они становятся не только, как было указано, необратимыми, но и движущимися вперед. -толкать и тем самым опережать желания и планы инициаторов. Однажды начатое движение вырывает закон действия из наших рук (…)

Всякая техническая конструкция, как мы установили, является некоторым отражением политического процесса, который ее породил. Этот технический артефакт устремится в будущее, затмевая контекст, в котором он был создан, и влияя на грядущие контексты. BART 1960-х годов предназначался для нечастых поездок - для утренних и вечерних поездок - и для обслуживания районов с доходом ниже среднего. В настоящее время BART работает двадцать часов в день, и районы вокруг его станций стали очень желанными, привлекая жителей и предприятия с более высокими доходами. Чернобыльская катастрофа сразу же разрушила запланированный город Припять, но оставила Европе многовековой проект по сдерживанию и очистке. Ни одна технология не остается без последствий. Мы видим это наиболее ясно в программном обеспечении в отношении автоматизации работы, которую в настоящее время выполняют люди. Целые виды труда, которые когда-то давали средства миллионам, — определенные виды канцелярской работы, логистики, производства — исчезли без явной замены. Такое «созидательное разрушение» кажется естественным порядком вещей — возможно, так оно и есть, — но следует сказать, что оно, вероятно, не кажется таким естественным, если вас заставляют сидеть среди разрушения.

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

  1. Как мы делаем программное обеспечение качественным?
  2. Внутренние неисправности

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

Как мы ограничиваем неизвестное поведение в нашем программном обеспечении? Согласно Перроу, такие всегда будут, и я считаю, что сегодня мы должны обратиться к тем, кто работает с высококритичными программными системами, чтобы найти подсказку, куда двигаться дальше. Я думаю, не будет спорным сказать, что большинство программных систем, сделанных сегодня, не так хороши, как могли бы быть. Даже с большими личными усилиями и сложными ритуалами разработки программного обеспечения — красное/зеленое тестирование, agile, схватка, толпа, пара, много глаз делают все ошибки поверхностными, доброжелательная диктатура, RUP, RAD, DSDM, AUP, DAD и т. д. и т. д. — большая часть программного обеспечения по-прежнему некачественный Почему? В 1981 году STS-1 — первый полет Космической транспортной системы, как официально назывался «Спейс шаттл», — был остановлен на стартовой площадке из-за отсутствия компьютерной синхронизации. Согласно Джону Горману, «ЖУКИ» слышали «во всем мире»:

10 апреля 1981 года, примерно за 20 минут до запланированного запуска первого полета Американской космической транспортной системы, астронавты и техники попытались инициализировать систему программного обеспечения, которая «резервирует» основную систему программного обеспечения с четырьмя резервами …… и могла нет. На самом деле, оказывается, не было возможности, чтобы BFS (резервная система управления полетом) в пятом бортовом компьютере могла быть правильно инициализирована с помощью PASS (основной системы программного обеспечения авионики), уже работающей на других четырех компьютерах. Был «баг» — очень маленькая, очень маловероятная, очень сложная и очень старая ошибка в логике инициализации PASS.

Компьютерная система «Шаттл» — это диковинка, демонстрация техники под названием «N-версия» программирования, которая больше не используется. Шаттл был аппаратом с дистанционным управлением, в котором действия пилота модерировались компьютером перед отправкой на управляющие поверхности или реактивные двигатели. PASS представлял собой кластер из четырех одинаковых компьютеров с одинаковым программным обеспечением. Каждый компьютер PASS управлял «цепочкой» бортового радиоэлектронного оборудования с некоторой избыточностью. Большая часть оборудования была покрыта частичным подмножеством компьютеров PASS, где очень важное оборудование, такое как главные двигатели, должно было получать четырехстороннее покрытие. PASS выполнил свои вычисления независимо, но сравнил результаты друг с другом. Это было сделано для контроля дефектов компьютерного оборудования: если в результатах обнаруживалось расхождение, компьютеры — или, вручную, пилот — могли проголосовать за то, чтобы машина вышла из-под контроля над своей строкой, предполагая, что она неисправна. Одновременно со всем этим BSF получал те же входные данные и выполнял собственные вычисления. В компьютере BFS использовалось такое же аппаратное обеспечение, что и в PASS, он был построен на том же языке программирования HAL/S, но запускал программное обеспечение независимой конструкции в другой операционной системе. Это N-версия программирования. надеялись, что программное обеспечение, созданное разными группами, окажется дефектным по-разному, что предотвратит потенциальный кризис из-за дефекта программного обеспечения.

Есть пять бортовых компьютеров (все называют их «GPC» — мало кто помнит, что они действительно были «общего назначения») — четыре работают с одинаковыми программными нагрузками во время критических фаз. Такой подход отлично подходит для сбоев компьютера или связанного с ним оборудования, но он не отвечает всем требованиям, если допустить возможность катастрофических программных ошибок («ошибка» в этой статье определенно не относится к этому классу). Мысль о том, что такая ошибка «выведет из строя» четыре в остальном совершенных компьютерных системы одновременно и мгновенно превратит орбитальный аппарат в инертную массу из плиток, проводов и планера в середине высокодинамичной фазы полета, была больше, чем проект мог вынести. Итак, в 1976 году родилась концепция размещения альтернативной загрузки программного обеспечения в пятом GPC, в остальном идентичном компоненте системы авионики.

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

Изменения в PASS для поддержки BFS произошли на заключительном и очень сложном этапе разработки многокомпьютерного программного обеспечения.

Чтобы BFS изначально синхронизировалась с PASS, она должна рассчитать точный момент для прослушивания на той же шине, что и PASS. То, что часы компьютеров вели одинаково, несколько упростило синхронизацию, хотя это никак не влияет на первоначальную синхронизацию при запуске. Решение, принятое программистами BFS, состояло в том, чтобы вычислить смещение текущего времени от времени, когда должна была произойти следующая синхронизация между PASS и BFS, и просто подождать. Количество циклов для этого расчета было известно, и, следовательно, время ожидания можно было сделать так, чтобы оно учитывало время вычисления времени ожидания. За исключением того, что иногда, в редких случаях, синхронизация немного сбивалась, и синхронизация оставалась отключенной на один такт. Разрешение требовало выключения и включения PASS и BFS. Как только синхронизация была достигнута, она была сохранена, и 12 апреля 1981 года Джон Янг и Роберт Криппен отправили космический шаттл «Колумбия» на низкую околоземную орбиту.

Другая подсистема, особенно такая сложно вплетенная в ткань авионики, как BFS, несет в себе решение одних проблем, но создание других. Хотя это, безусловно, повысило надежность системы в отношении общих сбоев программного обеспечения, в рамках проекта все еще академически утверждается, является ли сегодня чистая надежность выше, чем она была бы, если бы PASS развился до зрелости без присутствия своего двоюродного брата - либо как усложняющий фактор... либо костыль. С другой стороны, почти все участники PASS-стороны «чувствуют себя» намного комфортнее!

В 1986 году Джон К. Найт и Нэнси Г. Левесон опубликовали «Экспериментальную оценку предположения о независимости в многоверсионном программировании». Программное обеспечение N-версии, как уже упоминалось, предполагалось более эффективно снижать риск программных ошибок в критических системах не за счет их удаления, а за счет их различия. Это предположение усложнило компьютерную систему полета шаттла, задержав начальный полет, а также работу шаттла, а также обслуживание системы полета в течение всего срока службы шаттла.

Большим преимуществом, которое призвано обеспечить программирование N-версии, является существенное повышение надежности. (…) Мы обеспокоены тем, что это предположение может быть ложным. Наша интуиция подсказывает, что при решении трудной интеллектуальной задачи (например, при написании программы для ЭВМ) люди склонны совершать одни и те же ошибки (например, неверную трактовку граничных условий), даже работая самостоятельно. (…) Интересно отметить, что даже в механических системах, где избыточность является важным методом достижения отказоустойчивости, распространенные конструктивные ошибки являются источником серьезных проблем. Недавно самолет разбился из-за общего режима вибрации, который отрицательно сказался на всех трех частях системы с тройным резервированием.

Эксперимент Найта и Левесона по проверке этого предположения восхитительно прост. Аспирантам Университета Вирджинии и Калифорнийского университета в Ирвине было предложено написать программу на основе общей спецификации, и эта программа была подвергнута одному миллиону случайно сгенерированных тестовых случаев. Программистам были предоставлены общие приемочные тесты для проверки их программ, но им не был предоставлен доступ к случайно сгенерированным тестовым примерам. После отправки

(o)из двадцати семи, шесть версий не зафиксировали сбоев, а остальные были успешными более чем в 99% тестов. Двадцать три из двадцати семи были успешными в более чем 99,9% тестов.

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

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

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

Для конкретной задачи, которая была запрограммирована для этого эксперимента, мы заключаем, что предположение о независимости ошибок, лежащее в основе анализа N-версии программирования, не выполняется.

Программное обеспечение PASS скомпрометировано не из-за отсутствия тщательности при его создании, поскольку НАСА использовало наилучшее доступное понимание того, как собрать надежную программную систему во время создания. а потому, что это понимание оказалось ущербным. Шаттл всегда был сложнее, чем должен был быть, что усложняло его эксплуатацию и увеличивало расходы на его техническое обслуживание. Безусловно, в настоящее время в мире существует множество систем, которые были созданы с лучшими намерениями, с использованием лучших доступных знаний, но скомпрометированы аналогичным образом. Напомним, что системы безопасности сами по себе не являются независимыми, а становятся частью системы, взаимодействуя с существующими компонентами потенциально непредвиденным образом. При проектировании и построении систем мы должны стремиться к ограничению сложности, должны воздерживаться от ее включения, особенно на поздних стадиях проекта. Чем проще система, тем лучше мы сможем предсказывать ее поведение и контролировать ее сбои.

Компьютерная система челноков является примером технической системы, в которой технополитическая организация имела высокую степень баланса между техническими и политическими субкультурами. (Сам «Шаттл» был не таким, поскольку он был сделан слишком тяжелым для размещения полезной нагрузки Министерства обороны с прицелом на «окупаемость» за счет полетов. Это ограничение было введено Конгрессом США и усугублялось нереалистичной скоростью полета, заявленной НАСА. Это тема выходит за рамки этого эссе, но «В темноту» Роуленда Уайта — прекрасная книга, а также «Наследие космических челноков: как мы это сделали и чему мы научились» Лауниуса, Крайга и Крейга). Мы видели, что происходит с техническими системами, когда это не так: пригодность для цели ставится под угрозу целесообразностью по политическим соображениям. Проблема синхронизации PASS / BFS, а также наш жизненный опыт должны дать ощущение, что обратное неверно: идеальный баланс между техническими и политическими субкультурами не приведет к созданию бездефектной системы. В таких случаях куда лезут дефекты и почему? Особый интерес представляет статья Робин Р. Лутц «Анализ ошибок требований к программному обеспечению во встраиваемых системах, критически важных для безопасности».

В данной статье рассматриваются 387 программных ошибок, обнаруженных во время интеграции и системного тестирования двух космических аппаратов, "Вояджер" и "Галилео". Программная ошибка определяется как связанное с программным обеспечением несоответствие между вычисленным наблюдаемым или измеренным значением или условием и истинным заданным или теоретически правильным значением или условием.

Зонды "Вояджер" были запущены в 1977 году для изучения внешней Солнечной системы и состояли из оборудования для обработки изображений, радиопередатчиков и другого различного оборудования, обычного для космических кораблей. Галилео был более поздним космическим кораблем, запущенным в 1989 году, и как таковой является более мощным научным инструментом, предназначенным для изучения Юпитера и его спутников, но в целом он не отличается от Вояджера для наших целей. Программное обеспечение обоих устройств было критически важным для безопасности, поскольку компьютерная система отслеживала и контролировала оборудование устройства, неправильное использование которого могло привести к потере устройства. При строительстве зондов были приняты все меры предосторожности, поскольку технические и политические стимулы были направлены на достижение максимальной безопасности. Это общая черта технополитических организаций, когда система в ядре организации воспринимается одновременно как очень важная и очень чувствительная к сбоям. Благодаря этой серьезной предосторожности Лутц смог каталогизировать каждый дефект, обнаруженный командами разработчиков, разбив их на подкатегории. Разброс во времени между проектами "Вояджер" и "Галилео" дает уверенность в том, что результаты применимы в целом.

Ошибки программного обеспечения, связанные с безопасностью, составляют 56 % от общего числа ошибок программного обеспечения для Voyager и 48 % от общего числа ошибок программного обеспечения, наблюдаемых для Galileo во время интеграции и системного тестирования.

Нас здесь очень интересуют виды обнаруженных ошибок. В целом они разбиты на три схемы:

  • Ошибки интерфейса
  • Функциональные неисправности
  • В духе Торовиана, говорящего о том, что хорошо, я говорю следующее: представление о том, что занятия инженерным делом — это просто упражнение разума, неверно, и нам следует отказаться от этой фантазии. Программное обеспечение, которое мы создаем, будет сделано для других; это деревянное ружье для деревянного ружья. Ошибочно и представление о том, что технико-политический баланс должен обеспечиваться с помощью превосходящих технологий. Учтите, что большинство программных систем недостаточно протестированы. Это происходит из-за стимулов политической организации, которая их окружает. Учтите также, что эта же самая политическая организация часто не способна сколько-нибудь глубоко взаимодействовать с техническими артефактами. Если вы хотите, скажем, провести рандомизированное тестирование, но не находите для этого политической поддержки, тогда создайте инструмент тестирования, который кодирует рандомизированное тестирование фундаментально, неразрывно. Реальность будет двигаться к вашему инструменту, лягушка сварится и будущее будет закодировано вашей нормой. Будущее вполне может сожалеть об этом, понимая больше, чем мы, но такова природа истинного прогресса: прошлое, каким бы продвинутым оно ни казалось в то время, приобретает ощущение тривиальности и бессмысленности. Прогресс, истинный прогресс, совершается не из высокомерия — как демонстрация собственного таланта, — а из долга за благополучие будущего. Ощущение, что конечные политические цели не имеют значения, также неверно. Они должны быть полностью поняты и продуманы не меньше, чем технические детали проекта, наши собственные работы не меньше, чем работы других. Политические цели технической системы являются фундаментальной частью дизайна. Мы должны изучить их и сообщить о том, что находим. Возможно, скажем, всегда включенный голосовой помощник — это благо для мира. Почему же тогда он записывает все, что слышит, и передает это безотчетному другому? Было ли это устройство создано для того, чтобы сделать жизнь людей лучше или чтобы собрать информацию о них и вовлечь их в цикл нужды и приобретения? Как техника движется вперед, так и политика. Это потому, что мы, люди мира, меняемся: наши потребности меняются, и то, что когда-то было хорошим, может больше не быть. То, что кажется хорошим, может таковым не быть. Выбирая причинить что-то будущему — будь то созиданием или поддержкой созидания, — мы должны стремиться сделать будущее свободой, чтобы вытеснить его в случае необходимости. Мы должны держать будущее человечества «в петле» технологий, формирующих их мир. Техники, которые мы разрабатываем сегодня, являются основой того, что грядет. Сегодняшняя политика делает технику сегодняшнего дня, а технику — политикой.

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

На высоком уровне детализации программные ошибки, связанные и не связанные с безопасностью, отображают одинаковые пропорции интерфейсных и функциональных ошибок. Функциональные сбои (…) — наиболее распространенный вид программных ошибок. Поведенческие сбои составляют около половины всех функциональных сбоев на обоих космических кораблях (52% на "Вояджере"; 47% на "Галилео"). (…) Анализ также определяет ошибки интерфейса (…) как серьезную проблему (36% программных ошибок, связанных с безопасностью, на Voyager; 19% на Galileo).

Анализ Лутца показывает, что большинство ошибок интерфейса в обоих проектах — 93% Voyager, 72% Galileo — связаны с ошибками связи между инженерными группами. Тот факт, что большинство отказов программного обеспечения в этих проектах связано с неправильным функционированием в соответствии со спецификацией — двусмысленностью или неправильным толкованием указанной спецификации — делает человеческое общение основным источником дефектов в идеальной технико-политической организации. Корень проблемы здесь заключается в двусмысленности человеческой речи, либо в письменной спецификации, либо в соглашениях между сверстниками в отношении действий компьютеров. Это серьезная проблема, обнаруженная в области разработки программного обеспечения относительно рано, и для ее решения была проделана большая работа. Самый очевидный подход — убрать двусмысленность. То есть, если бы мы могли создать документ, в котором недвусмысленно декларировалось бы поведение системы, которую мы хотели бы иметь под рукой, а также всех необходимых вспомогательных машин, то мы бы многое сделали для устранения первоисточника дефектов. Это понятие во многом принадлежит формалистической школе математики и страдает тем же недостатком. А именно, недвусмысленная спецификация — это чудовищно сложная задача, гораздо сложнее, чем вы могли подумать сначала. Наиболее часто используемым языком формальных спецификаций на сегодняшний день является Z, произносится как Zed. Z не имеет широкого применения, и литература по его использованию печально известна применением Z к упрощенным примерам. Джонатан Боуден написал «Формальную спецификацию и документацию с использованием Z: подход к изучению конкретного случая», чтобы исправить это, отметив во введении, что:

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

Работа Боудена превосходна — особенно интересна глава 9 «Набор инструкций для транспьютера», — но, читая книгу, невольно чувствуешь некоторую безнадежность. Это та же безнадежность, которая закрадывается при обсуждении языков с зависимой типизацией или инструментов проверки с экстрактивным программированием. А именно, эти инструменты носят исключительно технический характер и требуют специального изучения специалистами-практиками. Кажется безнадежным ожидать, что политическая сторона технополитической организации сможет или захочет использовать формальные инструменты спецификации, за исключением исключительных обстоятельств. Это не означает, что такие инструменты бесполезны — они ценны даже сегодня только как направление исследований — но что им не хватает политической практичности, за исключением, опять же, исключительных обстоятельств. Что действительно имеет политическую практичность, так это «тестирование» как таковое, понимаемое в широком смысле как необходимое для создания программного обеспечения. Существующая методология сосредоточена на ручном тестировании небольших системных блоков, а также на ручном тестировании полных систем. Методологии проектирования — как и предметно-ориентированные — также все чаще воспринимаются как средство устранения невысказанных предположений в спецификациях. Это отлично. Текущая доминирующая культура тестирования терпит неудачу в тех же областях, что и выше, во входных граничных условиях, в неожиданном взаимодействии между компонентами, в неисследованных путях. Тестировщиками часто являются те же люди, что и авторы исходной системы. Они склонны к успеху системы, поскольку она является их собственной разработкой. Требуется гораздо больше, чем большинству, чтобы найти недостатки в чем-то, что имеет эмоциональную ценность. То есть созданные вручную тестовые наборы часто проверяют «счастливый путь» в системе, потому что это считается наиболее вероятным на практике, а вообразить случаи вне этого пути сложно.

В том же духе формальной спецификации подходы к созданию эффективных тестов были сосредоточены на эффективном исчерпывающем тестировании. Тестирование «черного ящика», когда входные данные для тестирования получаются только на основе знаний об интерфейсах, и тестирование «белого ящика» (или структурное), когда входные данные для тестирования получаются аналогично «черному ящику» в дополнение к личному знанию внутренней структуры программного обеспечения, по-прежнему используются. сегодня. Определение домена входных данных программы и применение его в ограниченное время является большой проблемой для обоих подходов. Эквивалентное разделение входных данных сокращает время выполнения, но эффективное определение эквивалентности само по себе представляет собой большую и потенциально подверженную ошибкам задачу. Предварительная работа в целях тестирования является негативным с точки зрения политической практичности. В основе лежит предположение о необходимости полноты, чтобы повысить вероятность обнаружения ошибок в программном обеспечении. В статье Джо Э. Дюрана и Симеона К. Нтафоса 1984 года «Оценка случайного тестирования» установлено, что это предположение неверно. Их метод прост. Дюран и Нтафос взяли ряд программ, распространенных в литературе по тестированию того времени, и создали тесты с использованием передовых методов того времени, а также тесты, которые просто генерировали случайные экземпляры из области ввода. Их результаты показали, что рандомизированное тестирование «работало лучше, чем тестирование ветвей в четырех программах, и лучше, чем требуемое парное тестирование в одной программе», но «было наименее эффективным в программах классификации двух треугольников, где важны одинаковые значения для двух или трех сторон треугольника. трудно генерировать случайным образом».

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

Суть в том, что обе субкультуры в технополитической организации удовлетворяют свои потребности. Техническая сторона организации способна достичь высокой уверенности в том, что потенциальное пространство состояний тестируемой системы было исследовано при очень небольших усилиях по разработке. Политическая сторона организации получает такие же высокие гарантии, но, опять же, с очень небольшими усилиями, то есть затратами. В последние годы инструментарий улучшился, что сделало рандомизированное тестирование более привлекательным дополнением к существующему тестированию в особых случаях: тестирование свойств — представлено в книге Хьюза и Классена «QuickCheck: легкий инструмент для произвольного тестирования программ на Haskell» — библиотеки распространены в основных языках. и автоматические инструменты тестирования белого ящика, такие как American Fuzzy Lop, быстро настраиваются и сразу же пожинают плоды. Как Дюран и соавт. обратите внимание, что «смысл выполнения работы по тестированию разделов заключается в поиске ошибок», и это верно для методов тестирования в целом. Другими словами, цель тестирования — выявить неожиданное поведение, вызванное двусмысленностью или случайностью. Рандомизированное тестирование — это решение грубой силы, которое можно эффективно применять без специальной техники — хотя тестирование свойств может потребовать немалого построения модели, как отмечено в последующих статьях Хьюза — и на всех уровнях программной системы. Такой подход может исследовать неожиданные состояния и обнаруживать результаты двусмысленности в человеческом общении, будучи ограниченным в объеме среды для моделирования тестируемой системы.

Предел поиска двусмысленности будет заключаться в ограниченности инженера созданием симуляционной среды и нетерпении политической субкультуры избежать ее создания. Теперь мы вернулись к нашему второму вопросу, вопросу о конструкторском программном обеспечении, неизвестные последствия которого ограничены. В немалой степени мы, техническая сторона технополитической организации, должны понимать, что последствия системы не могут быть поняты, если не понято ее поведение. Стоит иметь в виду, что следствие будет иметь первостепенное значение для политической организации: существование, будь то для прибыли или для удовлетворения избирателей. Левесон «Роль программного обеспечения в авариях космических кораблей» является всеобъемлющим, интерес для этого эссе представляет первый полет Ariane 5. Этот полет закончился через сорок секунд после того, как он начался, эффектным взрывом ракеты.

В отчете об аварии описывается то, что они назвали «основной причиной», как полная потеря информации о наведении и пространственном положении через 37 секунд после запуска последовательности зажигания основного двигателя (через 30 секунд после старта). Потеря информации произошла из-за технических и проектных ошибок в программном обеспечении инерциальной системы отсчета. Программное обеспечение было повторно использовано с Ariane 4 и включало функции, которые не были нужны для Ariane 5, но были оставлены для «общности».

Почему, когда «Ариан-4» была такой успешной системой запуска, система наведения ее преемника была собрана воедино?

По иронии судьбы, успех является одним из прародителей несчастных случаев, когда он ведет к самоуверенности, срезанию углов или компромиссам, которые увеличивают риск. Это явление не новое, и противодействовать ему крайне сложно, когда оно входит в инженерную культуру организации. Самоуспокоенность является первопричиной большинства других факторов аварий, описанных в этом документе, и проявлялась во всех изученных авариях. (…) В отчете об аварии Ariane 5 отмечается, что программное обеспечение считалось правильным, пока не было показано, что оно неисправно. Как отмечает комиссия по расследованию авиационных происшествий Ariane, более реалистичным является противоположное предположение.

Больше проклятия,

Хотя руководство может выражать озабоченность по поводу безопасности и рисков миссии, истинные приоритеты проявляются при распределении ресурсов. (…) Возникает культура отрицания, при которой отвергаются любые свидетельства значительного риска.

Особое внимание Левесон в «Роли программного обеспечения» уделяет неспособности руководства сдержать риск при разрушении критически важных с точки зрения безопасности систем. Если мы настроим свой разум говорить о последствии, то это в равной степени применимо и к нам, поскольку мы являемся теми, кто сейчас делает мир таким, каким он будет. Я имею в виду это не в самодовольном смысле «программное обеспечение пожирает мир», а в более скромном смысле, что каждый живущий сейчас своим действием или бездействием влияет на то, что грядет. Инженерная дисциплина является особенной, если не уникальной, для создания артефактов, которые будут перенесены в будущее, принося с собой невысказанные предположения настоящего. Рассмотрим «многоядерный кризис», когда предположение о последовательных машинах неизбежно столкнулось с миром суперскалярных многоуровневых многоядерных машин с многоуровневым кэшированием. Алгоритмы, разработанные в последовательную эпоху, продолжают работать, когда машины были фундаментально переработаны, но уже не обязательно оптимальны, требуя переписывания существующего программного обеспечения и переобучения существующего мышления, чтобы соответствовать современным машинам на их собственных условиях. Это налагает бремя неэффективности в личном и неличностном смысле. Рассмотрим также тенденцию к небинарному гендерному выражению, где она встречается с программным обеспечением, созданным в эпоху, предполагающую бинарный гендер. Независимо от того, задумано ли это сейчас или нет, это навязывает схему гендерного равенства из прошлого в настоящее. Адаптация таких систем требует работы от тех, чья гендерная идентичность не соответствует старой модели — убедить незатронутых — это большой труд; Мягко говоря, на меньшинство часто возлагается несоразмерный вес работы за равенство — и со стороны тех, кто управляет такими системами.

Там, где Йонас утверждает, что технология имеет тенденцию набирать собственный импульс и «обгонять желания и планы инициаторов», мы далее утверждаем, что если мы рассматриваем себя не как начало какого-то будущего или конец какого-то прошлого, а как народ в середина а будущего и прошлого, тогда тяжесть выбора, сделанного в прошлом, больше всего ложится на принятие решений, влияющих на будущее. Ни одна технология не является нейтральной. Стремясь решить какую-то проблему, он одновременно кодирует то, что его создатель рассматривал как проблему, и то, что также было действительным решением проблемы в том виде, в каком она сформулирована. Никакая технология не может быть полностью контролируемой, согласно представлению Перроу о «нормальной аварии». То, что сделано, будет выражать свою реальность и воздействовать на реальность, в которую оно помещено. Джерри Мандер четко выражает это в своих «Четырех аргументах в пользу ликвидации телевидения», хотя сейчас, может быть, формулировка этого аргумента покажется устаревшей. Мандер работал менеджером по рекламе в то время, когда средства массовой информации уступали первенство газетам и радио телевидению. Первые предположения о телевидении заключались в том, что оно окажет большое положительное влияние на массовую культуру. Это будет средство телеобучения, придающее непосредственность политике и распространяющее высокую культуру среди всех классов, которые были отрезаны от нее из-за недостатка свободного времени. Телевидение не просто расширило существующую культуру до новой среды, но изобрело ее, перенеся те части старой культуры, которые были подходящими, в новую, созданную и информированную телевидением.

За одно поколение из сотен тысяч людей, прошедших человеческую эволюцию, Америка стала первой культурой, которая заменила непосредственный опыт мира вторичными, опосредованными версиями опыта. Интерпретации и репрезентации мира принимались как опыт, и большинству из нас была неясна разница между ними.

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

Правительства индустриального мира, вы, усталые гиганты из плоти и стали, я пришел из Киберпространства, нового дома Разума. (…) Вы не участвовали в нашей большой и собирательной беседе и не создавали богатство наших торговых площадок.

То, что глобальный Интернет произошел от DARPANET, финансируемого Соединенными Штатами проекта по созданию распределенной коммуникационной сети, способной пережить ядерную перестрелку, отчасти лежит в основе этого заявления. Но, допуская это, Барлоу продолжает

Там, где есть настоящие конфликты, где есть ошибки, мы их выявим и решим своими средствами. Мы формируем собственный Общественный Контракт. (…) Наш мир другой. (…)

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

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

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

Интернет стал доступен широкому кругу людей, что характерно для первых «жителей» Интернета, именуемых Вечным сентябрем, имея в виду период инициации, через который проходят студенты колледжей в начале каждой школы. год, сентябрь — но не так, как ожидал Берроу. Первоначальное включение было осуществлено такими компаниями, как AOL, которые построили «обнесенные стеной сады» контента, отделенные от окружающего Интернета и предназначенные исключительно для платной подписки. Поисковые системы разрушили эту бизнес-модель, но ввели новую норму: «релевантность», определяемую PageRank или подобными алгоритмами. Контент как таковой имел ценность только в том случае, если на него ссылался другой Контент. Стоимость превратилась в сложную задачу графа, заменив то, что изначально было делом человеческого понимания, проблемой вычислений. Мы видим отражение этой ценностной нормы в важности «вирусных» материалов в нашем дискурсе сегодня. Google удалось открыть огороженные сады вдали от своих моделей подписки. Какой бы бесплатной информация ни хотела быть, платить за компьютерное время, чтобы сделать ее таковой, нельзя, и не случайно сегодня крупнейшими рекламодателями в Интернете являются либо обнесенные стеной сады — Facebook — либо поисковые системы — Google. Реклама субсидирует «бесплатный» доступ к контенту почти так же, как реклама субсидирует телевидение. Создатели контента неизбежно в обеих средах меняют свое поведение на придворных рекламодателей, иначе они не могут существовать. Что отличает Интернет — а это полностью отсутствует в ранних утопических представлениях — так это способность к слежке. Рекламные модели в Интернете отличаются от предыдущих сред, которые полагаются на статистические демографические модели для охвата целевой аудитории. Так называемая «программатическая» интернет-реклама построена на модели наблюдения, при которой индивидуальная активность отслеживается и записывается в течение длительного времени, компилируется в модели «намерения» машинного обучения и впоследствии сопоставляется с желаниями рекламодателей. Facebook вполне может быть местом встречи для человечества, но это также также удобная база данных о симпатиях и антипатиях пользователей, отношениях и глубоком личном понимании, которые должны быть загружены в машину, цель которой - убедить человечество покупать мелочи. Информация сжимается для сбора информации, сбор информации становится основной целью создания информации.

С технической точки зрения построение систем для взаимодействия в мире программной рекламы сложно. Большинство бирж — Google и Facebook в мире — работают на аукционе. Веб-сайты предоставляют слоты на своих сайтах, где может размещаться реклама, и за 100 миллисекунд, которые существуют между началом загрузки страницы и тем, что человеческое восприятие может зарегистрировать пустое место, происходит аукцион. С бирж к участникам торгов поступает сигнал с минимально идентифицирующей информацией. Участники торгов должны использовать этот сигнал для поиска идентифицирующей информации в своей частной базе данных и, исходя из этой информации, делать ставки. Это происходит миллиарды раз в день. Эти участники торгов, созданные частными компаниями и работающие с пулами информации, собранной теми же организациями, работают, в основном, для привлечения кликов. То есть реклама, которую они показывают после выигрыша ставок, должна быть «актуальна» для пользователя, которому она показывается, достаточно, чтобы заставить его щелкнуть рекламу и взаимодействовать с тем, что рекламодатель поместил на другой стороне экрана. ссылка на сайт. Так теперь вращаются колеса торговли. Создание системы, способной хранить идентифицирующую информацию о человечестве в локальной памяти и выполнять вычисления с помощью машинного обучения на основе этой информации в течение примерно 35 миллисекунд — если вы хотите отреагировать в течение доступных вам 100 миллисекунд. необходимо учитывать время передачи на обе стороны сделки — дело немалое. Чтобы сделать это возможным в прибыльном масштабе, требуется настоящая приверженность анализу безопасности сложных систем, автоматизированному преодолению катастрофических отказов надежных систем реального времени. При выполнении такой системы легко спутать сложность ее построения с присущим ей качеством. Вот с этой путаницей и надо бороться. Является ли на самом деле общественным благом создание базы данных наблюдения всего человечества для стимулирования продажи безделушек и, в конечном счете, для того, чтобы контент в Интернете мог быть «бесплатным» в смутном соответствии с видением желанные утописты? Может быть это. Но, если мы можем использовать норму релевантности Интернета против самого себя, мы отмечаем, что около 11% всех пользователей Интернета сейчас используют программное обеспечение для блокировки рекламы, и этот процент растет с каждым годом.

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

Наши изобретения — это красивые игрушки, отвлекающие наше внимание от серьезных вещей. Они всего лишь улучшенные средства для достижения неулучшенной цели, цели, к которой было уже слишком легко прийти; как железные дороги ведут в Бостон или Нью-Йорк. Мы торопимся построить магнитный телеграф от Мэна до Техаса; но Мэн и Техас, возможно, не имеют ничего важного для сообщения. (…) Мы стремимся проложить тоннель под Атлантикой и приблизить Старый Свет на несколько недель к Новому; но, быть может, первая новость, которая просочится в широкое трепещущее американское ухо, будет о том, что у принцессы Аделаиды коклюш.

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

Я хотел бы сказать пару слов о хороших программных системах. Под этим я подразумеваю что-то очень простое, хотя на это ушло ужасно много времени. Хорошая программная система — это та, которая была сконструирована с большой тщательностью — ограничена сотрудничеством с другими, ограничена проверкой ее возможных состояний — чтобы быть пригодной для какой-либо благонамеренной цели. Эта цель обязательно политическая, решает какую-то проблему, которую кто-то может найти в мире. На технический метод построения программной системы будут влиять политические требования и подход к этим требованиям, обусловленные техническими ограничениями современности. Крайне важно подвергнуть сомнению допущения, лежащие в основе программной системы, применить к ним наилучшую причину вашего собственного понимания правильного и неправильного, исследовать мир, который они стремятся своим собственным импульсом создать, и найти его в согласуйтесь с тем, в котором вы стремитесь обитать. Разработчик хорошей программной системы поймет, что это «добро» мимолетно, состоит из потребностей определенного времени и определенного места и исчезает почти сразу же, как появляется. Знание растет, и то, что считается лучшим, меняется. Рандомизированное тестирование в настоящее время является одним из лучших методов тестирования с точки зрения компромисса между стоимостью и эффективностью при поиске ошибок. Улучшения метода публикуются регулярно — «Удача для начинающих: язык для генераторов на основе свойств» Хьюза и др. начинает справляться с проблемой генерации, отмеченной Дюраном и Нтафосом, — но если человеческое знание действительно продвинется вперед, тогда когда-нибудь рандомизированное тестирование кажутся слишком упрощенными и неэффективными. Таково развитие произведений чистого разума. Развитие политической работы не продвигается таким образом, и поэтому ее обычно не принимают во внимание как «тривиальную». Эта «тривиальность» на самом деле является маской истинной сложности, областью знания, где нет четкого разделения правильного и неправильного, но есть медленное восхождение из тени к мудрости. Если мы хотим создавать хорошие программные системы в этом смысле, мы должны понимать, что, какими бы хорошими ни были наши намерения или, возможно, труднее, каким бы прекрасным ни было наше мастерство, вещь, сделанная хорошо, на самом деле может быть социальным злом. То есть проблема, которую нужно решить, может не быть проблемой — если она когда-либо была — или, если она все еще будет, может быть не решена таким образом, который функционирует сейчас, если вообще когда-либо был решен.

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

Создавайте хорошее программное обеспечение