如何避免软件工程中最昂贵错误的发生
url: http://www.iteye.com/news/30395
编者按:影响软件工程进度的原因有很多种,而代码重写无疑是最耗费时间的变更之一。那么重写的时候需要注意哪些细节才能把资源开销控制到最低或可接受的程度呢?本文作者Edmond Lau在其博文中进行了阐述。以下为译文。
前几周,一位年轻的初创企业工程师过来寻求我有关代码重写的建议。其管理层希望她的团队在4周内完成Web产品的代码重写工作。这已进行了3个多月,但估计还要多花2个月才能完成。她们每周的工作时间将近80多个小时,伴随的还有一堆堆的错误需要更改。时间对于初创公司来说无疑是重中之重,她们该如何处理目前这个困境呢?
在我职业生涯早期,也曾碰到过类似的困境——原本估计4个月完成的项目,在通过重写后,最终用了9个月才完成。在这个痛苦的过程里,最令人抓狂的事情之一是如果市场出现新的机遇,由这引起的改动是最优先的。换言之,我们只能不断的缝缝补补。打这以后对于项目重写,我变得慎之又慎。
Google Docs的故事
在今年初,我与Sam Schillace会面时也讨论过有关重写的问题,它是Box的技术副总裁,前Google Apps负责人。我向他提了一个问题,“你们工程团队曾遇到过的最昂贵的错误是什么?”
他的回答是,“尝试从零开始开展代码重写。”
Schillace的创业公司在2006年被Google收购了,他们当时的团队有4人,产品名字是Writely即Google Docs的前身。在他们发布了一个试验性的C#原型作品后,用户数很快就突破了50万。加入Google后,他们收到的第一个商业任务是进行项目迁移,从而充分利用Google的架构体系以实现高容量和高扩展性。每天用户数仍在快速增长,而他们也开始意识到之前所写代码的扩展瓶颈。
我还在Google工作时,我知道Google的软件堆栈是不支持C#的。所以当Schillace说到这里时,我很自然地问到,“当你们进行Writely到Google Docs的转换时,你们是不是只能从零开始?”。
Schillace的回答是,“是的。”当他们开展重写工作时,有个合伙人提出边转换边重写,因为如果进行彻底推翻,将极大增加工作量。Schillace并不认同。最终,他说服团队只设置一个非常有限的重写目标,延后其它更多的目标工作。他们定下一个清晰的目标先把系统在Google数据中心运转起来,然后再整合12种不同的Google技术。他们花费了一个星期来调试并最终编译成功。调试过程中,很多错误是由于Java和C#不同的语义表达引起的,例如==双等号的不同含义。
“这真的真的非常痛苦。”Schillace说道。继续奋战12个星期后,他们最终完成了一个“令人惊讶的,奇怪的,晦涩难懂的”代码库。但它也最终在Google数据中心里成功运转了,这也创造了一项纪录—被收购后最快适应Google架构的转换项目。如果他们不是摒弃了过多的目标,也许还不能这么快就完成。同时如果他们把更多精力放在代码质量上,时间也会用得更多,因为需要修正一堆堆的正则表达式。相反地,他们的目标是使Writely先尽快运转起来。
经验教训
以上所说并不代表重写或推倒重写就是绝对的对或错。MongoDB的创始人Eliot Horowitz曾说过,“我们应该把代码看成有3-5年的半生命周期,因此应该定期进行更新。”MapReduce,Bigtable等技术的Google架构师Jeff Dean也曾说过,“我们不妨以放大10倍的规模来设计软件,这样一来我们会发现它的与众不同。”
如果我们一口气就把整个代码进行重写,问题便会出现。我们会倾向于低估了开销而高估了益处。
当我们缺乏经验时,这是很正常的。我们没有足够的底气和知识来阻止过激的进度计划,同时也没有划分好先后优先级的技能。我们可能会想,一个好的工程团队会有人能完成这一切。因此可能会认为只要按部就班、兢兢业业地去做事就万事大吉了。
经过一段时间历练,也不一定就能避免所有错误,因为评估工作仍然复杂而我们也会因为有了经验而高估了自己。这是一个有关虚幻优越感的事例。如果你去调查100位驾驶员的驾驶水平,80%的人会认为自己的水平是中上的。如果调查100位教练,68%的人会认为自己处于前列。类似的情况在IQ测试,自我评价等测评中屡见不鲜。所以,对于软件工程师来说,很自然会认为不能按时完成任务只会在较低水平团队中出现,所以当真的出现超期情况时,会使得重写工作一再拖长。
一旦重写出现超期,我们往往会自欺欺人地认为只要多加几天班,多开几次会就能把进度赶上。我们也不会再去想别的途径。一两次或许可以侥幸通过,但长期来看这是不能持续的,“罗马非一天建成”。
最佳的策略是全方位评估推倒重写的价值。如果需要这样做,例如Schillace所做的,不妨为项目设置一个有限的目标集合然后使之尽快实现并不断完善。如果你所在的团队陷入了一个一再延迟的项目,你需要站出来,指出商业目标和实际工作的差距—看是否需要减少过多功能,是否需要设置更切实可行的目标,是否把项目看成是沉没成本而彻底终止。对于采取何种策略,需要实事求是,而不能生搬硬套。(编译:伍昆 责编:张红月)
原文来自:The Effective Engineer