История ошибок производительности и вашего мозга, заставляющего вас любить их решать

"Сможешь быстро?" - спросил покупатель. «Мы теряем кучу денег из-за этого медленного приложения, которое вы создали!».

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

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

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

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

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

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

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

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

Вы где-то вспомнили урок: «Никогда не выполняйте синхронный сетевой вызов при запуске приложения, вместо этого делайте это в фоновом режиме».

"Сможешь быстро?" - спросил руководитель филиала. «Мы теряем кучу денег из-за этого медленного приложения, которое вы создали!».

Сначала вы просматриваете журналы сервера, чтобы увидеть, нет ли чего-нибудь необычного. Вы ищете признаки стресса:

  • Таймауты базы данных. Возможно, у DB проблемы с таким количеством продуктов.
  • Запросы, выполнение которых занимает больше времени. Использование ЦП и памяти. Сервер API может испытывать трудности, если одновременно имеется больше, чем среднее число пользователей.
  • Неожиданный разрыв соединения. Поскольку соединения мобильных пользователей не всегда стабильны, запросы могут задерживаться по тайм-ауту, поскольку они получают более обширный список продуктов.

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

Вы решаете вызвать API вручную с помощью Fiddler, чтобы проверить производительность из первых рук. Fiddler подтверждает журналы. Продукты возвращаются быстро, за 12 мсек, а общий размер составляет всего 10 КБ в сжатом виде.

Вы надеялись, что с сервером что-то не так, но это не так. Мысль о сожалении приходит в голову на долю секунды: «Я постоянно борюсь с компиляторами, ошибками времени выполнения, критическими изменениями в зависимостях npm, клиентами, не имеющими представления о том, чего они хотят, а теперь и производственными сбоями. Почему мне вообще нравится эта работа? », - думаете вы.

«Поскольку с сервером проблем нет, проблема должна быть в приложении», - думаете вы.

Вы запускаете приложение из исходного кода и начинаете профилировать его с помощью Android Studio. Вы надеетесь увидеть экстремальные значения на графиках. Но тебе не повезло. Использование ЦП низкое, память стабильная, а использование сети для получения продуктов выполняется плавно.

В чем проблема? Почему на это уходит столько времени? Это должно быть шутка.

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

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

Вы решаете погрузиться в использование ЦП, чтобы понять, что происходит.

Поскольку это приложение React Native, вы хотите поближе познакомиться с потоками JavaScript и Native Module.

Вы заметили здесь интересную закономерность. Когда поток JS (`mqt_js`) занят, поток собственных модулей (` mqt_native_module`) простаивает. Когда поток собственных модулей занят, поток JS простаивает. Также существует поток, выполняющий команды SQL: `pool-1-thread-1`. Похоже, они все играют в пинг-понг друг с другом.

Черт! Ты нашел это. Вы выяснили, что не так. Это мост сообщений, который вызывает медлительность.

  • Вы вставляете каждый продукт в отдельный оператор SQL. Это передается из JavaScript в собственные модули по мосту.
  • Поток JS ожидает ответа, пока собственный поток занят вставкой одного продукта.
  • Когда поток собственных модулей завершает свою работу, в потоке JS вызывается обратный вызов успеха, который вставляет еще одну строку.
  • Один и тот же танец происходит с каждым продуктом.

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

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

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

Нити больше не играют в пинг-понг. Работает даже быстрее, чем раньше. Вы ожидаете увеличения производительности от 5 до 20 раз в зависимости от устройства. Вы проверяете свое исправление с помощью набора тестов, созданного с помощью Detox.

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

- Менеджер: Спасибо !. Вы спасли нас сегодня. Приложение запускается еще быстрее, чем раньше.
- Вы: Пожалуйста. Я рад быстро это исправить.

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

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

На следующий день вы продолжите читать книгу Ювала Ноя Харари «Homo Deus: Краткая история завтрашнего дня». Там вы наткнетесь на захватывающее исследование.

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

Испытуемых просили погрузить руки в воду с температурой 14 ° C на 60 секунд. Затем им задали то же самое с другой рукой, но на этот раз в течение 90 секунд. Единственная разница заключалась в том, что температура воды была тайно увеличена до 15 ° C в течение последних 30 секунд.

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

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

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

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

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

«Наверное, поэтому мне нравится быть инженером-программистом», - подумали вы.

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

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

Загадочные ошибки раскрывают детектива внутри вас. Вы работаете с ними, как с делами, и когда вы раскрываете одно из них, вы чувствуете себя Шерлоком Холмсом.

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