精益软件开发
在软件开发领域,如何提高效率、减少浪费、并在最短的时间内交付高质量的软件产品,一直是企业和开发团队追求的目标。精益软件开发(Lean Software Development)源自精益制造,其核心思想强调消除浪费、持续改进和快速交付,旨在通过全面的流程和文化变革,提高效率和价值交付。本文将深入探讨精益软件开发的核心原则、实施方法和实际案例,帮助读者全面了解这一高效的软件开发方法。
1.精益软件开发
工业工程:对内降本增效、对外快速响应市场
1.1 精益制造的起源
精益制造起源于日本丰田汽车公司,其创始人之一大野耐一(Taiichi Ohno)在20世纪50年代提出了丰田生产系统(Toyota Production System, TPS),旨在通过消除浪费、简化流程、提高生产效率。丰田的成功吸引了全球制造业的关注,精益理念逐渐被推广到其他行业。
1.2 精益思想在软件开发中的应用
随着信息技术的快速发展,软件开发的复杂性和不确定性不断增加,传统的瀑布模型难以满足快速变化的市场需求。20世纪90年代末,Mary Poppendieck和Tom Poppendieck将精益制造的思想引入软件开发领域,提出了精益软件开发的概念。通过借鉴精益制造的原则,精益软件开发旨在减少浪费、提高效率和质量,并在不断变化的环境中保持灵活性和快速响应能力。有五个核心精益原则:
- 价值:了解为客户增加价值的因素
- 价值流:了解组织如何产生客户价值
- 流程:通过实现连续流动,最大化速度并最小化成本
- 拉动:根据实际客户需求准时交付价值
- 完善:不断提高价值流的表现
1:价值由客户定义
任何不直接为客户带来价值的东西都是浪费。也许软件开发中最大的浪费来源是未使用的功能。根据Standish Group的说法,企业软件应用程序中只有20%的功能被频繁使用,45%从未使用,19%很少使用,其他常见的软件开发浪费来源包括:包括缺陷(返工和测试) ),不必要的文书工作,等待,任务切换,人才浪费,未使用的指标和软件工具的不当使用。
通过分析客户的市场并确定利润和增长瓶颈,您可以更好地了解在何处以及如何增加实际价值。如果可能的话,以涉及客户的方式进行研究 - 与他们一起访问,组建联合分析团队,撰写联合报告等。仅从信誉良好的分析公司购买市场研究报告是不够的。没有什么可以替代做自己的功课,并彻底做到这一点。
2:学会看你的价值流
价值流是开发和交付产品或服务所需的一系列活动。它通常涉及多个流程,团队和部门。由于价值流涉及组织开发产品所做的一切,因此我们避免单独查看工程和市场营销等各个职能部门。与传统的性能改进方法相比,价值流允许我们将产品开发视为一个整体。
如果我们查看价值流中的每个流程并询问谁负责日常绩效以及流程改进,答案通常是没有一个人负有全部责任。相反,责任分散在几个可能存在利益冲突的职能经理人身上。这就是为什么流程改进工作经常与日常执行“不同步”的原因。通过指定价值流经理负责日常业绩和协调每个价值流的流程改进工作,我们可以明确履行卓越绩效的责任。在商业产品开发中,产品经理角色是以这种方式扩展的最自然的工作。在IT组织中,它可能是一名在国防/航空航天公司的项目经理,
3:流程 - 通过实现连续流动,最大限度地提高速度并降低成本
一旦我们发现了我们的价值流实际上是什么样子,我们就可以开始研究它们如何有效地产生客户价值。流程的概念要求我们重新思考如何利用经过的时间。实际花费了多少时间用于为客户增加价值的活动?
流程意味着观点的重大变化。我们不再对保持员工的忙碌程度,或者他们如何“高效”地执行个人任务感兴趣。相反,我们主要关注的是有效利用经过的时间。当我们在为客户增加价值的同时利用经过的时间时,会出现流量。持续流动意味着客户价值的单个单位(例如产品功能)在价值流中移动而没有花费在非增值活动上的时间。
在一个典型的组织中,24小时工作日只有1/3用于工作,剩下的就是停机时间。在停机期间,没有流量,因为没有人在工作。但是我们实际工作的时间呢?许多公司仍将其产品开发流程组织为一系列不同的阶段,例如概念开发,需求定义,架构设计等。每个阶段都会产生大量部分完成的工作。部分完成的工作构成了过程中的库存,这是一种浪费。库存堵塞了开发流程,占用了资源,并增加了响应客户需求所需的时间。
较小批量的工作导致库存减少,这意味着由于等待而损失的时间更少。这就是迭代开发比传统瀑布方法更快的原因。但迭代开发并不是灵丹妙药。除了等待大批量生产之外,软件开发中的抑制因素包括:
- 规格不佳或缺失 - 缺乏信息会导致工作陷入停顿
- 不灵活的架构 - 这些可能使得逐步进展变得尴尬
- 缺陷 - 它们使我们浪费时间进行非增值返工和重新测试
- 不平衡的资源 - 这些导致库存积压和等待
- 配置管理不良 - 无法访问工件会导致延迟
- 不可靠的构建 - 无法可靠地构建版本可能会阻止进度
- 任务切换 - 个人浪费时间试图兼顾多项活动
在软件开发中,从客户的角度来看,高达95%的交付周期和80%的开发工作都没有增值。即使在使用具有较小迭代的“敏捷”方法的组织中,也存在改进流程的重要机会。通过改善流量,我们不仅可以提高速度,还可以大幅节省成本。这是因为非增值活动,包括停机和等待,会消耗宝贵的现金。
4:拉动 - 使开发与实际需求率同步
即使持续流动,如果我们无法按时交付功能,结果是客户等待,我们的经济回报也是如此。如果我们提供不需要的功能,我们也会浪费时间和金钱。为避免这两类浪费,我们需要实际的客户需求,以实时明确地推动我们工作的内容,数量和节奏。
而不是基于预测需求和前期规划“推动”价值流中的工作,Pull意味着我们只在客户实际需要时才构建某些东西。换句话说,我们希望客户从价值流中“拉”新产品发布。传统的计划驱动工作被基于需求的工作所取代,减少了库存并提高了我们对客户需求做出快速反应的能力。
在许多情况下,客户无法尽快发布新产品。为避免大批量工作,这需要我们建立“人工拉动”,其中内部版本是根据客户代表性子集的反馈而生成的。即使我们的所有客户都没有部署版本,频繁发布客户反馈也会大大降低开发不相关功能或设计解决方案的风险,这些解决方案不能很好地实践。
如果我们希望客户反馈推动我们的开发工作,我们必须解决许多实际问题,包括提供反馈的客户的选择,组成和优先级。除非我们为单个客户开发软件,否则我们可能会与大量客户打交道。在这种情况下,我们必须谨慎选择一组具有代表性的客户,并仔细权衡其反馈的相对优先级。另一个实际问题是基础设施 - 如果我们要经常交付和部署新版本,我们必须部署必要的基础设施,以使这项工作顺利进行。反馈的频率也是一个关键问题 - 我们越频繁地获得客户反馈越好,但这意味着参与的客户必须确信在整个工作中保持参与的必要性。
频繁的客户反馈需要信任。建立这种信任的一种方法是明显地投资于努力了解客户的业务问题和机会。我们还必须解释如何使用反馈来为客户增加真正的价值。为了保持和增强已建立的信任,我们必须一次又一次地表明我们会立即对我们收到的反馈采取行动。在某些情况下,通过合同正式确定已达成的理解也是有意义的。对于自定义软件开发尤其如此。这种合同还可以将持续的资金与实际的客户价值联系起来。
Pull对我们处理软件设计的方式具有重要意义。在设计解决方案的可行性存在不确定性或客户需求快速变化的领域,我们必须保持设计的开放性。有时,我们甚至可能同时采用多种策略来处理设计风险。当我们减少不确定性时,保持多个选项开放并缩小我们的选择范围被称为基于集合的并行工程,并且它是在很短的时间内设计复杂产品的有效方法。
5:完善 - 持续改善价值流的表现
实施精益的公司为团队提供技能和激励,以便无情地识别和消除浪费。由于改进的重点是整个价值流,我们避免解决可能对整体经济绩效影响不大的局部瓶颈。跨职能变更团队用于改善价值流性能的典型改进流程可能如下所示:
- (重新)定义客户价值
- 映射价值流
- 确定废物来源
- 设计价值流的“未来状态”(我们希望它看起来像)
- 实施未来状态
- 目前的结果
与财务业绩挂钩的开放式指标显示了团队及其价值流的表现。为了鼓励更高的改进率,团队可以参与友好竞争,但应该要求他们定期分享他们的创新。
为了不断提高绩效,组织必须提高其收集,创建和分享知识的能力。这可以在几个层面上完成。在团队中,尝试交叉培训团队成员并偶尔切换角色。在产品团队之间轮换人员也很有帮助。丰田和诺基亚等高级从业者围绕领域专业领域组织团队。每个域组都以不断改进可重用组件迭代的形式编码其专业知识
对于跨团队的额外学习,请考虑在战略领域建立实践社区,例如客户关系管理,软件设计,可用性,财务,战略,精益思维和团队领导。这些团体应该将其他公司的想法与过去和现在项目的经验教训结合起来。
1.3 精益软件开发的核心原则
简单一点就是:可重复的过程、统一标准、团队合作
一、消除浪费 Eliminate Waste
是指任何不直接增加客户价值的活动。这包括编写无用的代码或功能,过度设计,等待项目资源,进行不必要的任务,以及任何其他无效的工作。
对产品开发进行持续的价值流分析,识别并消除流程中的无效步骤和瓶颈。
在早期阶段就密切关注需求和质量,以减少后期的重工和修复。
提升团队的多功能性,以减少等待时间和提高效率。
使用敏捷方法如Scrum或Kanban来提高流程的可见性,以便更好地发现和解决问题。
浪费的几个例子:
过度生产:开发过于复杂或者不必要的功能和代码,而这些功能和代码并不直接增加用户的价值。这不仅浪费了开发的时间和资源,还可能增加维护的复杂性和成本。
等待:开发人员在等待其他任务完成(比如等待测试完成、等待审批、等待需求确认)时,他们的时间就被浪费。这情况下,改进流程和增加通信效率可以减少等待时间。
重复努力:如果团队成员之间没有良好的沟通,他们可能会在不知情的情况下重复对同一问题进行解决,这就造成了浪费。
过度处理:过度处理是指花费更多的精力去完成一个任务,超出了实际需求的范围。比如在代码质量上,追求完美可能会导致过度优化和重构,超过了实际所需。
未充分利用人才:不充分利用开发人员的技能和知识,比如让高级工程师做一些基础的编码工作,或者让他们花费大量的时间在非核心任务(如处理电子邮件)上。
库存:在软件开发中,未完成的工作可以看作是"库存"。比如,编写了大量的代码但还没有进行测试,或者积压了大量的待处理bug。这些库存会增加项目的风险,并可能导致延期。
缺陷:编写低质量的代码会导致bug,这就需要额外的时间来修复。而花费在修复bug上的时间和资源,本可以用来增加新的功能或提高产品质量。
任务切换:频繁切换任务会导致工作效率下降,因为每次切换任务都需要花费时间来上下文切换。
二、建立质量(保证质量)Build Quality In
如何在软件开发的每一个阶段都保证高质量,而不是等到最后阶段再进行质量检查和错误修复。
测试驱动开发(TDD):测试驱动开发是一种敏捷开发实践,它强调在编写新的代码之前先写出可以测试这段代码功能的测试代码。这样可以确保新写的代码可以正确地实现所需的功能,并能在开发过程中及时发现和修复错误。
持续集成:持续集成是一种实践,要求开发者频繁地将代码集成到主分支。每次集成都会触发自动化的构建和测试过程,以便及时发现并修复集成错误。
自动化测试:自动化测试可以减少人工测试的需要,提高测试的效率和可靠性。自动化测试包括单元测试、集成测试和系统测试,能够快速、频繁地对软件进行全面的测试。
代码审查:代码审查可以发现代码的问题和错误,提高代码的质量。代码审查不仅可以发现具体的编程错误,还可以发现设计问题、性能问题和可维护性问题。
重构:重构是一种改善已有代码结构的技术,但不改变其外在行为。重构可以提高代码的质量和可读性,减少未来的维护成本。
错误预防:在开发过程中采取措施预防错误的产生,比如使用编码标准、使用静态代码分析工具等。
三、创建知识(知识库)Create Knowledge
在软件开发过程中积累和分享知识,通过不断学习和改进,来提升团队的能力和产品的质量。
迭代开发:迭代开发强调分阶段地完成软件开发,每个阶段都包括需求分析、设计、编码和测试等活动。通过频繁的迭代,团队可以及时获取反馈,快速学习和适应变化,积累对产品和市场的知识。
持续学习:团队应该鼓励持续学习,不断提升技术能力和业务知识。这可以通过各种方式实现,比如定期的技术分享、代码审查、参加专业训练和会议等。
知识分享:团队成员之间应该分享知识和经验,以提高整个团队的能力。这可以通过代码审查、配对编程、团队会议等方式实现。
文档记录:虽然敏捷开发强调“工作的软件优于详尽的文档”,但适度的文档还是有必要的,特别是对于关键的设计决策和复杂的系统知识。好的文档可以帮助团队成员理解和记住这些知识,也方便新成员快速上手。
实验和反馈:鼓励进行实验,验证新的想法和做法。通过收集反馈,可以快速学习和改进。这可以通过A/B测试、用户访谈、使用数据分析等方式实现。
四、延迟决定(迭代架构)Defer Commitment
在有充足信息做出最佳决策之前,应该尽可能地延迟做决定。灵活地应对软件开发过程中的变化和不确定性。
尽可能晚地做出决定:在软件开发中,很多决定一旦做出就很难改变,例如架构设计、技术选型等。这类决定通常会对项目有深远影响。因此,如果在早期就做出这样的决定,可能由于信息不足而做出错误的选择。因此,应该在有足够信息做出最佳决定时再做,即使这意味着要延迟决定。
增加选项:延迟决定可以增加选项。如果在项目早期就做出决定,可能会排除一些在后期可能出现的更好的选项。通过延迟决定,我们可以在更多的选项中做出选择,从而增加获取最佳结果的可能性。
迭代和增量开发:通过迭代和增量开发,我们可以逐步获取更多的信息,然后在最合适的时机做出决定。每个迭代都可以看作是一个学习和决策的过程。
灵活的架构和设计:为了能够延迟决定,我们需要有灵活的架构和设计,以便在后期可以容易地做出改变。这需要我们在设计时考虑到可变性和可扩展性。
"延迟决定"并不意味着我们可以无限期地推迟决定。在某个时点,我们必须做出决定,即使这个决定可能不是完美的。关键是找到合适的平衡点,既不过早地做出决定,也不拖延决定,而是在最佳的时机做出最好的决定。
五、快速交付(持续交付)Deliver Fast
尽快地为客户提供有价值的软件,以此来获得反馈,改善产品,和提升客户满意度。
迭代开发和增量交付:通过分解任务,以小的、可管理的迭代进行开发。每个迭代都应该产出可以交付的软件,即使这个软件只包含了部分功能。这样可以尽快地向客户提供有价值的产品,并获得反馈。
持续集成和持续交付:持续集成要求开发者频繁地将代码集成到主分支。每次集成都会触发自动化的构建和测试过程,以便及时发现并修复集成错误。持续交付则进一步扩展了这个概念,目标是使得任何时候都可以将软件部署到生产环境。
自动化:自动化是加速交付的一个关键手段。这包括自动化测试、自动化构建、自动化部署等。自动化可以提高效率,减少错误,使得软件的交付更为快速和稳定。
优先级管理:通过有效优先级管理,确保首先开发和交付最有价值的功能。这通常需要产品经理、开发者和客户的密切合作,以确保理解并正确地优先处理客户的需求。
减少浪费:减少浪费也是加速交付的一个重要策略。这包括减少等待时间、减少不必要的工作、减少错误和重工等。
六、以人为本(尊重人才)Respect People
尊重和赋权给每个参与软件开发的人,包括开发者、产品经理、测试人员、用户等。
赋权:开发团队成员应该得到足够的权限,以做出对他们工作最重要的决定。这包括决定如何完成工作,决定如何解决问题,以及决定如何改进流程等。
信任:团队成员之间应该有深厚的互相信任。管理者应该信任他们的团队能够做出正确的决定,团队成员也应该信任他们的同事和管理者。
尊重个体:每个人都有他们的特点和价值,都应该得到尊重。这包括尊重他们的技能和知识,尊重他们的努力和贡献,以及尊重他们的意见和想法。
人本管理:管理者应该关注他们的员工,了解他们的需要,提供必要的支持。这包括提供良好的工作环境,提供必要的资源,以及提供有益的反馈和指导。
持续学习:团队和个人都应该有持续学习的机会,以提升他们的能力和价值。这可以通过培训、分享、反馈等方式实现。
尊重用户和客户:理解和尊重用户和客户的需求,以此为导向进行软件开发。
七、优化整体(系统思维)Optimize the Whole
不只是看待和优化个别部分,而是从整体上来提升软件开发流程和结果的效率和质量。
系统思考:系统思考强调看待软件开发作为一个整体的系统,而不仅仅是一系列独立的步骤或活动。只有理解了系统的整体性,我们才能有效地改进系统。
流程优化:流程优化意味着从整体上改进工作流程,以提高效率和质量。这可能包括消除浪费,减少等待时间,改进协作,提高可见性等。
交叉功能团队:交叉功能团队是由具有不同技能和背景的人组成,他们可以一起工作,以完成整个开发流程。这可以提高协作效率,减少沟通和转换的浪费,提高整体效率。
价值流分析:用图形方式呈现一种产品或服务从起始到完成的流程,同时显示在流程中添加的所有值和浪费,可以识别和消除浪费,简化流程,提高效率。
反馈和学习:反馈和学习是提高整体效率和质量的关键。我们应该在整个开发流程中收集和使用反馈,以快速学习和改进。
————————————————
2.DevOps敏捷软件开发
- DevOps是一种文化、运动或实践,旨在缩短系统开发生命周期,同时提供高质量的软件产品
- 它强调开发(Dev)和运维(Ops)团队之间的协作和沟通,以实现更快的交付和更稳定的部署
- DevOps通常与自动化工具和流程相结合,如持续集成(CI)、持续部署(CD)和基础设施即代码(IaC)
- DevOps的目标是减少开发和运维之间的摩擦,提高软件交付的速度和质量,同时确保系统的可靠性和安全性。
Atlassian 还提到一个 DevOps 团队包含了开发和 IT 运维,大家一起协作,共同参与产品的整个生命周期,一起为提升软件质量和加速软件开发过程而努力。DevOps 模式下开发和运维不再是独立的“筒仓”,而是几乎被整合成一个团队,这个团队的工程师技术栈会覆盖开发、测试、运维等。同时 DevOps 团队会利用一系列的 DevOps 工具链来实现诸如持续集成、持续发布、流程自动化、高效协作等等目的,DevOps 强调赋能团队、跨团队沟通与协作以及技术自动化。
用“无穷环”表示 DevOps 生命周期,是因为 DevOps 的根本理念是“持续”,也就是“没有终点”。Atlassion 将整个 DevOps 生命周期分成6个阶段,分别是:
- 计划(Plan)
- 构建(Build)
- 持续集成和部署(或者交付)(Continuous Integration and Deployment or Delivery)
- 监控和告警(Monitor and Alert)
- 运维(Operate)
- 持续反馈(Continuous Feedback)
Dev 与 Ops 互相学习彼此领域技能,每个人都懂开发又懂运维,抱着“成长的观念”,持续学习,不满足于当前已掌握的技术栈
- 责任共担,在一个 DevOps 模式组建团队里,每个人都需要为软件开发交付的整个生命周期而负责;
- 技能共享,通过持续学习,互相学习,让本是传统 Dev 的工程师学习 Ops 的技能,同时传统 Ops 的工程师也需要学习 Dev 的技能。
我们还能看到 Atlassian 想强调沟通与协作是贯穿 DevOps 生命周期全过程的。强调“DevOps 的目的是更快地向客户交付”。
3.Scrum敏捷软件开发
- Scrum是一种迭代式、增量式的软件开发框架,它将工作分解成小的、可管理的块,称为“冲刺”(Sprint),通常持续1到4周。
- 在Scrum中,团队成员包括产品负责人(负责定义产品愿景和优先级)、Scrum Master(负责确保团队遵循Scrum流程)和开发团队(负责交付产品)。
- Scrum流程包括每日站立会议(Daily Stand-up)、冲刺计划会议(Sprint Planning)、冲刺评审会议(Sprint Review)和冲刺回顾会议(Sprint Retrospective)。
- Scrum强调透明性、检查和适应,以确保团队能够快速响应变化并持续改进。
4.Kanban敏捷软件开发
- Kanban是一种可视化的工作流程管理系统,它起源于日本的“看板”生产方法。
- 它使用卡片(代表工作项)和列(代表工作流程的不同阶段)来展示工作进度。
- Kanban的核心原则是限制在制品(WIP,Work In Progress),即同时进行的工作项数量,以减少浪费和提高效率。
- 与Scrum相比,Kanban更加灵活,不需要固定的冲刺周期,而是根据团队的能力和工作流程进行调整。
- Kanban适用于那些需要快速响应变化和持续交付的团队。