一、写一篇学习心得,作为目前最为流行的敏捷开发过程,Scrum方法有何特点。写写对这个软件开发方法的评价。
1、scrum的简介
- scrum这个词来源于英式橄榄球,scrum是一种项目管理的方式。
- scrum的理念是响应变化,快速迭代,强调团队合作。
2、scrum的四个核心价值
- 个体与交互 胜于 过程和工具
- 可交付的软件 胜于 完备的文档
- 客户协作 胜于 合同谈判
- 响应变化 胜于 遵循计划
3、scrum的价值观
- 承诺,愿意对目标作出承诺
- 专注,把你的心思和能力都用到你承诺的工作上去
- 开放,Scrum把项目中的一切都开发给每个人看
- 尊重,每个人都有他独特的背景和经验
- 勇气,有勇气作出承诺,履行承诺,接受别人的尊重
4、scrum的内容(3:4:3模型)
- 3个角色
Product Owner 产品负责人,负责整理PB产品代办列表,制订发布计划
Scrum Master Scrum管理员,规则的守护者,让团队用正确的方法做事
Scrum Team Scrum团队,跨职能的产品发布所有人的组合,自组织的
- 4个活动
Sprint计划会,制订这轮冲刺需要完成的Sprint Backlog冲刺待办列表
每日站会,Scrum团队自己的会议,PO不能发言,三个问题,昨天完成了什么,今天计划做什么,遇到什么困难,目的是让所有人了解情况,然后进行检查和修改
评审会,PO对Team完成的工作进行验收,PO可以选择接受或不接受
回顾会,Scrum Master对这轮Sprint执行Scrum情况进行分析回顾,不好的改进
- 3个工件
Product Backlog,产品待办列表
Sprint Backlog,Sprint待办列表,这轮冲刺需要完成的任务,团队根据PB制定
发布计划,发布可供用户使用的版本
5、关键词
- 敏捷开发,每一个冲刺,整理需求、设计、开发、测试都并行进行
- 团队存在的意义是为客户创造价值
- 开放、尊重、共享
- 自组织、自我管理
6、用户故事
- 从用户的角度描述渴望得到的功能,包含三个部分.
- 角色(谁使用这个功能)
- 活动(需要完成什么样的功能)
- 商业价值(为什么需要这个功能,这个功能带来什么价值)
- 描述 As a,I want to,so that. 作为一个<角色>,我期望<活动>,以便于<商业价值>.
7、3个C
- Card 卡片,上面写用户故事
- Conversation,用户故事来源于和客户的沟通
- Confirmation,确认用户故事被正确的完成
8、用户故事的6个特性
- 独立性 Independent
- 可协商性 Negotiable
- 有价值 Valueable
- 可估算性 Estimeable
- 短小 Small
- 可测试性 Testable
9、时间维度
- 2周作为一个Sprint冲刺(迭代)
- 每日站会少于15分钟
- 计划会,每周1小时,2周就是2小时
- 评审会,每周2小时
- 回顾会,2小时
10、总结
- Scrum就是一种项目管理的理念和手段,通过对价值观,过程的固定,时间的拆分,用敏捷开发的方式解决复杂产品开发过程遇到的问题的解决的一种框架。
- Scrum的核心就是响应变化,快速迭代,通过小团队的快速调整变化来适应不明确的需求。
- Scrum适用于过程不能够完全定义好的,结果是不可预知的,生产过程是不可重复的,需要通过不断的检查和调整才能完成最终目标的项目。
博文推荐:
二、在上次作业布置熟悉的软件“生活在长大”的基础上,各小组提出进一步开发计划,并请按照Scrum方法来执行计划。用博客描述你们小组这次开发计划执行情况和最后的结果和评价,可以适当放上程序运行截图。你在这次开发中做所的共享。要求贴出你们小组作品的github源码地址,给评阅着查看。
1、Daily Scrum Meeting照片
2、具体项目
- 开发一个跨平台视频播放器,可以在不同操作系统平台(如 Windows、Linux、Unix等)上播放多种格式的视频文件,如MPEG、RMVB、AVI、WMV等常见视频格式。
3、燃尽图
4、困难与问题
- 组内成员几乎都是第一次接触Android语言,对Android语言不熟悉,导致软件的开发进展较慢,
所有成员正在不断得学习Android语言,希望能够完美的完成本次团队作业
- 团队正处于磨合期,对彼此的了解不够,
希望能够加深彼此的了解,提高工作效率。
- 时间比较紧迫,
队员应该保持良好心态,合理安排时间,争取获得更好的结果。
5、心得体会
- 团队工作注重的是合作,合理的利用资源往往能够达到事半功倍的效果
- 团队合作需要互助,任何一个队员遇到困难,彼此都应该尽可能的给予帮助
- 团队合作还要有一定的交流,促进彼此间的了解,还能够达到互补的效果
6、框架代码
public class AVIFile implements VideoFile {
public void decode(String osType,String fileFormat) {
System.out.println("操作系统:"+osType+"\t文件格式:"+fileFormat+"\n开始播放······");
}
}
public class LinuxVersion extends OsVersion {
public void play(String fileFormat) {
String osType="Linux";
this.vf.decode(osType,fileFormat);
}
}
public class MPEGFile implements VideoFile {
public void decode(String osType,String fileFormat) {
System.out.println("操作系统:"+osType+"\t文件格式:"+fileFormat+"\n开始播放······");
}
}
public abstract class OsVersion {
protected VideoFile vf;
public void setVideoFile(VideoFile vf) {
this.vf=vf;
}
public abstract void play(String fileFormat);
}
public class RMVBFile implements VideoFile {
public void decode(String osType,String fileFormat) {
System.out.println("操作系统:"+osType+"\t文件格式:"+fileFormat+"\n开始播放······");
}
}
public class UnixVersion extends OsVersion {
public void play(String fileFormat) {
String osType="Unix";
this.vf.decode(osType,fileFormat);
}
}
public interface VideoFile {
void decode(String osType,String fileformat);
}
public class WindowsVersion extends OsVersion {
public void play(String fileFormat) {
String osType="Windows";
this.vf.decode(osType,fileFormat);
}
}
public class WMVFile implements VideoFile {
public void decode(String osType,String fileFormat) {
System.out.println("操作系统:"+osType+"\t文件格式:"+fileFormat+"\n开始播放······");
}
}
public class Client {
public static void main(String[] args) {
OsVersion os1=new WindowsVersion();
VideoFile vf1=new AVIFile();
os1.setVideoFile(vf1);
os1.play("AVI");
System.out.println("---------------------------------------------");
OsVersion os2=new LinuxVersion();
VideoFile vf2=new AVIFile();
os2.setVideoFile(vf2);
os2.play("AVI");
System.out.println("---------------------------------------------");
OsVersion os3=new WindowsVersion();
VideoFile vf3=new WMVFile();
os3.setVideoFile(vf3);
os3.play("WMV");
}
}