Posts Tagged ‘敏捷开发’

这不是部署问题,这是设计问题

Sunday, September 13th, 2009

想年轻时,自动化一切并乐此不疲,直到我碰见了Cruise的部署问题。

大家都知道,Cruise采取的是Smart Server + Dummy Agent的架构,每个Server可以对应N个Agent, 开发是一件乐事,然而部署不是。 每次发布,大家都得小心翼翼的

ssh到Server上用apt-get升级,

根据环境下载.exe, osx.zip或者.deb

scp安装包到相应的agent

ssh到每一台agent,升级agent

嘿,有事情不对劲儿了,不是么? 你看什么了? 手工过程,很多邪恶的手工过程,自动化才是王道!

但是,请等一下…..

为什么要去手工下载安装包更新Agent?
因为安装文件是按照不同平台打包的,放在独立的下载站点上,由于Agent可能访问不了外网,它无法自行去下载站点下载安装文件。

既然Cruise Agent知道Cruise Server在哪儿,为什么不把Cruise Agent的安装文件放在Cruise Server上?
你是说我们要把所有的Agent安装包放在Cruise Server上? 这样占太多空间了。

为什么不能只提供一个jar包呢? 它是Java应用,只需要一个jar,不是么?
嗯….??!!

为什么需要脚本重启它?
Agent是一个Java进程,它不能把自己杀死再重启。所以必须有另外的脚本安装更新后再重启。



原来问题的关键不是自动化部署,而是:

1. Agent得不到新版本的安装包。

解决方案: agent.jar放在Server上,用MD5一比就知道有没有更新了

2. Agent无法把自动重启。

解决方案:写一个很薄的bootstrapper层,用它启动/重启agent

搞定,我们作了什么? 我们并没有解决部署问题,我们解决了一个架构问题,或者说是设计问题,而部署问题不治自愈。

我相信这是Kent在Responsive Design Worhshop试图表达的观点之一: 设计者决不能停留在问题的表面,在带上技术专家的帽子激情满怀的解决问题之前,停下来,问5次为什么? 不要被幻象蒙蔽了眼睛。因为

这也许不是配置问题,而是设计问题
这也许不是性能问题,而是设计问题
这也许不是部署问题,而是设计问题
….

跟踪团队的技术债

Sunday, April 26th, 2009

在开发的时候你碰到了一段散发着恶臭的代码,“这段重构有点棘手,要想把这段代码整理干净至少要花半天时间,打个patch的话马上就能解决,手里的故事不能再拖了,但是这段代码也不能放过。”,和Pair商量后,你们创建了一个Dev Card,在上面清清楚楚的写下了这段代码问题所在和大致的重构步骤。然后飞快的完成了故事。

几天以后,你对项目经理说有一段代码需要彻底清理,项目经理皱着眉头看了看计划:
”现在它还能工作,不是么?“
”是,可是…“
“这边还有两个bug,优先级很高,客户已经抱怨了。高优先级的必须首先完成,等我们有时间的时候再清理它吧,怎么样?”
“嗯,好吧…”

这段代码于是继续留在代码库里。这样的故事每天都发生着,”有时间“自然是从未发生过,有一件事开始折磨项目经理:不知道从什么时候开始团队开发速度变慢了,项目计划变的更紧了。

这些遗留下的Dev Card, 就是一笔笔技术债,和其他的债务一样,团队需要为此支付”利息“:这些未完成的技术任务会让添加功能、修复缺陷变得越来越困难,团队的开发速度也因此不断下降。

开发人员总在抱怨没有足够的时间来让代码闪闪发光,为什么Dev Card不能像像Story Card一样受到重视呢? 关键是Story Card姓$,每个人凭直觉便能认识到它们的价值。而Dev Card的价值一方面不是真金白银那般来得直接,另一方面只有专业的开发人员才能意识到它们的价值,然而对于$的迟钝却阻碍了开发人员认识到Dev Card究竟所值几何,在和项目经理、客户的谈判中如何能不败落?

和Story Card一样,如果我们对于Dev Card做出合理的估算,就可以在使用burn down图跟踪Story的同时,使用burn up图来跟踪每个迭代所增加的Dev Card的点数,结合开发速度的下降,所有人都可以直观的认识到Dev Card的价值,进而帮助项目经理和客户做出更合理的,符合可持续发展的计划。

那么对于Dev Card的大小不清楚怎么办? Spike,和Story一样,需要对技术问题进行摸索,做到对工作量心中有数,这样的Spike,一方面可以帮助团队找到最佳的解决方案,另一方面可以使用Dev Card的估算值与开发经理、客户share understanding.

与Story Card的处理原则一样,如果一张Dev Card过大,开发者需要将其变为若干较小,便于估算的Dev Card,从而使团队有能力小步的完成这些技术任务。

这些想法是上周的回顾会议中得到的,也将在项目进行实践,如果可以的话,希望能把项目中的一些数据发布出来,相信会非常有趣。