敏捷是以消除浪费、提高质量为目标的。但是有些时候总能见到一些原教旨主义者指出,重构也是浪费、结对也是浪费、讨论也是浪费。然后呢,又有人提出,XX是必要的浪费这种说法。
想了一下,XX是必要的浪费这个说法其实不确切,只能说,这些东西是必要的成本支出。所谓浪费,必须从经济学角度讲才行。不然世间一切都可以带上这个难看的帽子。
从牛博网最近新来的骗银老师那里学来一个概念:“经济学上有个奇怪的概念叫‘冤死的损失’(deadweight loss),英文的直译是‘未被释放出来的能量损失’,那是说,有一部分损失,...”谁也没拿走,“...但因为效率原因,它就那么凭空损失掉了。”
因为听起来很玄,为了让大家更好理解,骗银老师在后面讲的一个非常耳熟能详的例子:
“
我雇了一帮人,天天就负责刨坑,刨了然后填上,然后再刨开,再填上(这例子不荒谬,中国随处可见),我发给他们工资,这一来一往国民生产总值(GDP)就上去了。看起来谁也没损失什么,对不对?只是简单的财富转移。其实不然,这里面有巨大的浪费,因为这些钱、这些劳力本来可以用在其他更为有效的生产上,可都用来刨坑了,那就是浪费。”(其实个人这个例子还不够形象,如果挖坑和填坑的不是一批人,他们自己根本就不知道自己做的是浪费的事情,就知道干了活,拿钱,而且还为挖坑和填坑做了很多过程改进,提高工作效率。那就更形象了。)
所以说,您不能因为某些工作做了您能看到效果了,就不称之为浪费,而有些工作做了您看不到效果就称之为浪费了,应当反思一下是不是自己眼界不到。
离职将近,我在交接工作之际,因为我最熟,所以要我把依赖我负责模块的其他模块的适配器类改至新版。自己搬着Mingle写了一些故事卡,又用CC写了一
些持续集成的脚本。接下来,我还会去写测试用例。整个过程中,没有一行有效代码的产出。在以代码计绩效的角度看,我的工作就算是浪费。可是,大家应该知
道,没有这些东西,先不说我会不会在开发的时候保证质量。就说我离开以后,当产品质量出问题了,谁来保证?我可以根据异常一眼看出问题可能出在哪里,新接手的人能吗?如果他改了程序,能保证不会按下葫芦起来瓢吗?他需要时间去犯错去学习,这个时间,没有产生新的价值,这才是真正的浪费。而且这也就成了挖坑-填坑的模式了。
问题反过来了,我做好这个CI的环境走了,来了一个新人接手,会怎样?一天,系统报异常了。他有我的测试环境,而且,还是可以运行的。他可以很快的写一个测试用
例,并开始调试,即便他无法理解整个设计,那不妨碍他快速的修复Bug。而且,因为以前的测试用例可以自动运行,他还可以保证自己的修改不会导致之前的功
能出现问题。一个为产品而组织的团队,离开了某个特定的人,产品仍然可以自我完善,能完成这样的目标的手法才是最有价值的。
很多人担心前期花费的时间太多,后期就更没时间,问题又来了。前期花费的时间多,是浪费掉了,还是合理的用掉了?如果是浪费掉了,自然不应该,如果是合理的用掉了,那是必须的。我们学软件工程的时候都学过,一个问题发现的越晚,改正他的成本就越高。后期所谓的没时间,就是因为前期太多问题没有修正。
说道这个前后期的问题就不得不提最近一次结对的经历。在我的坚持下,总算完成了一次与同等水平开发人员的结对编程。持续时间有三天。与同等水平的人结对,感觉是不一样。也发现了很多以前没有发现的问题。这都是个人问题,脱离我本人就没有意义了,所以也就不说了。主要说一下心得。这三天的时间里做了一件什么事呢?推翻以前分成两个模块的应用,合成一个。两个人做一件事,大家可以随时根据今天剩余的时间做工作的调节,精确到小时。因为了解的信息不同,可以快速传递,合作互补,当他提出一方案的时候我可以快速告诉他,我这边没有问题,减少了尝试造成的时间浪费。因为两个人一起做,脑子根本停不下,一个人停了,另一个人还在转,带着你不得不进行。一天的有效工作时间在6小时以上。而分开的话,基本上能有3个小时就不错了。
(中间发生的一点插曲。因为结对开发从不了解的人看来,是一件很浪费时间的事情。所以出现干预结对的现象出现,理由是担心做不完。我觉得,如果不是坚持的话,就真的做不完了。从现实中看来,强调浪费,很容易被偷欢概念。而偷换概念的人很多人都没有做过仔细的考虑。纯粹的想当然。)