Подумайте, где вы на самом деле работаете.

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

А теперь подумайте, где обычно показывают демоверсии программ: в офисе, по Wi-Fi.

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

Виды сбоев — подробно

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

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

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

Связь то появляется, то пропадает. Вы четыре раза в день ходите с подъездной дорожки в подвал и обратно. Каждый такой переход — риск оборвать синхронизацию на середине.

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

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

Телефон показывает загрузку фото в очереди, пока мастер работает на бетонной лестничной клетке

Что на самом деле должно значить «работает офлайн»?

Эту фразу используют слишком вольно. Есть содержательная проверка, и в ней четыре пункта.

Чтение работает. Вы можете открыть объект, увидеть адрес, объём работ, номер телефона клиента и вчерашние фото вообще без связи. Это значит, что данные действительно хранятся на устройстве, а не кешируются от случая к случаю.

Запись работает и надёжно сохраняется. Вы можете добавить заметку, внести часы, зафиксировать расход, сделать фото. И если телефон выключится, приложение принудительно закроют или батарея сядет на морозе — эта работа всё равно будет на месте, когда телефон снова заработает. То, что лежит только в памяти, не сохранено.

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

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

Именно последний пункт легче всего пропустить, и именно он отделяет приложение, которое офлайн просто терпит, от приложения, для которого офлайн — основной режим. Чтобы поймать конфликт, приложению нужно вести версии каждой записи и сравнивать их при возврате в сеть. Это настоящая инженерная работа, которую потом нечем предъявить, — потому её так часто и не делают.

Почему фото заслуживают отдельного абзаца

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

Сложны они потому, что большие. Фотографии одного объекта в полном разрешении легко тянут на десятки мегабайт. При одной палочке связи такая загрузка не пройдёт — ни с первого раза, ни с десятого. Приложение, которое обращается с фото как с любой другой записью, либо подвесит всю работу в ожидании загрузки, либо просто потеряет снимок.

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

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

Мастер фотографирует готовую работу на телефон

Во что обходится отсутствие офлайна

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

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

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

Как проверить это до того, как вы примете решение?

По списку функций это не понять — «работает офлайн» пишут все. Проверьте сами, минут за десять:

  1. Включите на телефоне авиарежим.
  2. Откройте объект, который давно не открывали. Загружается ли он полностью, включая фото?
  3. Добавьте заметку, внесите часы, зафиксируйте расход, сделайте три фото.
  4. Принудительно закройте приложение. Откройте снова. Всё ли на месте?
  5. Восстановите связь. Синхронизируется ли всё само, без единого вашего нажатия?
  6. А теперь настоящая проверка: включите Wi-Fi, но подключитесь к сети без доступа в интернет, чтобы телефон сообщал о наличии связи, которой на самом деле нет. Повторите шаг 3. Многие приложения, успешно прошедшие авиарежим, проваливаются именно здесь.

Если приложение пережило все шесть пунктов, его делали люди, которые сами бывали в подвале.

Zeus построен именно так, и это осознанное решение. Приложение держит на устройстве полную локальную базу данных, поэтому объекты, клиенты и расценки читаются вообще без связи, а всё, что вы вводите, сначала пишется на телефон и уходит на сервер, когда связь вернётся. Фото сохраняются на устройстве сразу и — на тарифах с резервным копированием фото — уходят в фоне, с повторными попытками и с возможностью отправлять только по Wi-Fi, чтобы день съёмки не съел мобильный трафик. Расходящиеся правки с двух устройств не перезаписываются молча: их находят и помечают на индикаторе синхронизации, чтобы вы решили, какая версия верна.

Часто задаваемые вопросы

Не занимает ли хранение всего на телефоне слишком много места?

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

Безопасны ли данные на телефоне, если он потерян или украден?

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

Что будет, если двое из бригады отредактируют один и тот же объект офлайн?

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

Нужно ли синхронизироваться вручную перед выездом на объект?

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