InfoQ

InfoQ

新闻

我的书签

登录注册 以永久保存书签。

该内容已经被标记书签!

标记书签错误,请重试!

重构:“为什么”和“怎么做”

作者 林芷薰 发布于 2008年4月9日

领域
过程 & 实践
主题
敏捷实施 ,
企业级敏捷 ,
敏捷
标签
重构

近日在“敏捷中国”讨论组展开了一系列关于重构的讨论。一种观点认为,对代码的重构是程序员出于对代码美感的追求而进行的行为。

重构更多的是基于激情,把代码做为艺术品来雕琢。但是不少软件公司工作环境可以很快摧残这种热情。

然而作为软件开发工作的一部分,重构行为显然不应该被归结于“激情”和“艺术”。之所以有这种想法,往往是由于没有一种有效的方式来衡量重构行为的成本和收益,从而不能有效地组织和管理重构行为。在同一组讨论中就有人提出了这个问题:

我想了解一下,大家是否把重构的时间放到sprint的估算里。假设到了代码用户案例测试通过了,操作文档也完成了,如果没有时间重构代码,你们会怎么办?重构的时间,跟追求的度成正比,怎么估算重构的成本?

来自ThoughtWorks的熊节认为,重构的收益体现为修改成本的降低,因此也是可衡量的。

从商业的角度,每段代码,每次修改都带来一定的商业价值,同时每段新代码,每次修改都有它的成本,这个成本随代码质量的下降而上升。当代码质量烂到一定程度,修改代码的成本超过收益,这个软件就没办法继续发展了。重构也有它的成本,它带来的收益是降低修改代码的成本。如果你发现一个程序员一方面抱怨面对变化的需求他不敢动手改代码,另一方面又不想通过重构改善代码质量,你就知道这里必定有什么问题了。

在一篇题为“在大型遗留系统基础上运作重构项目”的文章中,熊节详细说明了如何权衡重构的成本和收益:

  1. 和别的任何story一样,重构的story(以及其他“技术债”类型的story)也应该符合INVEST的标准。尤其是,它们的工作量应该得到估算,它们应该按照业务价值排列优先级。因为归根到底,重构(以及其他任何开发任务)都归结为“花在代码上的成本”与“对业务创造的价值”之间的权衡。
  2. 按照定义,重构意味着“在不改变功能性行为的前提下改进代码的组织结构”。如果代码基础本身脆弱而没有测试覆盖,重构的成本就会很高,因为你需要花很大力气来确认自己的修改没有改变功能性行为。
  3. 如果偿还“技术债”的成本非常高,那么与之对应的业务价值就必须更高,否则偿还这些债务就将得不偿失。其结果是:一段代码,从程序员的角度看来越糟糕,从商业的角度来说就越不应该去动它。
  4. 综上所述,如果有人说“这一大堆代码都需要重构”,这样的说法很有可能是值得商榷的。你需要把重构划分成细粒度的、可控的story,为这些重构story制定验收标准,评估它们的优先级,估算它们的工作量,然后逐一实现它们,并且放弃一些得不偿失的重构。

这篇文章还介绍了对遗留系统进行重构的步骤:

经过这个咨询项目,eMAN产品开发团队在原有代码的基础上划分了细粒度的重构story,建立了持续集成环境,并按照共同探索出的节奏,以测试为驱动、以代码质量为导向,不断重构以改进代码质量,并且积累了一些常见问题的解决办法,为大规模遗留系统的重构找出了一条切实可行的路子。

和所有的敏捷实践一样,重构的原则说起来很简单,但实际操作起来总是会有很多困难,需要经验和权衡。你在尝试重构时遇到困难了吗?你有自己的重构经验想要与整个社区分享吗?

重构是毋庸置疑的有价值可衡量的 发表人 田 乐 发表于
重构是程序员素养的主要表现 发表人 wei wang 发表于
  1. 返回顶部

    重构是毋庸置疑的有价值可衡量的

    发表人 田 乐

    重构绝对不是美学问题,而体现为程序员的“责任心”问题。因为程序不是一锤子买卖,代码还要生存很长实践,所以作为有责任心的父母,就要对代码进行必要的重构。

  2. 返回顶部

    重构是程序员素养的主要表现

    发表人 wei wang

    重构过程是一个复杂而富有责任心的工作,可以直接体现程序员的素养。

深度内容

大规模视频网站的计费与流量管理

本次分享将会就大规模视频网站的计费与流量管理这个话题,从操作层面细细进行讲解和分析,为系统工程师们揭示平日里我们没有关心的另一些内容。同时也希望本次分享能揭示行业中的一些“潜规则”,让互联网行业的流量与带宽管理更为开放与简洁。
本次演讲视频录制于QCon杭州2011

专访Jeffrey Richter:Windows 8是微软的重中之重

Jeffrey Richter以其多本Windows核心技术的经典著作而闻名,同时,他深入掌握微软的.NET等一系列核心技术,2012年1月,Jeffrey Richter在北京接受了InfoQ中文站的专访,谈到Windows 8和WinRT编程,并就异步编程、Windows编程中的可扩展性、性能和安全性方面给出自己的建议。

应用云平台的可用性——从新浪SAE看云平台设计

云计算平台的可用性,相比传统互联网服务而言,更加复杂和困难,也更具有挑战性。本文借助新浪SAE云平台为读者讲述了云平台可用性的定义、如何打造高可用的平台,以及对云计算的用户提出了建议。

JVM定制改进 @ 淘宝

淘宝高度重视Java平台的健康发展,组建了一个团队专注于Java平台的底层部分的性能、功能与稳定性改进;工作主要基于OpenJDK中的HotSpot VM开展,其中一些通用的功能随后也会逐渐反馈给OpenJDK社区。希望能与使用Java平台开发应用的大家交流经验。
本次演讲视频录制于QCon杭州2011

"伤得起"的云计算应用——对云端应用之架构的思考

2011年4月21日至22日是值得云计算从业者纪念的日子。Amazon的IaaS服务出现故障,导致许多商业网站的服务中断,影响非常严重。作为云计算用户,我们需要思考的是,如何保证即便在云服务不可用的情况,我们的应用架构仍然能够屹立不倒?本文正是站在云计算用户的角度试图探讨这一问题。

让交付的速度跟上思考的速度

12人的技术团队,4组刀片服务器,每月20亿的访问量,每日1次准时部署,99.9%的可用性。这可能吗?当然。想知道如何做的吗?百姓网将与您分享他们在DevOps实践过程中的经验和技巧。
本次演讲视频录制于QCon杭州2011

架构之路——穿行在产品和业务之间

篱笆作为一家起源于社区的电子商务公司,反映到技术层面就是同时要面对产品和业务,以及经营战略的变化调整。如何在产品和业务的夹缝之间完成技术架构的抽象与平衡,寻找更有效的价值定位,这当中有些经验教训和个人感悟愿与众人分享。
本次演讲视频录制于QCon杭州2011

特性注入:成功三部曲

本文将对特性注入以及相关方法做一个扫盲性的介绍。我们会解释这个框架的关键要素,并附上实例来证实它们。为了让文章保持相对较短,我们不会深入到某个工具或方法中,而是会给出一些参考资料,以便大家做进一步的研究。