《敏捷软件开发工具----精益开发方法》(Lean Software Development: An Agile Toolkit)由Mary Poppendieck和Tom Poppendieck合著,2003年出版,尽管已经有20个年头了,但书中的理念和方法仍然具有很高的实践价值,被许多软件开发者和团队应用在日常工作中,对提高软件开发效率和质量产生了深远影响。
主要介绍了如何将精益生产原则应用于软件开发中,书的内容受精益制造和丰田生产系统的影响,作者试图通过消除浪费,加速交付,提高效率和质量等手段,来改进和优化软件开发的过程。
丰田的精益生产与本书的“精益软件开发”的对比:
精益生产 | 精益软件开发 | |
---|---|---|
消除浪费 | 减少过度生产、库存积压、不必要的运输、过度加工等 | 减少过度的文档、未被使用的代码、开发不需要的功能、等待批准等 |
建立质量 | 在生产过程中发现和修复问题,而非在产品完成后 | 通过持续集成、自动化测试、代码审查等方式在开发过程中关注和保证质量 |
创建知识 | 通过持续学习和改进优化生产过程 | 通过反馈、评审、迭代和实验来不断学习和改进 |
延迟决定 | 等待到有足够的信息再做出最佳决策 | 在最适合的时机做出决策,减少不确定性和风险 |
快速交付 | 通过降低批次大小和循环时间,消除浪费快速交付 | 通过迭代开发、持续集成和持续交付来实现快速交付 |
以人为本 | 尊重每个员工的贡献,赋予他们改进工作流程的权力 | 尊重每个参与开发的人,包括开发者、产品经理、测试人员、用户等 |
优化整体 | 考虑整个生产流程,而非只是某个部分 | 从整体的角度来看待和优化软件开发流程 |
七大主要原则:
-
消除浪费:消除在软件开发过程中不增加任何价值的活动,例如不必要的代码和功能、等待、多余的过程等。
-
建立质量:从一开始就建立质量,而不是在后期再进行质量检查和错误修复。
-
创建知识:通过迭代和实验来不断学习和改进。
-
延迟决定:在你有尽可能多的信息之前,尽量不做决定。
-
快速交付:尽早、尽快地交付价值给客户。
-
以人为本:人是软件开发的关键要素,要建立一个支持团队和个人成长的环境。
-
优化整体:不是优化单个部分或过程,而是要优化整个系统或流程。
一、消除浪费 Eliminate Waste
是指任何不直接增加客户价值的活动。这包括编写无用的代码或功能,过度设计,等待项目资源,进行不必要的任务,以及任何其他无效的工作。
-
对产品开发进行持续的价值流分析,识别并消除流程中的无效步骤和瓶颈。
-
在早期阶段就密切关注需求和质量,以减少后期的重工和修复。
-
提升团队的多功能性,以减少等待时间和提高效率。
-
使用敏捷方法如Scrum或Kanban来提高流程的可见性,以便更好地发现和解决问题。
浪费的几个例子:
-
过度生产:开发过于复杂或者不必要的功能和代码,而这些功能和代码并不直接增加用户的价值。这不仅浪费了开发的时间和资源,还可能增加维护的复杂性和成本。
-
等待:开发人员在等待其他任务完成(比如等待测试完成、等待审批、等待需求确认)时,他们的时间就被浪费了。在这种情况下,改进流程和增加通信效率可以减少等待时间。
-
重复努力:如果团队成员之间没有良好的沟通,他们可能会在不知情的情况下重复对同一问题进行解决,这就造成了浪费。
-
过度处理:过度处理是指花费更多的精力去完成一个任务,超出了实际需求的范围。比如在代码质量上,追求完美可能会导致过度优化和重构,超过了实际所需。
-
未充分利用人才:不充分利用开发人员的技能和知识,比如让高级工程师做一些基础的编码工作,或者让他们花费大量的时间在非核心任务(如处理电子邮件)上。
-
库存:在软件开发中,未完成的工作可以看作是"库存"。比如,编写了大量的代码但还没有进行测试,或者积压了大量的待处理bug。这些库存会增加项目的风险,并可能导致延期。
-
缺陷:编写低质量的代码会导致bug,这就需要额外的时间来修复。而花费在修复bug上的时间和资源,本可以用来增加新的功能或提高产品质量。
-
任务切换:频繁切换任务会导致工作效率下降,因为每次切换任务都需要花费时间来上下文切换。
二、建立质量(保证质量)Build Quality In
如何在软件开发的每一个阶段都保证高质量,而不是等到最后阶段再进行质量检查和错误修复。
-
测试驱动开发(TDD):测试驱动开发是一种敏捷开发实践,它强调在编写新的代码之前先写出可以测试这段代码功能的测试代码。这样可以确保新写的代码可以正确地实现所需的功能,并能在开发过程中及时发现和修复错误。
-
持续集成:持续集成是一种实践,要求开发者频繁地将代码集成到主分支。每次集成都会触发自动化的构建和测试过程,以便及时发现并修复集成错误。
-
自动化测试:自动化测试可以减少人工测试的需要,提高测试的效率和可靠性。自动化测试包括单元测试、集成测试和系统测试,能够快速、频繁地对软件进行全面的测试。
-
代码审查:代码审查可以发现代码的问题和错误,提高代码的质量。代码审查不仅可以发现具体的编程错误,还可以发现设计问题、性能问题和可维护性问题。
-
重构:重构是一种改善已有代码结构的技术,但不改变其外在行为。重构可以提高代码的质量和可读性,减少未来的维护成本。
-
错误预防:在开发过程中采取措施预防错误的产生,比如使用编码标准、使用静态代码分析工具等。
三、创建知识(知识库)Create Knowledge
在软件开发过程中积累和分享知识,通过不断学习和改进,来提升团队的能力和产品的质量。
-
迭代开发:迭代开发强调分阶段地完成软件开发,每个阶段都包括需求分析、设计、编码和测试等活动。通过频繁的迭代,团队可以及时获取反馈,快速学习和适应变化,积累对产品和市场的知识。
-
持续学习:团队应该鼓励持续学习,不断提升技术能力和业务知识。这可以通过各种方式实现,比如定期的技术分享、代码审查、参加专业训练和会议等。
-
知识分享:团队成员之间应该分享知识和经验,以提高整个团队的能力。这可以通过代码审查、配对编程、团队会议等方式实现。
-
文档记录:虽然敏捷开发强调“工作的软件优于详尽的文档”,但适度的文档还是有必要的,特别是对于关键的设计决策和复杂的系统知识。好的文档可以帮助团队成员理解和记住这些知识,也方便新成员快速上手。
-
实验和反馈:鼓励进行实验,验证新的想法和做法。通过收集反馈,可以快速学习和改进。这可以通过A/B测试、用户访谈、使用数据分析等方式实现。
四、延迟决定(迭代架构)Defer Commitment
在有充足信息做出最佳决策之前,应该尽可能地延迟做决定。灵活地应对软件开发过程中的变化和不确定性。
-
尽可能晚地做出决定:在软件开发中,很多决定一旦做出就很难改变,例如架构设计、技术选型等。这类决定通常会对项目有深远影响。因此,如果在早期就做出这样的决定,可能由于信息不足而做出错误的选择。因此,应该在有足够信息做出最佳决定时再做,即使这意味着要延迟决定。
-
增加选项:延迟决定可以增加选项。如果在项目早期就做出决定,可能会排除一些在后期可能出现的更好的选项。通过延迟决定,我们可以在更多的选项中做出选择,从而增加获取最佳结果的可能性。
-
迭代和增量开发:通过迭代和增量开发,我们可以逐步获取更多的信息,然后在最合适的时机做出决定。每个迭代都可以看作是一个学习和决策的过程。
-
灵活的架构和设计:为了能够延迟决定,我们需要有灵活的架构和设计,以便在后期可以容易地做出改变。这需要我们在设计时考虑到可变性和可扩展性。
"延迟决定"并不意味着我们可以无限期地推迟决定。在某个时点,我们必须做出决定,即使这个决定可能不是完美的。关键是找到合适的平衡点,既不过早地做出决定,也不拖延决定,而是在最佳的时机做出最好的决定。
五、快速交付(持续交付)Deliver Fast
尽快地为客户提供有价值的软件,以此来获得反馈,改善产品,和提升客户满意度。
迭代开发和增量交付:通过分解任务,以小的、可管理的迭代进行开发。每个迭代都应该产出可以交付的软件,即使这个软件只包含了部分功能。这样可以尽快地向客户提供有价值的产品,并获得反馈。
持续集成和持续交付:持续集成要求开发者频繁地将代码集成到主分支。每次集成都会触发自动化的构建和测试过程,以便及时发现并修复集成错误。持续交付则进一步扩展了这个概念,目标是使得任何时候都可以将软件部署到生产环境。
自动化:自动化是加速交付的一个关键手段。这包括自动化测试、自动化构建、自动化部署等。自动化可以提高效率,减少错误,使得软件的交付更为快速和稳定。
优先级管理:通过有效的优先级管理,可以确保首先开发和交付最有价值的功能。这通常需要产品经理、开发者和客户的密切合作,以确保理解并正确地优先处理客户的需求。
减少浪费:减少浪费也是加速交付的一个重要策略。这包括减少等待时间、减少不必要的工作、减少错误和重工等。
六、以人为本(尊重人才)Respect People
尊重和赋权给每个参与软件开发的人,包括开发者、产品经理、测试人员、用户等。
赋权:开发团队成员应该得到足够的权限,以做出对他们工作最重要的决定。这包括决定如何完成工作,决定如何解决问题,以及决定如何改进流程等。
信任:团队成员之间应该有深厚的互相信任。管理者应该信任他们的团队能够做出正确的决定,团队成员也应该信任他们的同事和管理者。
尊重个体:每个人都有他们的特点和价值,都应该得到尊重。这包括尊重他们的技能和知识,尊重他们的努力和贡献,以及尊重他们的意见和想法。
人本管理:管理者应该关注他们的员工,了解他们的需要,提供必要的支持。这包括提供良好的工作环境,提供必要的资源,以及提供有益的反馈和指导。
持续学习:团队和个人都应该有持续学习的机会,以提升他们的能力和价值。这可以通过培训、分享、反馈等方式实现。
尊重用户和客户:理解和尊重用户和客户的需求,以此为导向进行软件开发。
七、优化整体(系统思维)Optimize the Whole
不只是看待和优化个别部分,而是从整体上来提升软件开发流程和结果的效率和质量。
系统思考:系统思考强调看待软件开发作为一个整体的系统,而不仅仅是一系列独立的步骤或活动。只有理解了系统的整体性,我们才能有效地改进系统。
流程优化:流程优化意味着从整体上改进工作流程,以提高效率和质量。这可能包括消除浪费,减少等待时间,改进协作,提高可见性等。
交叉功能团队:交叉功能团队是由具有不同技能和背景的人组成,他们可以一起工作,以完成整个开发流程。这可以提高协作效率,减少沟通和转换的浪费,提高整体效率。
价值流分析:用图形方式呈现一种产品或服务从起始到完成的流程,同时显示在流程中添加的所有值和浪费,可以识别和消除浪费,简化流程,提高效率。
反馈和学习:反馈和学习是提高整体效率和质量的关键。我们应该在整个开发流程中收集和使用反馈,以快速学习和改进。
与OKR工作法有关联吗?
《精益软件开发:敏捷工具》出版的时候,OKR工作法还没有出生。然而,OKR工作法和精益软件开发的理念有许多相似之处:
-
对目标的关注:OKR工作法强调通过明确和量化的目标(即Objective和Key Results)来推动团队和个人的工作。这与精益软件开发关注价值流、交付快和优化整体的理念非常吻合。
-
透明性:OKR鼓励公开和透明的目标设定和追踪,这有助于增强团队的协作和对整体目标的理解。这与精益软件开发的原则“优化整体”相符,都强调看整体而不只看局部。
-
反馈和学习:OKR工作法鼓励定期的回顾和评估,以了解进展、学习经验教训,并进行必要的调整。这与精益软件开发的“创建知识”原则紧密相连,都强调通过反馈和学习来持续改进。
-
尊重人:OKR工作法赋予团队和个人设定和达成目标的权力,强调尊重每个人的能力和贡献。这与精益软件开发的“尊重人”的原则一致。