[Перевод] Программные баги, которые приносят реальный вред

blpwsyq57nanftbmpkiiaofzyvo.png


Три реальные истории из жизни, показывающие возможные проблемы, вызываемые ошибками или недоработками в программном обеспечении. Первая касается продуктов Apple, вторая — устройств Android, а третья связана с багами в ПО канадского гипермаркета стройматериалов.

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

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

*Прим. пер.: кого называют ковбоем?

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


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

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

В 2016 году я получила свою докторскую степень и устроилась на первую «реальную» должность в подразделение Apple, расположенное в Калифорнии. Я присоединилась к команде, которая работала над компилятором для GPU в устройствах iPhone и прочих. Ещё до выхода на работу, решая вопросы, связанные с обустройством на новом месте жительства, я задумалась, что появляться с телефоном на Android в команде по разработке iPhone будет не очень уместно.
Поэтому решила наведаться в магазин Apple и купить лучший на тот момент iPhone. Им оказался iPhone 6S Plus со 128ГБ хранилища. В целом мне этот смартфон очень нравился: он был лёгким, шустрым, красивым, долго держал батарею, а присутствие сканера отпечатка пальца избавляло от постоянной необходимости вводить пин-код, как на прежнем Android — явный апгрейд.

Как-то раз через несколько месяцев мне нужно было рано утром лететь на конференцию по рабочим вопросам. Я установила на телефоне будильник и легла спать. На следующий день я проснулась и сразу почувствовала, что что-то не так, так как за окном уже стояло яркое солнце. Тогда я потянулась за своим iPhone, чтобы посмотреть время. Когда я взяла его в руки, меня тут же охватила волна ужаса — мой самолёт должен был вот-вот взлететь! Экран при этом показывал, что установленный мной будильник работает, но по какой-то причине телефон не вибрирует и не издаёт никаких звуков. Будильник звонил абсолютно беззвучно, но связанная с этим анимация была активна.

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

Я ничего не могла с этим поделать, разве что злиться. Чья-то некомпетентность не только заставила меня испытать чувства стыда и тревоги, но также привела к тому, что несколько других людей потратили своё время, а компания — средства на упущенный рейс. Почему этот баг не был исправлен, спустя несколько месяцев? Сколько ещё людей из-за него пострадали? У меня была комфортная техническая должность, на которой в случае моего опоздания руководитель просто интересовался, всё ли у меня в порядке. Но некоторые люди занимают более ответственные позиции, и опоздание может привести к их незамедлительному увольнению. Причём некоторые из этих людей могут тянуть на себе всю семью и жить от зарплаты до зарплаты. Неисправный будильник вряд ли может напрямую вызвать смерть человека, но он определённо может принести реальный вред.

Однако смысл этой статьи не в том, чтобы указать на ошибки Apple, поэтому я поделюсь ещё одной историей о неудачной реализации ПО в Android OS и том, как это повлияло на мою жизнь. Спустя три года работы в Apple, когда запасная батарея моего iPhone 6S Plus начала умирать, я решила снова попробовать Android и купила себе Google Pixel 3A XL.

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

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

К счастью, сейчас в Android есть «ночной режим», который отключает срабатывание звонка между 22:00 и 8:30. Если моя мама скончается в больнице посреди ночи, то я узнаю об этом только не следующий день. Мой сон священен, и ночной режим позволяет мне возвести определённые личные границы программным путём.

Этот режим весьма полезен, но у меня есть и другая проблема. Дело в том, что мама вполне может также случайным образом позвонить днём, а я, уже порядком устав от всего этого, не часто готова ей ответить. Тем не менее мне также не хочется, чтобы она оказалась без дома или попала в тюрьму (а такое уже происходило, но это отдельная история), поэтому я не хочу блокировать её номер и полностью утрачивать возможность принимать её вызовы.

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

ih_4xsmecvkr7aq1vgaxpyc-plo.png

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

Суть в том, что хоть я иногда и хочу слышать телефонные вызовы, чтобы не пропустить нечто важное, я совсем не желаю слышать звуки уведомлений от приложений. Мне посоветовали просто по-отдельности отключить уведомления для каждого приложения, но меня интересует, почему, чёрт побери, нельзя просто сделать два отдельных слайдера — для «громкости вызовов» и «громкости уведомлений»? На мой взгляд, факт их отсутствия просто подчёркивает некомпетентность разработчиков и пренебрежение пользовательским опытом. Безусловно, этот недочёт заставил миллионы людей испытывать лишнюю раздражённость, и его следовало исправить много лет назад.

Получается длинная статья, но, как я и обещала, самая интересная история припасена напоследок. Я нахожусь в процессе покупки нового жилья, и через две недели планирую переезд. При этом я попутно решила сделать небольшой ремонт, так что мне потребовались кое-какие строительные материалы, включая листы гипсокартона. Это сопряжено с некоторыми неудобствами, поскольку я городская женщина. У меня нет машины и даже водительских прав. При этом гипсокартон довольно тяжёлый и слишком большой для подъёма в лифте, так что его нужно будет заносить на третий этаж по лестнице. Уфф…

В Монреале, где я и живу, есть 3 основных компании по продаже стройматериалов: Home Depot, Rona и Reno-Depot. Home Depot является единственной, где можно заказать всё мне необходимое, поэтому я зашла на их сайт и добавила нужные позиции в корзину. На выбор всех товаров и заполнение формы у меня ушло около 45 минут, но когда я дошла до момента подтверждения заказа, сайт выдал сообщение «Произошла неизвестная ошибка». На этом всё. Никаких дополнительных деталей, никакого описания причины ошибки, просто, мол, извините, но этот заказ вы оформить не можете.

Меня сильно расстроило, что я потратила на сборку этого заказа почти час. Одна моя подруга предложила попробовать оформить его с её компьютера. Я вывела страницу с содержимым моей корзины в документ PDF и послала его ей. У подруги всё сработало — заказ удалось оформить, и я отправила ей электронный платёж для компенсации расходов.

Поскольку моя новая квартира находится на третьем этаже, плюс нужно было уложить доставку в определённое время с подъёмом тяжёлых предметов по лестнице, пришлось заплатить сверху. В добавок к этому мы отметили, что доставка должна быть осуществлена между полуднем и 15:00. Сайт Home Depot, в свою очередь, сообщил, что меня уведомят за 30 минут до приезда машины. Общая стоимость услуги составила 90 канадских долларов, что показалось мне возмутительным, но иногда у тебя просто нет выбора.

Я ожидала, что товар привезут до 15:00. В 14:59 мне одновременно пришло два сообщения. В первом говорилось, что «Ваш заказ только что был отгружен», а во втором: «Ваш заказ только что был доставлен, нажмите здесь, чтобы оценить доставку». И снова меня охватило беспокойство. Может, они пытались со мной связаться, но безуспешно? Вдруг они просто выгрузили материалы на улице? Я помчалась вниз, но ни грузовика, ни выгруженных материалов я у подъезда не увидела. Тут я поняла, что дело может быть в очередной программной ошибке. Вопреки содержанию второго сообщения, доставка явно ещё не выполнена.

И действительно, в 15:27, то есть через 27 минут после окончания заявленного окна доставки, мне позвонил экспедитор. Он находился внизу и собирался выгрузить материалы на тротуар. О, нет! Я объяснила ему, что специально доплатила сверху, чтобы поднять эти материалы в квартиру. Я была готова даже показать ему электронное письмо, подтверждающее, что так и было. Он же утверждал обратное, ссылаясь на систему, в которой было сказано, что он должен выгрузить товар у подъезда.

Более того, отдел доставки прислал его одного. Никоим образом он бы не смог один поднять на третий этаж листы гипсокартона длиной почти 3 метра и весом 25 кг каждый. Я начала поднимать голос, он тоже. Спустя несколько минут, экспедитор сказал, что позвонит менеджеру. После он перезвонил. В итоге компания по доставке решила отправить ещё одну машину со вторым человеком в помощь первому. Я была зла, но всё же рада, что отстояла свою позицию в этом споре.

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

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

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

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

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

*Прим. пер.: в оригинале code monkey. Согласно Wikipedia, это программист, который не вовлечён ни в какие смысловые аспекты разработки проекта, а просто пишет код по выданной спецификации. Также этим термином ещё называют низкоквалифицированных программистов, которые пишут код быстро, не вникая в его структуру и не следуя каким-либо шаблонам проектирования или устоявшимся правилам.


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

hc88sbzi7apcmcvqt2icby4azas.jpeg

© Habrahabr.ru