我认为首先要意识到的是,敏捷与敏捷之间是有区别的。缓慢推出敏捷技术和特性-跨职能团队,自适应计划,渐进式/增量交付,有时间限制的迭代,甚至从精益中引入概念与引入极限编程,Scrum或Crystal都大不相同。
您明确提到了客户参与。是的,许多敏捷方法都要求客户参与,但这并不是敏捷所必需的。在每个与政府/国防相关的计划中,我始终都有与客户联系的计划或项目经理。此人成为“客户的声音”。在他们进行电话会议,电子邮件或打电话和澄清时,可能会减慢速度,但是您可以由一个人(或一组,如果您还有副PM)来代表团队。诚然,情况并不完全相同。但是,不是要灵活地应对变化吗?
您还提到了一些关键概念:预定义的需求,具有“丢在墙上”的功能请求,由于“它们都很重要”而缺乏优先级,以及固定成本和/或固定进度的项目。每个问题都可以通过不同的方式解决。
如果您认为自己已经满足了所有要求,那么您可能没有。要求确实有所变化。仅仅因为您有一个“完成并签字”说明,并不意味着它是一成不变的。给定您拥有的任何需求文档,捕获他们的感觉和/或以合同规定的方式,并交付需求,设计和体系结构。另外,看看您是否可以将它们当作活文档(我今天在工作中看到的设计文档标记为Revision G,这意味着它是第8次更新)。询问在任何给定的迭代中可以保留多少作为TBD,以及现在需要确定多少-可能会有一些让步。
敏捷地处理您的文档。不要在“您的团队想要什么”和“客户想要什么”之间重复工作。例如,如果您的客户想要一个传统的软件需求规范,而您的团队想要使用用户案例,请尝试适应传统的SRS,并使用操作项和滚动操作项列表来代替用户故事,以免浪费时间制定“系统应...”和“必须能够做到,因为”。但是,这确实需要团队的纪律来适应项目之间的差异。捕捉反思中的问题。
一旦进行开发,您可能会运行5或6次迭代,然后邀请您的客户到您的设施中查看实现的子集。冲洗并重复此过程。这不是某些方法要求的持续参与,但是您确实具有高可见性的优点。如果您的客户拒绝,则至少您尝试过。如果他们回答“是”,您可以启发他们敏捷。在我参与的一个项目中,客户每隔几个月(通常为3-5个月)访问该站点。他们会看着我们进行质量检查,会与工程师讨论问题,并与计划/项目办公室进行业务往来。这是每个人都可以进入同一页面的机会。
测试和维护与其他敏捷项目相同。创建测试程序并以适当的方式记录缺陷,跟踪每个合同义务的度量标准,并记录测试结果。如果您想遵循TDD,那就去吧。持续集成是另一个好主意。在项目状态会议期间,您的项目经理可以使用此信息说“我们实施了N个要求,有M个测试,X个测试通过”,并向有钱人提供了项目健康状况和状态更新。
说到钱,我们有固定成本和/或固定时间表的问题。
处理固定的时间表非常简单。根据您的要求,您知道可以完成多少次迭代。就实现,测试和集成的功能而言,每次迭代的工作量几乎都是固定的。这可能很困难,但是要分解特征并将它们预先分配给迭代并不是不可能的。这可以追溯到我邀请客户的时候-如果您有一年并且正在使用2周的迭代,则也许每季度邀请一次客户(并每季度邀请他们一次)并向他们展示以前的工作结果。让他们看到您对需求的优先顺序,您的未来计划以及计划进度。
处理固定预算是相似的。您知道您有多少时间,项目有多少资源,花费了多少,因此每个迭代每个人可以工作多少小时。这只是确保每个人都认真跟踪此事的问题。如果您的公司可以负担加班的费用,那就去加班。否则,请确保每个人都在适当的时间长度上工作,并使用良好的时间管理技能和时间拳击来保持每个人的生产力。您需要降低工作时间来降低成本-提供更多的增值文档和软件,而无需花费会议和开销。
归根结底,这并不一定是要敏捷,而是要应用使敏捷变得更好且敏捷的事物。能够响应需求的变化,即使客户不想要它也能够交付频繁的软件,仅生成增值文档(以及合同中规定的所有义务),等等。