1  如何避免在产品开发后期不断有重大修改,导致其它模块的连锁反应?

DCR Tell mode vs. Ask mode设计变更

在项目早期,如果大家觉得要做一个设计变更,便可以采用告知模式(Tell-mode)的形式,也就是说,修改方必须通告所有关系人:“我在这里修改了某某界面, 我在某个API 增加了一个参数。”但是修改方不必取得其他关系人(或者模块)的事先同意,就是说可以先行设计并编码。当然,如果其他关系人不同意,修改还是不能签入。

当项目进行到稳定阶段,例如达到了代码完成(CC)阶段,Tell-mode 要改为请求模式(Ask-mode),这时,修改方必须先问“我是否可以在这里修改某某界面?”(当然还要有更详尽和充分的理由),得到肯定的答复后,才能进行修改。这时的默认回答是“不”。

2  每周进度报告——还有多少事没做完

小飞: 我们每天都在签入新的代码,每人都很忙,但是我总觉得不太对劲。感觉事情越做越多,我们离最终目标到底是更接近了,还是更远了呢?

阿超: 这时我们可以看看各种报表,首要推荐的是TFS 的“Remaining Work”,可以看敏捷流程的“燃尽图”(Burn down chart)。如果你看到每个人每天花费的时间在不断增加,但是真正需要解决的任务(Task)和缺陷(Bug)都没有变化,甚至缓慢增加,这意味着团队离最后目标越来越远了。

可以在TFS报表设置的控制板中,进一步选择你要报告的内容,如:Iteration,选择里程碑;Area,选择项目的不同部分,也可以修改报告的起始和终止日期等[i]。

3  如何避免诧异的反应

问:     每次里程碑结束后,我们向客户汇报的时候,客户总是会惊讶地说,某某功能不是我们当初商量的那样啊,而PM却也同样一脸诧异地说,不对啊,当时咱们就是这么说好的啊,有文档为证。客户不干了,威胁不加/不改xx功能就如何如何,这时PM该怎么办?

阿超: 我们在合同里要写明到底我们要交付的是什么,这就要看PM的分析和说明能力了。有时要对客户说“不”。同时,我们在需求说明中也要从用户的角度去描述问题和解决方案,这样用户才能了解他们最终会得到什么,另一个方面是,当你给用户演示一些界面的时候,要说明哪些界面只是示例而已,哪些界面是大家同意的最终设计。敏捷的开发流程鼓励用户经常参与设计和计划,如果有条件这么做,那当然很好。

问:     项目开发中后期,开发人员用工具一统计,乖乖,足足xx万行代码,xx千个存储过程,可是每到给客户演示时,却不时出现程序的各个功能相互不配合,不能自圆其说的尴尬场景,Dev leader很郁闷,想想自己可是没少加班啊,代码量也够多,可是问题究竟出在什么方面呢?

阿超: 一个原因是每个人都沉浸在“我要写出最强大的某某类或某某模块”中,不停地优化一些没有人用的功能,但是真正能够为其他模块使用的功能却未能实现。他们忘了他们写的代码是给别人用的,而且是为了解决用户问题的。所以这个时候我们要想想“用场景驱动”的方法,保证典型的用户场景能够实现。如果从“场景”出发,各个模块的互相集成就能得到充分的测试,按照场景演示起来就更有保障了。

问:     在项目开始之前, 有很多队员还没有接触过编程语言(例如C#),导致PM在分配任务时很难用时间来衡量,就拿写一个Web Service这一模块来说,一个熟练的程序员可能只需要两个小时,而对于初学者来说,就得先花两天来理解Web Service的实现机制和原理。在有限时间的催促下,导致一些紧急的任务不断向高手集中,而初学者的任务越来越少。这时应该怎么办?

阿超: 对于这些队员,可以考虑在他们自己的任务估计值之上再乘以4。另外,如果你是写一个商业项目,请不要让连开发语言都没有接触过的队员进行开发工作。并不是非得 “写” 程序才是对项目有贡献,有时不写也有很好的贡献。如果他们有热情,就从测试开始学习吧。请参看前面提到的“大马哈鱼洄游模型“

4. 在这个时候是否碰到 “团队成员不给力” 的问题?  请看别的同学的吐槽:

http://www.cnblogs.com/xinz/archive/2010/11/27/1889935.html

5. 我们是在写代码解决问题呢,还是在搭建宏伟的架构?
请看:http://ourjs.com/detail/53dbb5292ee109090700000c 
英文版:http://nsainsbury.svbtle.com/java-developers 
6. 好的修改/重构是什么样的?  请看几个例子:
http://world.kankanews.com/w/2014-11-22/0015946771.shtml
http://www.cnblogs.com/marvin/p/TalkFromReflactingCode3000To15.html 

[i]      VS2010以及之后的版本还提供了燃尽图等功能,请参见相关同学的博客,例如

http://www.cnblogs.com/OMG-Team/archive/2011/09/30/2196150.html

7. 不同建模工具的特点:

我们讲了好几种建模和设计工具,它们在以下的方面有什么特点呢?

1)容易理解,特别是对于非专业人士来说。

2)不仅能处理非常简单的问题 (如计算一个文件的行数),还能扩展到处理复杂的现实世界的关系,实时系统,复杂的商业逻辑,等。

3) 能非常精确地描述问题

4)能精确地把这个模型转换为代码

5) 能很好地应对变化 (如果我们改变了设计,代码和模型能很快地跟随变化)

8. 软件设计的工具
创作需要工具,有些学科只需要简单的纸和笔,有些需要专门的工具。
1) 请调查一下你周边的同学在写软件的时候都使用什么工具 (IDE, 测试工具等)
2) 请采访有两年以上工作经验的软件工程师在使用什么开发/测试工具
3) 请采访有三年以上经验的产品经理在使用什么项目管理工具,这些工具有什么优缺点
4) 很多和信息处理相关的应用都是 “增删改查” 操作的组合, 那么能否抽象出这些操作, 找到规律,自动生成基本的信息应用呢? 请分析这个软件工具:
http://garrylachman.github.io/ElectroCRUD/   
9. 不同的设计方法有各自的适用范围,OO 也是这样
很多同学都上过 《面向对象的程序设计》这门课,请阅读下列文章,谈谈你的看法:
    http://www.vaikan.com/object-oriented-programming-is-inherently-harmful/ 
http://doc.cat-v.org/programming/bad_properties_of_OO 
http://harmful.cat-v.org/software/OO_programming/why_oo_sucks
http://harmful.cat-v.org/software/OO_programming/_pdf/Pitfalls_of_Object_Oriented_Programming_GCAP_09.pdf 

现代软件工程 第十一章 【软件设计与实现】 练习与讨论相关推荐

  1. 十一章--软件设计与实现

    程序开发的目的是满足客户的需求,因此我们先要理解问题,进而找到适合的数学模型,然后根据需要实现.设计方法有很多:形式化.文学化等.在设计和实现的过程中,设计文档(Spec)是很重要的,设计人员根据自己 ...

  2. 软件工程学习笔记——第六章 软件设计方法

    目录 第一章 概述 第二章 过程和活动 第三章 软件过程模型 第四章 问题定义和可行性研究方法 第五章 需求分析方法-1 第五章 需求分析方法-2 第六章 软件设计方法 第七章 软件实施与测试方法 第 ...

  3. 软件测试之第十一章 软件开发与测试模型

    第十一章 软件开发与测试模型 一. 软件开发模型 1 为什么学习软件开发模型 了解开发能够更好的有针对性的做好测试. 2 什么是软件开发模型 软件开发生命周期模型是软件产品从最初构思到退役的过程. 3 ...

  4. 【Linux命令】《鸟哥Linux基础》第二十一章 软件安装:源代码与Tarball

    第二十一章 软件安装:源代码与Tarball 了解:如何将开放源码的程序设计.加入函数库的原理.通过编译而成为可执行的二进制程序,最后该文件可被我们所使用的一连串过程. 这一章介绍最原始的软件管理方式 ...

  5. 《软件工程》第三章——软件设计综述

    1. 软件设计的任务与目标 任务和目标:以软件需求规格设计说明书为依据,根据其提出的系统目标,进行数据设 计(数据结构),系统结构设计(软件系统的体系结构),过程设计(吧结构转换为软件的过程性描述), ...

  6. 软件工程-第2章 软件生存周期与软件过程

    文章目录 软件工程 第二章 软件生存周期与软件过程 ==2.1 软件生存周期== 2.2 传统软件过程 1.瀑布模型 2.快速原型模型 3.软件演化模型 4.形式化方法模型 5.净室模型 2.3 面向 ...

  7. 软件工程——第1章软件工程学概述知识点整理

    本专栏是博主个人笔记,主要目的是利用碎片化的时间来记忆软工知识点,特此声明! 文章目录 1.为什么要有软件工程这门学科? 2.软件分为哪些阶段? 3.软件危机的定义? 4.软件危机包含的问题有哪些? ...

  8. 软件工程导论 01章软件工程学概述

    1.软件是程序.数据以及各种相关文档的集合. 程序是对计算任务的处理规则的描述,数据是对计算任务的处理对象的描述,文档则是有关计算机程序功能.设计.编制与使用的文字图形资料. 软件等于程序加数据加相关 ...

  9. 【学习笔记】慕课网—Java设计模式精讲 第3章 软件设计七大原则-3-6 迪米特原则(最少知道原则)...

    /** * 软件设计七大原则-迪米特原则 学习笔记 * @author cnRicky * @date 2018.11.10 */ 迪米特原则(最少知道原则) 一个对象应该对其他对象保持最少的了解.又 ...

最新文章

  1. 蓝牙Bluetooth技术小知识
  2. 不是计算机专业学python能找到工作吗-本科学历,非计算机专业,想学Python找工作靠谱吗?...
  3. 【建议收藏】二叉树的序列化与反序列化
  4. HttpServletResponse对象介绍
  5. Android Studio 之 NDK篇
  6. 实例探究Python以并发方式编写高性能端口扫描器的方法
  7. 计算半圆弧的周长及半圆的面积
  8. Java毕设项目——网上宠物店管理系统(java+SSM+Maven+Mysql+Jsp)
  9. 六年级上学期计算机上册教案,最新人教版六年级上册数学全册教案
  10. qtableview 查询_QTableView 操作SQLite
  11. 云服务器搭建MQTT服务器
  12. VGA驱动之-显示例程(最简单)
  13. Longhorn 企业级云原生分布式容器存储-券(Volume)和节点(Node)
  14. 批量爬取上交所上市公司报告
  15. Spring @Scheduled定时任务的fixedRate,fixedDelay,cron的作用和不同
  16. 支持向量机 一 :线性支持向量机介绍
  17. 大公开!精美动图制作只需这几款工具!
  18. 抖音之xl xa xg xk 四神签名参数
  19. 小程序支付,详细过程
  20. 全面开启 BI PaaS|衡石十月头条

热门文章

  1. linux 安装svn客户端
  2. CentOS7开放端口号
  3. webstorm配置Monokai-Sublime.jar主题
  4. HDU 5890 Eighty seven(DP+bitset优化)
  5. Redis应用场景(转)
  6. 重命名myclipse中web项目名称的过程
  7. oracle10g 监听服务无法启动
  8. 【计算机网络复习 物理层】2.2 物理传输介质
  9. 第一章 计算机网络 5 分层结构/协议/接口/服务的概念 [计算机网络笔记]
  10. c语言float转换为int_C语言的隐式类型转换和显示类型转换