1.1 流程自动化
本质上,流程(或工作流)仅指为实现预期结果而需要执行的一系列任务。
流程无处不在。作为开发者,我个人的开发流程能够管理从问题(issue)到代码修改的一系列任务。作为员工,我想到了优化以邮件为核心的处理流程,其中涉及快速确定邮件优先级和及时处理收件箱的技术。作为公司负责人,我想到了端到端的业务流程,例如,用户订单履约,或者称为“订单到现金”。作为后端开发者,我还想到了代码中的远程调用,这些调用涉及一系列任务——特别是在考虑重试及任务清理时,因为分布式系统随时都有可能失败。
流程自动化有不同的级别。主要区别在于是人工控制流程还是计算机控制流程,或者是流程完全自动化。下面的例子展示了不同级别自动化之间的明显区别。
高中毕业后,我协助组织“车轮上的餐厅”,为居家老年人提供送餐服务。当时有一个用来处理餐食订单的日常流程。这个流程包括汇总送往厨房的订单列表、打包餐食、确保所有订单都贴上正确的标签,以便交付给正确的收货人。除此之外,该流程还包括最重要的送餐服务。在我最初执行的时候,这个流程完全是由纸张驱动的,需要消耗整整一上午才能完成。我做了一些改进,利用Microsoft Excel实现了一些任务自动化。这把整个流程的时间缩短到大约30分钟——这显然要高效得多。虽然仍然存在人工劳动,例如,对食物进行打包和贴标签,以及开车去送餐。
更重要的是,这个流程仍然是由人控制的,我的工作是正确操控按键并在适当的时候带着清单去厨房。软件只负责其中一部分任务。
在我上一次去医院的时候,我和工作人员聊了聊备餐工作是如何进行的。我了解到,患者需要填写一张纸质卡片来标记过敏史及饮食偏好,这些信息会被录入计算机。之后,IT系统负责在正确的时间将信息传输到正确的位置,并且需要以自动的方式完成。人仍然在这个流程中发挥作用,但他们没有指导它。这是一个计算机控制的流程,虽然并不是完全自动化的。
如果你希望将这个例子再向前推进一步,那么今天有烹饪机器人可供选择。假如你将这些机器人添加到流程中,那么计算机不仅可以自动按照控制流向前推进,就连烹饪的任务都可以自动完成。这使得流程更接近于完全自动化的流程。
如你所见,任务间控制流的自动化与任务本身的自动化,两者有重要的区别。
控制流的自动化
任务之间的交互是自动化的,但任务本身可能不是。假如由人来完成任务,则计算机控制流程,并且在必要时让人参与进来,例如,使用含有任务列表的用户界面。这被称为人工任务管理。在前面的例子中,就是由人来烹饪食物。这与完全手动的流程形成鲜明对比,这个流程之所以高效,是因为在完全手动的流程中,人们通过传递纸张或电子邮件来控制任务流。
任务的自动化
任务本身是自动化的。在前面的例子中,就是将烹饪的任务交由机器完成。
如果你结合使用控制流的自动化和任务的自动化,则可以实现完全流程自动化,也称为直通式流程(STP)。只有当偏离预期,发生了不正常操作时,这些流程才需要进行手动干预。
当然,从趋势上看流程要尽可能地自动化是理所当然的,推动自动化的具体原因如下:
重复次数多
只有当潜在的收益超过了开发成本时,在自动化中投入的努力才是值得的。具有超高执行量的流程是进行自动化的候选者。
标准化
流程需要结构化和可重复,以便于自动化。虽然在流程自动化中实现一定程度的变化和灵活性是可行的,但它增加了自动化的开销,并削弱了一些优势。
合规的一致性
对于一些行业或特定流程,在可审计性方面有严格的规定,甚至规定在授权时要以可重复和可修订的方式记录步骤。自动化能够做到这一切,并能及时提供高质量的相关数据。
质量需求
某些流程需要保证产品质量的一致性。例如,你可以承诺为用户提供以特定的速度交货的订单。通过自动化流程,这更易实现并保持。
信息丰富
包含大量数字化信息的流程更适合自动化。
正如5.1节中进一步说明的那样,流程自动化可以通过不同的方式来实现,但是有一些专门用于流程自动化的软件。就像前言中提到的,本书将重点介绍这些工具,特别着眼于工作流引擎。
流程自动化并不一定意味着进行软件开发或使用某种工作流引擎。流程自动化的实现可以很简单,只需利用Microsoft Office、Slack或Zapier等工具来自动化某些基于事件触发的任务。例如,每次我在个人电子表格中输入新的会议演讲时,它都会触发几个自动任务,将其发布到我的主页、公司的日程表、用于维护开发者关系的Slack频道等。这种自动化相对容易实现,即使非IT人员也可以自己实现,当然功能也有限。
在本书的其余部分,我不会专注于这些类似于Office的工作流自动化工具。我们将从软件开发和架构的角度讲述流程自动化。
为了帮助你理解如何使用工作流引擎实现流程自动化,让我们通过一个故事来说明它可以解决的各种现实生活中的开发者问题。