A团队在进行一个预计3个月后上线的小项目,项目经理排的计划是2个月后完成开发,然后半个月Alpha测试,半个月Beta测试。项目很小,需求很简单,似乎没什么风险。2个月后顺利进入Alpha测试,结果发现bug很多,有些细节没有达到客户的要求。半个月很快就要过去,于是大家加班修bug。
相信很多团队都经历过类似的上线前的鸡飞狗跳的日子。问题出在什么地方?——团队把测试放到最后的阶段,并且只有一次。如果回到3个月前,项目经理可以做些什么改变呢?Do it often——团队可以先完成一个小的Feature,然后让QA针对这个Feature进行测试;同时团队继续下一个Feature的开发……如此循环。这其实就是“迭代开发”的概念了。
总结:如果一个团队需要使用“测试阶段”来对产品进行质量的保证,那么让这样的“测试阶段”多一些。
案例二
B团队在重写一个为期一年的中型应用软件,旧的应用软件已经成为遗留系统,维护成本太大,因此公司决定重写。除了要实现老系统的原有功能外,这个项目还有些特殊的需求:1,该系统跟其他几个系统有集成,重写后仍然需要支持。2, 新系统的数据库会有调整,但老系统的数据需要在新系统上线的时候,无缝地Migrate到新系统中。
团队在经历了几个月的开发后,终于完成了所有功能的开发。然后就进入了上线前的准备——1, 把新系统部署到服务器;2, 配置好与其他系统的集成,并且进行测试;3, 把老系统的数据库备份一个出来,然后运行脚本进行数据库的升级,然后进行测试。
所有这一切都是手工完成。导致的问题是:上线前有很多繁琐的,让人精神紧绷的事情,完全靠团队里个人的能力和细心程度,稍有差错,就会导致真正上线时的混乱甚至失败。
这其实不是个新鲜的问题,就是ThoughtWorks公司《软件开发沉思录》里提到的“最后一英里”的问题。
可以做些什么来改善这种状况,来减轻上线前的压力,增加上线的信心和可靠性呢?还是Do it often,如果能在每个月、甚至每天、甚至“持续集成”里的每次“代码check in”,都来演练一下上线前要做的所有这些事,那么到真正上线的时候,团队就几乎不会有任何额外的担心和压力了。
当然要做到这一点,“自动化”是不可或缺的。最理想的状态,一切都应该“一键完成”——团队需要维护一系列脚本,团队成员只需要按一个键,就能完成“代码迁出——build——部署——数据库升级——集成测试”等整个过程。或者,至少,可以把最没信心、最复杂的环节单独拿出来做自动化。
总结:越是困难的事情,越是要do it early, do it often, do it automatically。
案例三
作为软件工程师,我们编写软件就是因为人脑的运算速度、精确程度、可重复性都不如电脑,因此编写软件,用电脑来帮忙干活。可是在编写软件的时候,为什么很多人会忽略让电脑来帮我们验证我的软件呢?
1,不要完全依赖人来测试我们的代码——用代码来测试我们的代码。
2,不要完全依赖人来验证我们系统的集成——用自动化脚本,用持续集成软件。
3,不要依赖人工一次性的劳动来确保软件的正确——用分而治之、迭代开发来“反复确保”。
4,不要等软件腐化后再来“重写”软件——时时刻刻“重构”它。
5,不要期待设计/架构可以一步到位——时时刻刻进化它。
do it often。
参考阅读
Daniel Teng:我谈迭代 。迭代就是do it again and again。也是do it often的体现。
Matin Fowler:有机会就重构。大师最新的关于重构的文章,教导我们:refactor it often。
刘未鹏:为什么你应该(从现在就开始)写博客。经常写博客。