Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2014-06-14) TWI 2-1 敏捷与精益

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

一个很好的例子:买房

在北京买房,肯定会涨(确定有价值),这时你不会考虑它有多贵(成本),因为肯定能赚钱。会选择更好的小区,升值空间更大(最大价值),只要有办法能低成本的获得大量资金即可(不计成本)。

但是如果在一个偏远的三四线城市买房,会不会涨不确定,人们就会倾向于买便宜的房子。因为就算亏,也要少亏点。这时候最重要的是减少成本。

敏捷:追求最大价值

适合企业软件开发

有价值或者很容易确定有价值

企业软件所有的功能都是有价值的,软件可与行政互换

用户都在企业中,容易得到反馈

当软件不满足时,可以通过行政命令去适应软件,所以企业软件的功能都是有价值的

所以我们要考虑的就是“优先级”

敏捷是风险管理 Risk

在开发时会追求开发速度,在估点时会下意识做最乐观估计。“这个功能我已经做过类似的,比较熟悉”,“已经有相关代码可以重用”,但大多数情况下,实际情况总会超过预期,成为常态。

最后会拆卡,会说“超出scope”,但是人们都会接受这些理由。

问进度时会问:这张卡你还要多久可以完成,人们通常会乐观估计,告诉一个理想化的最短时间

看板上有很多queue,一般以"ready for XXX"为标题。这些queue会把看板分成独立的几个部分,每个角色只会关注其中的一块。

比如dev会关注:Ready for dev -> in dev -> ready for QA

QA会关注:Ready for QA -> in QA -> ready for Prod

当dev完成后,就会把卡移到ready for QA,而不管里面积了多少张卡,因为不是自己的事。可能dev会很快,但是QA不够,积了很多卡,最后还是无法交付,有大量的WIP(work in progress)

那么什么是推式系统呢?它是依赖批量计划来执行,成批送到下游工序或仓库排队。集中控制,不考虑下一个工序的实际节拍,独立的工序控制,关注资源能力。没有形成连续流。

容易库存,容易浪费

(感觉就像是发邮件:完成任务后,给下一个人发件邮件,告诉他该他了。然后自己再接着做下一个任务)

在度量时,不是整体时间:backlog -> production,而是部分时间,比如dev只关注dev那几列的最时间。

精益:追求最小成本

适合互联网软件开发

做出来的东西,有没有价值不容易确定。很可能做出一个东西后,发现用户不用,只能砍掉。

在东西做出来以前,没有用户。

在这种情况下,关注的是一个需求从提出到上线的时间,叫做cycle time。对于单个需求,叫singleton cycletime,单件时间

在最短的时间内上线,如果没用,损失也会少一些(浪费的时间和dev少)

事故管理 Accident

问进度时会问:在这个cycletime期限,这个功能你能不能完成。只回答能或者不能,而不关心几天

如果没有完成,则是一个“事故”。人们通常会悲观估计。

人们关心的是一个需求从提出(答应客户要做),直到上线的总体时间。

看板上没有Queue,每个列上有一个"MAX"值,说这一列最多有几个。超过数量后,人们就要尽快解决。

那么什么是拉式系统呢?它是实时响应实际需求或消耗来执行,一种由下游向上游提出实际生产需求的生产控制方法。分散控制,灵活和容易的适应性,关注物料的流动。

市场要多少,生产多少,没有库存(WIP),没有浪费

当某列阻塞时,两种做法:

临时加个Q,做为临时解决方法,多一些缓冲

某些人解决问题,其它人去做“过程改进”。“改进”是要花时间和成本的。在另一个“改进”看板

人们会关心从dev到qa到deployment的整个过程,而不像以前只专注某几列。

———-

敏捷和精简中的很多实践是一样的,但是由于动机不同,关注点不同,所以在做法上会有很多不同。

我们的REA-RESI项目的确是“精益式开发”。徐大师说我们公司至少有一半的项目应该使用精益。

另外选择哪一种做法,要看项目类型,客户关注点等,知道什么时候用,什么时候不用

comments powered by Disqus