Подумайте, де ви насправді працюєте.

Підвал із бетонним фундаментом і без вікон. Новобудова зі сталевим профілем, обшивкою й без жодних підключених комунікацій. Сільська ділянка за двадцять хвилин їзди від останньої вишки зв'язку. Технічне приміщення посеред поверху комерційної будівлі. Багаторівневий паркінг.

А тепер подумайте, де відбуваються демонстрації програм: в офісі, на Wi-Fi.

Саме в цьому розриві криється причина, чому польові застосунки дратують так, що це важко навіть сформулювати. Застосунок не повільний і не погано спроєктований. Він чудово працює на під'їзній доріжці й перестає працювати в підвалі — саме там, де він був потрібен. І відмова рідко буває чесною: зазвичай це виглядає як індикатор завантаження, тихе «збереження», яке нічого не зберегло, або форма, що скидає введене, коли ви натискаєте «назад».

Режими відмови, конкретно

«Немає з'єднання» — це не одна проблема. Їх декілька, і кожна ламає програму по-своєму.

Сигналу немає взагалі. Простий випадок. Добре зроблений застосунок знає, що він офлайн, і поводиться відповідно. З цим більшість застосунків справляється нормально, бо це легко виявити.

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

Сигнал, що з'являється й зникає. Ви чотири рази на день ходите з під'їзної доріжки в підвал. Кожен такий перехід — це ризик, що синхронізація обірветься на півдорозі.

З'єднання є, але повільне. Перевантажені сільські вишки о четвертій дня. Технічно все працює, але з такою швидкістю, що ви просто перестаєте цим користуватися.

Застосунок, який чесно вміє працювати офлайн, має справлятися з усіма чотирма випадками. Той, що вміє лише перший, усе одно втратить вашу роботу.

Телефон показує чергу вивантаження, поки майстер працює в бетонній сходовій клітці

Що насправді має означати «працює офлайн»?

Цю фразу вживають надто вільно. Є змістовний тест, і він складається з чотирьох частин.

Читання працює. Ви можете відкрити об'єкт, побачити адресу, обсяг робіт, номер телефону клієнта і вчорашні фото взагалі без з'єднання. Це означає, що дані справді лежать на пристрої, а не кешуються від нагоди до нагоди.

Запис працює, і надійно. Ви можете додати нотатку, зафіксувати години, записати витрату, зробити фото. І якщо телефон вимкнеться, застосунок примусово закриють або акумулятор сяде на морозі — ця робота все одно буде на місці, коли він знову увімкнеться. Те, що тримається в пам'яті, — не збережене.

Синхронізація автоматична і непомітна. Коли повертається сигнал, усе, що стояло в черзі, вивантажується само. Вам ніколи не повинно доводитися пам'ятати про кнопку синхронізації, бо той єдиний раз, коли ви про неї забудете, і буде тим разом, коли це матиме значення.

Конфлікти обробляються чесно. Двоє людей відредагували один і той самий об'єкт, обидва — офлайн. Хороша програма це виявляє і повідомляє вам. Погана — мовчки залишає одну з версій, і ви за кілька тижнів дізнаєтеся, що нотатка зникла.

Цей останній пункт найлегше пропустити, і саме він відрізняє застосунок, який офлайн просто терпить, від застосунку, який від початку побудований навколо офлайну. Щоб виявити конфлікт, застосунок має відстежувати версії кожного запису й порівнювати їх, коли зв'язок повертається. Це справжня інженерна робота, після якої нема чого показати як окрему функцію, — саме тому її часто просто не роблять.

Чому фото заслуговують на окремий абзац

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

Вони складні, бо великі. Фото повної роздільної здатності з одного об'єкта — це десятки мегабайтів. На одній рисці таке вивантаження зірветься. І ще раз, і ще. Застосунок, який ставиться до фото як до будь-якого іншого запису, або заблокує інтерфейс в очікуванні вивантаження, або просто його втратить.

Натомість має відбуватися ось що: фото одразу записується на пристрій і прикріплюється до об'єкта, а вивантаження стає окремим фоновим завданням, яке повторює спроби — і після перезапусків застосунку, і кілька днів поспіль, якщо треба. З фото має бути можна працювати в застосунку тієї ж миті, коли його зроблено, незалежно від того, чи дісталося воно колись до сервера.

Стежити варто ось за чим: застосунок показує фото на пристрої, але мовчки так його ніколи й не вивантажує. Усе виглядає правильно, поки ви не відкриєте об'єкт на ноутбуці або поки не загубиться телефон, — а фото весь цей час були лише локальними.

Майстер фотографує завершену роботу телефоном

Скільки це коштує, коли цього немає

Видима ціна невелика й постійна: кілька хвилин на кожен випадок, похід до під'їзної доріжки, щоб зловити риску.

Реальна ціна — поведінкова. Обпікшись двічі, люди перестають довіряти застосунку на об'єкті. Вони знову записують години на клаптику паперу й вносять їх у п'ятницю ввечері, фотографують квитанції в галерею телефона, яку ніхто ніколи не розбирає, і тримають справжній розклад у голові. Програма все ще встановлена й оплачена, а бізнес знову працює на пам'яті.

Щойно це сталося, усе, що йде далі по ланцюгу, деградує. Облік собівартості об'єктів перестає працювати, бо витрати ніколи не прив'язуються до об'єктів. Виставлення рахунків затримується, бо ніхто не впевнений, що роботу завершено. Цінність усієї системи трималася на тому, щоб дані фіксувалися в момент роботи, а офлайн-збій — це саме те, що це руйнує.

Як перевірити це, перш ніж на щось зважитеся?

За списком функцій цього не дізнатися; «працює офлайн» пише кожен. Перевірте самі — приблизно за десять хвилин:

  1. Увімкніть на телефоні режим польоту.
  2. Відкрийте об'єкт, який давно не відкривали. Чи завантажується він повністю, разом із фото?
  3. Додайте нотатку, зафіксуйте години, запишіть витрату, зробіть три фото.
  4. Примусово закрийте застосунок. Відкрийте знову. Усе на місці?
  5. Відновіть з'єднання. Чи все синхронізується само, без жодного натискання з вашого боку?
  6. А тепер справжній тест: увімкніть Wi-Fi, але підключіться до мережі без доступу до інтернету, щоб телефон показував з'єднання, якого насправді немає. Повторіть крок 3. Багато застосунків, які проходять перевірку в режимі польоту, провалюють саме цей крок.

Якщо застосунок пройшов усі шість — його робили люди, які самі бували в підвалі.

Zeus побудований саме так, свідомо. Застосунок тримає повну локальну базу даних на пристрої, тож об'єкти, клієнти та ціни читаються взагалі без з'єднання, а все, що ви вводите, спершу записується локально й синхронізується, коли повертається сигнал. Фото зберігаються на пристрої одразу і — на тарифах із резервним копіюванням фото — вивантажуються у фоні з повторними спробами, з можливістю вивантажувати лише через Wi-Fi, щоб день зйомки не з'їв мобільний трафік. Конфліктні редагування з двох пристроїв виявляються, а не мовчки перезаписуються, і позначаються на індикаторі синхронізації, щоб ви могли їх розв'язати.

Часті запитання

Хіба зберігання всього на телефоні не займає багато місця?

Текстові записи крихітні: тисячі об'єктів, клієнтів і позицій кошторису займають кілька мегабайтів. Єдине, що справді їсть місце, — фото, тому ними зазвичай керують окремо, а оригінали повної роздільної здатності після вивантаження лежать у хмарі.

Чи безпечні дані на телефоні, якщо його загублять або вкрадуть?

Це залежить від застосунку, і про це варто питати прямо. Дивитися треба на дві речі: шифрування локальної бази даних і блокування самого застосунку, а не на саму лише надію на екран блокування телефона. Zeus шифрує локальну базу даних і пропонує блокування застосунку за бажанням — через біометрію або PIN-код вашого пристрою.

Що станеться, якщо двоє з бригади відредагують той самий об'єкт офлайн?

У добре зробленій системі конфлікт виявляється, щойно синхронізується другий пристрій, і виноситься на розгляд людині. Стережіться будь-якого застосунку, який обіцяє, що такого ніколи не станеться: зазвичай під цим ховається правило «перемагає останній запис», а воно означає, що чиясь робота зникла й нікому про це не сказали.

Чи потрібно синхронізуватися вручну перед виїздом на об'єкт?

Не має бути такої потреби, а якщо вона є — це тривожний сигнал. Синхронізація має йти безперервно у фоні, щойно з'являється сигнал.