读书:《敏捷软件开发工具----精益开发方法》

news2024/11/15 12:47:37

在这里插入图片描述

《敏捷软件开发工具----精益开发方法》(Lean Software Development: An Agile Toolkit)由Mary Poppendieck和Tom Poppendieck合著,2003年出版,尽管已经有20个年头了,但书中的理念和方法仍然具有很高的实践价值,被许多软件开发者和团队应用在日常工作中,对提高软件开发效率和质量产生了深远影响。

主要介绍了如何将精益生产原则应用于软件开发中,书的内容受精益制造和丰田生产系统的影响,作者试图通过消除浪费,加速交付,提高效率和质量等手段,来改进和优化软件开发的过程。

丰田的精益生产与本书的“精益软件开发”的对比:

精益生产精益软件开发
消除浪费减少过度生产、库存积压、不必要的运输、过度加工等减少过度的文档、未被使用的代码、开发不需要的功能、等待批准等
建立质量在生产过程中发现和修复问题,而非在产品完成后通过持续集成、自动化测试、代码审查等方式在开发过程中关注和保证质量
创建知识通过持续学习和改进优化生产过程通过反馈、评审、迭代和实验来不断学习和改进
延迟决定等待到有足够的信息再做出最佳决策在最适合的时机做出决策,减少不确定性和风险
快速交付通过降低批次大小和循环时间,消除浪费快速交付通过迭代开发、持续集成和持续交付来实现快速交付
以人为本尊重每个员工的贡献,赋予他们改进工作流程的权力尊重每个参与开发的人,包括开发者、产品经理、测试人员、用户等
优化整体考虑整个生产流程,而非只是某个部分从整体的角度来看待和优化软件开发流程

七大主要原则:

  1. 消除浪费:消除在软件开发过程中不增加任何价值的活动,例如不必要的代码和功能、等待、多余的过程等。

  2. 建立质量:从一开始就建立质量,而不是在后期再进行质量检查和错误修复。

  3. 创建知识:通过迭代和实验来不断学习和改进。

  4. 延迟决定:在你有尽可能多的信息之前,尽量不做决定。

  5. 快速交付:尽早、尽快地交付价值给客户。

  6. 以人为本:人是软件开发的关键要素,要建立一个支持团队和个人成长的环境。

  7. 优化整体:不是优化单个部分或过程,而是要优化整个系统或流程。

一、消除浪费 Eliminate Waste

是指任何不直接增加客户价值的活动。这包括编写无用的代码或功能,过度设计,等待项目资源,进行不必要的任务,以及任何其他无效的工作。

  1. 对产品开发进行持续的价值流分析,识别并消除流程中的无效步骤和瓶颈。

  2. 在早期阶段就密切关注需求和质量,以减少后期的重工和修复。

  3. 提升团队的多功能性,以减少等待时间和提高效率。

  4. 使用敏捷方法如Scrum或Kanban来提高流程的可见性,以便更好地发现和解决问题。

浪费的几个例子:

  1. 过度生产:开发过于复杂或者不必要的功能和代码,而这些功能和代码并不直接增加用户的价值。这不仅浪费了开发的时间和资源,还可能增加维护的复杂性和成本。

  2. 等待:开发人员在等待其他任务完成(比如等待测试完成、等待审批、等待需求确认)时,他们的时间就被浪费了。在这种情况下,改进流程和增加通信效率可以减少等待时间。

  3. 重复努力:如果团队成员之间没有良好的沟通,他们可能会在不知情的情况下重复对同一问题进行解决,这就造成了浪费。

  4. 过度处理:过度处理是指花费更多的精力去完成一个任务,超出了实际需求的范围。比如在代码质量上,追求完美可能会导致过度优化和重构,超过了实际所需。

  5. 未充分利用人才:不充分利用开发人员的技能和知识,比如让高级工程师做一些基础的编码工作,或者让他们花费大量的时间在非核心任务(如处理电子邮件)上。

  6. 库存:在软件开发中,未完成的工作可以看作是"库存"。比如,编写了大量的代码但还没有进行测试,或者积压了大量的待处理bug。这些库存会增加项目的风险,并可能导致延期。

  7. 缺陷:编写低质量的代码会导致bug,这就需要额外的时间来修复。而花费在修复bug上的时间和资源,本可以用来增加新的功能或提高产品质量。

  8. 任务切换:频繁切换任务会导致工作效率下降,因为每次切换任务都需要花费时间来上下文切换。

二、建立质量(保证质量)Build Quality In

如何在软件开发的每一个阶段都保证高质量,而不是等到最后阶段再进行质量检查和错误修复。

  1. 测试驱动开发(TDD):测试驱动开发是一种敏捷开发实践,它强调在编写新的代码之前先写出可以测试这段代码功能的测试代码。这样可以确保新写的代码可以正确地实现所需的功能,并能在开发过程中及时发现和修复错误。

  2. 持续集成:持续集成是一种实践,要求开发者频繁地将代码集成到主分支。每次集成都会触发自动化的构建和测试过程,以便及时发现并修复集成错误。

  3. 自动化测试:自动化测试可以减少人工测试的需要,提高测试的效率和可靠性。自动化测试包括单元测试、集成测试和系统测试,能够快速、频繁地对软件进行全面的测试。

  4. 代码审查:代码审查可以发现代码的问题和错误,提高代码的质量。代码审查不仅可以发现具体的编程错误,还可以发现设计问题、性能问题和可维护性问题。

  5. 重构:重构是一种改善已有代码结构的技术,但不改变其外在行为。重构可以提高代码的质量和可读性,减少未来的维护成本。

  6. 错误预防:在开发过程中采取措施预防错误的产生,比如使用编码标准、使用静态代码分析工具等。

三、创建知识(知识库)Create Knowledge

在软件开发过程中积累和分享知识,通过不断学习和改进,来提升团队的能力和产品的质量。

  1. 迭代开发:迭代开发强调分阶段地完成软件开发,每个阶段都包括需求分析、设计、编码和测试等活动。通过频繁的迭代,团队可以及时获取反馈,快速学习和适应变化,积累对产品和市场的知识。

  2. 持续学习:团队应该鼓励持续学习,不断提升技术能力和业务知识。这可以通过各种方式实现,比如定期的技术分享、代码审查、参加专业训练和会议等。

  3. 知识分享:团队成员之间应该分享知识和经验,以提高整个团队的能力。这可以通过代码审查、配对编程、团队会议等方式实现。

  4. 文档记录:虽然敏捷开发强调“工作的软件优于详尽的文档”,但适度的文档还是有必要的,特别是对于关键的设计决策和复杂的系统知识。好的文档可以帮助团队成员理解和记住这些知识,也方便新成员快速上手。

  5. 实验和反馈:鼓励进行实验,验证新的想法和做法。通过收集反馈,可以快速学习和改进。这可以通过A/B测试、用户访谈、使用数据分析等方式实现。

四、延迟决定(迭代架构)Defer Commitment

在有充足信息做出最佳决策之前,应该尽可能地延迟做决定。灵活地应对软件开发过程中的变化和不确定性。

  1. 尽可能晚地做出决定:在软件开发中,很多决定一旦做出就很难改变,例如架构设计、技术选型等。这类决定通常会对项目有深远影响。因此,如果在早期就做出这样的决定,可能由于信息不足而做出错误的选择。因此,应该在有足够信息做出最佳决定时再做,即使这意味着要延迟决定。

  2. 增加选项:延迟决定可以增加选项。如果在项目早期就做出决定,可能会排除一些在后期可能出现的更好的选项。通过延迟决定,我们可以在更多的选项中做出选择,从而增加获取最佳结果的可能性。

  3. 迭代和增量开发:通过迭代和增量开发,我们可以逐步获取更多的信息,然后在最合适的时机做出决定。每个迭代都可以看作是一个学习和决策的过程。

  4. 灵活的架构和设计:为了能够延迟决定,我们需要有灵活的架构和设计,以便在后期可以容易地做出改变。这需要我们在设计时考虑到可变性和可扩展性。

"延迟决定"并不意味着我们可以无限期地推迟决定。在某个时点,我们必须做出决定,即使这个决定可能不是完美的。关键是找到合适的平衡点,既不过早地做出决定,也不拖延决定,而是在最佳的时机做出最好的决定。

五、快速交付(持续交付)Deliver Fast

尽快地为客户提供有价值的软件,以此来获得反馈,改善产品,和提升客户满意度。

迭代开发和增量交付:通过分解任务,以小的、可管理的迭代进行开发。每个迭代都应该产出可以交付的软件,即使这个软件只包含了部分功能。这样可以尽快地向客户提供有价值的产品,并获得反馈。

持续集成和持续交付:持续集成要求开发者频繁地将代码集成到主分支。每次集成都会触发自动化的构建和测试过程,以便及时发现并修复集成错误。持续交付则进一步扩展了这个概念,目标是使得任何时候都可以将软件部署到生产环境。

自动化:自动化是加速交付的一个关键手段。这包括自动化测试、自动化构建、自动化部署等。自动化可以提高效率,减少错误,使得软件的交付更为快速和稳定。

优先级管理:通过有效的优先级管理,可以确保首先开发和交付最有价值的功能。这通常需要产品经理、开发者和客户的密切合作,以确保理解并正确地优先处理客户的需求。

减少浪费:减少浪费也是加速交付的一个重要策略。这包括减少等待时间、减少不必要的工作、减少错误和重工等。

六、以人为本(尊重人才)Respect People

尊重和赋权给每个参与软件开发的人,包括开发者、产品经理、测试人员、用户等。

赋权:开发团队成员应该得到足够的权限,以做出对他们工作最重要的决定。这包括决定如何完成工作,决定如何解决问题,以及决定如何改进流程等。

信任:团队成员之间应该有深厚的互相信任。管理者应该信任他们的团队能够做出正确的决定,团队成员也应该信任他们的同事和管理者。

尊重个体:每个人都有他们的特点和价值,都应该得到尊重。这包括尊重他们的技能和知识,尊重他们的努力和贡献,以及尊重他们的意见和想法。

人本管理:管理者应该关注他们的员工,了解他们的需要,提供必要的支持。这包括提供良好的工作环境,提供必要的资源,以及提供有益的反馈和指导。

持续学习:团队和个人都应该有持续学习的机会,以提升他们的能力和价值。这可以通过培训、分享、反馈等方式实现。

尊重用户和客户:理解和尊重用户和客户的需求,以此为导向进行软件开发。

七、优化整体(系统思维)Optimize the Whole

不只是看待和优化个别部分,而是从整体上来提升软件开发流程和结果的效率和质量。

系统思考:系统思考强调看待软件开发作为一个整体的系统,而不仅仅是一系列独立的步骤或活动。只有理解了系统的整体性,我们才能有效地改进系统。

流程优化:流程优化意味着从整体上改进工作流程,以提高效率和质量。这可能包括消除浪费,减少等待时间,改进协作,提高可见性等。

交叉功能团队:交叉功能团队是由具有不同技能和背景的人组成,他们可以一起工作,以完成整个开发流程。这可以提高协作效率,减少沟通和转换的浪费,提高整体效率。

价值流分析:用图形方式呈现一种产品或服务从起始到完成的流程,同时显示在流程中添加的所有值和浪费,可以识别和消除浪费,简化流程,提高效率。

反馈和学习:反馈和学习是提高整体效率和质量的关键。我们应该在整个开发流程中收集和使用反馈,以快速学习和改进。

与OKR工作法有关联吗?

《精益软件开发:敏捷工具》出版的时候,OKR工作法还没有出生。然而,OKR工作法和精益软件开发的理念有许多相似之处:

  1. 对目标的关注:OKR工作法强调通过明确和量化的目标(即Objective和Key Results)来推动团队和个人的工作。这与精益软件开发关注价值流、交付快和优化整体的理念非常吻合。

  2. 透明性:OKR鼓励公开和透明的目标设定和追踪,这有助于增强团队的协作和对整体目标的理解。这与精益软件开发的原则“优化整体”相符,都强调看整体而不只看局部。

  3. 反馈和学习:OKR工作法鼓励定期的回顾和评估,以了解进展、学习经验教训,并进行必要的调整。这与精益软件开发的“创建知识”原则紧密相连,都强调通过反馈和学习来持续改进。

  4. 尊重人:OKR工作法赋予团队和个人设定和达成目标的权力,强调尊重每个人的能力和贡献。这与精益软件开发的“尊重人”的原则一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/658643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot2概览-运维实用篇

知识点 使用SpringBoot提供的maven插件可以将工程打包成可执行jar包然后执行&#xff0c;即java –jar xxx.jar&#xff0c;下面的图是MANIFEST.MF文件的内容&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</groupId>…

【MySQL】如何速通MySQL(3)

&#x1f4cc;前言&#xff1a;本篇博客介绍如何速通MySQL的第二篇&#xff0c;主要介绍Mysql中主要的基础的入门&#xff0c;学习MySQL之前要先安装好MySQL&#xff0c;如果还没有安装的小伙伴可以看看博主前面的博客&#xff0c;里面有详细的安装教程。或者看一下下面这个链接…

136-nago

PEID查看你程序有没有壳&#xff0c;发现是汇编语言程序 打开程序&#xff0c;我们发现程序是由Nag提示窗口的。 我们先进行去Nag提示。 进入回调函数&#xff0c;进行分析 保存修改到文件。 重新打开文件&#xff0c;我们发现没有Nag窗口。 再次使用OD进行附加进行分析。…

项目中遇到的问题总结(四)

GateWay和Nginx的相同点和不同点在哪里&#xff1f; Gateway 和 Nginx 都是常见的反向代理服务器&#xff0c;它们的相同点和不同点如下&#xff1a; 相同点&#xff1a; 都可以作为反向代理服务器&#xff0c;接收来自客户端的请求并转发到后端服务器进行处理。 都支持负载均…

67、C#调用Visual Studio 2019生成的Paddle+OCR(使用ncnn库),去完成业务任务

基本思想&#xff1a;这里使用飞哥写的android代码&#xff0c;将其取出纯c代码逻辑&#xff0c;自己尝试转了paddleocr模型&#xff0c;可以成功转换&#xff0c;不在详细阐述生成ncnn模型的过程和写后处理ocr识别过程&#xff0c;这里要实现的目的是使用c#调用ncnn的ocr工程&…

Ps修改文字

第一步&#xff1a;打开ps软件&#xff0c;选择菜单栏“文件”中的“打开”选项。 第二步&#xff1a;在弹出的“打开”对话框中&#xff0c;选择一张需要修改文字的图片&#xff0c;单击“打开”按钮。 第三步&#xff1a;在左侧工具栏中&#xff0c;选择“仿制图章工具”。 第…

【Python 随练】输出 9*9 口诀

题目&#xff1a; 输出 9*9 口诀 简介&#xff1a; 在本篇博客中&#xff0c;我们将使用 Python 代码输出 9*9 口诀表。口诀表是一个常见的数学乘法表格&#xff0c;用于展示从 1 到 9 的乘法结果。我们将给出问题的解析&#xff0c;并提供一个完整的代码示例来生成这个口诀…

全志V3S嵌入式驱动开发(USB camera驱动)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 soc和mcu的一个重要区别&#xff0c;就是soc会涉及到大量的音视频操作&#xff0c;当然音视频也就包括了camera摄像头这部分。v3s本身支持csi接口和…

webpack优化代码运行之Code split

一、 什么是code split Webpack的code split是一种技术&#xff0c;它能够将代码分割成多个块&#xff0c;从而优化应用程序的性能。这样做可以实现按需加载和并行加载&#xff0c;从而减少初始化时间和请求次数。Code split在Webpack中通过使用entry语法和各种Loader和插件来…

享元模式:减少内存占用的诀窍

一&#xff0c;概要 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;它主要通过共享对象来降低系统中对象的数量&#xff0c;从而减少内存占用和提高程序性能。这听起来有点像单例模式&#xff0c;但它们在实现和用途上有很大的区别。享元…

JavaScript Day01 初识JavaScript

文章目录 1.初识JavaScript1.1.什么是JavaScript1.2.JavaScript的组成部分1.3.JavaScript的历史-JavaScript发展历史-系统环境-编辑器-运行环境-调试&#xff1a; 2. js组成2.1 ECMAScrpt 【js标准】&#xff08;兼容性100%&#xff09; (类似于CoreJava&#xff0c;制定了基础…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 阿里巴巴找黄金宝箱(III)

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客阿里巴巴找黄金宝箱(III) 题目描述 贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c;每个箱子上面贴有一个数字。 阿里巴巴念出一个咒…

SpringMVC 学习整理

文章目录 一、SpringMVC 简介1.1 什么是MVC1.2 什么是Spring MVC1.3 Spring MVC的特点 二、SpringMVC 快速入门三、RequestMapping注解说明四、SpringMVC获取请求参数4.1 通过ServletAPI获取请求参数4.2 通过控制器方法的形参获取请求参数4.3 通过RequestParam接收请求参数4.4 …

Elasticsearch:实用 BM25 - 第 3 部分:在 Elasticsearch 中选择 b 和 k1 的注意事项

这是系列文章的第三篇文章。之前的文章是&#xff1a; Elasticsearch&#xff1a;实用 BM25 - 第 1 部分&#xff1a;分片如何影响 Elasticsearch 中的相关性评分 Elasticsearch&#xff1a;实用 BM25 - 第 2 部分&#xff1a;BM25 算法及其变量 选择 b 和 k1 值得注意的是&…

【备战秋招】每日一题:2023.05-B卷-华为OD机试 - 比赛的冠亚季军

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客比赛的冠亚季军 题目描述 有个运动员&#xff0c;他们的id为0到N-1,他们的实力由一组整数表示。他们之间进行比赛&#xff0c;需要决出冠亚军。比赛的规则是0号和1号比赛&#xff0c;2号和3号比赛&#xff0c;以此类推…

014、数据库管理之配置管理

配置管理 TiDB配置系统配置集群配置配置的存储位置区分TiDB的系统参数和集群参数 系统参数系统参数的作用域系统参数的修改 集群参数集群参数的修改配置参数的查看 实验一&#xff1a; 在不同作用域下对数据库的系统参数进行修改session级别global级别 实验二&#xff1a; 修改…

Redis入门(二)

3.7 Redis 默认16个库 1&#xff09;Redis默认创建16个库,每个库对应一个下标,从0开始. 通过客户端连接后默认进入到0 号库&#xff0c;推荐只使用0号库. 127.0.0.1:6379> 16个是因为配置文件中是这样的 [aahadoop102 redis]$ vim redis.conf 2&#xff09;使用命令 sele…

DataX和SQLServer的导入导出案例

DataX和SQLServer的导入导出案例 文章目录 DataX和SQLServer的导入导出案例写在前面SQLServer数据库的简单使用SQLServer数据库一些常用的Shell脚本命令创建数据库 DataX 导入导出案例创建表并插入数据读取 SQLServer 的数据导入到 HDFS读取 SQLServer 的数据导入 MySQL 总结 写…

【C++Coppeliasim】UR机械臂位置正逆解Coppeliasim集成测试

前言&#xff1a; 基于改进的 Denavit-Hartenberg 参数的UR机械臂正向运动学求解和基于几何分析的逆运动学求解。该代码在 C 和 MATLAB 中可用&#xff0c;两者都与 CoppeliaSim 集成。 该解决方案是使用 Microsoft Visual Studio 2022 和 C 20 标准构建的。 依赖&#xff1a; …

C++ 类继承

目录 类继承基类派生一个类构造函数访问权限派生类与基类之间的特殊关系 完整demo 类继承 基类 #ifndef __TEST_1_H_ #define __TEST_1_H_ #include <iostream> #include<string> using namespace std; typedef unsigned int uint;//father class class TableTen…