【CSDN】在第三届“敏捷中国”技术大会的分会场内,下午的第一场演讲是由ThoughtWorks咨询师路宁带给大家的“精益工厂之旅”。 他通过丰富的实例和细致的讲解与大家分享了几个月前多位ThoughtWorks员工到天津塘沽一家精益工厂参观的所见所闻,带着广大听众感性地接触了精益生产,同时还反思了精益思想在软件开发中的应用。 刚一进入工厂,他们感受到了清洁明亮的环境,没有油污或散落的零件。所有的工具都有一个唯一的地方保持它们,那些没有用的东西都已被清理掉,任何细小的问题和浪费都变得显而易见。这是精益生产中“5S”实践的结果,它是关于如何创造便于暴露问题的工作环境的一组实践。在软件开发中,工作环境就是代码库以及各种文档和配置,没有被引用的类就是散落在地面上的报废零件,一些碍眼的全局变量就是机器旁的油污,保持清洁明亮的工作环境才可能生产出高质量的软件。 步入工厂不久,他们发现这是一家可视化的工厂。你通过简单观察信息揭示板,看板等,在5分钟内就能了解到工厂的生产情况,而不需要询问他人。这是精益生产中可视化控制实践的结果,它强调生产信息不应保存在经理的电脑中,而应可视化地展示出来,支持团队自我管理和自我决策。在敏捷开发中,用户故事墙和Burn Up图等等被用来可视化地展示项目各方面信息,团队成员据此清楚地了解到什么是此时最重要的工作,而不是只关心如何做好被分配的具体工作。 参观中,他们注意到了各种看板,并体会到了看板是如何拉动生产过程的。精益生产强调前一道工序在后一道工序要求时才开始生产,依次类推,最后一道工序是客户。是客户将产品一件一件地“拉”出工厂,而不是如传统企业一样借助物料资源管理系统向各单位下达生产指令,并通过执行计划将产品“推”向仓库或客户。在敏捷开发中,用户故事卡,验收测试和单元测试等都是看板。只有在建立了看板,也就是在看到失败的测试的时候才开始编码。软件中的看板是可运行的看板,所有验收测试运行通过后,用户故事也就做完了。 工厂工作人员的介绍说,他们频繁接到丰田的小量订单,并在接到订单后开始通过看板拉动生产和采购的过程,无需通过库存就能满足及时交付的要求。这体现了准时化生产和零库存的概念。库存就是指部分完成的工作,在软件上,严格意义上说就是指已经开始了,但还尚未给客户创造价值的全部工作。迭代式软件开发类似准时化生产,它持有一个迭代的库存(严格意义上说是一个交付周期的库存)。而瀑布式开发可能持有半年,甚至一年的库存。零库存在软件中是指“每次提交都产生可交付的软件”,和制造业中的零库存概念一样都是无法严格做到的,但不妨碍它们成为我们追求的目标。精益就是将未完成的工作最小化的技术。 在该工厂中,他们看到了一个个自主的工作单元,其中包括生产某一产品需要的全部设备和各种角色的人员,其中也包括产品检验人员。而传统工厂则按照机器类型或加工步骤组织部门,并通过在部门间批量传递半成品来进行生产。在该厂的工作单元中,产品被一件一件地生产出来,一件产品加工后立即检测,而不是集中送去独立的质检部门进行检测。这体现了精益生产中单件流和全能小团队的概念。敏捷开发中有一样的全能小团队,针对某一功能的开发测试环节紧密相连。我们知道,生产线上的流程是高度可视化的,这便于我们发现其中可以优化的环节,而软件开发是智力工作,其流程难以可视化,但“结对”则可作为改进智力工作流程的有效方法。 在生产线旁,他们了解到了质量是如何在工序中被有效保证的。一线工人被授权在出现缺陷时通过拉动面前的绳子来停止生产线,同时还广泛使用自动化的检测设备来第一时间发现问题,停止生产线。停止生产线后会亮红灯,这时值班组长、产品设计人员或生产设备的设计人员会过来在第一时间,第一现场对出现问题的实物进行分析,并可能通过改进产品设计或工具设计将问题彻底解决。精益生产强调质量产生于工序中,而非依赖后期检测,并认为后期检测是一种浪费。在软件开发中也一样,质量主要不在于你投入了多少人组建了一个强大的测试队伍,而在于测试的时机和方法。等所有功能都做完了再测试就太晚了。你可能通过大量的投入得到较好的软件外部质量,但很可能错失了通过改进设计提升软件内部质量的时机。糟糕的内部质量在你为软件增加新功能时会暴露无疑的。 他们在参观中还发现,工人们会持续地进行频繁的改进活动。工人会对改进前后的状态分别拍照,并将照片张贴在改进展示板上。带领他们参观的人就是负责改善工作的,他说培养“发现浪费的眼光”是他这个角色的重要技能。在软件开发中,我们也需要培养这种眼光,不断发现可以改进的做法或流程。频繁的重构本身就是持续改进的生动例子。 了解精益工厂的一些实践只是精益之路的开始。向制造业中的先进技术学习,精益思想正在为敏捷软件开发注入新的灵感。 第三届“敏捷中国”技术大会,CSDN现场报道中。 路宁介绍:
ThoughtWorks公司咨询师,擅长.NET企业应用开发,在敏捷软件开发领域有着丰富的经验。博客位于www.luning.name