我们在超市结账的时候,收银员会给我们一张小票。有时我们购买两件或三件相同的产品并将它们打印在收据上。有时只有1行记录,数量为3,但有时有3行记录,数量为1,这个现象很有意思,为什么不统一呢?根据我的观察,后者的情况要多得多。明明前一种方法比较省纸,为什么用的少呢?我曾经想象是因为收银机性能太差,内存太少。它只能维护一个简单的数组结构,而不是一个集合,不可能每增加一个产品就重新扫描数组进行修改。但仔细一想,这个论点是站不住脚的——现代收银机已经足够好了,就连手机也在突飞猛进。那么这是什么原因呢?就在我想不通的时候,一个偶然的机会解开了我的疑惑。当时我们想开发一个收货管理系统。为了节省纸张和追求“程序的美感”,我决定选择“一行多记录”的方式,即“1行记录,个数为3”,因为硬件绰绰有余。程序开发完成后,测试完全没有问题,一切都很顺利。但是实际应用之后,仓库的同事对这一点很不满意,强烈要求每一行只对应一个item,同一个item的多个item必须有多个record。好吧,这是一个了解原因的机会。到外地一看,顿时明白,把多个项目放到一行记录里是不对的。首先,大家习惯对一件商品扫描一次,需要在对应的清单上打印一行记录,以确认扫描完成。当然,我们可以说还可以通过其他方式进行提示,比如闪屏或者发出声音。但是扫描生成的核对表也会被员工在下一个流程中使用。在对照清单处理商品的时候,他当然希望自己每次下单的时候,都直接从清单中越过一条线;如果这一行对应的项目不止一项,他只能在旁边写上“正”来算。自然就大大减少了(如果仔细观察餐厅服务员的上菜过程,也会发现这一点,但很少有人会点两份某道菜)。这个发现让我触动很大。可能是因为长期做“纯”的软件产品,所以虽然要考虑划分边界、分离职责、设计架构,但这些都是“软”的,没有“硬”的约束:一个功能,一个一种职责放在这里放在那里,虽然有结构上的考虑,但是如果真的需要修改,通常不会有太大的问题,所以即使只是从逻辑和美感的角度考虑,也是没有问题的.最典型的消息传递可以是“push”也可以是“pull”,一般场景下不会有太大区别。然而,现实世界中的许多问题并不是那么简单。受限于设备和场景,有时只能“拉”不能“推”。例如,一些移动设备受功耗限制,“推”当然比“拉”好。比如,面对这样的“硬”限制,如果我们只是把自己关在办公室里,闭门造车,即使程序写得再好,结构再漂亮,也不能真正解决问题。不要以为只有软件是“硬”受环境制约的,有时候环境也是“硬”受软件制约的。如果你留意过产品说明书,你会经常发现很多产品都提供了多语言的说明书。本来,描述的文字不需要太多的空间。每种语言版本都是印刷的,说明书的成本要高出很多倍。事实上,产品的目标市场(目标语言)几乎是确定的,那么为什么还要花钱买多语种的说明书呢?直到参观了工厂的生产线,我才真正明白其中的原因:软件可以自由分离和组合,而生产线却不能。根据实际情况,大部分加工厂使用的生产管理系统只能支持“单一原料表、单一工序、单一产品”。如果销往不同目的地市场的产品本体相同,只是说明书不同,生产管理系统无法将“放入说明书”这一环节作为变量分离出来,插入到生产流程的“模板”中去实现“身体同一生产过程”,包装上使用的说明不同”。即使生产系统可以支持,生产线也不能这样安排,因为整条线的工位组合是固定的。是的,先进的生产管理系统和生产lines可以支持这种“模板+变量”的模式,但是实现起来成本太高。因此,如果不使用多语言说明书,就只能针对不同的市场配备不同的生产工艺(硬拷贝)。如果其中一个过程需要改变,所有的生产过程都需要改变。一根头发牵一发而动全身,成本太高。.所以我只能退而求其次,干脆花更多的钱,用多种语言打印最重要的变量——手册。虽然看起来很浪费,却是最省钱省事的办法。这种问题看似很简单,但我还是觉得值得一谈,因为我发现随着互联网,尤其是移动互联网的发展,软件越来越多地涉及到生活的方方面面,而且越来越多更多的会受到现实的“硬”约束。过去,软件开发更像是一门独立的科学,所以每个人都要学会如何“使用软件”,软件开发者也有随意“改改改”的权利。而现在,既然软件是“软”的,就应该像水一样,没有固定的形态,却可以渗透到现实世界的每一个角落。很多时候,决定软件价值的不再是先进的技术和复杂的架构。而是能够与现实和谐相处。作为软件开发人员,我们需要反复问自己我们试图解决什么问题,我们受到什么约束,然后提出切入问题核心的解决方案。在这方面,我也遇到过让我印象深刻的例子。在快递包裹的收件站,收件人需要做的就是称重包裹并扫描包裹上的条码。电子秤和扫描枪都已与电脑连接,正常过程中光标会自动移动,无需人工干预。但有时会出现异常情况,仍然需要进行注销、回滚、确认等操作。根据常见的解决方案,键盘或至少是小键盘是必须的。这样一来,不仅多了一台设备,操作人员也需要转移双手操作多台设备。后来,我的团队成员给出了一个非常巧妙的解决方案:将常用的取消、回退、确认等操作约定为操作码,打印成条码贴在控制台上,这样操作人员就不用离开操作台了。扫描器。您可以完成所有工作:扫描此条形码取消;扫描该条形码以返回;扫描另一个条码来确认...必须承认,虽然我之前做过很多年的软件开发,解决过很多问题,但是面对这个问题,我想到的解决办法都是“如何简化键盘操作””。直到我看到扫码解决方案的那一刻,我才恍然大悟——原来这个软件还是可以做到的!好吧,以后软件应该可以做到这一点。
