我们出发时面对的问题
二月天。一栋房子里的锅炉坏了,十八个月前,您手下的人在那儿干过活。那次上门的记录还在,就是散在各处:一段短信里、相册里、货车里的一张纸质发票上,还有一个人的脑子里。而您现在就站在这扇门前,手上一样都没有。于是这项工作只能从头来过。同样的问题再问一遍,同样的检查再做一遍,同样的一个小时再搭进去。这笔钱您要么再收一次,要么自己认了。
本该解决这个问题的软件,大多没解决。它们是为有调度员、有办公桌的办公室做的,价格也只有那样的公司付得起。偏偏在真正干活的地方,它们不管用。于是技工们继续用纸。
我们做的正好相反:您干过活的每一个地址,应用都留着一份记录。每一次上门、每一张照片、每一份报价单、每一张发票、每一条备注,都挂在这处房产上。有没有信号都一样,站在门口就能打开。
我们如何打造
我们从不打破的四条规则
这些不是贴在墙上好看的话。每一条都管着我们每天怎么写代码,每一条也都有程序自动检查。我们不会只指望有人发现。
这里没有信号是常态,不是故障
机房、地下室、狭小空间,还有半个乡村服务区域,都没有可用的信号。所以应用会先把您的工作存在手机上,之后再发到服务器。它还留着一份“还没发出去”的清单:您关掉应用、手机把它关掉、把手机落在停车场一整天,这份清单都还在。您的工作在发到任何地方之前,就已经存好了。
应用在手机上有自己的数据库,也有自己那份待发清单。它不是我们服务器上那份数据的临时副本。
金额以整数分计算,从不使用小数
每一笔金额都存成整数的“分”,每一个税率都以万分之一为单位存成整数。规则说在哪一步四舍五入,我们就在那一步舍一次,是有意为之。我们不会在上百笔小额相加的过程中,一点一点悄悄地舍。
一项自动测试会读取正在运行的数据库。只要有哪一列标着金额,却不是只存整数,这项测试就不通过。
一家公司永远看不到另一家公司
每条记录都盖着所属公司的印记。每次对数据库的请求,都只能落在提出请求的那家公司范围内。再往下一层,数据库自己也筑着同一道墙,每张表都有自己的规则。两道墙同时倒,数据才可能泄出去。
一项自动测试会读取正在运行的数据库。只要有哪一张公司记录表少了这条规则,它就会点名报出来,测试不通过。
历史记录只能追加,从不能修改
历史记录行和付款记录从不修改,也从不删除。要改一处错,我们会新加一条把旧的那条冲掉,这样过了几年,一项工作的来龙去脉还是看得清楚。日后有人对当初约定了什么、什么时候约定的说不到一起,这一点就派上用场了。
数据库会自动挡住这类操作。这不只是我们要求大家守的一条规矩。