想想你平时到底在哪儿干活。

一间地下室,混凝土基础,没有窗。一栋新房,轻钢龙骨和覆面板都上了,水电还没接通。一处乡下的房子,过了最后一座信号塔还得再开二十分钟。一间机电房,卡在商业楼层正中间。一座地下车库。

现在再想想软件演示是在哪儿做的:办公室里,连着 Wi-Fi。

正是这道落差,让现场软件用起来特别窝火,而这股窝火又很难说清。应用不慢,设计也不差。它在门口用得好好的,一进地下室——也就是你真正需要它的地方——就不好使了。而且它很少老实告诉你:通常就是一个转圈的加载图标,一次看着存上了、其实没存的保存,或者你一退出去,刚打的字全没了。

具体是哪些故障模式

“没网”不是一个问题,是好几个问题,而且它们搞崩软件的方式各不相同。

一格信号都没有。 这是最干净的一种。做得好的应用知道自己离线了,会照着离线的方式来。大多数应用都能应付,因为这种情况很好判断。

有一格信号,技术上算连着网。 这一种才真要命。设备报告说有连接,应用就去找服务器,请求挂在那儿不动。你盯着加载图标转四十秒,然后超时;更糟的是,请求只完成了一半。软件如果只查“有没有网”,不查“这次到底成没成”,就在这儿栽得最惨。

信号时有时无。 你一天要从门口走进地下室四趟。每进出一次,就多一次同步卡在半路的机会。

连着网,但很慢。 下午四点,乡下的基站挤满了人。从技术上讲一切都能用,就是慢到你干脆不想再用。

一款老老实实做到离线可用的应用,这四种都得应付得了。只处理了第一种的,照样会把你干的活儿弄丢。

一名技师在混凝土楼梯间干活,手机上显示着一条排队等待上传的记录

“离线可用”到底该是什么意思?

这个说法用得很随便。其实有一套站得住脚的检验标准,分四条。

读得出来。 一点信号都没有,也能打开一单工程,看到地址、施工范围、客户电话和昨天的照片。这说明数据是真存在设备上的,而不是碰巧缓存了一份。

写得进去,而且存得住。 你能加备注、记工时、录费用、拍照。而且手机没电也好、应用被强制退出也好、电池在冷天里耗光也好,回过头来这些东西都还在。存在内存里,不算保存。

同步自动完成,不用你操心。 信号一恢复,排队的东西自己就上去了。不该还要你记着去按同步键,因为你唯一忘按的那一次,恰恰就是最要命的那次。

冲突要老实交代。 两个人都在离线状态下改了同一单工程。好软件会发现,并且告诉你。差软件悄悄留下其中一个版本,你要到几周之后才发现少了一条备注。

最后这条最容易漏掉,而它正是“离线能凑合”和“离线优先”两种应用的分界线。要发现冲突,应用就得给每条记录记版本号,回传时逐条比对。这是实打实的工程活儿,却拿不出任何看得见的功能来展示——所以它常常干脆就没人做。

为什么照片值得单独说一段

照片是现场软件里最难办的离线场景,偏偏又是承包商在现场最需要留下的东西:开工前的原有破损、墙里面的状况、完工的活儿、一次抄表、一次送货。

难就难在体积大。一单工程的全分辨率照片,加起来几十兆。一格信号下,这批上传会失败,而且反复失败。应用要是把照片当成普通记录来处理,要么卡在那儿等上传,要么干脆把它丢了。

真正该做的是:照片当场写进设备,挂到这单工程名下;上传另开一个后台任务,失败了就重试,应用重启接着重试,必要时跨好几天也接着重试。照片从按下快门那一刻起就得能在应用里用,不管它有没有真的到过服务器。

要提防的是这一种:应用在手机上把照片显示得好好的,却从来没真正传上去过。一切看着都对,直到你在电脑上打开这单工程,或者手机丢了,才发现那些照片一直只在本地。

一名技师用手机给已完工的作品拍照

缺了这个,代价是什么

看得见的代价很小,但一直在流:每出一次问题损失几分钟,走回门口去找那一格信号。

真正的代价在人的行为上。被坑过两次之后,大家在现场就不再信这款应用了。又退回到用一张废纸记工时、周五晚上再补录,把收据拍进一个永远不会去整理的相册,把真正的日程记在自己脑子里。软件还装在手机上,钱还照付,生意又开始靠脑子转了。

一旦到了这一步,下游全都跟着垮。成本核算不灵了,因为成本从来没落到具体工程头上。开票拖了,因为没人敢说这活儿到底完没完。整套系统的价值,本来就建立在“数据在干活当下就记下来”这个前提上,而离线一失灵,这个前提就没了。

决定用它之前,你该怎么测?

光看功能清单看不出来,因为人人都写着“支持离线使用”。花十来分钟,自己测一遍:

  1. 把手机调成飞行模式。
  2. 打开一单你最近没打开过的工程。能完整加载吗,照片也在?
  3. 加一条备注,记一笔工时,录一笔费用,拍三张照片。
  4. 强制退出这款应用,再重新打开。刚才那些都还在吗?
  5. 把网络恢复。东西会不会自己同步上去,不用你按任何键?
  6. 然后才是真考验:打开 Wi-Fi,连到一个上不了网的网络,让手机显示“已连接”,实际却不通。再做一遍第 3 步。很多能过飞行模式那一关的应用,会栽在这里。

六项都扛过来了,说明做这个东西的人,是下过地下室的。

Zeus 就是刻意照这个标准做的。应用在设备上留着一份完整的本地数据库,所以没有信号也读得到工程、客户和价格;你输进去的东西一律先写本地,信号回来了再同步。照片当场存在设备上;在包含照片备份的套餐里,还会在后台反复重试上传,并且有只走 Wi-Fi 的选项,这样一天拍下来的照片就不必把流量吃光。两台设备改出冲突,应用会认出来,而不是悄悄覆盖掉,并在同步指示器上标出来,等你处理。

常见问题

把所有东西都存在手机上,会不会占用很多空间?

文字记录很小:成千上万单工程、客户和明细行,加起来也就几兆。真正占地方的只有照片,所以照片通常单独管——传上去之后,全分辨率原图放在云端。

手机丢了或被偷了,里面的数据安全吗?

这要看具体是哪款应用,值得直接问一句。要留意两点:本地数据库有没有加密,以及应用本身有没有一道锁,而不是光靠手机的锁屏。Zeus 会加密本地数据库,另外提供一道可选的应用锁,用你设备上的生物识别或 PIN 码解锁。

如果两名队员都在离线时改了同一单工程,会怎样?

设计得好的系统,第二台设备一同步就发现冲突,交给人来处理。对那些拍胸脯说“绝不会发生”的应用要警惕:常见做法是“最后写入者胜”(last-write-wins),意思就是有人干的活儿悄没声地没了。

出发去工地之前,我需要手动同步吗?

不该需要;如果需要,这件事本身就是个警示。只要有信号,同步就该一直在后台跑着。