`

《scrum敏捷软件开发》读书笔记

阅读更多


一本scrum方面的大部头, 很多内容讲的比较细, 也比较全, 很多地方都涉及到项目管理的知识, 当然还有敏捷相关的知识, 不过较少, 有选择性的看了看, 算是其他scrum书籍的一个补充吧.


----------------我是读书笔记的分割线--------------------------------------

scrum这个游戏如同围棋, 入门容易, 成为九段高手难

在scrum领域, 没有最佳实践, 只有最合适, 最有效的实践.

scrum不在于让你现在有多优秀, 而在于你下个月有没有变得更好.

衡量开发人员的效率是不可能的(martin flower)

对于scrum团队成员来说, 不要考虑是你的任务还是我的任务, 而应该考虑是我们的任务.

scrummaster一方面是团队的领导, 另一方面是毫无行政权力的普通人

scrummaster的存在是为了帮助团队使用scrum, 他类似于健身教练, 教会你用正确的方式进行各种练习, 但是教练的权利又是有限的. 他不能强迫你参加你不喜欢的运动, 他们的权利是客户授予的. 而scrummaster的权利是团队授予的.

如果团队不能按时交付软件, 那一定是流程上出了问题. 而scrummaster的权利不能超越流程之外.

对于scrummaster的权利, 举个例子: 某团队成员在提交代码之前, 必须进行code review, 这个虽然是个好主意, 但是不应该是scrummaster来决定, 因为它超出了流程之外, 这个是要求团队怎么工作的决定.

优秀的scrummaster能够并愿意承担责任的人.

scrummaster不应该对项目的成功负责, 这个是团队的责任.

scrummaster必须对团队产出最大化以及支持团队使用scrum负责.

scrummaster相当于乐队的指挥, 二者都必须对团队的行为进行引导.

优秀的scrummaster不会以自我为中心. 应该帮助团队实现目标提供任何帮助.

scrummaster必须保证团队中存在一种互相协作的文化, 需要确保团队成员能将问题拿出来公开讨论. 善于合作的scrummaster应该鼓励团队用共赢的方式思考, 而不是以赢家和输家的方式思考.

如果团队发现障碍经常不能很快得到清除, 那么应该提醒scrummaster积极投入团队的重要性.

成功的scrummaster应该影响团队内和团队外的人, scrummaster应该懂得向别人施加影响, 同时又要避免独裁.

scrummaster不仅要有scrum知识, 还必须具有技术, 市场和其他专业知识, 帮助团队实现目标.

scrummaster的职责是提供指导而非答案, 团队必须自己找答案.

scrummaster是这样的人: 保证团队一起顺利工作, 迅速清理挡路石, 团队有效朝着目标前进. 而产品负责人则是保证团队朝着正确目标前进的人.

产品负责人不仅仅是一名项目经理, 同时还必须撰写需求和排列优先级.

需求边界必须由负责人提出并且经常表现为限制条件, 比如: 我六月需要它;我需要减少一半的开销; 它的速度要加倍; 内存占用要减半等.

产品负责人的工作分两部分: 对外了解市场趋势, 对内与团队一起建造产品.

产品负责人的品质
必须要有非常强的业务背景.
能与各种干系人等友好相处, 是一个良好的沟通者.
当团队成员遇到问题找你时, 产品负责人必须给出一个解决方案或决定.
要懂得授权.

产品负责人通常会要求的更多, scrummaster必须在这种情况下站出来与之抗衡从而保护团队.

scrum基本原则: 相信团队能解决问题.

scrum并没有规定必须有测试, 必须结对编程, 它只要求团队在每个sprint结束时能交付高质量, 可工作的软件.

不断的重构, 让小问题在变成大问题之前修复他们, 保证我们的应用不会腐烂.

如果能保证我们在提交代码的时候比我们更新代码干净一点点, 那么我们的代码就不会变烂

集体所有制鼓励成员对程序的任何部分都承担责任, 以便团队成员能在任何一个模块工作.

必须确保开发人员不会变得太专业以至于只能在某一方面做出贡献.
确保没有一个地方变得太复杂以至于只有一个开发人员可以明白和完成其工作.

结对编程
如果偶尔的代码检查能带来好处, 那么为何不将代码检查持续下去?
在一起工作对学习如何做驱动测试更容易.
结对编程能创造出代码集体所有制的感觉.
能保证我们以低错误率完成一些复杂的产品.
相当于一个人在键盘上工作时有了两个脑袋.
结对编程有利于知识传递.
增加的成本可以通过缩短周期提高产品质量换来.
在最难的模块采用结对编程, 可以得到更少的缺陷, 甚至零缺陷.
如果赶时间, 这正是结对编程的时候.
期望在延期的项目上增加人手, 这也是采用结对编程的理想时机.

企业向敏捷转型的一个重要方面就在于预见性和适应性之间找到一个合理平衡.

在前期进行大量的设计和分析可以让后期的变更数目下降, 但是一旦变更, 就比较昂贵.

产品负责人的真正工作是最大化某一个时间段内的功能交付.

敏捷编程鼓励简单, 局部的方式来适应变更, 以避免大的重构, 测试和系统构建.

团队的优势在于让事情很快的完成, 比一个人做要快得多, 坏处是带来了大量的潜在的沟通成本

amazon称他们的团队为两个披萨的团队, 指他们的团队规模人数一顿吃两个披萨就够了.

当一个团队人数超过10~12人, 就很难建立信任感, 共同的责任感和凝聚力.

为一个大团队安排一次会议非常麻烦.

在一个大团队, 团队活动和讨论的参与度较低.

一个大团队会导致差异增加, 不利于组成一个有凝聚力, 高效的团队.

最好不要频繁调整团队结构, 因为团队需要时间形成凝聚力.

如果一个人的工作量不饱和, 那多任务是可以接受的.

宁可让少数人承担多任务, 也不要让每个人有少量的多任务

一个人被安排到一个团队的时候, 至少60%的时间在这个团队中.

scrum来自于这样一种场景:产品开发团队必须像一支橄榄球队, 一组运动员作为一个整体沿着球场传球.

要成为高效的scrum团队, 首要目标就是要确认团队责任制, 即"谁为...负责"

尝试是最好的学习方法之一

如果大家觉得做这件事没有安全感, 他们就不会去做.

多数团队发现每个sprint用大约半个小时到半天时间寻找改进的方法是值得做的.

敏捷开发的目标在于找到文档和讨论之间的合理平衡, 而过去我们更偏向于文档.

当文档用于任务的交接时, 那它就是邪恶的, 如果是为了捕捉交谈记录而不为忘记, 这是有价值的.

用户故事是团队将用户需求从编写转换到讨论的最佳方式, 它从该功能的用户角度出发来进行简短的描述

用户故事模板:
作为一个<用户类型>, 我想<某个目标>, 以便于<一些原因>
为了<实现某个价值>, 作为什么<用户类型>, 我想<某个目标>.

story card 不需要记录所有的细节, 细节在产品负责人和团队讨论之后产生.

一旦使用软件工具管理产品backlog, 就说明你不能做到敏捷. 如果你使用笔和纸, 你就会更加敏捷, 只要能采用这种低技术含量方式, 请尽量使用它.(好扯^_^)

用例所表现的功能比常见的用户故事要大.

scrum团队能更好的处理比通常用例更小的任务.

故事卡片上的问题都是可以讨论的, 所以不要包含所有的细节.

总有一些只有在系统成型之后才想到的东西. "可恶, 我们居然没有想到..."

涌现的需求不允许你完美的预测进度

涌现的需求被认为是计划太早或者包含过多细节导致的结果, 不能看成计划的失败.

对需求的变化就像对天气的抱怨, 你不能改变大自然的规律, 但是你可以找到方法来应对它, 你不能让雨停, 但是你可以带一把伞.

产品backlog中, 团队很快要实现的那些内容必须拥有足够的细节, 以便每一个内容都能在一个sprint中编码实现, 测试和集成.

在产品backlog中, 那些位置靠前的用户故事, 一定是更小更容易理解, 包含更过的细节, 位置靠后的用户故事则更大, 更粗略, 只能大致进行估算和排列优先级, 整个产品backlog呈现冰山状的结构.

如果位置靠后的故事对前面的故事有影响, 那么就应该花一些时间来理解它.

一个大需求被拆分为小需求的例子:
大需求: 作为一个用户, 我需要登录系统, 以便只有我才能访问的信息.
分拆成小需求:
作为一名已注册的用户, 我能用我的用户名和密码登录
作为一名新用户, 我能创建用户名和密码, 并让系统记住我的信息.
作为一名已注册的用户, 我能修改我的密码, 让我保证它是安全和容易记忆
作为一名已注册的用户, 系统能在我的密码在被猜测时, 提醒我, 从而保证我的信息安全.
作为一名健忘用户, 系统能让我申请一个新的密码, 避免忘记密码账号被锁住.
作为一个已注册的用户, 我不想看到由于用户错误, 密码错误或者二者都错误导致的信息, 让其他人冒充我.
作为一名已注册用户, 我能在我的账户出现三次错误尝试后得到通知, 让我知道是否有人尝试访问我的账户.

当大故事拆分成小故事, 大故事就可以从backlog中删除了

如果遇到更大的故事, 可以首先拆成一些中等规模的故事, 然后再拆成更小的.

当故事拆分到足够小, 能在一个sprint中完成, 拆分就到此为止.

当故事拆分到足够小之后, 可以通过向故事中添加满意条件来继续提炼需求. 满意条件是某个简单的验收测试, 如果故事完成, 那么该条件就为真. 满意条件可以是支持什么, 包含什么, 也可以是不支持什么, 不包含什么, 通过满意条件我们知道产品负责人对该功能的期望.

向scrum转型并取得长期的成功, 必须学会在没有完整的细节说明书的情况, 如何启动项目.

详细说明书的一个不足就是他们很少保持更新, 写一份文档之前, 问问自己是否愿意一直更新该文档.

利用事例可以帮助我们更好的沟通, 也更容易帮助我们发现不一致的地方.

因为存在交接, 所以需要文档, 如果一起讨论, 文档的工作就得到简化.

可工作软件的作用:
能鼓励反馈
能衡量它们的进度
允许软件在需要时发布

在sprint结束时, 我们得到的产品是可用的, 或者称之为潜在可交付的, 即: 对于正在开发的特性, 功能不全, 但是可以工作.

潜在可交付的意味着测试通过. 但并不意味着系统功能的完整.

每个sprint提交有价值的东西的两个主要好处: 可以尽早的反馈和确保团队不会误解项目的进度

如果那个功能还不能被最终的用户认识到或见到, 那么至少产品负责人能理解目前完成工作的价值.

在任何一个sprint中应该有10%的时间准备下一个sprint

产品backlog的优先级与所包含的细节成正比, 优先级越高的任务, 所包含的细节越多.

如果项目开始做了非常详细的假设, 而该计划基于非常多的假设, 随着项目的进展, 我们会发现这些假设是不对的, 这样会导致这些基于假设的设计是无效的.

逐步完善的计划可以帮助团队避免落入项目一开始就做太多决定的陷阱, 随着项目的推进, 细节的掌握, 我们才能逐渐做出决定, 今天不能做的决定, 完全可以推迟到明天.

程序员往往会低估做一件事情要花费的时间.

增加能源的最好方法之一是增加热情, 项目中充满热情的人越多, 团队就越有可能充满能量, 其中产品负责人是关键, 他需要传达一个引人注目的产品愿景, 让团队充满热情工作.

定时的短暂休息, 比如一个20分钟的散步, 或者和同事聊天可以快速的恢复对主要任务的关注和能量.

人会有一个90~120分钟的周期, 在这个周期中, 人的身体逐渐从精力旺盛过度到生理的低谷期. 每隔半个小时最好休息休息, 如果不休息, 你就会累, 就会精神不集中, 会容易犯错, 变得急躁, 并出现意外.

范围,成本, 进度是项目管理的铁三角. 同时只能满足任意两个. 而铁三角中间的内容就是产品的质量, 这个是万万碰不得的. 而错误的做法往往是将质量作为第四条边.

作为向scrum转型的一部分, 项目关键的干系人, 开发人员以及产品负责人需要学会把改变范围作为第一选择. 即我们偏向于调整范围去适应可用的资源和进度.

测试不能作为事后的纠正, 而是验证在之前的开发有没有引入错误

缺乏自动化是一种技术债

至少必须对系统中最复杂的部分做彻底的代码检查

自动化测试的金字塔:UI<服务<单元

一个自动化的单元测试可以缩小检查的范围, 而且单元测试和开发语言相同, 写起来更得心应手.

自动化的用户界面测试放在金字塔的顶端, 是因为我们想尽量少做它(脆弱, 成本高, 耗时).

对于涉及到硬件和外部系统的集成, 不应该采用自动化

手工测试应该作为探索式测试, 这种测试应该以短尾特色.

经验告诉我们程序员以后回头为可工作的代码补充单元测试是很少见的.

技术债: 代码不成熟, 或不太正确导致的成本的增加.

第一次提交代码就像借债, 只要通过重构快速地归还, 小的债务是可以加速开发的. 问题的关键是必须快速的偿还债务
分享到:
评论

相关推荐

    《Scrum精髓:敏捷转型指南》读书笔记.pdf

    ### Scrum精髓:敏捷转型指南读书笔记 #### 第一章:Scrum的适用范围 - **Cynefin框架**:本书介绍了Cynefin框架作为理解Scrum适用环境的基础。该框架将工作环境划分为五个区域:复杂、繁杂、混乱、简单以及无序。...

    敏捷软件开发:原则、模式与实践.pdf

    敏捷软件开发是现代软件工程领域的一项重要实践,它倡导快速迭代、持续集成和对变化的迅速响应。敏捷软件开发的主要目的在于提高软件质量和交付速度,同时更好地满足客户需求和应对变化。敏捷开发的核心是一系列原则...

    [免费PDF高清]精益和敏捷开发大型应用指南之读书笔记.rar

    通过阅读这本书和相关的读书笔记,开发者不仅可以学习如何将精益和敏捷理念应用于大型应用的开发中,还能了解到如何优化团队协作、提高开发效率和软件质量。对于任何想要提升软件开发实践的人来说,这些都是宝贵的...

    敏捷学习笔记整理敏捷学习笔记整理

    敏捷开发是一种以人为核心、迭代、递增的软件开发方法,旨在提高开发团队的灵活性和应对变化的能力。Scrum 是敏捷开发中的一种流行框架,它强调通过短期的、固定时间盒(通常为2-4周)的迭代周期,快速交付可用的...

    软件开发课程小笔记(很有用的)

    通过阅读这些笔记,你可以深入了解软件开发的各个环节,包括需求分析、设计、编码、测试以及维护。 1. **需求分析**:软件开发的起点是明确需求。需求分析涉及与客户沟通,了解他们的业务目标和功能需求,从而制定...

    2023软件设计师笔记

    在技术方面,笔记可能介绍了现代软件开发工具和框架,如敏捷开发方法(Agile Methodologies,如Scrum和Kanban)、持续集成/持续部署(Continuous Integration/Continuous Deployment, CI/CD)以及流行的编程语言和库...

    2022 敏捷专项笔记小结

    2022年的敏捷专项笔记主要涵盖了敏捷的核心概念、敏捷宣言及其原则、敏捷组织结构以及Scrum框架的关键要素。 敏捷的核心思想在于四大价值观:个体交互高于过程和工具,可用软件高于完备的文档,客户协作高于合同...

    软件设计师笔记和试题

    1. **软件工程基础**:涵盖软件生命周期、需求分析、系统设计、编码、测试、维护等阶段的基本知识,强调软件开发过程中的规范化和质量管理。 2. **设计模式与架构**:介绍常见的设计模式(如工厂模式、单例模式、...

    软件设计师复习笔记资料.rar

    了解瀑布模型、敏捷开发、迭代模型等软件开发流程,掌握UML(统一建模语言)用于系统建模,以及需求分析文档的编写,如需求规格说明书、用例图和活动图等。 二、编程语言与数据结构 编程语言是软件设计师的工具,如...

    软件设计师笔记.zip

    同时,熟悉常用的软件开发框架(如Spring、Django、React等),可以提高开发效率和代码质量。 四、软件架构设计 软件架构是软件设计的核心,它定义了系统的组织结构和交互方式。学习常见的软件架构模式(如单体架构...

    开发学习笔记供大家学习参考

    笔记可能包含了敏捷开发方法(如Scrum或Kanban)、版本控制(Git的使用)、持续集成/持续部署(CI/CD)流程,以及如何编写高质量的代码和测试用例。 操作系统原理也是开发者需要了解的。进程与线程的区别、内存管理...

    中国海洋大学软件工程学习笔记

    1. **软件工程概述**:介绍软件工程的基本概念,包括软件生命周期,软件开发过程模型(如瀑布模型、螺旋模型、敏捷方法等),以及软件工程的重要性。 2. **需求分析**:讲解如何进行需求获取、分析和表达,可能包括...

    达内开发笔记

    总的来说,【达内开发笔记】是一份全面的IT技术学习资料,不仅覆盖了各种编程语言和技术框架的基础知识,还包含了软件开发过程中的重要实践环节,对于提升开发者的技能水平和解决实际问题的能力有着极大的帮助。...

    软件工程aster-paper-maste笔记

    笔记可能涉及敏捷开发方法(如Scrum或Kanban)的应用,以及如何使用项目管理工具(如Jira或Trello)进行任务追踪。 七、维护与演化 软件在发布后需要持续维护和更新,以适应新的需求和技术变化。笔记会讨论软件的...

    软件设计师笔记资料.zip

    软件设计师需了解知识产权法、合同法等相关法律法规,以及行业内的道德规范和职业操守,以确保软件开发过程的合法性与合规性。 十、新技术与趋势 随着技术的不断发展,云计算、大数据、人工智能、物联网等新兴领域...

    软考中级软件设计师专题复习笔记

    8. **法律法规与标准化**:了解与软件开发相关的知识产权法、合同法,以及ISO、IEEE等制定的相关标准和规范。 9. **项目管理**:理解项目管理的基础知识,包括范围管理、时间管理、质量管理、风险管理等,能运用...

    《UML及建模》读书笔记

    9. **UML在敏捷开发中的应用**:UML不仅适用于传统的瀑布模型,也适应于敏捷开发方法,如Scrum或XP,可以用于快速迭代和需求变更的管理。 通过《UML及建模》这本书的学习,读者不仅可以掌握UML的基本语法和用法,还...

    软件工程笔记软件工程思想

    敏捷开发、Scrum框架等现代项目管理方法强调灵活适应变化,迭代开发,以快速响应市场需求。 总的来说,软件工程思想贯穿于软件生命周期的每一个阶段,从需求分析到设计、编码、测试,再到维护,每个环节都体现了...

    「软件工程之美」笔记1

    【软件工程之美笔记1】是关于软件开发方法和实践的一系列知识总结,涵盖了从基础理论到具体实践的各种方面。在软件工程中,学习的核心在于理解工具、方法和过程的结合,以确保软件的质量。以下是对这些知识点的详细...

    软件设计师笔记.docx

    而在软件开发过程中采用合适的设计模式,比如策略模式,可以帮助开发者更好地组织代码结构,提高代码的复用性和可维护性。这些知识点不仅是软件设计师必备的专业技能,也是每一位从事软件开发工作的技术人员应该掌握...

Global site tag (gtag.js) - Google Analytics