В этой части я приведу ещё несколько примеров того, как нам мешает скачивание обновлений внутри приложений.
Пример 1: обновления macOS
Ни для кого не секрет, что обновления macOS огромны. Иногда это раздражает даже дома, но на Южном полюсе ситуация гораздо хуже.
Размер патча минорного обновления macOS обычно имеет размер от 0,5 до 1,5 гигабайтов. Патчи с крупными обновлениями иногда занимают до шести с лишним гигабайтов. Дополнительные инструменты, например Xcode, часто весят несколько гигабайтов.
![(Вздыхает) Ещё один патч на гигабайт для моего личного устройства с macOS на Южном полюсе. macOS Update Prompt 01](https://habrastorage.org/getpro/habr/upload_files/fb5/cf5/fa3/fb5cf5fa36800114b294161842fd2b90.png)
Если бы каждое устройство macOS на Южном полюсе скачивало эти обновления напрямую от Apple, то мы бы тратили огромную часть полосы пропускания. А встроенный скачиватель macOS определённо этого от нас и ждёт! Посмотрите на этот интерфейс: ограниченное количество элементов управления, никакой возможности выйти и легко получить сами файлы патчей. Если я отменю скачивание или оно по каким-то причинам прервётся, то я не всегда смогу возобновить его. Иногда весь прогресс теряется.
![Приложение для обновления macOS. Тут нет кнопки паузы! Я что, должен оставить ноутбук подключенным к Интернету в течение пятнадцати дней?? Apple Download Progress 01](https://habrastorage.org/getpro/habr/upload_files/80f/ddb/7f6/80fddb7f63438c586214b5216007de53.png)
К слову, у Apple есть встроенная в macOS функция кэширующего сервера. Теоретически, она должна облегчить задачу. Мы должны иметь возможность использовать эту функцию, чтобы каждый патч скачивался на Южный полюс только раз, после чего клиентские Mac обращались бы к кэшу.
В свободное время я экспериментировал с этой функцией на нескольких своих устройствах Apple. На практике эта функция всё равно требует от каждого клиентского Macbook выполнить успешный HTTPS-вызов напрямую к Apple, чтобы согласовать параметры кэша. В случае сбоя этого кэша, который происходит часто (из-за жёстко заданных коротких таймаутов!), клиентский Mac просто получает патч с публичных серверов Apple. Никаких повторных попыток или уведомлений. Клиентский Mac просто принимает одностороннее решение обойти кэш, не обращаясь к пользователю и не уведомляя его. На практике этот первоначальный вызов согласования кэша на Южном полюсе часто заканчивается неудачей, так что функция кэширования бесполезна.
Что мы можем сделать, так это скачать полный установщик (12 гигабайтов!) Apple. Ссылки на пакеты установщиков удобно собраны в блоге Mr. Macintosh. Мы можем медленно и старательно скачать на Южный полюс установщик целиком: с троттлингом и низким фоновым приоритетом при помощи надёжного, устойчивого к прерываниям инструментария, с поддержкой кэширования и возобновления приостановленных или сбойных передач. Получив файл, мы можем распространить его среди пользователей на станции. Этот процесс может занимать несколько дней, но он надёжен.
![Полный установщик macOS, мучительно и старательно скачиваемый на Южный полюс. macOS Installer 01](https://habrastorage.org/getpro/habr/upload_files/419/1c1/ec2/4191c1ec2c31ed40f7243c2c1f0ab49b.png)
Но даже это не может решить проблему! Если клиентский Mac — это Apple Silicon, он всё равно настаивает на скачивании дополнительного контента непосредственно с серверов Apple, даже если вы выполнили обновление полным установщиком на 12 ГБ. Нет никакого способа обойти или кэшировать это. Если обновление операционной системы требует определённых типов обновлений прошивки или обновлений Rosetta, то каждый клиентский Mac Apple Silicon обязан будет скачать в процессе установки 1-2 ГБ данных напрямую с серверов Apple.
Хуже того, иногда процесс скачивания передавался отдельному компоненту в macOS, который даже не сообщал о прогрессе установщику! Установка обновления macOS на Южном полюсе — это когда ты смотришь на окно с надписью «устанавливается, осталось 32 минуты» в течение нескольких часов, пока подкомпонент macOS скачивает в фоновом режиме гигабайт некэшируемых данных.
Apple наивно предполагает, что скачивание 1 ГБ будет таким быстрым, поэтому даже не озаботилась указанием скорости скачивания в оценке времени работы программы обновления. Разработчики не ожидали, что люди будут устанавливать обновления macOS в местах, где скачивание гигабайта данных может занять много часов, если не дней.
Это невозможно кэшировать и скачать напрямую при помощи веб-браузера (или другого механизма). Этим должен непосредственно заниматься скачиватель Apple. И, разумеется, в нём нет кнопки паузы. Скачивание каждым клиентским Mac 1-2 ГБ данных за один раз без прерываний — очень неудобно для пользователей и занимает очень большую часть канала.
Как бы Apple могла сильно улучшить ситуацию для пользователей с медленным или странно работающим Интернетом:
Создать требуемый патч, а затем дать нам ссылку, чтобы мы могли скачать его вне скачивателя Apple.
Дополнить встроенный инструмент для скачивания функциями паузы/возобновления и интеллектуальным управлением состоянием, чтобы прогресс не терялся.
Исправить полный установщик, чтобы в него включалось всё, в том числе и исключённые сейчас элементы, например обновления прошивки и Rosetta для Apple Silicon Mac. Было бы гораздо полезнее, если бы в него входило всё. Я бы мог скачать его один раз, а затем распространить его, не беспокоясь, что каждому Mac требуется скачивание дополнительных данных от Apple.
Усовершенствовать функцию кэширующего сервера Apple, чтобы повысить его надёжность в случаях ненадёжного доступа к Интернету. Дайте нам больше контроля за тем, как мы можем заставить работать Mac, чтобы мы могли заставить кэширующий сервер проактивно скачивать данные, которые нам понадобятся в будущем.
Пример 2: обновления телефона Samsung с Android
Мой телефон Samsung с Android получает периодические обновления операционной системы. В эти обновления включаются патчи Android, а также обновления Samsung UI и других компонентов операционной системы.
Программа обновления — это особо плохой пример приложения, совершенно не учитывающего случаи медленного и прерывистого Интернета.
![Скачиваю обновление операционной системы для моего телефона Samsung с Android на Южном полюсе. Phone Download Progress 01](https://habrastorage.org/getpro/habr/upload_files/180/335/df9/180335df966d558575c32dbed2a0a257.png)
Начнём с основ. У программы нет показателя скорости, нет числового индикатора прогресса (удачи в подсчитывании пикселей на движущейся полоске), нет кнопки паузы и кнопки отмены, нет индикатора размера файла, а также способа отдельного скачивания файла.
Во-вторых, при неудачном скачивании его нельзя возобновить, оно начнётся с начала.
На практике, на Южном полюсе телефон не может целиком скачать обновление операционной системы за один проход спутника. Поэтому с потерей связи скачивание неизбежно прерывается, и мне приходится начинать его заново.
Единственный способ решения проблемы — полностью отключить телефон непосредственно перед обрывом Интернет-соединения, а затем включить его при восстановлении Интернета при проходе следующего спутника. Эта хитрость заставляет телефон не отказываться от скачивания, потому что он полностью был отключен во время отсутствия Интернета. У него никогда не было шанса потерпеть неудачу. Благодаря этому я смог разделить скачивание на несколько проходов спутника и завершить его.
Это абсурдное решение! Я не должен заниматься этим.
У моего провайдера в США (Verizon) есть скачиваемое приложение для macOS и Windows, которое должно, теоретически, позволить мне прошивать обновления операционной системы с компьютера, а не полагаться на телефон при скачивании патчей. На практике, приложение Verizon даже хуже. Оно забагованное, ненадёжное и к тому же настаивает на использовании собственного скачивателя для получения файлов обновления (печаль...).
Я уверен, что должен существовать способ получения образов и их прошивки вручную. Это не предложение для кучи фанатов Android писать мне письма с объяснениями загрузчиков, APK, ROM, sideloading и всего того, что тут важно. Смысл не в этом. Я говорю, что предоставляемые производителями стандартные инструменты безнадёжно неполноценны для пользователей с медленным Интернетом, и это огорчает.
Пример 3: программа автоматического обновления небольшого приложения
В маленьком десктопном приложении есть встроенный скачиватель обновлений. Вы уже видите, в чём тут проблемы?
![In-App Downloader 02](https://habrastorage.org/getpro/habr/upload_files/253/475/661/2534756613088787ba73c95fae8537f7.png)
Давайте перечислим:
Нет кнопки паузы.
Нет кнопки отмены.
Нет никакого индикатора прогресса.
Нет индикатора скорости/оставшегося времени.
Нет никакого способа получить URL файла, чтобы я мог воспользоваться собственным скачивателем.
Нет отслеживания прогресса и возможности возобновить прерванную загрузку.
На самом деле, это одно из моих любимых десктопных приложений! Очень жаль говорить о нём в таком ключе. Разработчики могли бы сильно облегчить жизнь пользователей на Южном полюсе, если бы указали ссылку для скачивания вручную. Тогда бы им не пришлось самостоятельно реализовывать все удобные функции скачивания, которые есть у браузера, и я бы воспользовался им.
Пример 4: ещё одна программа для автоматического обновления
Ещё один пример!
![In-App Downloader 03](https://habrastorage.org/getpro/habr/upload_files/9ec/d0a/0df/9ecd0a0dfa47016460c41f6960934a62.png)
Давайте перечислим проблемы:
Нет кнопки паузы.
Нет числового индикатора прогресса/скорости.
Нет никакого способа получить URL для использования собственного скачивателя.
Нет отслеживания прогресса и возобновления после прерванной загрузки.
Однако у него есть кое-что хорошее:
Кнопка отмены.
Визуальный индикатор прогресса.
Но в целом для пользователей с медленным или прерывистым доступом к Интернету процесс очень утомителен.
Пример 5: Microsoft Office для Mac
Нужно отдать должное: в Office для Mac компания Microsoft встроила ОТЛИЧНУЮ программу автоматического обновления! Посмотрите сами:
![Microsoft Autoupdate 01](https://habrastorage.org/getpro/habr/upload_files/84d/0c8/bcb/84d0c8bcb7df017a5f154ee263faa907.png)
Только взгляните на эти замечательные функции!
Кнопка паузы!
Кнопки отмены!
Индикатор прогресса!
Индикаторы скорости и оставшегося времени!
Возможность возобновления прерванных скачиваний!
Единственное, что могло бы улучшить ситуацию — это ссылка на URL, чтобы можно использовать собственный скачиватель. Но учитывая удобство интерфейса, я вполне могу пользоваться им даже на Южном полюсе.
Заключение
Надеюсь, показанные в этом посте примеры стали полезной иллюстрацией того, как небольшие оплошности или несовершенства функций становятся огромными проблемами в местах с медленным Интернетом.
Повторюсь, я не прошу, чтобы каждый разработчик приложений тратил кучу времени, оптимизируя код под пограничные случаи наподобие Южного полюса.
И я точно не прошу людей творить чудеса. Доступ к Интернету на Южном полюсе на октябрь 2023 года был медленным. Я не жду, что в этих условиях будет работать интерактивный стриминг, но было бы здорово, если бы приложения были достаточно надёжны, чтобы передавать и получать несколько байтов. К сожалению, часто это заканчивается тем. что приложения застревают в порочном цикле из-за непродуманного жёстко заданного таймаута.
Надеюсь, статья была для вас полезной или хотя бы интересной.
Сейчас я уже полгода не нахожусь во льдах, и чтение своих старых постов навевает приятные воспоминания.
Надеюсь, дела у нынешней зимующей команды идут хорошо, и что всем нравится полярная ночь. Если поставки и скорость потребления яиц остались теми же, что и зимой 2023 года, то скоро они съедят последнее яйцо.