BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

如何抉择重构?

| 作者 Vikas Hazrati 关注 0 他的粉丝 ,译者 石永超 关注 0 他的粉丝 发布于 2010年6月19日. 估计阅读时间: 4 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

重构是一种改变软件系统的过程,在不修改代码外部行为的情况下,改善其内部结构。在大多数敏捷团队中,改善已有代码的想法是受欢迎的。毕竟,持续改善是这些团队为之奋斗的事情。但是,改善已有代码牵涉到时间和金钱。这样做值得吗?

重构涉及到的成本有这些:

  • 做重构的成本
  • 测试更改的成本
  • 更新测试和文档的成本

同时,如果单元测试以及测试工具没有达到标准,系统会有引入新缺陷的风险。 在极限编程项目中,总是假设项目有很好的单元测试,这种风险就很低。另一方面, 重构有一些好处

  • 添加新的功能不会破坏系统的结构
  • 可以提高对系统的理解
  • 更容易测试
  • 更容易找出、隔离以及修正缺陷

影响重构的决定有哪些参数呢?

John Virgolino 认为,用金钱去衡量重构带来的利益,这道数学题并不复杂

你无需做复杂的业务分析,保持其简单。重构需要多少时间?再乘以一个按小时或按天算的成本因子就可以了。

$60000薪资 × 1.25 = $75000 负担成本

$75000成本 / 12个月 / 22个工作日 = $297.61 (每天的成本)

现在,3天时间做代码重构 × $297 = $891 重构成本(这就是你的投资)

下一次做代码改动时,之前没有重构的话需要5天时间(5 × $297 = $1485),而重构过的话只要1天时间就可以做相同的代码改动(1×$297 = $297)

$1485 - $297 = $1188(节省)- $891(初期投资)= $297.00 总共节约成本

此时,投资已经自我偿还了,而且未来会带来很多意外的成本节约,并且可用于提高其他产品、项目、文档、计费工作等等的生产率。

做类似定量分析的Simon Johnson 认为, 重构后生产率必须有一定比例的提高, 这样才能调整重构成本,Simon说:

对于重构,为了让它同把钱存在银行而言成为一种更好的投资,你必须提高5-8%或更高的生产率。这是一个相当大的要求,我非常怀疑这样的目标在实践中能否达成。如果你的机会成本远高于“帐户B”描绘的数目,那么你最好把钱花在其他地方,比如新的功能或者减少缺陷的方法。

不过,除了成本,还有其他因素可能导致重构不是可行的策略。

Mark Needham 重构困境上做了评论,他举出了最后期限很紧张的项目作为例子。如果团队在某个指定时刻开始重构,他们不会看到重构带来的任何回报。Mark认为,尽管重构有一些好处,但是,他很少看到仅仅由于重构让代码在今后易于维护,就赶上交付日期的情况。

John也提出了类似的场景,那时重构可能不是一种好的选择

虽然总得来说,管理层可能也有很好的理由不做重构。这可能与金钱或时间都无关,可能是一个战略决策,甚至是合同的原因(比如政府工作)。确保你自己也了解整个故事。我也见过很多人在讨论你要在工作之余做重构。这无疑表明你对重构技术的信念和喜爱,但我不会在真空中做重构。我见到过程序员去做重构,结果导致团队其他成员和整个项目陷入混乱。

Mark同时还指出,有时候项目周期可能太短了,不值得为重构投资。为这种项目做重构投资可能是徒劳无功的练习。

因此,尽管引入重构必然会有好处,是否决定在特定时间、特定情况下去做重构,必须谨慎对待。关键在于权衡利益,然后判定哪一个会带来最高的商业价值。

查看英文原文:The Decision to Refactor

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

“重构”应尽早开始 by 高 翌翔

文中似乎把“重构”定义为一种亡羊补牢的做法,即待系统基本开发完毕后再着手“重构”。而在“重构”的定义中并未规定“重构”启动的时间点!因此,我个人的意见是,“重构”应尽早开始,理想的启动点是在做第一个单元测试时,因为此时已完成了明确功能。

“重构”风险的高低取决于重构代码的范围,开发完成后的大规模重构的风险和难度可想而知,早期基于单元测试的重构相对而言就要容易多了。

此外,应把“重构”作为一种团队风格,即作为团队成员必备的一种编程技能,进而养成为编程习惯!

顺便请教一下:国内哪里这样的开发团队么?!

Re: “重构”应尽早开始 by zen chris

"顺便请教一下:国内哪里这样的开发团队么?!"
同问……

Re: “重构”应尽早开始 by Shi Stone

Vikas Hazrati最近的文章似乎颇受争议!
www.infoq.com/news/2010/05/reactions-first-csd-... Jeffries也出来发话了。
此篇新闻在讨论重构是不是值得做,作者引述的其他人的言论认为有时候可能不值得做,也举出了例子,但并未明确就何时应该做重构作出论断。
基本同意Arnold Gao的意见,重构做地越早越好,这是一个技术债务的问题,债务拖欠地越久,偿还的代价就越大。
同时,重构的前提是有良好的单元测试、这些测试要基本做到逻辑覆盖,没有这个前提,就不用谈重构了。
如果使用测试驱动开发,那么的确,是不是应该做重构只有一个答案:是的,且必须。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

3 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT