Три реальные истории из жизни, показывающие возможные проблемы, вызываемые ошибками или недоработками в программном обеспечении. Первая касается продуктов 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 появилась функция, позволяющая отключить звуковой сигнал для конкретного номера. На мой взгляд, реализовать такую было бы не сильно сложно, но при этом она серьёзно улучшила бы качество жизни многих людей. Но я отошла от темы.



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

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

Комментарии (19)


  1. Shpakov
    14.06.2023 14:23
    +16

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

    Назначить контакту отдельный рингтон " с тишиной"? Вроде так делали еще до появления Андроида...

    Насчет "почему, чёрт побери, нельзя просто сделать два отдельных слайдера – для «громкости вызовов» и «громкости уведомлений»?" была новость: "Google наконец-то «починит» регулировку громкости в Android". Правда заняло это больше года...


    1. playnet
      14.06.2023 14:23
      +1

      Назначить контакту отдельный рингтон " с тишиной"?

      Борьба багов и костылей. Это - именно костыль. Но.. потому и используется, что работает.


    1. Didimus
      14.06.2023 14:23

      А как на iPhone отрегулировать громкость воспроизведения видео, если оно вот прямо в текущий момент не проигрывается?


  1. z250227725
    14.06.2023 14:23
    +4

    Давайте сделаем 100500 настроек в которых никто даже не попытается разобраться. Пишу с Pixel 3a. Android позволяет назначать персональный ringtone для контактов, звонков и уведомлений. Для решения проблемы 2 достаточно было взять "пустой" звуковой файл и использовать его для соответствующих настроек.

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


  1. LordCarCar
    14.06.2023 14:23
    +7

    Это все красиво. Но что автор сделала кроме нытья???


    1. sim31r
      14.06.2023 14:23
      +3

      И вряд ли кто поверит, что она никогда не ошибалась в работе.


      1. Didimus
        14.06.2023 14:23
        +2

        Походу, она работала над будильником в эппл


  1. vai
    14.06.2023 14:23
    +6

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


  1. sim31r
    14.06.2023 14:23
    +4

    Статья просто тень от мощной статьи на Хабре

    Самые дорогие и судьбоносные ошибки в ИТ-индустрии

    Ракета Ariane 5: ущерб в 8,5 млрд долларов
    4 июня 1996 года случился неудачный запуск ракеты-носителя Ariane 5, которая была разработана Европейским космическим агентством. Ракета разрушилась на 39-й секунде полета из-за неверной работы бортового программного обеспечения. Эта история запомнилась, как одна из самых дорогостоящих компьютерных ошибок.
    В системе управления полетом новой ракеты Ариан 5 использовались фрагменты программного обеспечения ракеты Ариан 4, в частности системы инерциальной навигации. Однако при переносе этой системы для использования на новой ракете, разработчиками не были учтены все особенности. Из-за другой траектории выведения ракеты на 30-й секунде после запуска значение горизонтальной скорости превысило установленные в программе ограничения и вызвало сбой в работе компьютера.
    ...
    ...


  1. RarogCmex
    14.06.2023 14:23
    +8

    Гм. https://habr.com/ru/articles/309388/

    Плохой программист Джон сделал ошибку в коде, из-за которой каждый
    пользователь программы был вынужден потратить в среднем 15 минут времени
    на поиск обхода возникшей проблемы. Пользователей было 10 миллионов.
    Всего впустую потрачено 150 миллионов минут = 2.5 миллиона часов. Если
    человек спит 8 часов в сутки, то на сознательную деятельность у него
    остается 16 часов. То есть Джон уничтожил 156250 человеко-дней ≈ 427.8
    человеко-лет. Средний мужчина живет 64 года, значит Джон убил примерно 6
    целых 68 сотых человека.

    Как тебе спится, Джон — серийный программист?

    Байка возникла далеко не на пустом месте.


    1. sim31r
      14.06.2023 14:23
      +1

      Компьютерные игры сколько "убили" интересно? У меня четверть жизни наверное, начиная с Quake 1 ))


  1. Altaev
    14.06.2023 14:23
    +4

    Хабр - не жалобная книга!????


    1. tetelevm
      14.06.2023 14:23
      +3

      А это и не жалобное нытьё, это перевод жалобного нытья.


  1. ogost
    14.06.2023 14:23
    +3

    Второй баг - не баг, а отсутствие фичи.


  1. vadimk91
    14.06.2023 14:23
    +1

    Буквально несколько дней назад пытался сделать первый заказ на СберМаркете. Выбрал товар, ввёл промокод, но до оплаты дело не доходит, "заполнены не все поля" (а входил по номеру телефона). Ок, забиваю ФИО, остаётся поле email, ввожу первый символ и поле сразу становится недоступным, а адрес разумеется невалидным. Попробовал в другом браузере, тоже самое. А может это и не баг)


    1. Mike-M
      14.06.2023 14:23

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


  1. Mike-M
    14.06.2023 14:23
    +1

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

    Если бы "эффективные" менеджеры выделяли на баг-фикс более 10-20% времени, а программисты получали от баг-фикса такой же интерес как от осваивания новых технологий/фреймворков/фич, то и "улучшать качество жизни многих людей" не пришлось бы.


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

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


    Кстати, у кого-нибудь есть опыт Customer Driven Development? Поделитесь, пожалуйста (ссылкой).


  1. Gradiens
    14.06.2023 14:23
    +1

    А долголи вы, как переводчик, искали эту эталонную "снежинку", чтобы ее перевести?

    Она занимает "комфортную техническую должность", она из поколения Y (то есть взрослая тетя) при этом не способна ни найти, ни нагуглить существующий workaround для своей задачи. Но, как снежинка, искренне так считает, что ей все должны. Это "почему, черт возьми, нельзя сделать" - просто прелестное. Путать баги с отсутствием фичи - тоже прекрасно характеризует автора (или надо говорить авторку?).


  1. klirichek
    14.06.2023 14:23
    +3

    В Яндекс-такси можно случайно дважды ткнуть в карту и оформить реальный заказ на поездку "из дома домой". Хотя вроде ничего не мешает для таких подозрительных заказов ставить фильтр с подтверждением ("вы действительно хотите проехать 30м. в булочную на такси?"). И обязательно найдётся пройдоха-водитель, который такой заказ примет и "выполнит"!

    (буквально пару недель назад Новосиб изнывал от жары... И незаблокированный телефон, положенный в мокрую от пота рубашку, "съездил" на 245р. куда-то)