Leon's blog

每天活的有趣一点

正在浏览标签为 翻译 的文章

软件项目的任务积压管理

抢沙发

这是一篇关于如何管理软件项目需求、任务、缺陷的文章,来自大名鼎鼎的Joel Spolsky, StackOverflow的创始人。

想像一下你生平第一次来的一家面包工厂。开始这里看起来像是一个无法理解的杂乱不堪的机器,一些工人在里面东奔西跑的忙碌着。仔细再看看,你就会看到一些你认识的东西。一些桶装的芝麻,大桶大桶的面团,一些小面球,还有些烤好了的面包条。

这些都是库存,或者叫积压。积压逐渐的堆在机器之间。在机器边上,是大桶的将被撒在汉堡面包片上的芝麻。生产线的尽头,是些装满面包的箱子和空箱子。它们在等着被卡车运到商店去。

维持积压需要费用。假设你的面包厂有6个50吨的面粉贮仓。贮仓空下来时,你就会把它填满。这意味着平均你有150吨面粉积压。按照现在的价格计算,你需要73000美刀来维持这个积压。一直需要占用这么多钱。

积压还有别的消耗,比如腐烂、变坏。面粉可以储存几个月,但是面包从它们出炉的那一刻起价值就在不断的降低;24小时之后,基本上就一文不值了。

为什么还要要保持有库存,有积压呢?因为缺货也会造成损失。如果订购芝麻需要2天,在你的芝麻用光的时候,你就2天没办法生产面包。库存可以防止类似的生产流程上的阻塞。丰田汽车的精益生产系统和限制理论,可以指导我们优化每一个生产环节上需要多少缓冲库存。

为什么我会关心这些呢?因为软件开发流程上也有几个主要的积压堆积点。这些环节上的堆积,会造成大量的时间和金钱的浪费。

你也许会问:“什么?软件怎么能跟工厂比呢?”

好吧,想像一下,把产品想法当作生产原料。根据你的流程不同,产品想法可能会经过下面这几个开发阶段,才最终完成为客户看到的软件的特性。

  1. 特性决策阶段 (我们真的需要实现这个特性吗?)
  2. 设计阶段 (特性描述, 白板讨论, 原型测试, 等等)
  3. 实现阶段 (软件编码)
  4. 测试阶段 (抓虫)
  5. 修复阶段 (杀虫)
  6. 部署阶段 (把代码发送给客户,或者部署到WEB服务器,等等)

(备注: 不是,这可不是“瀑布式开发”。真的不是。 真不是。 闭嘴。)

在这些阶段之间,就可能产生积压。比如:当程序员完成了代码开发(阶段3 实现阶段),把代码交给测试人员去测试(阶段4 测试阶段)。任何时候,都有一定量的的代码等着被测试。这就是代码积压。

代码积压的代价是巨大的。它很可能累积成6到12个月的工作量,导致生产线卡壳,产品交不到客户手里。这甚至有可能造成巨大的差别,就像时髦的尖端产品(如iPhone)跟永远在别人屁股后面追赶的产品(如Windows Phone)这样的差别。几乎不会有人会去购买Windows Phone,尽管iPhone其实仅仅比它先进6个月而已。很多市场都有网络效应,领先者意味着赢取几乎所有的份额。所以在开发流程上消除积压,能创造或毁掉一个产品。

现在我们来回顾一下积压累积的3个主要环节。

1.产品特性点子库

每个产品都有很多新点子,你实现点子的速度永远赶不上新点子涌现的速度,所以你就把他们记录下来,这就形成了产品特性点子库。点子库里很多点子其实是坏点子,你把他们记录下来,只是为了避免伤害想出这些点子的人的感情而已。点子库看起来能让每个人都感觉良好。

问题是,这些点子中90%的点子永远也不会被实现。所以花在这些永远也不会被实现的点子上的分分秒秒,记录、设计、思考、讨论,都是浪费时间。当我听说产品团队定期的开展“点子库梳理”会,在会上仔细的研究这些永远也不会被实现每一个点子,每天、每周细心的浪费着自己的时间和精力,我戳瞎自己眼睛的心都有。

建议:不要让点子库里的工作超过一或两个月。如果点子库满了,不要加入新的项目,除非你删除掉一些别的项目。不要花时间细化说明、设计、讨论这些点子库里的项目。产品特性点子库事实上应该被视为是一个关于你现在还不用讨论或开始工作的项目的列表。

2.缺陷数据库

缺陷数据库显然是很有必要的。缺陷报告应该完整、准确、可操作。但是我注意到在很多公司,大家似乎不想漏掉任何一个缺陷报告,这直接导致缺陷库的爆炸。你某天醒来,突然发现缺陷库里有3000个缺陷,其中一些已经太旧失去意义了,一些永远也无法重现,还有更多一部分太琐碎根本没有修复的价值。你仔细想想,就会意识到经年累月的时间被花在准备这些缺陷报告上,你问自己,我们怎么会即有一个很好的、客户喜欢的、每天使用的产品,同时又有一个有3000个缺陷的缺陷数据库呢?这时候你会意识到也许你花太多时间在缺陷数据库上了,这些时间本可以花在构建更好的产品上的。

建议

  1. 使用一个筛选策略决定:一个缺陷是否值得记录
  2. 不要让缺陷库的工作量(按照修复时间计算)超过两周
  3. 如果缺陷库里的缺陷超过了这个限制,停下手头的工作,去修复缺陷,直到你觉得自己在修复都是些无聊的缺陷为止。这时候你可以关闭这些缺陷,把他们标记为“won’t fix”。不用担心会标错,如果缺陷确实严重,它还会再次出现的。

3.未发布的产品特性

还有很多公司现在还在按照季度或者每年的版本发布,通常这是由于他们的部署过程比较昂贵。比如操作系统或其他任何需要每个用户自己安装的软件,通常是这样批量升级的。

未发布的产品特性,是最昂贵的软件积压之一。它本来可以帮你赚钱的,但是现在它却只能呆在仓库里,眼睁睁的看着别人的产品已经有了同样的特性。

更有害的是,有时候你并不能感受到这种痛苦,因为你团队里的每个人都已经使用这个新特性很久了。我可以肯定的说,在微软每个人都已经很happy的使用Windows 8一年多了,所以他们感觉不到那些天天在苹果的Mac OS X猎豹系统堆里兜售Windows 7的OEM提供商的痛苦。

建议:不要让完成的特性堆在那里不能为你赚钱。改进你的部署流程,使原来客户需要一年才能得到的特性几个月就能得到。如果你已经能按月发布产品了,那就想想能不能按周发布。不断提高发布的频度,不断减少每次发布的大小。

我是怎么想起这些的呢?

因为在Fog Creek,我们有全部上面说的三种软件积压:恐怖冗长的点子库、过度膨胀的缺陷库、等了一年的也没发布的已完成的新特性。所有这些每天在屁股后面盯着我们。我意识到我们需要一个系统来限制积压,使它不再堆积起来了。

我本来的想法是做一个叫Five Things的产品。这是一个项目管理工具,里面的用户最多只能被分配5个任务:2个他正在做的,1个接下来可以做的,还有几个正在计划中的。这个想法最终没有实施(但是如果你愿意,搞一个试试),但是却演化出了Trello

Trello里的任务在没超过一定数量的时候工作的很好,但是当一些列表里有太多的任务卡片的时候就开始显得拥挤了。关键就在这里:当积压开始涌现的时候,对你来说是显而易见的,很容易观察到。看看这里,这是Trello团队的开发看板

每天你看到你的Trello看板,看到17个已完成了的特性,他们都可以随时发布,但是不知道什么原因还没有发布。你马上就能发现瓶颈在哪里,并消除它。

每次有人向你建议一个疯狂的新点子的时候,你就可以看看你的产品特性积压,如果已经太长了,你就知道现在也许不需要浪费时间在这些疯狂的点子上。

希望这样能帮助你,花更少的时间和精力在那些永远也见不到天日的事情上。“梳理积压。” Sheeeesh。

参考:

专注!专注!专注在过程中!

抢沙发

“嗨,你,你..”Hugo喊道.

那个高高的女孩转过身来.

“对,就是你!”他重申道.

女孩不认识他, 她感到有些困惑. 但是女孩还是大步的朝他走了过来. 她一头卷卷的红发, 眼睛闪闪的, 反射着周围的颜色, 她的手很柔美, 腿修长而白皙.
“听着,听我说.注意停,我没有时间了.” Hugo气喘嘘嘘的说.

“我认识你吗?” 女孩问到.

“奥,对不起,我叫Hugo.” 他回答道. “你叫什么名字?”

女孩向后退了一步, 有点犹豫是不是应该回答他, 还是一走了之算了. 她嘴唇微微颤抖道, “Charlotte.”

“很高兴遇到你,亲爱的女士. 可以占用你一点时间吗?”

“嗯…, 当然” Charlotte一边检查自己那小巧的腕表一边回答道.

那天有点微风,阳光灿烂. 他们面对面站在布鲁塞尔火车站前. 两个陌生人 – 一个人遇到了点难处, 另一个人也许能帮他.

“我错过了火车.” Hugo解释道. “你知道我在哪儿能查到下一班去巴黎的火车是什么时候吗?”

“我知道, 跟我来.” 她回答道.

他们穿过一间高高天花板的大房间, 里面的人们像是蚁丘里的小小的蚂蚁. 像Hugo一样, 每个人都显得匆忙而紧张. 只有Charlotte不一样, 她看起来很平静.

“火车时刻表就在那儿.” 她微笑的说道, 并用食指在空中一指. “就在你前面.”

Hugo匆匆的查看, 眼光扫过一行行正在离站的火车. 忽然眼光一闪, 巴黎, 第五站台, 14:41开车.

“不好意思, Charlotte, 现在几点了?” Hugo问道.

Hugo转过身来, 才发现她已经走了. 喔, 他甚至都没来及谢谢她呢. 他像刚才查看火车时刻表那样在大房间里查找, 还真找到Charlotte了, 就像刚才在火车时刻表上找到巴黎一样.

是的,她就在那儿. 他看到一头微卷红发的拓,正朝沿着一个长走廊往前走. 他紧走几步跟上她.

“Charlotte, 嗨, Charlotte..” Hugo从后面追上来.

Charlotte转过身, 她的微笑还挂在她尖尖的鼻子下面.

“嗨” Hugo试着喘口气. “不好意思, 还没来得及谢谢你呢, 多谢了.” 他今天第一次露出了笑脸.

“不用谢.” 她回答.

“我能.. 请你喝杯咖啡吗?” Hugo提议道, 他急切的等待着Charlotte的回答.

“当然可以, 不过我们必须往北走.” 她说. “我只往方走.”

Hugo觉得她的回答很奇怪, 但是他很快就回过神来, 说道. “往北, 可以. 我的火车开之前我还有大约42分钟. 我想时间足够了.”

他们一起走着 – Charlotte朝北走, Hugo在旁边跟着. 不一会他们找到一个舒适的地方. Hugo点了一杯浓缩咖啡, 在他们过来的路上他就跟Charlotte说他现在特想喝浓缩咖啡. 她点了一杯水.

“你要到北方什么地方去?” Hugo边问边滋溜了一口他的咖啡.

Charlotte笑了笑, 她知道他会这么问的. “没什么特定的地点, 只是朝北走.” 她稍微顿了顿, 看到Hugo的眼神显得有些疑惑, 她接着说. “我没有最终的目的地, 我只是朝北走.”

“嗯, 你计划去哪儿呢? 荷兰? 丹麦? 挪威?” 他还是不理解.

“我没有计划. 我每天醒来只是往北走. 我慢慢走. 我也不着急, 反正也没有具体目标. 我只有一个方向.” 她说.

“那工作怎么办? 你有工作的吧? 难道你没有什么职责吗?” Hugo觉得挺好奇.

Charlotte把头发理到身后,笑了笑. Hugo看着她. 她的笑容很美. “我曾经有个工作,” 她说“但是2个月前我辞掉了. 因为我要往北走.”

“但是为什么往北呢?” Hugo想知道.

“因为我掷了两次硬币, 两次都是人头. 如果是字, 我就往南走了.” 她从口袋里拿出一枚硬币, 放在他俩之间的桌子上. “在路上我学到了很多东西 – 有关于我自己的,也有关于生命的. 我认识到专注有多重要. 我曾经有一个计划,一个目标, 每天忙碌着去完成我的计划任务(to-dos). 任务一件接着一件从我的脑袋里冒出来. 我失去了自己的自由. 我变成了自己计划的奴隶. Hugo, 你知道Charlotte这个名字的意义吗?” 她问道.

“不知道, 什么意义?” 他回答道.

“自由的人. 我不再自由了, Hugo. 我就是一个囚犯. 我的存在不是因为我的思想, 而是因为我的计划任务(to-dos). 我需要改变. 然后我就发现了专注.” 她笑得很开心. “专注意味着你做事情时, 不是赶时间(rush), 而是享受(enjoy), 从你每天遇到的事情上去学习和互动, 不要囫囵吞枣.” 她的声音充满了热情和激情. “我们的祖先曾经是思考者(thinkers),但是今天的社会把我们变成了工兵(doers). 我们崇尚质量和解决之道, 但是我们完全忘记了过程.”

“过程?”雨果问道.

“是的. 开始和结束之间的距离, A和B之间的距离. 很多人只看到了B, 和到达B要花费什么代价, 另一些人则甚至从来没有从A出发. 这两类人很不同, 但是从理解专注和过程的角度说, 他们是一样的. 当人专注在过程上时, 他就会在过程中发现很多宝藏. 对你我来说, 那些宝藏就在哪儿.”

Charlotte把硬币推到Hugo面前. “掷一个.” 她建议道. 他拿起硬币,往空中一掷, 硬币翻滚着落回到桌面上. 这时Charlotte已经起身走了, 他回头看了看硬币.

“Hugo, 你知道你的名字的意义吗? 它的含义是思考者. 也许巴黎不是你最终的目的地.” 他微笑着走出了咖啡店.

Hugo静静的站在那儿, 低头看着硬币. 硬币是字朝上.

  1. 翻译自: http://1p1e1.tumblr.com/post/16164435870/focus-focus-focus-on-the-process

一个缓和疗护护士打电话给Bronnie Ware,她列出自己死前的一些最大的遗憾。她的遗憾列表看起来挺有道理的。从中我也看到自己犯下的至少4到5个错误。

如果你必须把这个列表压缩成一句话,那也许是:不要做一个不知停顿的齿轮。这个5个错误,刻画出一个后工业时代人的形象。他把自己压缩成一个适应形状,以适应他的环境,然后直到他停下来,才变得忠实(dutifully)。

值得警惕的是,这些错误都是由于疏忽(omission)引起的。你忘掉了自己的梦想,忽略了自己的家人,压制了自己的感受,忽略了自己朋友,忘记了要快乐的活着。疏忽是一种特别危险的错误,因为你会默认犯这种错误。

我希望能避免这些错误。但是你要怎样做才能防止犯这些默认就会犯的错误呢?理想情况就是转变自己的生活方式,用别的默认行为代替这些默认行为。不过要彻底改变很难。只要这些错误还会默认犯,你也许就应该不停提醒自己。所以我把这个五个错误编成了5个命令,然后把他们列在我的任务列表文件的最头上。他们是:

  • 不要忘掉自己的梦想
  • 不要只顾着工作
  • 说出你的想法
  • 积累朋友
  • 快乐的活着

翻译自: Paul GrahamThe Top Of My Todo List