敏捷设计-主动设计而又是涌现式的设计

Scrum的项目没有一个前期的分析和设计阶段,所有工作发生在迭代的Sprint周期内。然而,这并不意味着,在一个Scrum项目中没有主动的设计。在一个主动的设计过程中,设计是通过深思熟虑的和清醒的决策来指引的。 Scrum项目上的差异不是扔掉主动的设计,而是通过增量的方式来完成,像Scrum项目中的其他做法一样。 Scrum团队承认,尽可能在前期做出所有的设计决策会很好,但这是不可能完全做到的。这意味着,在一个Scrum项目中,设计即是主动的又是涌现式的设计。涌现式设计是因为没有前期设计阶段(即使在每个Sprint中都有设计的活动);要主动设计,是因为慎重地选择产品Backlog的条目,有一双眼睛去推动设计在不同的时期朝着不同的方向。

关于如何通过排列产品backlog中的条目来影响系统的架构,我考虑用自己曾参与过的一个工作流系统作为例子。这个系统用来支撑一家生产特殊的T恤衫以及类似产品的筹款公司。学龄儿童会挨家挨户地推销这些产品。年销售收入将会在公司和孩子们代表的机构之间分摊,比如学校、运动队或者其他团体。对于每一笔买卖,这些孩子会填写表格并交到公司,在这里,表格要经过光学字符识别(OCR)处理,转换成一个订单。为了保持降低运费,在孩子们手工交付这些条目以后,同一个单位的订单会批量打包发回给该单位。
我们的软件负责整个过程——从公司收到表格到装箱出门。孩子们书写不规范和拼写错误是出了名的,因此我们的系统需要做的不仅仅是扫描表格以及准备装箱单。这里有各种不同程度的验证,取决于我们如何考虑每个订单已被准确地识别了。一些表格由于人工的办事人员把扫描的表格放在了屏幕的一侧,而系统的解释部分在另一侧,所以需要增加一些空间去修正。

由于成千上万的衬衫要在最繁忙的日子里处理,这个过程需要尽可能地自动化。我和产品负责人Steve协作来写产品Backlog。在那之后,我约见了开发团队,和他们讨论系统中哪些部分风险是最高的,或者是我们最不确定如何来开发的。我们决定,我们的第一个Sprint将集中在让系统可以端到端的处理一个高质量的文档:它将包括扫描,通过光学字符识别(OCR),并生成装箱单。我会绕开一些可选的步骤,比如倾斜矫正弯曲的页面、页面降斑等,但是我们会证明,整个流程可以完整的从开始到结束。这没有非常高的价值,但这是必须要做的事情,并且这能让开发人员测试总体架构。当我们完成这一点的时候,我们有了一个的基础数据库,可以让文档从一个状态变化到另外一个状态,并触发正确的工作流步骤。

下一步,开发人员询问产品负责人,他们是否可以开始系统另外一个部分的工作——将扫描的文档展现给一个工作人员,让他能够修改那些扫描和解释得到的信息。

这个被选择作为第二个架构目标,有如下三个原因:
• 这是一个人工步骤, 它和工作流现在已经可以处理的步骤不同。
• 让用户界面正确是至关重要的。考虑到通过这个系统的文档的体积,节省秒数很重要。我们要早点获得用户的反馈,以便于有时间去重复的改善可用性。
• 当这个特性增加了之后,用户可以开始处理体恤衫订单了。

这个项目继续以这种方式进行了几个月,最终非常成功,达到了所有可靠性和吞吐量的预发布目标。它的成功关键是产品的所有者和技术人员共同努力来给要做的工作排序。团队最接近设计阶段的环节发生在第一个下午,我们在会议室中确定风险最大的部分和暗角,并且决定我们应该先去解决哪一个。从那时起,设计在一个Sprint接着一个Sprint的涌现出来,同时通过决定选择产品backlog的哪个条目来解决项目的风险和照亮暗角,主动地指引着设计。

作者: Mike Cohn

Mike的blog:http://blog.mountaingoatsoftware.com/